A10 Networks LBaaS v2 Driver

Change-Id: I05fc66493b3fc9f9a4f2048c86c0b1ff01319d61
Implements: blueprint a10-lbaas-v2-driver
This commit is contained in:
Doug Wiegley 2014-07-14 23:50:31 -06:00
parent 53ef6171c6
commit 6fa0839dd9
5 changed files with 203 additions and 0 deletions

View File

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

View File

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

View File

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