
Fixes bug #1156852. This adds the support for archiving HAProxy log files to Swift. Files will be organized into containers based on load balancer ID. Object names will be 'haproxy-YYYMMDD-HHMMSS.log.gz' where the timestamp portion is current UTC time when the file is stored. Files are Gzip compressed. Change-Id: I5e9007ca816f4834d477be42e1cfa1624d33b54e
233 lines
7.9 KiB
Python
233 lines
7.9 KiB
Python
import logging
|
|
import testtools
|
|
import tests.mock_objects
|
|
from libra.worker.controller import LBaaSController as c
|
|
from libra.worker.drivers.base import LoadBalancerDriver
|
|
from libra.worker.drivers.haproxy.driver import HAProxyDriver
|
|
|
|
|
|
class TestWorkerController(testtools.TestCase):
|
|
def setUp(self):
|
|
super(TestWorkerController, self).setUp()
|
|
self.logger = logging.getLogger('test_worker_controller')
|
|
self.lh = tests.mock_objects.MockLoggingHandler()
|
|
self.logger.setLevel(logging.DEBUG)
|
|
self.logger.addHandler(self.lh)
|
|
self.driver = HAProxyDriver('tests.mock_objects.FakeOSServices',
|
|
None, None)
|
|
|
|
def testBadAction(self):
|
|
msg = {
|
|
c.ACTION_FIELD: 'BOGUS'
|
|
}
|
|
controller = c(self.logger, self.driver, msg)
|
|
response = controller.run()
|
|
self.assertIn(c.RESPONSE_FIELD, response)
|
|
self.assertEquals(response[c.RESPONSE_FIELD], c.RESPONSE_FAILURE)
|
|
|
|
def testCaseSensitive(self):
|
|
msg = {
|
|
c.ACTION_FIELD: 'UPDATE',
|
|
'LoAdBaLaNcErS': [ { 'protocol': 'http' } ]
|
|
}
|
|
controller = c(self.logger, self.driver, msg)
|
|
response = controller.run()
|
|
self.assertIn('badRequest', response)
|
|
|
|
def testUpdate(self):
|
|
msg = {
|
|
c.ACTION_FIELD: 'UPDATE',
|
|
c.LBLIST_FIELD: [
|
|
{
|
|
'protocol': 'http',
|
|
'nodes': [
|
|
{
|
|
'address': '10.0.0.1',
|
|
'port': 80
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
controller = c(self.logger, self.driver, msg)
|
|
response = controller.run()
|
|
self.assertIn(c.RESPONSE_FIELD, response)
|
|
self.assertEquals(response[c.RESPONSE_FIELD], c.RESPONSE_SUCCESS)
|
|
|
|
def testSuspend(self):
|
|
msg = {
|
|
c.ACTION_FIELD: 'SUSPEND'
|
|
}
|
|
controller = c(self.logger, self.driver, msg)
|
|
response = controller.run()
|
|
self.assertIn(c.RESPONSE_FIELD, response)
|
|
self.assertEquals(response[c.RESPONSE_FIELD], c.RESPONSE_SUCCESS)
|
|
|
|
def testEnable(self):
|
|
msg = {
|
|
c.ACTION_FIELD: 'ENABLE'
|
|
}
|
|
controller = c(self.logger, self.driver, msg)
|
|
response = controller.run()
|
|
self.assertIn(c.RESPONSE_FIELD, response)
|
|
self.assertEquals(response[c.RESPONSE_FIELD], c.RESPONSE_SUCCESS)
|
|
|
|
def testDelete(self):
|
|
msg = {
|
|
c.ACTION_FIELD: 'DELETE'
|
|
}
|
|
controller = c(self.logger, self.driver, msg)
|
|
response = controller.run()
|
|
self.assertIn(c.RESPONSE_FIELD, response)
|
|
self.assertEquals(response[c.RESPONSE_FIELD], c.RESPONSE_SUCCESS)
|
|
|
|
def testCreateMissingLBs(self):
|
|
msg = {
|
|
c.ACTION_FIELD: 'UPDATE'
|
|
}
|
|
controller = c(self.logger, self.driver, msg)
|
|
response = controller.run()
|
|
self.assertIn('badRequest', response)
|
|
|
|
def testCreateMissingNodes(self):
|
|
msg = {
|
|
c.ACTION_FIELD: 'UPDATE',
|
|
c.LBLIST_FIELD: [ { 'protocol': 'http' } ]
|
|
}
|
|
controller = c(self.logger, self.driver, msg)
|
|
response = controller.run()
|
|
self.assertIn('badRequest', response)
|
|
|
|
def testCreateMissingProto(self):
|
|
msg = {
|
|
c.ACTION_FIELD: 'UPDATE',
|
|
c.LBLIST_FIELD: [
|
|
{
|
|
'nodes': [
|
|
{
|
|
'address': '10.0.0.1',
|
|
'port': 80
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
controller = c(self.logger, self.driver, msg)
|
|
response = controller.run()
|
|
self.assertIn('badRequest', response)
|
|
|
|
def testBadAlgorithm(self):
|
|
msg = {
|
|
c.ACTION_FIELD: 'UPDATE',
|
|
c.LBLIST_FIELD: [
|
|
{
|
|
'protocol': 'http',
|
|
'algorithm': 'BOGUS',
|
|
'nodes': [
|
|
{
|
|
'address': '10.0.0.1',
|
|
'port': 80
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
controller = c(self.logger, self.driver, msg)
|
|
response = controller.run()
|
|
self.assertIn(c.RESPONSE_FIELD, response)
|
|
self.assertEquals(response[c.RESPONSE_FIELD], c.RESPONSE_FAILURE)
|
|
|
|
def testDiscover(self):
|
|
msg = { c.ACTION_FIELD: 'DISCOVER' }
|
|
controller = c(self.logger, self.driver, msg)
|
|
response = controller.run()
|
|
self.assertIn('version', response)
|
|
self.assertEquals(response[c.RESPONSE_FIELD], c.RESPONSE_SUCCESS)
|
|
|
|
def testArchiveMissingMethod(self):
|
|
msg = {
|
|
c.ACTION_FIELD: 'ARCHIVE'
|
|
}
|
|
null_driver = LoadBalancerDriver()
|
|
controller = c(self.logger, null_driver, msg)
|
|
response = controller.run()
|
|
self.assertIn('badRequest', response)
|
|
|
|
def testArchiveInvalidMethod(self):
|
|
msg = {
|
|
c.ACTION_FIELD: 'ARCHIVE',
|
|
c.OBJ_STORE_TYPE_FIELD: 'bad'
|
|
}
|
|
null_driver = LoadBalancerDriver()
|
|
controller = c(self.logger, null_driver, msg)
|
|
response = controller.run()
|
|
self.assertIn('badRequest', response)
|
|
|
|
def testArchiveSwiftRequiredParams(self):
|
|
null_driver = LoadBalancerDriver()
|
|
|
|
# Missing basepath field
|
|
msg = {
|
|
c.ACTION_FIELD: 'ARCHIVE',
|
|
c.OBJ_STORE_TYPE_FIELD: 'Swift',
|
|
c.OBJ_STORE_ENDPOINT_FIELD: "https://example.com",
|
|
c.OBJ_STORE_TOKEN_FIELD: "XXXX",
|
|
c.LBLIST_FIELD: [{'protocol': 'http', 'id': '123'}]
|
|
}
|
|
controller = c(self.logger, null_driver, msg)
|
|
response = controller.run()
|
|
self.assertIn('badRequest', response)
|
|
|
|
# Missing endpoint field
|
|
msg = {
|
|
c.ACTION_FIELD: 'ARCHIVE',
|
|
c.OBJ_STORE_TYPE_FIELD: 'Swift',
|
|
c.OBJ_STORE_BASEPATH_FIELD: "/lbaaslogs",
|
|
c.OBJ_STORE_TOKEN_FIELD: "XXXX",
|
|
c.LBLIST_FIELD: [{'protocol': 'http', 'id': '123'}]
|
|
}
|
|
controller = c(self.logger, null_driver, msg)
|
|
response = controller.run()
|
|
self.assertIn('badRequest', response)
|
|
|
|
# Missing token field
|
|
msg = {
|
|
c.ACTION_FIELD: 'ARCHIVE',
|
|
c.OBJ_STORE_TYPE_FIELD: 'Swift',
|
|
c.OBJ_STORE_BASEPATH_FIELD: "/lbaaslogs",
|
|
c.OBJ_STORE_ENDPOINT_FIELD: "https://example.com",
|
|
c.LBLIST_FIELD: [{'protocol': 'http', 'id': '123'}]
|
|
}
|
|
controller = c(self.logger, null_driver, msg)
|
|
response = controller.run()
|
|
self.assertIn('badRequest', response)
|
|
|
|
# Missing load balancer field
|
|
msg = {
|
|
c.ACTION_FIELD: 'ARCHIVE',
|
|
c.OBJ_STORE_TYPE_FIELD: 'Swift',
|
|
c.OBJ_STORE_BASEPATH_FIELD: "/lbaaslogs",
|
|
c.OBJ_STORE_ENDPOINT_FIELD: "https://example.com",
|
|
c.OBJ_STORE_TOKEN_FIELD: "XXXX"
|
|
}
|
|
controller = c(self.logger, null_driver, msg)
|
|
response = controller.run()
|
|
self.assertIn('badRequest', response)
|
|
|
|
def testArchiveNotImplemented(self):
|
|
msg = {
|
|
c.ACTION_FIELD: 'ARCHIVE',
|
|
c.OBJ_STORE_TYPE_FIELD: 'Swift',
|
|
c.OBJ_STORE_BASEPATH_FIELD: "/lbaaslogs",
|
|
c.OBJ_STORE_ENDPOINT_FIELD: "https://example.com",
|
|
c.OBJ_STORE_TOKEN_FIELD: "XXXX",
|
|
c.LBLIST_FIELD: [{'protocol': 'http', 'id': '123'}]
|
|
}
|
|
null_driver = LoadBalancerDriver()
|
|
controller = c(self.logger, null_driver, msg)
|
|
response = controller.run()
|
|
self.assertEquals(response[c.RESPONSE_FIELD], c.RESPONSE_FAILURE)
|
|
self.assertIn(c.ERROR_FIELD, response)
|
|
self.assertEquals(response[c.ERROR_FIELD],
|
|
"Selected driver does not support ARCHIVE action.")
|