From 9869cc1d100ced5f50cf03b557639835c364fbb5 Mon Sep 17 00:00:00 2001 From: Dhanashree Gosavi Date: Fri, 7 Feb 2014 22:28:55 -0800 Subject: [PATCH] Add support for router scheduling in Cisco N1kv Plugin Added functionality for router and network scheduling in Cisco N1kv Plugin. Change-Id: I1a8d27670d10ca26fb62a8d02230a1aaf3e7bbca Closes-Bug: #1286412 --- .../plugins/cisco/n1kv/n1kv_neutron_plugin.py | 42 ++++++++++++++++--- .../tests/unit/cisco/n1kv/test_n1kv_plugin.py | 12 ++++++ 2 files changed, 48 insertions(+), 6 deletions(-) diff --git a/neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py b/neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py index 028808b9f..badb7fe37 100644 --- a/neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py +++ b/neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py @@ -21,6 +21,8 @@ import eventlet +from oslo.config import cfg as q_conf + from neutron.api.rpc.agentnotifiers import dhcp_rpc_agent_api from neutron.api.rpc.agentnotifiers import l3_rpc_agent_api from neutron.api.v2 import attributes @@ -35,11 +37,12 @@ from neutron.db import db_base_plugin_v2 from neutron.db import dhcp_rpc_base from neutron.db import external_net_db from neutron.db import extraroute_db -from neutron.db import l3_db +from neutron.db import l3_agentschedulers_db from neutron.db import l3_rpc_base from neutron.db import portbindings_db from neutron.extensions import portbindings from neutron.extensions import providernet +from neutron.openstack.common import importutils from neutron.openstack.common import log as logging from neutron.openstack.common import rpc from neutron.openstack.common import uuidutils as uuidutils @@ -78,12 +81,12 @@ class N1kvRpcCallbacks(dhcp_rpc_base.DhcpRpcCallbackMixin, class N1kvNeutronPluginV2(db_base_plugin_v2.NeutronDbPluginV2, external_net_db.External_net_db_mixin, extraroute_db.ExtraRoute_db_mixin, - l3_db.L3_NAT_db_mixin, portbindings_db.PortBindingMixin, n1kv_db_v2.NetworkProfile_db_mixin, n1kv_db_v2.PolicyProfile_db_mixin, network_db_v2.Credential_db_mixin, - agentschedulers_db.AgentSchedulerDbMixin): + l3_agentschedulers_db.L3AgentSchedulerDbMixin, + agentschedulers_db.DhcpAgentSchedulerDbMixin): """ Implement the Neutron abstractions using Cisco Nexus1000V. @@ -99,7 +102,9 @@ class N1kvNeutronPluginV2(db_base_plugin_v2.NeutronDbPluginV2, supported_extension_aliases = ["provider", "agent", "n1kv", "network_profile", "policy_profile", "external-net", "router", - "binding", "credential"] + "binding", "credential", + "l3_agent_scheduler", + "dhcp_agent_scheduler"] def __init__(self, configfile=None): """ @@ -119,6 +124,12 @@ class N1kvNeutronPluginV2(db_base_plugin_v2.NeutronDbPluginV2, c_cred.Store.initialize() self._setup_vsm() self._setup_rpc() + self.network_scheduler = importutils.import_object( + q_conf.CONF.network_scheduler_driver + ) + self.router_scheduler = importutils.import_object( + q_conf.CONF.router_scheduler_driver + ) def _setup_rpc(self): # RPC support @@ -1155,7 +1166,9 @@ class N1kvNeutronPluginV2(db_base_plugin_v2.NeutronDbPluginV2, :returns: port object """ if ('device_id' in port['port'] and port['port']['device_owner'] in - [constants.DEVICE_OWNER_DHCP, constants.DEVICE_OWNER_ROUTER_INTF]): + [constants.DEVICE_OWNER_DHCP, constants.DEVICE_OWNER_ROUTER_INTF, + constants.DEVICE_OWNER_ROUTER_GW, + constants.DEVICE_OWNER_FLOATINGIP]): p_profile_name = c_conf.CISCO_N1K.network_node_policy_profile p_profile = self._get_policy_profile_by_name(p_profile_name) if p_profile: @@ -1413,4 +1426,21 @@ class N1kvNeutronPluginV2(db_base_plugin_v2.NeutronDbPluginV2, net_profile_id, network_profile)) self._send_update_network_profile_request(net_p) - return net_p + return net_p + + def create_router(self, context, router): + """ + Handle creation of router. + + Schedule router to L3 agent as part of the create handling. + :param context: neutron api request context + :param router: router dictionary + :returns: router object + """ + session = context.session + with session.begin(subtransactions=True): + rtr = (super(N1kvNeutronPluginV2, self). + create_router(context, router)) + LOG.debug(_("Scheduling router %s"), rtr['id']) + self.schedule_router(context, rtr['id']) + return rtr diff --git a/neutron/tests/unit/cisco/n1kv/test_n1kv_plugin.py b/neutron/tests/unit/cisco/n1kv/test_n1kv_plugin.py index 0891ab80e..d9dc4cf3b 100644 --- a/neutron/tests/unit/cisco/n1kv/test_n1kv_plugin.py +++ b/neutron/tests/unit/cisco/n1kv/test_n1kv_plugin.py @@ -37,6 +37,8 @@ from neutron.tests.unit import _test_extension_portbindings as test_bindings from neutron.tests.unit.cisco.n1kv import fake_client from neutron.tests.unit import test_api_v2 from neutron.tests.unit import test_db_plugin as test_plugin +from neutron.tests.unit import test_l3_plugin +from neutron.tests.unit import test_l3_schedulers PHYS_NET = 'some-phys-net' @@ -546,3 +548,13 @@ class TestN1kvSubnets(test_plugin.TestSubnetsV2, N1kvPluginTestCase): pass + + +class TestN1kvL3Test(test_l3_plugin.L3NatExtensionTestCase): + + pass + + +class TestN1kvL3SchedulersTest(test_l3_schedulers.L3SchedulerTestCase): + + pass -- 2.45.2