diff --git a/neutron/tests/common/agents/__init__.py b/neutron/tests/common/agents/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/neutron/tests/common/agents/l3_agent.py b/neutron/tests/common/agents/l3_agent.py new file mode 100755 index 00000000000..9f87f6bbabd --- /dev/null +++ b/neutron/tests/common/agents/l3_agent.py @@ -0,0 +1,78 @@ +#!/usr/bin/env python +# +# 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 mock +import sys + +from oslo_config import cfg + +from neutron.agent.l3 import agent +from neutron.agent.l3 import namespaces +from neutron.agent import l3_agent + + +class L3NATAgentForTest(agent.L3NATAgentWithStateReport): + def __init__(self, host, conf=None): + ns_suffix = '@%s' % cfg.CONF.test_namespace_suffix + + # Mock out building of namespace names + orig_build_ns_name = namespaces.build_ns_name + + def build_ns_name(prefix, identifier): + return "%s%s" % (orig_build_ns_name(prefix, identifier), ns_suffix) + + build_ns = mock.patch.object(namespaces, 'build_ns_name').start() + build_ns.side_effect = build_ns_name + + # Mock the parsing prefix from namespace names + orig_get_prefix = namespaces.get_prefix_from_ns_name + + def get_prefix_from_ns_name(ns_name): + if ns_name.endswith(ns_suffix): + return orig_get_prefix(ns_name[:-len(ns_suffix)]) + + parse_prefix = mock.patch.object(namespaces, + 'get_prefix_from_ns_name').start() + parse_prefix.side_effect = get_prefix_from_ns_name + + # Mock the parsing id from namespace names + orig_get_id = namespaces.get_id_from_ns_name + + def get_id_from_ns_name(ns_name): + if ns_name.endswith(ns_suffix): + return orig_get_id(ns_name[:-len(ns_suffix)]) + + parse_id = mock.patch.object(namespaces, 'get_id_from_ns_name').start() + parse_id.side_effect = get_id_from_ns_name + + super(L3NATAgentForTest, self).__init__(host, conf) + + +OPTS = [ + cfg.StrOpt('test_namespace_suffix', default='testprefix', + help=_("Suffix to append to all namespace names.")), +] + + +def register_opts(conf): + conf.register_opts(OPTS) + + +def main(manager='neutron.tests.common.agents.l3_agent.L3NATAgentForTest'): + register_opts(cfg.CONF) + l3_agent.main(manager=manager) + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/neutron/tests/fullstack/config_fixtures.py b/neutron/tests/fullstack/config_fixtures.py index 6c25c965507..4e1e0986176 100644 --- a/neutron/tests/fullstack/config_fixtures.py +++ b/neutron/tests/fullstack/config_fixtures.py @@ -207,9 +207,13 @@ class L3ConfigFixture(ConfigFixture): 'router_delete_namespaces': 'True', 'debug': 'True', 'verbose': 'True', + 'test_namespace_suffix': self._generate_namespace_suffix(), } }) def _generate_external_bridge(self): return base.get_rand_name(prefix='br-ex', max_length=constants.DEVICE_NAME_MAX_LEN) + + def _generate_namespace_suffix(self): + return base.get_rand_name(prefix='test') diff --git a/neutron/tests/fullstack/fullstack_fixtures.py b/neutron/tests/fullstack/fullstack_fixtures.py index 9d30325860d..526cffaccec 100644 --- a/neutron/tests/fullstack/fullstack_fixtures.py +++ b/neutron/tests/fullstack/fullstack_fixtures.py @@ -14,6 +14,7 @@ from distutils import spawn import functools +import os import fixtures from neutronclient.common import exceptions as nc_exc @@ -24,6 +25,7 @@ from oslo_utils import timeutils from neutron.agent.linux import async_process from neutron.agent.linux import utils +from neutron.tests import base from neutron.tests.common import net_helpers from neutron.tests.fullstack import config_fixtures @@ -188,8 +190,13 @@ class L3AgentFixture(fixtures.Fixture): self.process_fixture = self.useFixture(ProcessFixture( name=self.NEUTRON_L3_AGENT, - exec_name=self.NEUTRON_L3_AGENT, + exec_name=spawn.find_executable( + 'l3_agent.py', + path=os.path.join(base.ROOTDIR, 'common', 'agents')), config_filenames=config_filenames)) def _get_br_ex_name(self): return self.plugin_config.DEFAULT.external_network_bridge + + def get_namespace_suffix(self): + return self.plugin_config.DEFAULT.test_namespace_suffix diff --git a/neutron/tests/fullstack/test_l3_agent.py b/neutron/tests/fullstack/test_l3_agent.py index 3c41571f46f..29ae03f67fd 100644 --- a/neutron/tests/fullstack/test_l3_agent.py +++ b/neutron/tests/fullstack/test_l3_agent.py @@ -78,7 +78,10 @@ class TestLegacyL3Agent(base.BaseFullStackTestCase): body={'subnet_id': subnet['subnet']['id']}) router_id = router['router']['id'] - self._assert_namespace_exists(self._get_namespace(router_id)) + namespace = "%s@%s" % ( + self._get_namespace(router_id), + self.environment.l3_agent.get_namespace_suffix(), ) + self._assert_namespace_exists(namespace) self.client.remove_interface_router( router=router['router']['id'], diff --git a/neutron/tests/functional/__init__.py b/neutron/tests/functional/__init__.py index a2a87e23b26..86c037e23ad 100644 --- a/neutron/tests/functional/__init__.py +++ b/neutron/tests/functional/__init__.py @@ -27,6 +27,7 @@ def load_tests(loader, tests, pattern): target_dirs = [ this_dir, os.path.join(parent_dir, 'retargetable'), + os.path.join(parent_dir, 'fullstack'), ] for start_dir in target_dirs: new_tests = loader.discover(start_dir=start_dir, pattern=pattern)