From aa82d51961865428bc3b2c8b26faefa85eb43e90 Mon Sep 17 00:00:00 2001 From: Michael Johnson Date: Fri, 18 Jan 2019 13:49:34 -0800 Subject: [PATCH] Update the amphora driver for flavor support. This patch updates the amphroa driver to pass the flavor dictionary over to the controller worker at load balancer creation time. This flavor dictionary is then inserted into the load balancer creation flow. Change-Id: I615937fdf9edf335fb18999f1b7c11eb6202a3d1 --- octavia/api/drivers/amphora_driver/driver.py | 8 +++++++- octavia/common/constants.py | 3 +++ octavia/controller/queue/endpoint.py | 7 ++++--- octavia/controller/worker/controller_worker.py | 7 +++++-- .../drivers/amphora_driver/test_amphora_driver.py | 3 ++- octavia/tests/unit/controller/queue/test_endpoint.py | 10 +++++++++- .../unit/controller/worker/test_controller_worker.py | 12 ++++++++---- 7 files changed, 38 insertions(+), 12 deletions(-) diff --git a/octavia/api/drivers/amphora_driver/driver.py b/octavia/api/drivers/amphora_driver/driver.py index 0a25d0a72c..875fb8d63f 100644 --- a/octavia/api/drivers/amphora_driver/driver.py +++ b/octavia/api/drivers/amphora_driver/driver.py @@ -20,6 +20,7 @@ from oslo_log import log as logging import oslo_messaging as messaging from octavia.api.drivers.amphora_driver import flavor_schema +from octavia.api.drivers import data_models as driver_dm from octavia.api.drivers import exceptions from octavia.api.drivers import provider_base as driver_base from octavia.api.drivers import utils as driver_utils @@ -63,8 +64,13 @@ class AmphoraProviderDriver(driver_base.ProviderDriver): vip.port_id, loadbalancer_id) return driver_utils.vip_dict_to_provider_dict(vip.to_dict()) + # TODO(johnsom) convert this to octavia_lib constant flavor + # once octavia is transitioned to use octavia_lib def loadbalancer_create(self, loadbalancer): - payload = {consts.LOAD_BALANCER_ID: loadbalancer.loadbalancer_id} + if loadbalancer.flavor == driver_dm.Unset: + loadbalancer.flavor = None + payload = {consts.LOAD_BALANCER_ID: loadbalancer.loadbalancer_id, + consts.FLAVOR: loadbalancer.flavor} self.client.cast({}, 'create_load_balancer', **payload) def loadbalancer_delete(self, loadbalancer, cascade=False): diff --git a/octavia/common/constants.py b/octavia/common/constants.py index 0f52a3c8bb..370ce69bd1 100644 --- a/octavia/common/constants.py +++ b/octavia/common/constants.py @@ -561,6 +561,9 @@ AMP_NETNS_SVC_PREFIX = 'amphora-netns' # Amphora Feature Compatibility HTTP_REUSE = 'has_http_reuse' +# TODO(johnsom) convert this to octavia_lib constant flavor +# once octavia is transitioned to use octavia_lib +FLAVOR = 'flavor' FLAVOR_DATA = 'flavor_data' # Flavor metadata diff --git a/octavia/controller/queue/endpoint.py b/octavia/controller/queue/endpoint.py index 219725d87d..82a7077105 100644 --- a/octavia/controller/queue/endpoint.py +++ b/octavia/controller/queue/endpoint.py @@ -30,7 +30,7 @@ class Endpoint(object): # 1.0 - Initial version. target = messaging.Target( namespace=constants.RPC_NAMESPACE_CONTROLLER_AGENT, - version='1.0') + version='1.1') def __init__(self): self.worker = stevedore_driver.DriverManager( @@ -39,9 +39,10 @@ class Endpoint(object): invoke_on_load=True ).driver - def create_load_balancer(self, context, load_balancer_id): + def create_load_balancer(self, context, load_balancer_id, + flavor=None): LOG.info('Creating load balancer \'%s\'...', load_balancer_id) - self.worker.create_load_balancer(load_balancer_id) + self.worker.create_load_balancer(load_balancer_id, flavor) def update_load_balancer(self, context, load_balancer_id, load_balancer_updates): diff --git a/octavia/controller/worker/controller_worker.py b/octavia/controller/worker/controller_worker.py index 9209722870..6e950597c0 100644 --- a/octavia/controller/worker/controller_worker.py +++ b/octavia/controller/worker/controller_worker.py @@ -320,7 +320,7 @@ class ControllerWorker(base_taskflow.BaseTaskFlowEngine): wait=tenacity.wait_incrementing( RETRY_INITIAL_DELAY, RETRY_BACKOFF, RETRY_MAX), stop=tenacity.stop_after_attempt(RETRY_ATTEMPTS)) - def create_load_balancer(self, load_balancer_id): + def create_load_balancer(self, load_balancer_id, flavor=None): """Creates a load balancer by allocating Amphorae. First tries to allocate an existing Amphora in READY state. @@ -337,9 +337,12 @@ class ControllerWorker(base_taskflow.BaseTaskFlowEngine): '60 seconds.', 'load_balancer', load_balancer_id) raise db_exceptions.NoResultFound + # TODO(johnsom) convert this to octavia_lib constant flavor + # once octavia is transitioned to use octavia_lib store = {constants.LOADBALANCER_ID: load_balancer_id, constants.BUILD_TYPE_PRIORITY: - constants.LB_CREATE_NORMAL_PRIORITY} + constants.LB_CREATE_NORMAL_PRIORITY, + constants.FLAVOR: flavor} topology = lb.topology diff --git a/octavia/tests/unit/api/drivers/amphora_driver/test_amphora_driver.py b/octavia/tests/unit/api/drivers/amphora_driver/test_amphora_driver.py index 355f2e71ee..bdf558a2ec 100644 --- a/octavia/tests/unit/api/drivers/amphora_driver/test_amphora_driver.py +++ b/octavia/tests/unit/api/drivers/amphora_driver/test_amphora_driver.py @@ -59,7 +59,8 @@ class TestAmphoraDriver(base.TestCase): provider_lb = driver_dm.LoadBalancer( loadbalancer_id=self.sample_data.lb_id) self.amp_driver.loadbalancer_create(provider_lb) - payload = {consts.LOAD_BALANCER_ID: self.sample_data.lb_id} + payload = {consts.LOAD_BALANCER_ID: self.sample_data.lb_id, + consts.FLAVOR: None} mock_cast.assert_called_with({}, 'create_load_balancer', **payload) @mock.patch('oslo_messaging.RPCClient.cast') diff --git a/octavia/tests/unit/controller/queue/test_endpoint.py b/octavia/tests/unit/controller/queue/test_endpoint.py index 9be458ea83..f72f6b19ce 100644 --- a/octavia/tests/unit/controller/queue/test_endpoint.py +++ b/octavia/tests/unit/controller/queue/test_endpoint.py @@ -15,6 +15,7 @@ import mock from oslo_config import cfg from oslo_config import fixture as oslo_fixture +from oslo_utils import uuidutils from octavia.controller.queue import endpoint from octavia.controller.worker import controller_worker @@ -39,11 +40,18 @@ class TestEndpoint(base.TestCase): self.resource_updates = {} self.resource_id = 1234 self.server_group_id = 3456 + self.flavor_id = uuidutils.generate_uuid() def test_create_load_balancer(self): + self.ep.create_load_balancer(self.context, self.resource_id, + flavor=self.flavor_id) + self.ep.worker.create_load_balancer.assert_called_once_with( + self.resource_id, self.flavor_id) + + def test_create_load_balancer_no_flavor(self): self.ep.create_load_balancer(self.context, self.resource_id) self.ep.worker.create_load_balancer.assert_called_once_with( - self.resource_id) + self.resource_id, None) def test_update_load_balancer(self): self.ep.update_load_balancer(self.context, self.resource_id, diff --git a/octavia/tests/unit/controller/worker/test_controller_worker.py b/octavia/tests/unit/controller/worker/test_controller_worker.py index 944ada82aa..c2c926a379 100644 --- a/octavia/tests/unit/controller/worker/test_controller_worker.py +++ b/octavia/tests/unit/controller/worker/test_controller_worker.py @@ -420,7 +420,8 @@ class TestControllerWorker(base.TestCase): store = { constants.LOADBALANCER_ID: LB_ID, 'update_dict': {'topology': constants.TOPOLOGY_SINGLE}, - constants.BUILD_TYPE_PRIORITY: constants.LB_CREATE_NORMAL_PRIORITY + constants.BUILD_TYPE_PRIORITY: constants.LB_CREATE_NORMAL_PRIORITY, + constants.FLAVOR: None } lb_mock = mock.MagicMock() lb_mock.listeners = [] @@ -466,7 +467,8 @@ class TestControllerWorker(base.TestCase): store = { constants.LOADBALANCER_ID: LB_ID, 'update_dict': {'topology': constants.TOPOLOGY_ACTIVE_STANDBY}, - constants.BUILD_TYPE_PRIORITY: constants.LB_CREATE_NORMAL_PRIORITY + constants.BUILD_TYPE_PRIORITY: constants.LB_CREATE_NORMAL_PRIORITY, + constants.FLAVOR: None } setattr(mock_lb_repo_get.return_value, 'topology', constants.TOPOLOGY_ACTIVE_STANDBY) @@ -512,7 +514,8 @@ class TestControllerWorker(base.TestCase): store = { constants.LOADBALANCER_ID: LB_ID, 'update_dict': {'topology': constants.TOPOLOGY_SINGLE}, - constants.BUILD_TYPE_PRIORITY: constants.LB_CREATE_NORMAL_PRIORITY + constants.BUILD_TYPE_PRIORITY: constants.LB_CREATE_NORMAL_PRIORITY, + constants.FLAVOR: None } cw = controller_worker.ControllerWorker() @@ -564,7 +567,8 @@ class TestControllerWorker(base.TestCase): store = { constants.LOADBALANCER_ID: LB_ID, 'update_dict': {'topology': constants.TOPOLOGY_ACTIVE_STANDBY}, - constants.BUILD_TYPE_PRIORITY: constants.LB_CREATE_NORMAL_PRIORITY + constants.BUILD_TYPE_PRIORITY: constants.LB_CREATE_NORMAL_PRIORITY, + constants.FLAVOR: None } cw = controller_worker.ControllerWorker()