From 806cf71eb5af34359f8bc0c6b740752e53cf854f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C5=82awek=20Kap=C5=82o=C5=84ski?= Date: Fri, 3 Nov 2017 09:59:04 +0000 Subject: [PATCH] Fullstack: init trunk agent's driver only when necessary Trunk driver is not needed to be initialized when "trunk" service plugin is not enabled. On production environments it's not possible to base on "service_plugins" config option on L2 agent's side so this driver is initialized always. It cause problems on fullstack tests becasue there is race condition between different ovs agents which consumes events from Openvswitch monitor. On fullstack tests however we can assume that agent's and server's config are in sync so trunk driver can be initialized only if "trunk" service plugin is enabled on server side. Change-Id: I3ad8d6e7b8f103867ee277078d03f3a01c20ac0d Closes-Bug: #1687709 --- neutron/tests/fullstack/cmd/ovs_agent.py | 49 +++++++++++++++++++ .../tests/fullstack/resources/environment.py | 2 +- neutron/tests/fullstack/resources/process.py | 2 +- neutron/tests/fullstack/test_trunk.py | 10 +++- 4 files changed, 60 insertions(+), 3 deletions(-) create mode 100755 neutron/tests/fullstack/cmd/ovs_agent.py diff --git a/neutron/tests/fullstack/cmd/ovs_agent.py b/neutron/tests/fullstack/cmd/ovs_agent.py new file mode 100755 index 00000000000..d8132855876 --- /dev/null +++ b/neutron/tests/fullstack/cmd/ovs_agent.py @@ -0,0 +1,49 @@ +#!/usr/bin/env python +# Copyright 2017 OVH SAS +# +# 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 + +from oslo_config import cfg + +from neutron.services.trunk.drivers.openvswitch.agent \ + import driver as trunk_driver +from neutron.tests.common.agents import ovs_agent + + +def monkeypatch_init_handler(): + original_handler = trunk_driver.init_handler + + def new_init_handler(resource, event, trigger, payload=None): + # NOTE(slaweq): make this setup conditional based on server-side + # capabilities for fullstack tests we can assume that server-side + # and agent-side conf are in sync + if "trunk" not in cfg.CONF.service_plugins: + return + original_handler(resource, event, trigger, payload) + + trunk_driver.init_handler = new_init_handler + + +def main(): + # TODO(slaweq): this monkepatch will not be necessary when + # https://review.openstack.org/#/c/506722/ will be merged and ovsdb-server + # ovs-vswitchd processes for each test will be isolated in separate + # namespace + monkeypatch_init_handler() + ovs_agent.main() + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/neutron/tests/fullstack/resources/environment.py b/neutron/tests/fullstack/resources/environment.py index e5de37bb747..06ee2e69901 100644 --- a/neutron/tests/fullstack/resources/environment.py +++ b/neutron/tests/fullstack/resources/environment.py @@ -35,7 +35,7 @@ class EnvironmentDescription(object): """ def __init__(self, network_type='vxlan', l2_pop=True, qos=False, mech_drivers='openvswitch,linuxbridge', - service_plugins='router,trunk', arp_responder=False, + service_plugins='router', arp_responder=False, agent_down_time=75, router_scheduler=None): self.network_type = network_type self.l2_pop = l2_pop diff --git a/neutron/tests/fullstack/resources/process.py b/neutron/tests/fullstack/resources/process.py index a24f017eaf0..0f9ff1f4b56 100644 --- a/neutron/tests/fullstack/resources/process.py +++ b/neutron/tests/fullstack/resources/process.py @@ -205,7 +205,7 @@ class OVSAgentFixture(ServiceFixture): process_name=self.NEUTRON_OVS_AGENT, exec_name=spawn.find_executable( 'ovs_agent.py', - path=os.path.join(base.ROOTDIR, 'common', 'agents')), + path=os.path.join(fullstack_base.ROOTDIR, 'cmd')), config_filenames=config_filenames, kill_signal=signal.SIGTERM)) diff --git a/neutron/tests/fullstack/test_trunk.py b/neutron/tests/fullstack/test_trunk.py index d1d35f31a90..3376d5d706e 100644 --- a/neutron/tests/fullstack/test_trunk.py +++ b/neutron/tests/fullstack/test_trunk.py @@ -91,7 +91,7 @@ class TestTrunkPlugin(base.BaseFullStackTestCase): host_desc = [environment.HostDescription( l3_agent=False, l2_agent_type=constants.AGENT_TYPE_OVS)] - env_desc = environment.EnvironmentDescription() + env_desc = environment.EnvironmentDescription(service_plugins='trunk') env = environment.Environment(env_desc, host_desc) super(TestTrunkPlugin, self).setUp(env) @@ -207,6 +207,14 @@ class TestTrunkPlugin(base.BaseFullStackTestCase): vm.add_vlan_interface( subport['mac_address'], ip_network, subport_network.tag) + # NOTE(slaweq): As is described in bug + # https://bugs.launchpad.net/neutron/+bug/1687709 when more than one + # different ovs-agent with enabled trunk driver is running at a time it + # might lead to race contitions between them. + # Because of that ovs_agent used for fullstack tests is monkeypatched and + # loads trunk driver only if trunk service plugin is enabled. + # That makes restriction that only a single set of tests with trunk-enabled + # services will run at the same time. def test_trunk_lifecycle(self): """Test life-cycle of a fake VM with trunk port.