Prepare Base(OVS)LinuxTestCase transformation in helpers

This change prepares to transform BaseLinuxTestCase[1] and
BaseOVSLinuxTestCase[1] methods into helpers in a follow-up change.

[1] in neutron.tests.functional.agent.linux.base

Change-Id: Ie04f33283544e79c1296aa1de5b6946049ae53b9
This commit is contained in:
Cedric Brandily 2015-03-19 13:28:15 +00:00
parent d0589051ad
commit e7becaf36c
5 changed files with 76 additions and 46 deletions

View File

@ -0,0 +1,34 @@
# 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 neutron.common import constants as n_const
from neutron.tests import sub_base
def create_resource(prefix, creation_func, *args, **kwargs):
"""Create a new resource that does not already exist.
:param prefix: The prefix for a randomly generated name
:param creation_func: A function taking the name of the resource
to be created as it's first argument. An error is assumed
to indicate a name collision.
:param *args *kwargs: These will be passed to the create function.
"""
while True:
name = sub_base.get_rand_name(
max_length=n_const.DEVICE_NAME_MAX_LEN,
prefix=prefix)
try:
return creation_func(name, *args, **kwargs)
except RuntimeError:
pass

View File

@ -18,9 +18,9 @@ import testscenarios
from neutron.agent.linux import bridge_lib
from neutron.agent.linux import ip_lib
from neutron.agent.linux import ovs_lib
from neutron.agent.linux import utils
from neutron.common import constants as n_const
from neutron.openstack.common import uuidutils
from neutron.tests.common import base
from neutron.tests.functional import base as functional_base
from neutron.tests import sub_base
@ -61,14 +61,6 @@ class BaseLinuxTestCase(functional_base.BaseSudoTestCase):
def setUp(self):
super(BaseLinuxTestCase, self).setUp()
def check_command(self, cmd, error_text, skip_msg, run_as_root=False):
try:
utils.execute(cmd, run_as_root=run_as_root)
except RuntimeError as e:
if error_text in str(e) and not self.fail_on_missing_deps:
self.skipTest(skip_msg)
raise
@staticmethod
def _cleanup_namespace(namespace):
if namespace.netns.exists(namespace.namespace):
@ -82,28 +74,21 @@ class BaseLinuxTestCase(functional_base.BaseSudoTestCase):
return namespace
def create_resource(self, name_prefix, creation_func, *args, **kwargs):
"""Create a new resource that does not already exist.
:param name_prefix: The prefix for a randomly generated name
:param creation_func: A function taking the name of the resource
to be created as it's first argument. An error is assumed
to indicate a name collision.
:param *args *kwargs: These will be passed to the create function.
"""
while True:
name = get_rand_name(max_length=n_const.DEVICE_NAME_MAX_LEN,
prefix=name_prefix)
try:
return creation_func(name, *args, **kwargs)
except RuntimeError:
continue
def create_veth(self):
ip_wrapper = ip_lib.IPWrapper()
name1 = get_rand_veth_name()
name2 = get_rand_veth_name()
self.addCleanup(ip_wrapper.del_veth, name1)
# NOTE(cbrandily): will be removed in follow-up change
def destroy():
try:
ip_wrapper.del_veth(name1)
except RuntimeError:
# NOTE(cbrandily): It seems a veth is automagically deleted
# when a namespace owning a veth endpoint is deleted.
pass
self.addCleanup(destroy)
veth1, veth2 = ip_wrapper.add_veth(name1, name2)
return veth1, veth2
@ -138,19 +123,16 @@ class BaseOVSLinuxTestCase(testscenarios.WithScenarios, BaseLinuxTestCase):
self.ip = ip_lib.IPWrapper()
def create_ovs_bridge(self, br_prefix=BR_PREFIX):
br = self.create_resource(br_prefix, self.ovs.add_bridge)
br = base.create_resource(br_prefix, self.ovs.add_bridge)
self.addCleanup(br.destroy)
return br
def get_ovs_bridge(self, br_name):
return ovs_lib.OVSBridge(br_name)
def create_ovs_port_in_ns(self, br, ns):
def create_port(name):
br.replace_port(name, ('type', 'internal'))
self.addCleanup(br.delete_port, name)
return name
port_name = self.create_resource(PORT_PREFIX, create_port)
port_name = base.create_resource(PORT_PREFIX, create_port)
port_dev = self.ip.device(port_name)
ns.add_device_to_namespace(port_dev)
port_dev.link.set_up()
@ -182,14 +164,12 @@ class BaseIPVethTestCase(BaseLinuxTestCase):
src_addr = self.SRC_ADDRESS
dst_addr = self.DST_ADDRESS
src_veth = get_rand_veth_name()
dst_veth = get_rand_veth_name()
src_veth, dst_veth = self.create_veth()
src_ns = self._create_namespace(src_ns_prefix)
dst_ns = self._create_namespace(dst_ns_prefix)
src_veth, dst_veth = src_ns.add_veth(src_veth,
dst_veth,
dst_ns.namespace)
src_ns.add_device_to_namespace(src_veth)
dst_ns.add_device_to_namespace(dst_veth)
self._set_ip_up(src_veth, '%s/24' % src_addr)
self._set_ip_up(dst_veth, '%s/24' % dst_addr)
@ -198,12 +178,16 @@ class BaseIPVethTestCase(BaseLinuxTestCase):
class BaseBridgeTestCase(BaseIPVethTestCase):
def create_veth_pairs(self, dst_namespace):
src_ns = self._create_namespace()
src_veth = get_rand_veth_name()
dst_veth = get_rand_veth_name()
dst_ns = ip_lib.IPWrapper(dst_namespace)
return src_ns.add_veth(src_veth, dst_veth, dst_namespace)
src_veth, dst_veth = self.create_veth()
src_ns.add_device_to_namespace(src_veth)
dst_ns.add_device_to_namespace(dst_veth)
return src_veth, dst_veth
def create_bridge(self, br_ns=None):
br_ns = br_ns or self._create_namespace()

