]> review.fuel-infra Code Review - openstack-build/neutron-build.git/commitdiff
Prepare Base(OVS)LinuxTestCase transformation in helpers
authorCedric Brandily <zzelle@gmail.com>
Thu, 19 Mar 2015 13:28:15 +0000 (13:28 +0000)
committerCedric Brandily <zzelle@gmail.com>
Thu, 19 Mar 2015 14:43:42 +0000 (14:43 +0000)
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

neutron/tests/common/base.py [new file with mode: 0644]
neutron/tests/functional/agent/linux/base.py
neutron/tests/functional/agent/linux/test_ovsdb_monitor.py
neutron/tests/functional/agent/test_l3_agent.py
neutron/tests/functional/base.py

diff --git a/neutron/tests/common/base.py b/neutron/tests/common/base.py
new file mode 100644 (file)
index 0000000..4ebfb67
--- /dev/null
@@ -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
index 49c2a561c21d905c91be09386e8134e6560e6630..51084077a155379ed8f8cffde5dd6946f1d4b751 100644 (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)
+
+        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_ns.add_veth(src_veth, dst_veth, dst_namespace)
+        return src_veth, dst_veth
 
     def create_bridge(self, br_ns=None):
         br_ns = br_ns or self._create_namespace()
index b6f1ab995a4346318a9855c525401bcdfdb3ac42..4fe18ca0ece2a9cd3c9e2a62cdfcb7132c20483c 100644 (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)
index a822eb2640e6d7449772595fc8e72ae576c6be86..64bacafdeb4868c78b08521da1ea4c7286783aa7 100755 (executable)
@@ -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])
 
index 95efa0c3ed60a9b77e006ef28bd95fb3484b3cce..0907ea729bc7533a74db967617e86c940f933c58 100644 (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