diff --git a/tempest/api/compute/floating_ips/test_floating_ips_actions.py b/tempest/api/compute/floating_ips/test_floating_ips_actions.py index 4d8416f1d0..2769245d2b 100644 --- a/tempest/api/compute/floating_ips/test_floating_ips_actions.py +++ b/tempest/api/compute/floating_ips/test_floating_ips_actions.py @@ -13,6 +13,8 @@ # License for the specific language governing permissions and limitations # under the License. +import testtools + from tempest.api.compute.floating_ips import base from tempest import config from tempest.lib.common.utils import test_utils @@ -86,6 +88,8 @@ class FloatingIPsTestJSON(base.BaseFloatingIPsTest): @decorators.idempotent_id('307efa27-dc6f-48a0-8cd2-162ce3ef0b52') @test.services('network') + @testtools.skipUnless(CONF.network.public_network_id, + 'The public_network_id option must be specified.') def test_associate_disassociate_floating_ip(self): # Positive test:Associate and disassociate the provided floating IP # to a specific server should be successful @@ -107,6 +111,8 @@ class FloatingIPsTestJSON(base.BaseFloatingIPsTest): @decorators.idempotent_id('6edef4b2-aaf1-4abc-bbe3-993e2561e0fe') @test.services('network') + @testtools.skipUnless(CONF.network.public_network_id, + 'The public_network_id option must be specified.') def test_associate_already_associated_floating_ip(self): # positive test:Association of an already associated floating IP # to specific server should change the association of the Floating IP diff --git a/tempest/api/compute/servers/test_server_rescue.py b/tempest/api/compute/servers/test_server_rescue.py index 5db7f4f54d..f74a5a4b12 100644 --- a/tempest/api/compute/servers/test_server_rescue.py +++ b/tempest/api/compute/servers/test_server_rescue.py @@ -13,6 +13,8 @@ # License for the specific language governing permissions and limitations # under the License. +import testtools + from tempest.api.compute import base from tempest.common.utils import data_utils from tempest.common import waiters @@ -85,6 +87,8 @@ class ServerRescueTestJSON(base.BaseV2ComputeTest): 'ACTIVE') @decorators.idempotent_id('4842e0cf-e87d-4d9d-b61f-f4791da3cacc') + @testtools.skipUnless(CONF.network.public_network_id, + 'The public_network_id option must be specified.') def test_rescued_vm_associate_dissociate_floating_ip(self): # Rescue the server self.servers_client.rescue_server( diff --git a/tempest/api/network/admin/test_external_networks_negative.py b/tempest/api/network/admin/test_external_networks_negative.py index 743089ac50..770d91fa0a 100644 --- a/tempest/api/network/admin/test_external_networks_negative.py +++ b/tempest/api/network/admin/test_external_networks_negative.py @@ -12,6 +12,7 @@ # 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 testtools from tempest.api.network import base from tempest import config @@ -27,6 +28,8 @@ class ExternalNetworksAdminNegativeTestJSON(base.BaseAdminNetworkTest): @test.attr(type=['negative']) @decorators.idempotent_id('d402ae6c-0be0-4d8e-833b-a738895d98d0') + @testtools.skipUnless(CONF.network.public_network_id, + 'The public_network_id option must be specified.') def test_create_port_with_precreated_floatingip_as_fixed_ip(self): # NOTE: External networks can be used to create both floating-ip as # well as instance-ip. So, creating an instance-ip with a value of a diff --git a/tempest/api/network/admin/test_floating_ips_admin_actions.py b/tempest/api/network/admin/test_floating_ips_admin_actions.py index c36323a6df..83286b03a9 100644 --- a/tempest/api/network/admin/test_floating_ips_admin_actions.py +++ b/tempest/api/network/admin/test_floating_ips_admin_actions.py @@ -31,6 +31,9 @@ class FloatingIPAdminTestJSON(base.BaseAdminNetworkTest): if not test.is_extension_enabled('router', 'network'): msg = "router extension not enabled." raise cls.skipException(msg) + if not CONF.network.public_network_id: + msg = "The public_network_id option must be specified." + raise cls.skipException(msg) @classmethod def setup_clients(cls): diff --git a/tempest/api/network/test_floating_ips.py b/tempest/api/network/test_floating_ips.py index 23614d6efa..1dc574b27e 100644 --- a/tempest/api/network/test_floating_ips.py +++ b/tempest/api/network/test_floating_ips.py @@ -46,6 +46,9 @@ class FloatingIPTestJSON(base.BaseNetworkTest): if not test.is_extension_enabled('router', 'network'): msg = "router extension not enabled." raise cls.skipException(msg) + if not CONF.network.public_network_id: + msg = "The public_network_id option must be specified." + raise cls.skipException(msg) @classmethod def resource_setup(cls): diff --git a/tempest/api/network/test_floating_ips_negative.py b/tempest/api/network/test_floating_ips_negative.py index 9ccda05f16..fc402cdf27 100644 --- a/tempest/api/network/test_floating_ips_negative.py +++ b/tempest/api/network/test_floating_ips_negative.py @@ -37,6 +37,9 @@ class FloatingIPNegativeTestJSON(base.BaseNetworkTest): if not test.is_extension_enabled('router', 'network'): msg = "router extension not enabled." raise cls.skipException(msg) + if not CONF.network.public_network_id: + msg = "The public_network_id option must be specified." + raise cls.skipException(msg) @classmethod def resource_setup(cls): diff --git a/tempest/api/network/test_routers.py b/tempest/api/network/test_routers.py index 524ab9e56c..694b86b3ff 100644 --- a/tempest/api/network/test_routers.py +++ b/tempest/api/network/test_routers.py @@ -14,6 +14,7 @@ # under the License. import netaddr +import testtools from tempest.api.network import base_routers as base from tempest.common.utils import data_utils @@ -42,6 +43,8 @@ class RoutersTest(base.BaseRouterTest): @test.attr(type='smoke') @decorators.idempotent_id('f64403e2-8483-4b34-8ccd-b09a87bcc68c') + @testtools.skipUnless(CONF.network.public_network_id, + 'The public_network_id option must be specified.') def test_create_show_list_update_delete_router(self): # Create a router router = self._create_router( @@ -89,6 +92,8 @@ class RoutersTest(base.BaseRouterTest): @decorators.idempotent_id('847257cc-6afd-4154-b8fb-af49f5670ce8') @test.requires_ext(extension='ext-gw-mode', service='network') + @testtools.skipUnless(CONF.network.public_network_id, + 'The public_network_id option must be specified.') def test_create_router_with_default_snat_value(self): # Create a router with default snat rule router = self._create_router( @@ -99,6 +104,8 @@ class RoutersTest(base.BaseRouterTest): @decorators.idempotent_id('ea74068d-09e9-4fd7-8995-9b6a1ace920f') @test.requires_ext(extension='ext-gw-mode', service='network') + @testtools.skipUnless(CONF.network.public_network_id, + 'The public_network_id option must be specified.') def test_create_router_with_snat_explicit(self): name = data_utils.rand_name('snat-router') # Create a router enabling snat attributes @@ -184,6 +191,8 @@ class RoutersTest(base.BaseRouterTest): self.assertIn(subnet_id, public_subnet_ids) @decorators.idempotent_id('6cc285d8-46bf-4f36-9b1a-783e3008ba79') + @testtools.skipUnless(CONF.network.public_network_id, + 'The public_network_id option must be specified.') def test_update_router_set_gateway(self): router = self._create_router() self.routers_client.update_router( @@ -198,6 +207,8 @@ class RoutersTest(base.BaseRouterTest): @decorators.idempotent_id('b386c111-3b21-466d-880c-5e72b01e1a33') @test.requires_ext(extension='ext-gw-mode', service='network') + @testtools.skipUnless(CONF.network.public_network_id, + 'The public_network_id option must be specified.') def test_update_router_set_gateway_with_snat_explicit(self): router = self._create_router() self.admin_routers_client.update_router( @@ -213,6 +224,8 @@ class RoutersTest(base.BaseRouterTest): @decorators.idempotent_id('96536bc7-8262-4fb2-9967-5c46940fa279') @test.requires_ext(extension='ext-gw-mode', service='network') + @testtools.skipUnless(CONF.network.public_network_id, + 'The public_network_id option must be specified.') def test_update_router_set_gateway_without_snat(self): router = self._create_router() self.admin_routers_client.update_router( @@ -227,6 +240,8 @@ class RoutersTest(base.BaseRouterTest): self._verify_gateway_port(router['id']) @decorators.idempotent_id('ad81b7ee-4f81-407b-a19c-17e623f763e8') + @testtools.skipUnless(CONF.network.public_network_id, + 'The public_network_id option must be specified.') def test_update_router_unset_gateway(self): router = self._create_router( external_network_id=CONF.network.public_network_id) @@ -241,6 +256,8 @@ class RoutersTest(base.BaseRouterTest): @decorators.idempotent_id('f2faf994-97f4-410b-a831-9bc977b64374') @test.requires_ext(extension='ext-gw-mode', service='network') + @testtools.skipUnless(CONF.network.public_network_id, + 'The public_network_id option must be specified.') def test_update_router_reset_gateway_without_snat(self): router = self._create_router( external_network_id=CONF.network.public_network_id) diff --git a/tempest/common/dynamic_creds.py b/tempest/common/dynamic_creds.py index 632a87687c..88fe26c3cc 100644 --- a/tempest/common/dynamic_creds.py +++ b/tempest/common/dynamic_creds.py @@ -293,12 +293,12 @@ class DynamicCredentialProvider(cred_provider.CredentialProvider): return resp_body['subnet'] def _create_router(self, router_name, tenant_id): - external_net_id = dict( - network_id=self.public_network_id) - resp_body = self.routers_admin_client.create_router( - name=router_name, - external_gateway_info=external_net_id, - tenant_id=tenant_id) + kwargs = {'name': router_name, + 'tenant_id': tenant_id} + if self.public_network_id: + kwargs['external_gateway_info'] = dict( + network_id=self.public_network_id) + resp_body = self.routers_admin_client.create_router(**kwargs) return resp_body['router'] def _add_router_interface(self, router_id, subnet_id): diff --git a/tempest/scenario/test_minimum_basic.py b/tempest/scenario/test_minimum_basic.py index 738ed616fc..27c45cb0bd 100644 --- a/tempest/scenario/test_minimum_basic.py +++ b/tempest/scenario/test_minimum_basic.py @@ -13,6 +13,8 @@ # License for the specific language governing permissions and limitations # under the License. +import testtools + from tempest.common import custom_matchers from tempest.common import waiters from tempest import config @@ -99,6 +101,8 @@ class TestMinimumBasicScenario(manager.ScenarioTest): return address @decorators.idempotent_id('bdbb5441-9204-419d-a225-b4fdbfb1a1a8') + @testtools.skipUnless(CONF.network.public_network_id, + 'The public_network_id option must be specified.') @test.services('compute', 'volume', 'image', 'network') def test_minimum_basic_scenario(self): image = self.glance_image_create() diff --git a/tempest/scenario/test_shelve_instance.py b/tempest/scenario/test_shelve_instance.py index d88a6394ed..75cef88a59 100644 --- a/tempest/scenario/test_shelve_instance.py +++ b/tempest/scenario/test_shelve_instance.py @@ -13,6 +13,8 @@ # License for the specific language governing permissions and limitations # under the License. +import testtools + from tempest.common import compute from tempest.common import waiters from tempest import config @@ -73,11 +75,15 @@ class TestShelveInstance(manager.ScenarioTest): self.assertEqual(timestamp, timestamp2) @decorators.idempotent_id('1164e700-0af0-4a4c-8792-35909a88743c') + @testtools.skipUnless(CONF.network.public_network_id, + 'The public_network_id option must be specified.') @test.services('compute', 'network', 'image') def test_shelve_instance(self): self._create_server_then_shelve_and_unshelve() @decorators.idempotent_id('c1b6318c-b9da-490b-9c67-9339b627271f') + @testtools.skipUnless(CONF.network.public_network_id, + 'The public_network_id option must be specified.') @test.services('compute', 'volume', 'network', 'image') def test_shelve_volume_backed_instance(self): self._create_server_then_shelve_and_unshelve(boot_from_volume=True) diff --git a/tempest/scenario/test_snapshot_pattern.py b/tempest/scenario/test_snapshot_pattern.py index 2ce8532328..6dedd1d40b 100644 --- a/tempest/scenario/test_snapshot_pattern.py +++ b/tempest/scenario/test_snapshot_pattern.py @@ -13,6 +13,8 @@ # License for the specific language governing permissions and limitations # under the License. +import testtools + from tempest import config from tempest.lib import decorators from tempest.scenario import manager @@ -39,6 +41,8 @@ class TestSnapshotPattern(manager.ScenarioTest): raise cls.skipException("Snapshotting is not available.") @decorators.idempotent_id('608e604b-1d63-4a82-8e3e-91bc665c90b4') + @testtools.skipUnless(CONF.network.public_network_id, + 'The public_network_id option must be specified.') @test.services('compute', 'network', 'image') def test_snapshot_pattern(self): # prepare for booting an instance diff --git a/tempest/scenario/test_stamp_pattern.py b/tempest/scenario/test_stamp_pattern.py index f00270d24c..8661217132 100644 --- a/tempest/scenario/test_stamp_pattern.py +++ b/tempest/scenario/test_stamp_pattern.py @@ -91,6 +91,8 @@ class TestStampPattern(manager.ScenarioTest): @decorators.idempotent_id('10fd234a-515c-41e5-b092-8323060598c5') @testtools.skipUnless(CONF.compute_feature_enabled.snapshot, 'Snapshotting is not available.') + @testtools.skipUnless(CONF.network.public_network_id, + 'The public_network_id option must be specified.') @test.services('compute', 'network', 'volume', 'image') def test_stamp_pattern(self): # prepare for booting an instance diff --git a/tempest/scenario/test_volume_boot_pattern.py b/tempest/scenario/test_volume_boot_pattern.py index 5254082f56..43dcf9668b 100644 --- a/tempest/scenario/test_volume_boot_pattern.py +++ b/tempest/scenario/test_volume_boot_pattern.py @@ -11,6 +11,7 @@ # under the License. from oslo_log import log as logging +import testtools from tempest.common.utils import data_utils from tempest.common import waiters @@ -98,6 +99,8 @@ class TestVolumeBootPattern(manager.ScenarioTest): @decorators.idempotent_id('557cd2c2-4eb8-4dce-98be-f86765ff311b') @test.attr(type='smoke') + @testtools.skipUnless(CONF.network.public_network_id, + 'The public_network_id option must be specified.') @test.services('compute', 'volume', 'image') def test_volume_boot_pattern(self):