View File

@ -102,7 +102,7 @@ class TestSimpleInterfaceMonitor(BaseMonitorTest):
'Initial call should always be true')
self.assertFalse(self.monitor.has_updates,
'has_updates without port addition should be False')
self.create_resource('test-port-', self.bridge.add_port)
self.create_ovs_port_in_ns(self.bridge, self.ip)
# has_updates after port addition should become True
while not self.monitor.has_updates:
eventlet.sleep(0.01)

View File

@ -50,6 +50,10 @@ _uuid = uuidutils.generate_uuid
METADATA_REQUEST_TIMEOUT = 60
def get_ovs_bridge(br_name):
return ovs_lib.OVSBridge(br_name)
class L3AgentTestFramework(base.BaseOVSLinuxTestCase):
def setUp(self):
super(L3AgentTestFramework, self).setUp()
@ -515,9 +519,8 @@ class L3HATestFramework(L3AgentTestFramework):
super(L3HATestFramework, self).setUp()
self.failover_agent = self._configure_agent('agent2')
br_int_1 = self.get_ovs_bridge(
self.agent.conf.ovs_integration_bridge)
br_int_2 = self.get_ovs_bridge(
br_int_1 = get_ovs_bridge(self.agent.conf.ovs_integration_bridge)
br_int_2 = get_ovs_bridge(
self.failover_agent.conf.ovs_integration_bridge)
veth1, veth2 = self.create_veth()
@ -600,7 +603,7 @@ class MetadataL3AgentTestCase(L3AgentTestFramework):
client_ns = self._create_namespace()
router_ip_cidr = router.internal_ports[0]['ip_cidr']
ip_cidr = self.shift_ip_cidr(router_ip_cidr)
br_int = self.get_ovs_bridge(self.agent.conf.ovs_integration_bridge)
br_int = get_ovs_bridge(self.agent.conf.ovs_integration_bridge)
port = self.bind_namespace_to_cidr(client_ns, br_int, ip_cidr)
self.set_namespace_gateway(port, router_ip_cidr.partition('/')[0])

View File

@ -18,6 +18,7 @@ import os
from oslo_config import cfg
from neutron.agent.common import config
from neutron.agent.linux import utils
from neutron.tests import base
SUDO_CMD = 'sudo -n'
@ -59,3 +60,11 @@ class BaseSudoTestCase(base.BaseTestCase):
self.config(group='AGENT',
root_helper_daemon=os.environ.get(
'OS_ROOTWRAP_DAEMON_CMD'))
def check_command(self, cmd, error_text, skip_msg, run_as_root=False):
try:
utils.execute(cmd, run_as_root=run_as_root)
except RuntimeError as e:
if error_text in str(e) and not self.fail_on_missing_deps:
self.skipTest(skip_msg)
raise