]> review.fuel-infra Code Review - openstack-build/neutron-build.git/commitdiff
enable linuxbridge for agent scheduler
authorgongysh <gongysh@linux.vnet.ibm.com>
Fri, 1 Mar 2013 09:06:23 +0000 (17:06 +0800)
committergongysh <gongysh@linux.vnet.ibm.com>
Sat, 2 Mar 2013 10:20:26 +0000 (18:20 +0800)
Bug #1135793
blueprint quantum-scheduler

In addition, we refactor agent scheduler so that we will make
it easier to enable plugin to support agent scheduler.

Change-Id: I0d5cc8bcea644720a3c5cbe92486ce8d8ecd248c

quantum/db/agentschedulers_db.py
quantum/db/migration/alembic_migrations/versions/4692d074d587_agent_scheduler.py
quantum/db/migration/alembic_migrations/versions/511471cc46b_agent_ext_model_supp.py
quantum/plugins/linuxbridge/common/config.py
quantum/plugins/linuxbridge/lb_quantum_plugin.py
quantum/plugins/nicira/nicira_nvp_plugin/QuantumPlugin.py
quantum/plugins/openvswitch/ovs_quantum_plugin.py
quantum/tests/unit/linuxbridge/test_agent_scheduler.py [new file with mode: 0644]

index bf04be20e288be6ca23faba612ddba2c54d69c1b..bb82979a97132dbc03a9d290d640825d14ee1f0e 100644 (file)
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
-import copy
-
 import sqlalchemy as sa
 from sqlalchemy import orm
 from sqlalchemy.orm import exc
 from sqlalchemy.orm import joinedload
 
-from quantum.api.v2 import attributes
 from quantum.common import constants
 from quantum.db import agents_db
 from quantum.db import model_base
 from quantum.db import models_v2
 from quantum.extensions import agentscheduler
 from quantum.openstack.common import log as logging
-from quantum.openstack.common import uuidutils
 
 
 LOG = logging.getLogger(__name__)
@@ -57,7 +53,8 @@ class RouterL3AgentBinding(model_base.BASEV2, models_v2.HasId):
                                           ondelete='CASCADE'))
 
 
-class AgentSchedulerDbMixin(agentscheduler.AgentSchedulerPluginBase):
+class AgentSchedulerDbMixin(agentscheduler.AgentSchedulerPluginBase,
+                            agents_db.AgentDbMixin):
     """Mixin class to add agent scheduler extension to db_plugin_base_v2."""
 
     dhcp_agent_notifier = None
