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
This commit is contained in:
Michael Johnson 2019-01-18 13:49:34 -08:00
parent 5e1cdac4c9
commit aa82d51961
7 changed files with 38 additions and 12 deletions

View File

@ -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):

View File

@ -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

View File

@ -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):

View File

@ -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

View File

@ -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')

View File

@ -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,

View File

@ -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()