From 59ac3c636244452a7c4796850a7f354e61ca4277 Mon Sep 17 00:00:00 2001 From: Ihar Hrachyshka Date: Sat, 17 Sep 2016 01:24:58 +0000 Subject: [PATCH] fullstack: execute qos tests for all ovsdb/of interface permutations Change-Id: Iff36b4e5c102ace45a201ca192b94f12e653b995 Related-Bug: #1622644 (cherry picked from commit 225477c6c6de97aad6ce79ab83a97bffdf230e7d) --- neutron/tests/fullstack/test_connectivity.py | 12 +--- neutron/tests/fullstack/test_qos.py | 70 ++++++++++---------- neutron/tests/fullstack/utils.py | 24 +++++++ 3 files changed, 60 insertions(+), 46 deletions(-) create mode 100644 neutron/tests/fullstack/utils.py diff --git a/neutron/tests/fullstack/test_connectivity.py b/neutron/tests/fullstack/test_connectivity.py index 1fef368a66c..aa767ed4fd4 100644 --- a/neutron/tests/fullstack/test_connectivity.py +++ b/neutron/tests/fullstack/test_connectivity.py @@ -19,6 +19,7 @@ import testscenarios from neutron.tests.fullstack import base from neutron.tests.fullstack.resources import environment from neutron.tests.fullstack.resources import machine +from neutron.tests.fullstack import utils from neutron.tests.unit import testlib_api load_tests = testlib_api.module_load_tests @@ -80,17 +81,8 @@ class TestOvsConnectivitySameNetwork(BaseConnectivitySameNetworkTest): 'l2_pop': True}), ('VLANs', {'network_type': 'vlan', 'l2_pop': False})] - interface_scenarios = [ - ('openflow-cli_ovsdb-cli', {'of_interface': 'ovs-ofctl', - 'ovsdb_interface': 'vsctl'}), - ('openflow-native_ovsdb-cli', {'of_interface': 'native', - 'ovsdb_interface': 'vsctl'}), - ('openflow-cli_ovsdb-native', {'of_interface': 'ovs-ofctl', - 'ovsdb_interface': 'native'}), - ('openflow-native_ovsdb-native', {'of_interface': 'native', - 'ovsdb_interface': 'native'})] scenarios = testscenarios.multiply_scenarios( - network_scenarios, interface_scenarios) + network_scenarios, utils.get_ovs_interface_scenarios()) def test_connectivity(self): self._test_connectivity() diff --git a/neutron/tests/fullstack/test_qos.py b/neutron/tests/fullstack/test_qos.py index 3b804dea426..422ece386b0 100644 --- a/neutron/tests/fullstack/test_qos.py +++ b/neutron/tests/fullstack/test_qos.py @@ -17,8 +17,6 @@ import functools from neutron_lib import constants from oslo_utils import uuidutils -from neutron.agent.common import ovs_lib -from neutron.agent.linux import bridge_lib from neutron.agent.linux import tc_lib from neutron.common import utils from neutron.services.qos import qos_consts @@ -26,6 +24,7 @@ from neutron.tests.common.agents import l2_extensions from neutron.tests.fullstack import base from neutron.tests.fullstack.resources import environment from neutron.tests.fullstack.resources import machine +from neutron.tests.fullstack import utils as fullstack_utils from neutron.tests.unit import testlib_api from neutron.conf.plugins.ml2.drivers import linuxbridge as \ @@ -43,11 +42,15 @@ BANDWIDTH_LIMIT = 500 DSCP_MARK = 16 -class BaseQoSRuleTestCase(base.BaseFullStackTestCase): +class BaseQoSRuleTestCase(object): + of_interface = None + ovsdb_interface = None def setUp(self): host_desc = [environment.HostDescription( l3_agent=False, + of_interface=self.of_interface, + ovsdb_interface=self.ovsdb_interface, l2_agent_type=self.l2_agent_type)] env_desc = environment.EnvironmentDescription(qos=True) env = environment.Environment(env_desc, host_desc) @@ -91,35 +94,7 @@ class BaseQoSRuleTestCase(base.BaseFullStackTestCase): return vm, qos_policy -class TestBwLimitQoS(BaseQoSRuleTestCase): - - scenarios = [ - ("ovs", {'l2_agent_type': constants.AGENT_TYPE_OVS}), - ("linuxbridge", {'l2_agent_type': constants.AGENT_TYPE_LINUXBRIDGE}) - ] - - def _wait_for_bw_rule_applied_ovs_agent(self, vm, limit, burst): - utils.wait_until_true( - lambda: vm.bridge.get_egress_bw_limit_for_port( - vm.port.name) == (limit, burst)) - - def _wait_for_bw_rule_applied_linuxbridge_agent(self, vm, limit, burst): - port_name = linuxbridge_agent.LinuxBridgeManager.get_tap_device_name( - vm.neutron_port['id']) - tc = tc_lib.TcCommand( - port_name, - linuxbridge_agent_config.DEFAULT_KERNEL_HZ_VALUE, - namespace=vm.host.host_namespace - ) - utils.wait_until_true( - lambda: tc.get_filters_bw_limits() == (limit, burst)) - - def _wait_for_bw_rule_applied(self, vm, limit, burst): - if isinstance(vm.bridge, ovs_lib.OVSBridge): - self._wait_for_bw_rule_applied_ovs_agent(vm, limit, burst) - if isinstance(vm.bridge, bridge_lib.BridgeDevice): - self._wait_for_bw_rule_applied_linuxbridge_agent(vm, limit, burst) - +class _TestBwLimitQoS(BaseQoSRuleTestCase): def _wait_for_bw_rule_removed(self, vm): # No values are provided when port doesn't have qos policy self._wait_for_bw_rule_applied(vm, None, None) @@ -172,11 +147,34 @@ class TestBwLimitQoS(BaseQoSRuleTestCase): self._wait_for_bw_rule_removed(vm) -class TestDscpMarkingQoS(BaseQoSRuleTestCase): +class TestBwLimitQoSOvs(_TestBwLimitQoS, base.BaseFullStackTestCase): + l2_agent_type = constants.AGENT_TYPE_OVS + scenarios = fullstack_utils.get_ovs_interface_scenarios() - def setUp(self): - self.l2_agent_type = constants.AGENT_TYPE_OVS - super(TestDscpMarkingQoS, self).setUp() + def _wait_for_bw_rule_applied(self, vm, limit, burst): + utils.wait_until_true( + lambda: vm.bridge.get_egress_bw_limit_for_port( + vm.port.name) == (limit, burst)) + + +class TestBwLimitQoSLinuxbridge(_TestBwLimitQoS, base.BaseFullStackTestCase): + l2_agent_type = constants.AGENT_TYPE_LINUXBRIDGE + + def _wait_for_bw_rule_applied(self, vm, limit, burst): + port_name = linuxbridge_agent.LinuxBridgeManager.get_tap_device_name( + vm.neutron_port['id']) + tc = tc_lib.TcCommand( + port_name, + linuxbridge_agent_config.DEFAULT_KERNEL_HZ_VALUE, + namespace=vm.host.host_namespace + ) + utils.wait_until_true( + lambda: tc.get_filters_bw_limits() == (limit, burst)) + + +class TestDscpMarkingQoSOvs(BaseQoSRuleTestCase, base.BaseFullStackTestCase): + scenarios = fullstack_utils.get_ovs_interface_scenarios() + l2_agent_type = constants.AGENT_TYPE_OVS def _wait_for_dscp_marking_rule_applied(self, vm, dscp_mark): l2_extensions.wait_until_dscp_marking_rule_applied( diff --git a/neutron/tests/fullstack/utils.py b/neutron/tests/fullstack/utils.py new file mode 100644 index 00000000000..5a0f9623ce2 --- /dev/null +++ b/neutron/tests/fullstack/utils.py @@ -0,0 +1,24 @@ +# 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. + + +def get_ovs_interface_scenarios(): + return [ + ('openflow-cli_ovsdb-cli', {'of_interface': 'ovs-ofctl', + 'ovsdb_interface': 'vsctl'}), + ('openflow-native_ovsdb-cli', {'of_interface': 'native', + 'ovsdb_interface': 'vsctl'}), + ('openflow-cli_ovsdb-native', {'of_interface': 'ovs-ofctl', + 'ovsdb_interface': 'native'}), + ('openflow-native_ovsdb-native', {'of_interface': 'native', + 'ovsdb_interface': 'native'}), + ]