From d69d1b552ba08ac1637b8589eb73eb108aa2e1d5 Mon Sep 17 00:00:00 2001 From: Andrea Frittoli Date: Thu, 13 Jul 2017 11:12:53 +0100 Subject: [PATCH] Move multi-nic tests to dedicated module The test_create_server module creates a server and then it runs multiple checks in different tests. This is done for DiskConfig AUTO and MANUAL. The two multinic tests however create their own server, so they should not belong to the same class. With the current setup we run them twice, once per DiskConfig value, which uses gate time and resources for no clear purpose. To fix this I'm moving these two multi nic tests to a dedicated module. Change-Id: I97dd4b5c703d41d9084e6e049144e4df4e3fb75d --- .../api/compute/servers/test_create_server.py | 83 ------------ .../servers/test_create_server_multi_nic.py | 120 ++++++++++++++++++ 2 files changed, 120 insertions(+), 83 deletions(-) create mode 100644 tempest/api/compute/servers/test_create_server_multi_nic.py diff --git a/tempest/api/compute/servers/test_create_server.py b/tempest/api/compute/servers/test_create_server.py index ffadd96c5..09479c60b 100644 --- a/tempest/api/compute/servers/test_create_server.py +++ b/tempest/api/compute/servers/test_create_server.py @@ -38,8 +38,6 @@ class ServersTestJSON(base.BaseV2ComputeTest): def setup_clients(cls): super(ServersTestJSON, cls).setup_clients() cls.client = cls.servers_client - cls.networks_client = cls.os_primary.networks_client - cls.subnets_client = cls.os_primary.subnets_client @classmethod def resource_setup(cls): @@ -63,20 +61,6 @@ class ServersTestJSON(base.BaseV2ComputeTest): cls.server = (cls.client.show_server(server_initial['id']) ['server']) - def _create_net_subnet_ret_net_from_cidr(self, cidr): - name_net = data_utils.rand_name(self.__class__.__name__) - net = self.networks_client.create_network(name=name_net) - self.addCleanup(self.networks_client.delete_network, - net['network']['id']) - - subnet = self.subnets_client.create_subnet( - network_id=net['network']['id'], - cidr=cidr, - ip_version=4) - self.addCleanup(self.subnets_client.delete_subnet, - subnet['subnet']['id']) - return net - @decorators.attr(type='smoke') @decorators.idempotent_id('5de47127-9977-400a-936f-abcfbec1218f') def test_verify_server_details(self): @@ -158,73 +142,6 @@ class ServersTestJSON(base.BaseV2ComputeTest): ['server_group']) self.assertIn(server['id'], server_group['members']) - @decorators.idempotent_id('0578d144-ed74-43f8-8e57-ab10dbf9b3c2') - @testtools.skipUnless(CONF.service_available.neutron, - 'Neutron service must be available.') - def test_verify_multiple_nics_order(self): - # Verify that the networks order given at the server creation is - # preserved within the server. - net1 = self._create_net_subnet_ret_net_from_cidr('19.80.0.0/24') - net2 = self._create_net_subnet_ret_net_from_cidr('19.86.0.0/24') - - networks = [{'uuid': net1['network']['id']}, - {'uuid': net2['network']['id']}] - - server_multi_nics = self.create_test_server( - networks=networks, wait_until='ACTIVE') - - # Cleanup server; this is needed in the test case because with the LIFO - # nature of the cleanups, if we don't delete the server first, the port - # will still be part of the subnet and we'll get a 409 from Neutron - # when trying to delete the subnet. The tear down in the base class - # will try to delete the server and get a 404 but it's ignored so - # we're OK. - self.addCleanup(self.delete_server, server_multi_nics['id']) - - addresses = (self.client.list_addresses(server_multi_nics['id']) - ['addresses']) - - # We can't predict the ip addresses assigned to the server on networks. - # Sometimes the assigned addresses are ['19.80.0.2', '19.86.0.2'], at - # other times ['19.80.0.3', '19.86.0.3']. So we check if the first - # address is in first network, similarly second address is in second - # network. - addr = [addresses[net1['network']['name']][0]['addr'], - addresses[net2['network']['name']][0]['addr']] - networks = [netaddr.IPNetwork('19.80.0.0/24'), - netaddr.IPNetwork('19.86.0.0/24')] - for address, network in zip(addr, networks): - self.assertIn(address, network) - - @decorators.idempotent_id('1678d144-ed74-43f8-8e57-ab10dbf9b3c2') - @testtools.skipUnless(CONF.service_available.neutron, - 'Neutron service must be available.') - def test_verify_duplicate_network_nics(self): - # Verify that server creation does not fail when more than one nic - # is created on the same network. - net1 = self._create_net_subnet_ret_net_from_cidr('19.80.0.0/24') - net2 = self._create_net_subnet_ret_net_from_cidr('19.86.0.0/24') - - networks = [{'uuid': net1['network']['id']}, - {'uuid': net2['network']['id']}, - {'uuid': net1['network']['id']}] - - server_multi_nics = self.create_test_server( - networks=networks, wait_until='ACTIVE') - self.addCleanup(self.delete_server, server_multi_nics['id']) - - addresses = (self.client.list_addresses(server_multi_nics['id']) - ['addresses']) - - addr = [addresses[net1['network']['name']][0]['addr'], - addresses[net2['network']['name']][0]['addr'], - addresses[net1['network']['name']][1]['addr']] - networks = [netaddr.IPNetwork('19.80.0.0/24'), - netaddr.IPNetwork('19.86.0.0/24'), - netaddr.IPNetwork('19.80.0.0/24')] - for address, network in zip(addr, networks): - self.assertIn(address, network) - class ServersTestManualDisk(ServersTestJSON): disk_config = 'MANUAL' diff --git a/tempest/api/compute/servers/test_create_server_multi_nic.py b/tempest/api/compute/servers/test_create_server_multi_nic.py new file mode 100644 index 000000000..3447d858d --- /dev/null +++ b/tempest/api/compute/servers/test_create_server_multi_nic.py @@ -0,0 +1,120 @@ +# Copyright 2012 OpenStack Foundation +# All Rights Reserved. +# +# 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 netaddr +import testtools + +from tempest.api.compute import base +from tempest import config +from tempest.lib.common.utils import data_utils +from tempest.lib import decorators + +CONF = config.CONF + + +class ServersTestMultiNic(base.BaseV2ComputeTest): + + @classmethod + def setup_credentials(cls): + cls.prepare_instance_network() + super(ServersTestMultiNic, cls).setup_credentials() + + @classmethod + def setup_clients(cls): + super(ServersTestMultiNic, cls).setup_clients() + cls.client = cls.servers_client + cls.networks_client = cls.os_primary.networks_client + cls.subnets_client = cls.os_primary.subnets_client + + def _create_net_subnet_ret_net_from_cidr(self, cidr): + name_net = data_utils.rand_name(self.__class__.__name__) + net = self.networks_client.create_network(name=name_net) + self.addCleanup(self.networks_client.delete_network, + net['network']['id']) + + subnet = self.subnets_client.create_subnet( + network_id=net['network']['id'], + cidr=cidr, + ip_version=4) + self.addCleanup(self.subnets_client.delete_subnet, + subnet['subnet']['id']) + return net + + @decorators.idempotent_id('0578d144-ed74-43f8-8e57-ab10dbf9b3c2') + @testtools.skipUnless(CONF.service_available.neutron, + 'Neutron service must be available.') + def test_verify_multiple_nics_order(self): + # Verify that the networks order given at the server creation is + # preserved within the server. + net1 = self._create_net_subnet_ret_net_from_cidr('19.80.0.0/24') + net2 = self._create_net_subnet_ret_net_from_cidr('19.86.0.0/24') + + networks = [{'uuid': net1['network']['id']}, + {'uuid': net2['network']['id']}] + + server_multi_nics = self.create_test_server( + networks=networks, wait_until='ACTIVE') + + # Cleanup server; this is needed in the test case because with the LIFO + # nature of the cleanups, if we don't delete the server first, the port + # will still be part of the subnet and we'll get a 409 from Neutron + # when trying to delete the subnet. The tear down in the base class + # will try to delete the server and get a 404 but it's ignored so + # we're OK. + self.addCleanup(self.delete_server, server_multi_nics['id']) + + addresses = (self.client.list_addresses(server_multi_nics['id']) + ['addresses']) + + # We can't predict the ip addresses assigned to the server on networks. + # Sometimes the assigned addresses are ['19.80.0.2', '19.86.0.2'], at + # other times ['19.80.0.3', '19.86.0.3']. So we check if the first + # address is in first network, similarly second address is in second + # network. + addr = [addresses[net1['network']['name']][0]['addr'], + addresses[net2['network']['name']][0]['addr']] + networks = [netaddr.IPNetwork('19.80.0.0/24'), + netaddr.IPNetwork('19.86.0.0/24')] + for address, network in zip(addr, networks): + self.assertIn(address, network) + + @decorators.idempotent_id('1678d144-ed74-43f8-8e57-ab10dbf9b3c2') + @testtools.skipUnless(CONF.service_available.neutron, + 'Neutron service must be available.') + def test_verify_duplicate_network_nics(self): + # Verify that server creation does not fail when more than one nic + # is created on the same network. + net1 = self._create_net_subnet_ret_net_from_cidr('19.80.0.0/24') + net2 = self._create_net_subnet_ret_net_from_cidr('19.86.0.0/24') + + networks = [{'uuid': net1['network']['id']}, + {'uuid': net2['network']['id']}, + {'uuid': net1['network']['id']}] + + server_multi_nics = self.create_test_server( + networks=networks, wait_until='ACTIVE') + self.addCleanup(self.delete_server, server_multi_nics['id']) + + addresses = (self.client.list_addresses(server_multi_nics['id']) + ['addresses']) + + addr = [addresses[net1['network']['name']][0]['addr'], + addresses[net2['network']['name']][0]['addr'], + addresses[net1['network']['name']][1]['addr']] + networks = [netaddr.IPNetwork('19.80.0.0/24'), + netaddr.IPNetwork('19.86.0.0/24'), + netaddr.IPNetwork('19.80.0.0/24')] + for address, network in zip(addr, networks): + self.assertIn(address, network)