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
This commit is contained in:
Sławek Kapłoński 2017-11-03 09:59:04 +00:00
parent 3458173d5f
commit 806cf71eb5
4 changed files with 60 additions and 3 deletions

View File

@ -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())

View File

@ -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

View File

@ -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))

View File

@ -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.