@@ -362,3 +359,22 @@ class AgentSchedulerDbMixin(agentscheduler.AgentSchedulerPluginBase):
         """
         for router in routers:
             self.schedule_router(context, router)
+
+    def update_agent(self, context, id, agent):
+        original_agent = self.get_agent(context, id)
+        result = super(AgentSchedulerDbMixin, self).update_agent(
+            context, id, agent)
+        agent_data = agent['agent']
+        if ('admin_state_up' in agent_data and
+            original_agent['admin_state_up'] != agent_data['admin_state_up']):
+            if (original_agent['agent_type'] == constants.AGENT_TYPE_DHCP and
+                self.dhcp_agent_notifier):
+                self.dhcp_agent_notifier.agent_updated(
+                    context, agent_data['admin_state_up'],
+                    original_agent['host'])
+            elif (original_agent['agent_type'] == constants.AGENT_TYPE_L3 and
+                  self.l3_agent_notifier):
+                self.l3_agent_notifier.agent_updated(
+                    context, agent_data['admin_state_up'],
+                    original_agent['host'])
+        return result
index 2d28fff2cbd15ac37c5e152868b88f58a4167d4c..6594fc672351bd94dd0c98cd803d9670dd9e2312 100644 (file)
@@ -30,7 +30,9 @@ down_revision = '3b54bf9e29f7'
 # Change to ['*'] if this migration applies to all plugins
 
 migration_for_plugins = [
-    'quantum.plugins.openvswitch.ovs_quantum_plugin.OVSQuantumPluginV2'
+    'quantum.plugins.openvswitch.ovs_quantum_plugin.OVSQuantumPluginV2',
+    'quantum.plugins.linuxbridge.lb_quantum_plugin.LinuxBridgePluginV2',
+    'quantum.plugins.nicira.nicira_nvp_plugin.QuantumPlugin.NvpPluginV2',
 ]
 
 from alembic import op
index 7c8855c90eed6ec414acb96eab8e3c5ce42325a1..7410b42010cbbdcdc90c1131ba21c6da37929dfb 100644 (file)
@@ -32,6 +32,7 @@ down_revision = '363468ac592c'
 migration_for_plugins = [
     'quantum.plugins.openvswitch.ovs_quantum_plugin.OVSQuantumPluginV2',
     'quantum.plugins.linuxbridge.lb_quantum_plugin.LinuxBridgePluginV2',
+    'quantum.plugins.nicira.nicira_nvp_plugin.QuantumPlugin.NvpPluginV2',
 ]
 
 from alembic import op
index 327bad3855fcf842033b402c97c0c05808da95b5..dea8d685d1db6aa24e7c70c8e0636e3ce5fc6465 100644 (file)
@@ -20,6 +20,7 @@
 from oslo.config import cfg
 
 from quantum.agent.common import config
+from quantum import scheduler
 
 DEFAULT_VLAN_RANGES = []
 DEFAULT_INTERFACE_MAPPINGS = []
@@ -51,5 +52,6 @@ agent_opts = [
 cfg.CONF.register_opts(vlan_opts, "VLANS")
 cfg.CONF.register_opts(bridge_opts, "LINUX_BRIDGE")
 cfg.CONF.register_opts(agent_opts, "AGENT")
+cfg.CONF.register_opts(scheduler.AGENTS_SCHEDULER_OPTS)
 config.register_agent_state_opts_helper(cfg.CONF)
 config.register_root_helper(cfg.CONF)
index 43ce8de0233af007c9d3a18ba7b2c1a3278b8fac..fa38b2229e1168eaa04d7393e220a08bc75169cd 100644 (file)
@@ -18,6 +18,8 @@ import sys
 from oslo.config import cfg
 
 from quantum.agent import securitygroups_rpc as sg_rpc
+from quantum.api.rpc.agentnotifiers import dhcp_rpc_agent_api
+from quantum.api.rpc.agentnotifiers import l3_rpc_agent_api
 from quantum.api.v2 import attributes
 from quantum.common import constants as q_const
 from quantum.common import exceptions as q_exc
@@ -25,6 +27,7 @@ from quantum.common import rpc as q_rpc
 from quantum.common import topics
 from quantum.common import utils
 from quantum.db import agents_db
+from quantum.db import agentschedulers_db
 from quantum.db import api as db_api
 from quantum.db import db_base_plugin_v2
 from quantum.db import dhcp_rpc_base
@@ -36,6 +39,7 @@ from quantum.db import securitygroups_rpc_base as sg_db_rpc
 from quantum.extensions import portbindings
 from quantum.extensions import providernet as provider
 from quantum.extensions import securitygroup as ext_sg
+from quantum.openstack.common import importutils
 from quantum.openstack.common import log as logging
 from quantum.openstack.common import rpc
 from quantum.openstack.common.rpc import proxy
@@ -174,7 +178,7 @@ class AgentNotifierApi(proxy.RpcProxy,
 class LinuxBridgePluginV2(db_base_plugin_v2.QuantumDbPluginV2,
                           extraroute_db.ExtraRoute_db_mixin,
                           sg_db_rpc.SecurityGroupServerRpcMixin,
-                          agents_db.AgentDbMixin):
+                          agentschedulers_db.AgentSchedulerDbMixin):
     """Implement the Quantum abstractions using Linux bridging.
 
     A new VLAN is created for each network.  An agent is relied upon
@@ -199,7 +203,8 @@ class LinuxBridgePluginV2(db_base_plugin_v2.QuantumDbPluginV2,
     __native_sorting_support = True
 
     supported_extension_aliases = ["provider", "router", "binding", "quotas",
-                                   "security-group", "agent", "extraroute"]
+                                   "security-group", "agent", "extraroute",
+                                   "agent_scheduler"]
 
     network_view = "extension:provider_network:view"
     network_set = "extension:provider_network:set"
@@ -219,6 +224,10 @@ class LinuxBridgePluginV2(db_base_plugin_v2.QuantumDbPluginV2,
                       self.tenant_network_type)
             sys.exit(1)
         self._setup_rpc()
+        self.network_scheduler = importutils.import_object(
+            cfg.CONF.network_scheduler_driver)
+        self.router_scheduler = importutils.import_object(
+            cfg.CONF.router_scheduler_driver)
         LOG.debug(_("Linux Bridge Plugin initialization complete"))
 
     def _setup_rpc(self):
