From: Ihar Hrachyshka Date: Sun, 2 Aug 2015 17:17:27 +0000 (+0200) Subject: L2 agent extension manager: read extensions list from config file X-Git-Url: https://review.fuel-infra.org/gitweb?a=commitdiff_plain;h=336a547aad506ccf69a58e7ac11b9ea12e9f66f9;p=openstack-build%2Fneutron-build.git L2 agent extension manager: read extensions list from config file This effectively disables qos extension in the OVS agent, but we don't rely on it in any functional or fullstack tests so far. To enable the extension, a user should add: [agent] extensions = qos to their openvswitch_agent.ini file. DocImpact Partially-Implements: blueprint quantum-qos-api Change-Id: Icfbf32c36f98cc6e203841b152c7f6fc4f48c20a --- diff --git a/etc/neutron/plugins/ml2/openvswitch_agent.ini b/etc/neutron/plugins/ml2/openvswitch_agent.ini index 58ed2908b..5a23d1ea2 100644 --- a/etc/neutron/plugins/ml2/openvswitch_agent.ini +++ b/etc/neutron/plugins/ml2/openvswitch_agent.ini @@ -133,6 +133,11 @@ # # quitting_rpc_timeout = 10 +# (ListOpt) Extensions list to use +# Example: extensions = qos +# +# extensions = + [securitygroup] # Firewall driver for realizing neutron security group function. # firewall_driver = neutron.agent.firewall.NoopFirewallDriver diff --git a/neutron/agent/l2/agent_extensions_manager.py b/neutron/agent/l2/agent_extensions_manager.py index 872e2438d..54d17adcf 100644 --- a/neutron/agent/l2/agent_extensions_manager.py +++ b/neutron/agent/l2/agent_extensions_manager.py @@ -13,6 +13,7 @@ # License for the specific language governing permissions and limitations # under the License. +from oslo_config import cfg from oslo_log import log import stevedore @@ -21,23 +22,26 @@ from neutron.i18n import _LE, _LI LOG = log.getLogger(__name__) -class AgentExtensionsManager(stevedore.named.NamedExtensionManager): - """Manage agent extensions.""" +L2_AGENT_EXT_MANAGER_NAMESPACE = 'neutron.agent.l2.extensions' +L2_AGENT_EXT_MANAGER_OPTS = [ + cfg.ListOpt('extensions', + default=[], + help=_('Extensions list to use')), +] + - def __init__(self): - # Ordered list of agent extensions, defining - # the order in which the agent extensions are called. +def register_opts(conf): + conf.register_opts(L2_AGENT_EXT_MANAGER_OPTS, 'agent') - #TODO(QoS): get extensions from config - agent_extensions = ('qos', ) - LOG.info(_LI("Configured agent extensions names: %s"), - agent_extensions) +class AgentExtensionsManager(stevedore.named.NamedExtensionManager): + """Manage agent extensions.""" + def __init__(self, conf): super(AgentExtensionsManager, self).__init__( - 'neutron.agent.l2.extensions', agent_extensions, + L2_AGENT_EXT_MANAGER_NAMESPACE, conf.agent.extensions, invoke_on_load=True, name_order=True) - LOG.info(_LI("Loaded agent extensions names: %s"), self.names()) + LOG.info(_LI("Loaded agent extensions: %s"), self.names()) def _call_on_agent_extensions(self, method_name, context, data): """Helper method for calling a method across all agent extensions.""" diff --git a/neutron/plugins/ml2/drivers/openvswitch/agent/ovs_neutron_agent.py b/neutron/plugins/ml2/drivers/openvswitch/agent/ovs_neutron_agent.py index bdcda2b95..e9de955f8 100644 --- a/neutron/plugins/ml2/drivers/openvswitch/agent/ovs_neutron_agent.py +++ b/neutron/plugins/ml2/drivers/openvswitch/agent/ovs_neutron_agent.py @@ -367,8 +367,9 @@ class OVSNeutronAgent(sg_rpc.SecurityGroupAgentRpcCallbackMixin, start_listening=False) def init_agent_extensions_mgr(self): + agent_extensions_manager.register_opts(self.conf) self.agent_extensions_mgr = ( - agent_extensions_manager.AgentExtensionsManager()) + agent_extensions_manager.AgentExtensionsManager(self.conf)) self.agent_extensions_mgr.initialize() def get_net_uuid(self, vif_id): diff --git a/neutron/tests/unit/agent/l2/test_agent_extensions_manager.py b/neutron/tests/unit/agent/l2/test_agent_extensions_manager.py index ed2247df6..619973f06 100644 --- a/neutron/tests/unit/agent/l2/test_agent_extensions_manager.py +++ b/neutron/tests/unit/agent/l2/test_agent_extensions_manager.py @@ -11,6 +11,7 @@ # under the License. import mock +from oslo_config import cfg from neutron.agent.l2 import agent_extensions_manager from neutron.tests import base @@ -22,7 +23,10 @@ class TestAgentExtensionsManager(base.BaseTestCase): super(TestAgentExtensionsManager, self).setUp() mock.patch('neutron.agent.l2.extensions.qos_agent.QosAgentExtension', autospec=True).start() - self.manager = agent_extensions_manager.AgentExtensionsManager() + conf = cfg.CONF + agent_extensions_manager.register_opts(conf) + cfg.CONF.set_override('extensions', ['qos'], 'agent') + self.manager = agent_extensions_manager.AgentExtensionsManager(conf) def _get_extension(self): return self.manager.extensions[0].obj diff --git a/neutron/tests/unit/plugins/ml2/drivers/openvswitch/agent/test_ovs_neutron_agent.py b/neutron/tests/unit/plugins/ml2/drivers/openvswitch/agent/test_ovs_neutron_agent.py index ca1f48a3c..19bcd520d 100644 --- a/neutron/tests/unit/plugins/ml2/drivers/openvswitch/agent/test_ovs_neutron_agent.py +++ b/neutron/tests/unit/plugins/ml2/drivers/openvswitch/agent/test_ovs_neutron_agent.py @@ -374,12 +374,7 @@ class TestOvsNeutronAgent(object): return_value=None): self.assertFalse(get_dev_fn.called) - #TODO(QoS) that this mock should go away once we don't hardcode - #qos extension. - @mock.patch('neutron.api.rpc.handlers.resources_rpc.' - 'ResourcesServerRpcApi.get_info', return_value=[]) - def test_treat_devices_added_updated_updates_known_port( - self, *args): + def test_treat_devices_added_updated_updates_known_port(self): details = mock.MagicMock() details.__contains__.side_effect = lambda x: True self.assertTrue(self._mock_treat_devices_added_updated(