From fdad941d3e01688b043bb7e780ae97b5fa0141d5 Mon Sep 17 00:00:00 2001 From: gongysh Date: Fri, 1 Mar 2013 17:06:23 +0800 Subject: [PATCH] enable linuxbridge for agent scheduler 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 | 26 ++++++++++++--- .../versions/4692d074d587_agent_scheduler.py | 4 ++- .../511471cc46b_agent_ext_model_supp.py | 1 + quantum/plugins/linuxbridge/common/config.py | 2 ++ .../plugins/linuxbridge/lb_quantum_plugin.py | 15 +++++++-- .../nicira/nicira_nvp_plugin/QuantumPlugin.py | 13 -------- .../plugins/openvswitch/ovs_quantum_plugin.py | 18 ----------- .../unit/linuxbridge/test_agent_scheduler.py | 32 +++++++++++++++++++ 8 files changed, 72 insertions(+), 39 deletions(-) create mode 100644 quantum/tests/unit/linuxbridge/test_agent_scheduler.py diff --git a/quantum/db/agentschedulers_db.py b/quantum/db/agentschedulers_db.py index bf04be20e..bb82979a9 100644 --- a/quantum/db/agentschedulers_db.py +++ b/quantum/db/agentschedulers_db.py @@ -15,21 +15,17 @@ # 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 diff --git a/quantum/db/migration/alembic_migrations/versions/4692d074d587_agent_scheduler.py b/quantum/db/migration/alembic_migrations/versions/4692d074d587_agent_scheduler.py index 2d28fff2c..6594fc672 100644 --- a/quantum/db/migration/alembic_migrations/versions/4692d074d587_agent_scheduler.py +++ b/quantum/db/migration/alembic_migrations/versions/4692d074d587_agent_scheduler.py @@ -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 diff --git a/quantum/db/migration/alembic_migrations/versions/511471cc46b_agent_ext_model_supp.py b/quantum/db/migration/alembic_migrations/versions/511471cc46b_agent_ext_model_supp.py index 7c8855c90..7410b4201 100644 --- a/quantum/db/migration/alembic_migrations/versions/511471cc46b_agent_ext_model_supp.py +++ b/quantum/db/migration/alembic_migrations/versions/511471cc46b_agent_ext_model_supp.py @@ -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 diff --git a/quantum/plugins/linuxbridge/common/config.py b/quantum/plugins/linuxbridge/common/config.py index 327bad385..dea8d685d 100644 --- a/quantum/plugins/linuxbridge/common/config.py +++ b/quantum/plugins/linuxbridge/common/config.py @@ -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) diff --git a/quantum/plugins/linuxbridge/lb_quantum_plugin.py b/quantum/plugins/linuxbridge/lb_quantum_plugin.py index 43ce8de02..fa38b2229 100644 --- a/quantum/plugins/linuxbridge/lb_quantum_plugin.py +++ b/quantum/plugins/linuxbridge/lb_quantum_plugin.py @@ -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 = {} diff --git a/quantum/plugins/nicira/nicira_nvp_plugin/QuantumPlugin.py b/quantum/plugins/nicira/nicira_nvp_plugin/QuantumPlugin.py index 2f1cb6bad..05498cb58 100644 --- a/quantum/plugins/nicira/nicira_nvp_plugin/QuantumPlugin.py +++ b/quantum/plugins/nicira/nicira_nvp_plugin/QuantumPlugin.py @@ -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 diff --git a/quantum/plugins/openvswitch/ovs_quantum_plugin.py b/quantum/plugins/openvswitch/ovs_quantum_plugin.py index 54acdb8ca..8fadc4e97 100644 --- a/quantum/plugins/openvswitch/ovs_quantum_plugin.py +++ b/quantum/plugins/openvswitch/ovs_quantum_plugin.py @@ -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 index 000000000..bdd3f5735 --- /dev/null +++ b/quantum/tests/unit/linuxbridge/test_agent_scheduler.py @@ -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 -- 2.45.2