@@ -232,6 +241,8 @@ class LinuxBridgePluginV2(db_base_plugin_v2.QuantumDbPluginV2,
         # Consume from all consumers in a thread
         self.conn.consume_in_thread()
         self.notifier = AgentNotifierApi(topics.AGENT)
+        self.dhcp_agent_notifier = dhcp_rpc_agent_api.DhcpAgentNotifyAPI()
+        self.l3_agent_notifier = l3_rpc_agent_api.L3AgentNotify
 
     def _parse_network_vlan_ranges(self):
         self.network_vlan_ranges = {}
index 2f1cb6badd77947d15552da44e59a3edb0401853..05498cb5824a6738fbb76d46ca192efd132a457a 100644 (file)
@@ -217,7 +217,6 @@ class NvpPluginV2(db_base_plugin_v2.QuantumDbPluginV2,
                   qos_db.NVPQoSDbMixin,
                   nvp_sec.NVPSecurityGroups,
                   nvp_meta.NvpMetadataAccess,
-                  agents_db.AgentDbMixin,
                   agentschedulers_db.AgentSchedulerDbMixin):
     """
     NvpPluginV2 is a Quantum plugin that provides L2 Virtual Network
@@ -2198,15 +2197,3 @@ class NvpPluginV2(db_base_plugin_v2.QuantumDbPluginV2,
             return []
         return super(NvpPluginV2, self).get_qos_queues(context, filters,
                                                        fields)
-
-    def update_agent(self, context, id, agent):
-        original_agent = self.get_agent(context, id)
-        result = super(NvpPluginV2, self).update_agent(context, id, agent)
-        agent_data = agent['agent']
-        if ('admin_state_up' in agent_data and
-            original_agent['admin_state_up'] != agent_data['admin_state_up']):
-            if original_agent['agent_type'] == constants.AGENT_TYPE_DHCP:
-                self.dhcp_agent_notifier.agent_updated(
-                    context, agent_data['admin_state_up'],
-                    original_agent['host'])
-        return result
index 54acdb8ca39e2906f145600c52e93c55b6abcc2a..8fadc4e974a58bee238e2e1dd89b702917681d5d 100644 (file)
@@ -215,7 +215,6 @@ class AgentNotifierApi(proxy.RpcProxy,
 class OVSQuantumPluginV2(db_base_plugin_v2.QuantumDbPluginV2,
                          extraroute_db.ExtraRoute_db_mixin,
                          sg_db_rpc.SecurityGroupServerRpcMixin,
-                         agents_db.AgentDbMixin,
                          agentschedulers_db.AgentSchedulerDbMixin):
 
     """Implement the Quantum abstractions using Open vSwitch.
@@ -644,20 +643,3 @@ class OVSQuantumPluginV2(db_base_plugin_v2.QuantumDbPluginV2,
 
         self.notifier.security_groups_member_updated(
             context, port.get(ext_sg.SECURITYGROUPS))
-
-    def update_agent(self, context, id, agent):
-        original_agent = self.get_agent(context, id)
-        result = super(OVSQuantumPluginV2, self).update_agent(
-            context, id, agent)
-        agent_data = agent['agent']
-        if ('admin_state_up' in agent_data and
-            original_agent['admin_state_up'] != agent_data['admin_state_up']):
-            if original_agent['agent_type'] == q_const.AGENT_TYPE_DHCP:
-                self.dhcp_agent_notifier.agent_updated(
-                    context, agent_data['admin_state_up'],
-                    original_agent['host'])
-            elif original_agent['agent_type'] == q_const.AGENT_TYPE_L3:
-                self.l3_agent_notifier.agent_updated(
-                    context, agent_data['admin_state_up'],
-                    original_agent['host'])
-        return result
diff --git a/quantum/tests/unit/linuxbridge/test_agent_scheduler.py b/quantum/tests/unit/linuxbridge/test_agent_scheduler.py
new file mode 100644 (file)
index 0000000..bdd3f57
--- /dev/null
@@ -0,0 +1,32 @@
+# Copyright (c) 2013 OpenStack, LLC.
+#
+# 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.
+
+from quantum.tests.unit.openvswitch import test_agent_scheduler
+from quantum.tests.unit.linuxbridge import test_linuxbridge_plugin
+
+
+class LbAgentSchedulerTestCase(
+    test_agent_scheduler.OvsAgentSchedulerTestCase):
+    plugin_str = test_linuxbridge_plugin.PLUGIN_NAME
+
+
+class LbL3AgentNotifierTestCase(
+    test_agent_scheduler.OvsL3AgentNotifierTestCase):
+    plugin_str = test_linuxbridge_plugin.PLUGIN_NAME
+
+
+class LbDhcpAgentNotifierTestCase(
+    test_agent_scheduler.OvsDhcpAgentNotifierTestCase):
+    plugin_str = test_linuxbridge_plugin.PLUGIN_NAME