diff --git a/etc/neutron_lbaas.conf b/etc/neutron_lbaas.conf index f6413a99d..890113abb 100644 --- a/etc/neutron_lbaas.conf +++ b/etc/neutron_lbaas.conf @@ -54,9 +54,11 @@ service_provider=LOADBALANCER:Haproxy:neutron_lbaas.services.loadbalancer.driver # service_provider=LOADBALANCER:NetScaler:neutron_lbaas.services.loadbalancer.drivers.netscaler.netscaler_driver.NetScalerPluginDriver # service_provider=LOADBALANCER:Embrane:neutron_lbaas.services.loadbalancer.drivers.embrane.driver.EmbraneLbaas:default # service_provider = LOADBALANCER:A10Networks:neutron_lbaas.services.loadbalancer.drivers.a10networks.driver_v1.ThunderDriver:default + # LBaaS v2 drivers # service_provider = LOADBALANCERV2:LoggingNoop:neutron_lbaas.drivers.logging_noop.driver.LoggingNoopLoadBalancerDriver:default # service_provider=LOADBALANCERV2:Haproxy:neutron_lbaas.drivers.haproxy.plugin_driver.HaproxyOnHostPluginDriver:default +# service_provider = LOADBALANCERV2:A10Networks:neutron_lbaas.drivers.a10networks.driver_v2.ThunderDriver:default [certificates] # cert_manager_class = neutron_lbaas.common.cert_manager.local_cert_manager diff --git a/neutron_lbaas/drivers/a10networks/__init__.py b/neutron_lbaas/drivers/a10networks/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/neutron_lbaas/drivers/a10networks/driver_v2.py b/neutron_lbaas/drivers/a10networks/driver_v2.py new file mode 100644 index 000000000..e842b5a32 --- /dev/null +++ b/neutron_lbaas/drivers/a10networks/driver_v2.py @@ -0,0 +1,104 @@ +# Copyright 2015, Doug Wiegley (dougwig), A10 Networks +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +import a10_neutron_lbaas +from oslo_log import log as logging + +from neutron_lbaas.drivers import driver_base + +VERSION = "2.0.0" +LOG = logging.getLogger(__name__) + + +class ThunderDriver(driver_base.LoadBalancerBaseDriver): + + def __init__(self, plugin): + super(ThunderDriver, self).__init__(plugin) + + self.load_balancer = LoadBalancerManager(self) + self.listener = ListenerManager(self) + self.pool = PoolManager(self) + self.member = MemberManager(self) + self.health_monitor = HealthMonitorManager(self) + + LOG.debug("A10Driver: v2 initializing, version=%s, lbaas_manager=%s", + VERSION, a10_neutron_lbaas.VERSION) + + self.a10 = a10_neutron_lbaas.A10OpenstackLBV2(self) + + +class LoadBalancerManager(driver_base.BaseLoadBalancerManager): + + def create(self, context, lb): + self.driver.a10.lb.create(context, lb) + + def update(self, context, old_lb, lb): + self.driver.a10.lb.update(context, old_lb, lb) + + def delete(self, context, lb): + self.driver.a10.lb.delete(context, lb) + + def refresh(self, context, lb): + self.driver.a10.lb.refresh(context, lb) + + def stats(self, context, lb): + return self.driver.a10.lb.stats(context, lb) + + +class ListenerManager(driver_base.BaseListenerManager): + + def create(self, context, listener): + self.driver.a10.listener.create(context, listener) + + def update(self, context, old_listener, listener): + self.driver.a10.listener.update(context, old_listener, listener) + + def delete(self, context, listener): + self.driver.a10.listener.delete(context, listener) + + +class PoolManager(driver_base.BasePoolManager): + + def create(self, context, pool): + self.driver.a10.pool.create(context, pool) + + def update(self, context, old_pool, pool): + self.driver.a10.pool.update(context, old_pool, pool) + + def delete(self, context, pool): + self.driver.a10.pool.delete(context, pool) + + +class MemberManager(driver_base.BaseMemberManager): + + def create(self, context, member): + self.driver.a10.member.create(context, member) + + def update(self, context, old_member, member): + self.driver.a10.member.update(context, old_member, member) + + def delete(self, context, member): + self.driver.a10.member.delete(context, member) + + +class HealthMonitorManager(driver_base.BaseHealthMonitorManager): + + def create(self, context, hm): + self.driver.a10.hm.create(context, hm) + + def update(self, context, old_hm, hm): + self.driver.a10.hm.update(context, old_hm, hm) + + def delete(self, context, hm): + self.driver.a10.hm.delete(context, hm) diff --git a/neutron_lbaas/tests/unit/drivers/a10networks/__init__.py b/neutron_lbaas/tests/unit/drivers/a10networks/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/neutron_lbaas/tests/unit/drivers/a10networks/test_driver_v2.py b/neutron_lbaas/tests/unit/drivers/a10networks/test_driver_v2.py new file mode 100644 index 000000000..c587cff94 --- /dev/null +++ b/neutron_lbaas/tests/unit/drivers/a10networks/test_driver_v2.py @@ -0,0 +1,97 @@ +# Copyright 2015, Doug Wiegley (dougwig), A10 Networks +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +import sys + +import mock +from neutron import context + +from neutron_lbaas.tests.unit.db.loadbalancer import test_db_loadbalancerv2 + +with mock.patch.dict(sys.modules, {'a10_neutron_lbaas': mock.Mock()}): + from neutron_lbaas.drivers.a10networks import driver_v2 + + +class FakeModel(object): + def __init__(self, id): + self.id = id + self.address = '1.1.1.1' + self.tenant_id = "tennant-was-a-great-doctor" + + +class ManagerTest(object): + def __init__(self, parent, manager, model, mocked_root): + self.parent = parent + self.context = parent.context + self.driver = parent.driver + self.manager = manager + self.model = model + self.mocked_root = mocked_root + + self.create(model) + self.update(model, model) + self.delete(model) + + def create(self, model): + self.manager.create(self.context, model) + self.mocked_root.create.assert_called_with(self.context, model) + + def update(self, old_model, model): + self.manager.update(self.context, old_model, model) + self.mocked_root.update.assert_called_with(self.context, + old_model, model) + + def delete(self, model): + self.manager.delete(self.context, model) + self.mocked_root.delete.assert_called_with(self.context, model) + + def refresh(self): + self.manager.refresh(self.context, self.model) + self.mocked_root.refresh.assert_called_with(self.context, self.model) + + def stats(self): + self.manager.stats(self.context, self.model) + self.mocked_root.stats.assert_called_with(self.context, self.model) + + +class TestA10ThunderDriver(test_db_loadbalancerv2.LbaasPluginDbTestCase): + + def setUp(self): + super(TestA10ThunderDriver, self).setUp() + self.context = context.get_admin_context() + self.plugin = mock.Mock() + self.driver = driver_v2.ThunderDriver(self.plugin) + self.driver.a10 = mock.Mock() + + def test_load_balancer_ops(self): + m = ManagerTest(self, self.driver.load_balancer, + FakeModel("loadbalancer-a10"), self.driver.a10.lb) + m.refresh() + m.stats() + + def test_listener_ops(self): + ManagerTest(self, self.driver.listener, FakeModel("listener-a10"), + self.driver.a10.listener) + + def test_pool_ops(self): + ManagerTest(self, self.driver.pool, FakeModel("pool-10"), + self.driver.a10.pool) + + def test_member_ops(self): + ManagerTest(self, self.driver.member, FakeModel("member-a10"), + self.driver.a10.member) + + def test_health_monitor_ops(self): + ManagerTest(self, self.driver.health_monitor, FakeModel("hm-a10"), + self.driver.a10.hm)