Merge "Add flavor extra spec validation tests"
diff --git a/releasenotes/notes/deprecate-old-api-microversion-fixture-a471aac985c0f3fb.yaml b/releasenotes/notes/deprecate-old-api-microversion-fixture-a471aac985c0f3fb.yaml
new file mode 100644
index 0000000..652f7fa
--- /dev/null
+++ b/releasenotes/notes/deprecate-old-api-microversion-fixture-a471aac985c0f3fb.yaml
@@ -0,0 +1,7 @@
+---
+deprecations:
+ - |
+ Old APIMicroversionFixture classes ``tempest.api.compute.api_microversion_fixture.APIMicroversionFixture``
+ and ``tempest.api.volume.api_microversion_fixture.APIMicroversionFixture``
+ has been deprecated for removal in favor of new location
+ ``tempest.lib.common.api_microversion_fixture.APIMicroversionFixture``
diff --git a/tempest/api/compute/admin/test_volume.py b/tempest/api/compute/admin/test_volume.py
index cf8c560..549d4fb 100644
--- a/tempest/api/compute/admin/test_volume.py
+++ b/tempest/api/compute/admin/test_volume.py
@@ -48,8 +48,8 @@
:param return image_id: The UUID of the newly created image.
"""
- image = self.image_client.show_image(CONF.compute.image_ref)
- image_data = self.image_client.show_image_file(
+ image = self.admin_image_client.show_image(CONF.compute.image_ref)
+ image_data = self.admin_image_client.show_image_file(
CONF.compute.image_ref).data
image_file = io.BytesIO(image_data)
create_dict = {
@@ -60,11 +60,11 @@
'visibility': 'public',
}
create_dict.update(kwargs)
- new_image = self.image_client.create_image(**create_dict)
- self.addCleanup(self.image_client.wait_for_resource_deletion,
+ new_image = self.admin_image_client.create_image(**create_dict)
+ self.addCleanup(self.admin_image_client.wait_for_resource_deletion,
new_image['id'])
- self.addCleanup(self.image_client.delete_image, new_image['id'])
- self.image_client.store_image_file(new_image['id'], image_file)
+ self.addCleanup(self.admin_image_client.delete_image, new_image['id'])
+ self.admin_image_client.store_image_file(new_image['id'], image_file)
return new_image['id']
diff --git a/tempest/api/compute/api_microversion_fixture.py b/tempest/api/compute/api_microversion_fixture.py
index 695af52..1f55a65 100644
--- a/tempest/api/compute/api_microversion_fixture.py
+++ b/tempest/api/compute/api_microversion_fixture.py
@@ -13,14 +13,23 @@
# under the License.
import fixtures
+from oslo_log import log as logging
from tempest.lib.services.compute import base_compute_client
+LOG = logging.getLogger(__name__)
+
class APIMicroversionFixture(fixtures.Fixture):
def __init__(self, compute_microversion):
self.compute_microversion = compute_microversion
+ new_fixture = (
+ 'tempest.lib.common.api_microversion_fixture.'
+ 'APIMicroversionFixture')
+ LOG.warning("%s class is deprecated and moved to %s. It"
+ " will be removed in Z cycle.",
+ self.__class__.__name__, new_fixture)
def _setUp(self):
super(APIMicroversionFixture, self)._setUp()
diff --git a/tempest/api/compute/base.py b/tempest/api/compute/base.py
index 922a14c..ed50282 100644
--- a/tempest/api/compute/base.py
+++ b/tempest/api/compute/base.py
@@ -21,7 +21,6 @@
from tempest.common import waiters
from tempest import config
from tempest import exceptions
-from tempest.lib.common import api_microversion_fixture
from tempest.lib.common import api_version_request
from tempest.lib.common import api_version_utils
from tempest.lib.common.utils import data_utils
@@ -164,6 +163,11 @@
api_version_utils.select_request_microversion(
cls.placement_min_microversion,
CONF.placement.min_microversion))
+ cls.setup_api_microversion_fixture(
+ compute_microversion=cls.request_microversion,
+ volume_microversion=cls.volume_request_microversion,
+ placement_microversion=cls.placement_request_microversion)
+
cls.build_interval = CONF.compute.build_interval
cls.build_timeout = CONF.compute.build_timeout
cls.image_ref = CONF.compute.image_ref
@@ -499,13 +503,6 @@
else:
raise lib_exc.InvalidConfiguration()
- def setUp(self):
- super(BaseV2ComputeTest, self).setUp()
- self.useFixture(api_microversion_fixture.APIMicroversionFixture(
- compute_microversion=self.request_microversion,
- volume_microversion=self.volume_request_microversion,
- placement_microversion=self.placement_request_microversion))
-
@classmethod
def create_volume(cls, image_ref=None, **kwargs):
"""Create a volume and wait for it to become 'available'.
@@ -658,7 +655,7 @@
cls.os_admin.availability_zone_client)
cls.admin_flavors_client = cls.os_admin.flavors_client
cls.admin_servers_client = cls.os_admin.servers_client
- cls.image_client = cls.os_admin.image_client_v2
+ cls.admin_image_client = cls.os_admin.image_client_v2
cls.admin_assisted_volume_snapshots_client = \
cls.os_admin.assisted_volume_snapshots_client
diff --git a/tempest/api/identity/admin/v3/test_domains.py b/tempest/api/identity/admin/v3/test_domains.py
index 32ccb9e..419c6c7 100644
--- a/tempest/api/identity/admin/v3/test_domains.py
+++ b/tempest/api/identity/admin/v3/test_domains.py
@@ -157,4 +157,4 @@
self.addCleanup(self.delete_domain, domain['id'])
expected_data = {'name': d_name, 'enabled': True}
self.assertEqual('', domain['description'])
- self.assertDictContainsSubset(expected_data, domain)
+ self.assertLessEqual(expected_data.items(), domain.items())
diff --git a/tempest/api/identity/admin/v3/test_services.py b/tempest/api/identity/admin/v3/test_services.py
index a649d27..fb3b03e 100644
--- a/tempest/api/identity/admin/v3/test_services.py
+++ b/tempest/api/identity/admin/v3/test_services.py
@@ -44,7 +44,7 @@
# Verifying response body of create service
expected_data = {'name': name, 'type': serv_type, 'description': desc}
- self.assertDictContainsSubset(expected_data, create_service)
+ self.assertLessEqual(expected_data.items(), create_service.items())
# Update description
s_id = create_service['id']
@@ -61,7 +61,7 @@
resp3_desc = fetched_service['description']
self.assertEqual(resp2_desc, resp3_desc)
- self.assertDictContainsSubset(update_service, fetched_service)
+ self.assertLessEqual(update_service.items(), fetched_service.items())
@decorators.idempotent_id('d1dcb1a1-2b6b-4da8-bbb8-5532ef6e8269')
def test_create_service_without_description(self):
@@ -72,7 +72,7 @@
type=serv_type, name=name)['service']
self.addCleanup(self.services_client.delete_service, service['id'])
expected_data = {'name': name, 'type': serv_type}
- self.assertDictContainsSubset(expected_data, service)
+ self.assertLessEqual(expected_data.items(), service.items())
@decorators.idempotent_id('e55908e8-360e-439e-8719-c3230a3e179e')
def test_list_services(self):
diff --git a/tempest/api/identity/admin/v3/test_tokens.py b/tempest/api/identity/admin/v3/test_tokens.py
index 5bbd65c..e191979 100644
--- a/tempest/api/identity/admin/v3/test_tokens.py
+++ b/tempest/api/identity/admin/v3/test_tokens.py
@@ -38,14 +38,17 @@
# Create a user.
user_password = data_utils.rand_password()
- user = self.create_test_user(password=user_password)
+ user = self.create_test_user(password=user_password,
+ domain_id=CONF.identity.default_domain_id)
# Create a couple projects
project1_name = data_utils.rand_name(name=self.__class__.__name__)
- project1 = self.setup_test_project(name=project1_name)
+ project1 = self.setup_test_project(
+ name=project1_name, domain_id=CONF.identity.default_domain_id)
project2_name = data_utils.rand_name(name=self.__class__.__name__)
- project2 = self.setup_test_project(name=project2_name)
+ project2 = self.setup_test_project(
+ name=project2_name, domain_id=CONF.identity.default_domain_id)
self.addCleanup(self.projects_client.delete_project, project2['id'])
# Create a role
diff --git a/tempest/api/network/test_security_groups.py b/tempest/api/network/test_security_groups.py
index d75acfc..532ef65 100644
--- a/tempest/api/network/test_security_groups.py
+++ b/tempest/api/network/test_security_groups.py
@@ -110,6 +110,33 @@
# Delete security group
self._delete_security_group(group_create_body['security_group']['id'])
+ @decorators.idempotent_id('fd1ea1c5-eedc-403f-898d-2b562e853f2e')
+ def test_delete_security_group_clear_associated_rules(self):
+ """Verify delete security group.
+
+ its associated security group rules are also deleted
+ """
+ group_create_body, _ = self._create_security_group()
+
+ # Create rules for tcp protocol
+ client = self.security_group_rules_client
+ rule_create_body = client.create_security_group_rule(
+ security_group_id=group_create_body['security_group']['id'],
+ protocol='tcp',
+ direction='ingress',
+ ethertype=self.ethertype
+ )
+ rule_id = rule_create_body['security_group_rule']['id']
+ # Delete security group
+ self._delete_security_group(group_create_body['security_group']['id'])
+
+ # List rules and verify created rule is not in response
+ rule_list_body = (
+ self.security_group_rules_client.list_security_group_rules())
+ rule_list = [rule['id']
+ for rule in rule_list_body['security_group_rules']]
+ self.assertNotIn(rule_id, rule_list)
+
@decorators.attr(type='smoke')
@decorators.idempotent_id('cfb99e0e-7410-4a3d-8a0c-959a63ee77e9')
def test_create_show_delete_security_group_rule(self):
diff --git a/tempest/api/volume/admin/test_group_snapshots.py b/tempest/api/volume/admin/test_group_snapshots.py
index ddfc78a..73903cf 100644
--- a/tempest/api/volume/admin/test_group_snapshots.py
+++ b/tempest/api/volume/admin/test_group_snapshots.py
@@ -256,7 +256,6 @@
volume_max_microversion = 'latest'
@decorators.idempotent_id('3b42c9b9-c984-4444-816e-ca2e1ed30b40')
- @decorators.skip_because(bug='1770179')
def test_reset_group_snapshot_status(self):
"""Test resetting group snapshot status to creating/available/error"""
# Create volume type
diff --git a/tempest/api/volume/admin/test_volume_quotas.py b/tempest/api/volume/admin/test_volume_quotas.py
index 5ab8e87..6b58189 100644
--- a/tempest/api/volume/admin/test_volume_quotas.py
+++ b/tempest/api/volume/admin/test_volume_quotas.py
@@ -87,7 +87,7 @@
# test that the specific values we set are actually in
# the final result. There is nothing here that ensures there
# would be no other values in there.
- self.assertDictContainsSubset(new_quota_set, quota_set)
+ self.assertLessEqual(new_quota_set.items(), quota_set.items())
@decorators.idempotent_id('18c51ae9-cb03-48fc-b234-14a19374dbed')
def test_show_quota_usage(self):
diff --git a/tempest/api/volume/api_microversion_fixture.py b/tempest/api/volume/api_microversion_fixture.py
index 7bbe674..219fde8 100644
--- a/tempest/api/volume/api_microversion_fixture.py
+++ b/tempest/api/volume/api_microversion_fixture.py
@@ -12,14 +12,23 @@
# under the License.
import fixtures
+from oslo_log import log as logging
from tempest.lib.services.volume import base_client
+LOG = logging.getLogger(__name__)
+
class APIMicroversionFixture(fixtures.Fixture):
def __init__(self, volume_microversion):
self.volume_microversion = volume_microversion
+ new_fixture = (
+ 'tempest.lib.common.api_microversion_fixture.'
+ 'APIMicroversionFixture')
+ LOG.warning("%s class is deprecated and moved to %s. It"
+ " will be removed in Z cycle.",
+ self.__class__.__name__, new_fixture)
def _setUp(self):
super(APIMicroversionFixture, self)._setUp()
diff --git a/tempest/api/volume/base.py b/tempest/api/volume/base.py
index 6e34dd6..b90b5bb 100644
--- a/tempest/api/volume/base.py
+++ b/tempest/api/volume/base.py
@@ -16,7 +16,6 @@
from tempest.common import compute
from tempest.common import waiters
from tempest import config
-from tempest.lib.common import api_microversion_fixture
from tempest.lib.common import api_version_utils
from tempest.lib.common.utils import data_utils
from tempest.lib.common.utils import test_utils
@@ -75,12 +74,6 @@
cls.os_primary.volume_availability_zone_client_latest)
cls.volume_limits_client = cls.os_primary.volume_limits_client_latest
- def setUp(self):
- super(BaseVolumeTest, self).setUp()
- self.useFixture(api_microversion_fixture.APIMicroversionFixture(
- compute_microversion=self.compute_request_microversion,
- volume_microversion=self.volume_request_microversion))
-
@classmethod
def resource_setup(cls):
super(BaseVolumeTest, cls).resource_setup()
@@ -92,6 +85,9 @@
api_version_utils.select_request_microversion(
cls.min_microversion,
CONF.compute.min_microversion))
+ cls.setup_api_microversion_fixture(
+ compute_microversion=cls.compute_request_microversion,
+ volume_microversion=cls.volume_request_microversion)
cls.image_ref = CONF.compute.image_ref
cls.flavor_ref = CONF.compute.flavor_ref
diff --git a/tempest/lib/api_schema/response/volume/volumes.py b/tempest/lib/api_schema/response/volume/volumes.py
index ffcf488..4f44526 100644
--- a/tempest/lib/api_schema/response/volume/volumes.py
+++ b/tempest/lib/api_schema/response/volume/volumes.py
@@ -21,7 +21,7 @@
'items': {
'type': 'object',
'properties': {
- 'server_id': {'type': 'string', 'format': 'uuid'},
+ 'server_id': {'type': ['string', 'null'], 'format': 'uuid'},
'attachment_id': {'type': 'string', 'format': 'uuid'},
'attached_at': parameter_types.date_time_or_null,
'host_name': {'type': ['string', 'null']},
diff --git a/tempest/lib/cmd/check_uuid.py b/tempest/lib/cmd/check_uuid.py
index 0ae11ca..466222d 100755
--- a/tempest/lib/cmd/check_uuid.py
+++ b/tempest/lib/cmd/check_uuid.py
@@ -38,7 +38,7 @@
class SourcePatcher(object):
- """"Lazy patcher for python source files"""
+ """Lazy patcher for python source files"""
def __init__(self):
self.source_files = None
@@ -431,14 +431,21 @@
help='Package with tests')
parser.add_argument('--fix', action='store_true', dest='fix_tests',
help='Attempt to fix tests without UUIDs')
+ parser.add_argument('--libpath', action='store', dest='libpath',
+ default=".", type=str,
+ help='Path to package')
+
args = parser.parse_args()
- sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
+ sys.path.append(os.path.join(os.path.dirname(__file__), os.pardir))
+ sys.path.insert(0, args.libpath)
pkg = importlib.import_module(args.package)
+
checker = TestChecker(pkg)
errors = False
tests = checker.get_tests()
untagged = checker.find_untagged(tests)
errors = checker.report_collisions(tests) or errors
+
if args.fix_tests and untagged:
checker.fix_tests(untagged)
else:
diff --git a/tempest/scenario/manager.py b/tempest/scenario/manager.py
index 39021d5..7aa96b2 100644
--- a/tempest/scenario/manager.py
+++ b/tempest/scenario/manager.py
@@ -30,7 +30,6 @@
from tempest.common import waiters
from tempest import config
from tempest import exceptions
-from tempest.lib.common import api_microversion_fixture
from tempest.lib.common import api_version_utils
from tempest.lib.common.utils import data_utils
from tempest.lib.common.utils import test_utils
@@ -85,12 +84,10 @@
cls.placement_min_microversion,
CONF.placement.min_microversion))
- def setUp(self):
- super(ScenarioTest, self).setUp()
- self.useFixture(api_microversion_fixture.APIMicroversionFixture(
- compute_microversion=self.compute_request_microversion,
- volume_microversion=self.volume_request_microversion,
- placement_microversion=self.placement_request_microversion))
+ cls.setup_api_microversion_fixture(
+ compute_microversion=cls.compute_request_microversion,
+ volume_microversion=cls.volume_request_microversion,
+ placement_microversion=cls.placement_request_microversion)
def setup_compute_client(cls):
"""Compute client"""
diff --git a/tempest/test.py b/tempest/test.py
index 8ea3b16..bf0aba4 100644
--- a/tempest/test.py
+++ b/tempest/test.py
@@ -27,6 +27,7 @@
from tempest.common import utils
from tempest import config
from tempest.lib import base as lib_base
+from tempest.lib.common import api_microversion_fixture
from tempest.lib.common import fixed_network
from tempest.lib.common import profiler
from tempest.lib.common import validation_resources as vr
@@ -480,6 +481,34 @@
pass
@classmethod
+ def setup_api_microversion_fixture(
+ cls, compute_microversion=None, volume_microversion=None,
+ placement_microversion=None):
+ """Set up api microversion fixture on service clients.
+
+ `setup_api_microversion_fixture` is used to set the api microversion
+ on service clients. This can be invoked from resource_setup() method.
+
+ Example::
+
+ @classmethod
+ def resource_setup(cls):
+ super(MyTest, cls).resource_setup()
+ cls.setup_api_microversion_fixture(
+ compute_microversion=cls.compute_request_microversion,
+ volume_microversion=cls.volume_request_microversion,
+ placement_microversion=cls.placement_request_microversion)
+
+ """
+
+ api_fixture = api_microversion_fixture.APIMicroversionFixture(
+ compute_microversion=compute_microversion,
+ volume_microversion=volume_microversion,
+ placement_microversion=placement_microversion)
+ api_fixture.setUp()
+ cls.addClassResourceCleanup(api_fixture._reset_microversion)
+
+ @classmethod
def resource_setup(cls):
"""Class level resource setup for test cases.
diff --git a/tempest/tests/lib/common/test_rest_client.py b/tempest/tests/lib/common/test_rest_client.py
index c5f6d7a..1dea5f5 100644
--- a/tempest/tests/lib/common/test_rest_client.py
+++ b/tempest/tests/lib/common/test_rest_client.py
@@ -144,11 +144,11 @@
extra_headers=True,
headers=self.headers)
- self.assertDictContainsSubset(
+ self.assertLessEqual(
{'X-Configuration-Session': 'session_id',
'Content-Type': 'application/json',
- 'Accept': 'application/json'},
- return_dict['headers']
+ 'Accept': 'application/json'}.items(),
+ return_dict['headers'].items()
)
def test_get_update_headers(self):
@@ -156,11 +156,11 @@
extra_headers=True,
headers=self.headers)
- self.assertDictContainsSubset(
+ self.assertLessEqual(
{'X-Configuration-Session': 'session_id',
'Content-Type': 'application/json',
- 'Accept': 'application/json'},
- return_dict['headers']
+ 'Accept': 'application/json'}.items(),
+ return_dict['headers'].items()
)
def test_delete_update_headers(self):
@@ -168,11 +168,11 @@
extra_headers=True,
headers=self.headers)
- self.assertDictContainsSubset(
+ self.assertLessEqual(
{'X-Configuration-Session': 'session_id',
'Content-Type': 'application/json',
- 'Accept': 'application/json'},
- return_dict['headers']
+ 'Accept': 'application/json'}.items(),
+ return_dict['headers'].items()
)
def test_patch_update_headers(self):
@@ -180,11 +180,11 @@
extra_headers=True,
headers=self.headers)
- self.assertDictContainsSubset(
+ self.assertLessEqual(
{'X-Configuration-Session': 'session_id',
'Content-Type': 'application/json',
- 'Accept': 'application/json'},
- return_dict['headers']
+ 'Accept': 'application/json'}.items(),
+ return_dict['headers'].items()
)
def test_put_update_headers(self):
@@ -192,11 +192,11 @@
extra_headers=True,
headers=self.headers)
- self.assertDictContainsSubset(
+ self.assertLessEqual(
{'X-Configuration-Session': 'session_id',
'Content-Type': 'application/json',
- 'Accept': 'application/json'},
- return_dict['headers']
+ 'Accept': 'application/json'}.items(),
+ return_dict['headers'].items()
)
def test_head_update_headers(self):
@@ -207,11 +207,11 @@
extra_headers=True,
headers=self.headers)
- self.assertDictContainsSubset(
+ self.assertLessEqual(
{'X-Configuration-Session': 'session_id',
'Content-Type': 'application/json',
- 'Accept': 'application/json'},
- return_dict['headers']
+ 'Accept': 'application/json'}.items(),
+ return_dict['headers'].items()
)
def test_copy_update_headers(self):
@@ -219,11 +219,11 @@
extra_headers=True,
headers=self.headers)
- self.assertDictContainsSubset(
+ self.assertLessEqual(
{'X-Configuration-Session': 'session_id',
'Content-Type': 'application/json',
- 'Accept': 'application/json'},
- return_dict['headers']
+ 'Accept': 'application/json'}.items(),
+ return_dict['headers'].items()
)
diff --git a/tempest/tests/lib/services/network/test_routers_client.py b/tempest/tests/lib/services/network/test_routers_client.py
index f5dcc7d..20b6853 100644
--- a/tempest/tests/lib/services/network/test_routers_client.py
+++ b/tempest/tests/lib/services/network/test_routers_client.py
@@ -95,6 +95,67 @@
}
}
+ FAKE_ROUTER_ID = "f8a44de0-fc8e-45df-93c7-f79bf3b01c95"
+ FAKE_INTERFACE = {
+ "id": "915a14a6-867b-4af7-83d1-70efceb146f9",
+ "network_id": "91c013e2-d65a-474e-9177-c3e1799ca726",
+ "port_id": "2dc46bcc-d1f2-4077-b99e-91ee28afaff0",
+ "subnet_id": "a2f1f29d-571b-4533-907f-5803ab96ead1",
+ "subnet_ids": [
+ "a2f1f29d-571b-4533-907f-5803ab96ead1"
+ ],
+ "project_id": "0bd18306d801447bb457a46252d82d13",
+ "tenant_id": "0bd18306d801447bb457a46252d82d13",
+ "tags": ["tag1,tag2"]
+ }
+ FAKE_INTERFACE_KWARGS = {
+ "subnet_id": "a2f1f29d-571b-4533-907f-5803ab96ead1"
+ }
+ FAKE_SHOW_ROUTER = {
+ "router": {
+ "admin_state_up": "true",
+ "availability_zone_hints": [],
+ "availability_zones": [
+ "nova"
+ ],
+ "created_at": "2018-03-19T19:17:04Z",
+ "description": "",
+ "distributed": "false",
+ "external_gateway_info": {
+ "enable_snat": "true",
+ "external_fixed_ips": [
+ {
+ "ip_address": "172.24.4.6",
+ "subnet_id": "b930d7f6-ceb7-40a0-8b81-a425dd994ccf"
+ },
+ {
+ "ip_address": "2001:db8::9",
+ "subnet_id": "0c56df5d-ace5-46c8-8f4c-45fa4e334d18"
+ }
+ ],
+ "network_id": "ae34051f-aa6c-4c75-abf5-50dc9ac99ef3"
+ },
+ "flavor_id": "f7b14d9a-b0dc-4fbe-bb14-a0f4970a69e0",
+ "ha": "false",
+ "id": "f8a44de0-fc8e-45df-93c7-f79bf3b01c95",
+ "name": "router1",
+ "revision_number": 1,
+ "routes": [
+ {
+ "destination": "179.24.1.0/24",
+ "nexthop": "172.24.3.99"
+ }
+ ],
+ "status": "ACTIVE",
+ "updated_at": "2018-03-19T19:17:22Z",
+ "project_id": "0bd18306d801447bb457a46252d82d13",
+ "tenant_id": "0bd18306d801447bb457a46252d82d13",
+ "service_type_id": "null",
+ "tags": ["tag1,tag2"],
+ "conntrack_helpers": []
+ }
+ }
+
def setUp(self):
super(TestRoutersClient, self).setUp()
fake_auth = fake_auth_provider.FakeAuthProvider()
@@ -116,6 +177,15 @@
bytes_body,
name="another_router", admin_state_up="true", status=201)
+ def _test_show_router(self, bytes_body=False):
+ self.check_service_client_function(
+ self.client.show_router,
+ "tempest.lib.common.rest_client.RestClient.get",
+ self.FAKE_SHOW_ROUTER,
+ bytes_body,
+ 200,
+ router_id=self.FAKE_ROUTER_ID)
+
def _test_update_router(self, bytes_body=False):
self.check_service_client_function(
self.client.update_router,
@@ -125,6 +195,24 @@
router_id="8604a0de-7f6b-409a-a47c-a1cc7bc77b2e",
admin_state_up=False)
+ def _test_add_router_interface(self, bytes_body=False):
+ self.check_service_client_function(
+ self.client.add_router_interface,
+ 'tempest.lib.common.rest_client.RestClient.put',
+ self.FAKE_INTERFACE,
+ bytes_body,
+ router_id=self.FAKE_ROUTER_ID,
+ **self.FAKE_INTERFACE_KWARGS)
+
+ def _test_remove_router_interface(self, bytes_body=False):
+ self.check_service_client_function(
+ self.client.remove_router_interface,
+ 'tempest.lib.common.rest_client.RestClient.put',
+ self.FAKE_INTERFACE,
+ bytes_body,
+ router_id=self.FAKE_ROUTER_ID,
+ **self.FAKE_INTERFACE_KWARGS)
+
def test_list_routers_with_str_body(self):
self._test_list_routers()
@@ -148,3 +236,21 @@
def test_update_router_with_bytes_body(self):
self._test_update_router(bytes_body=True)
+
+ def test_show_router_with_str_body(self):
+ self._test_show_router()
+
+ def test_show_router_with_bytes_body(self):
+ self._test_show_router(bytes_body=True)
+
+ def test_add_router_interface_with_str_body(self):
+ self._test_add_router_interface()
+
+ def test_add_router_interface_with_bytes_body(self):
+ self._test_add_router_interface(bytes_body=True)
+
+ def test_remove_router_interface_with_str_body(self):
+ self._test_remove_router_interface()
+
+ def test_remove_router_interface_with_bytes_body(self):
+ self._test_remove_router_interface(bytes_body=True)
diff --git a/tempest/tests/lib/services/network/test_subnetpools_client.py b/tempest/tests/lib/services/network/test_subnetpools_client.py
index 3abb438..2dfa25e 100644
--- a/tempest/tests/lib/services/network/test_subnetpools_client.py
+++ b/tempest/tests/lib/services/network/test_subnetpools_client.py
@@ -26,13 +26,13 @@
"subnetpools": [
{
"min_prefixlen": "64",
- "address_scope_id": None,
+ "address_scope_id": "null",
"default_prefixlen": "64",
"id": "03f761e6-eee0-43fc-a921-8acf64c14988",
"max_prefixlen": "64",
"name": "my-subnet-pool-ipv6",
- "default_quota": None,
- "is_default": False,
+ "default_quota": "null",
+ "is_default": "false",
"project_id": "9fadcee8aa7c40cdb2114fff7d569c08",
"tenant_id": "9fadcee8aa7c40cdb2114fff7d569c08",
"prefixes": [
@@ -40,19 +40,22 @@
"2001:db8::/63"
],
"ip_version": 6,
- "shared": False,
+ "shared": "false",
"description": "",
- "revision_number": 2
+ "created_at": "2016-03-08T20:19:41",
+ "updated_at": "2016-03-08T20:19:41",
+ "revision_number": 2,
+ "tags": ["tag1,tag2"]
},
{
"min_prefixlen": "24",
- "address_scope_id": None,
+ "address_scope_id": "null",
"default_prefixlen": "25",
"id": "f49a1319-423a-4ee6-ba54-1d95a4f6cc68",
"max_prefixlen": "30",
"name": "my-subnet-pool-ipv4",
- "default_quota": None,
- "is_default": False,
+ "default_quota": "null",
+ "is_default": "false",
"project_id": "9fadcee8aa7c40cdb2114fff7d569c08",
"tenant_id": "9fadcee8aa7c40cdb2114fff7d569c08",
"prefixes": [
@@ -60,9 +63,12 @@
"192.168.0.0/16"
],
"ip_version": 4,
- "shared": False,
+ "shared": "false",
"description": "",
- "revision_number": 2
+ "created_at": "2016-03-08T20:19:41",
+ "updated_at": "2016-03-08T20:19:41",
+ "revision_number": 2,
+ "tags": ["tag1,tag2"]
}
]
}
diff --git a/tempest/tests/test_test.py b/tempest/tests/test_test.py
index 9aeedb3..a95914a 100644
--- a/tempest/tests/test_test.py
+++ b/tempest/tests/test_test.py
@@ -24,6 +24,9 @@
from tempest import config
from tempest.lib.common import validation_resources as vr
from tempest.lib import exceptions as lib_exc
+from tempest.lib.services.compute import base_compute_client
+from tempest.lib.services.placement import base_placement_client
+from tempest.lib.services.volume import base_client as base_volume_client
from tempest import test
from tempest.tests import base
from tempest.tests import fake_config
@@ -749,3 +752,186 @@
self.test.fixtures_invoked)
found_exc = log[0][1][1]
self.assertIn(expected_exc, str(found_exc))
+
+
+class TestAPIMicroversionTest1(test.BaseTestCase):
+
+ @classmethod
+ def resource_setup(cls):
+ super(TestAPIMicroversionTest1, cls).resource_setup()
+ # Setting microvesions and checks that every tests
+ # of this class will have those microversion set
+ # on service clients requesting service APIs.
+ cls.setup_api_microversion_fixture(
+ compute_microversion='2.30',
+ volume_microversion='3.10',
+ placement_microversion='3.1')
+ # Check microvesion is set during resource_setup()
+ if base_compute_client.COMPUTE_MICROVERSION != '2.30':
+ raise testtools.TestCase.failureException(
+ "Microversion is not set in resource_setup method")
+ if base_volume_client.VOLUME_MICROVERSION != '3.10':
+ raise testtools.TestCase.failureException(
+ "Microversion is not set in resource_setup method")
+ if base_placement_client.PLACEMENT_MICROVERSION != '3.1':
+ raise testtools.TestCase.failureException(
+ "Microversion is not set in resource_setup method")
+
+ @classmethod
+ def resource_cleanup(cls):
+ super(TestAPIMicroversionTest1, cls).resource_cleanup()
+ # Check microversion is reset back to None in resource_cleanup()
+ if base_compute_client.COMPUTE_MICROVERSION is not None:
+ raise testtools.TestCase.failureException(
+ "Microversion is not reset to None in resource_cleanup method")
+ if base_volume_client.VOLUME_MICROVERSION is not None:
+ raise testtools.TestCase.failureException(
+ "Microversion is not reset to None in resource_cleanup method")
+ if base_placement_client.PLACEMENT_MICROVERSION is not None:
+ raise testtools.TestCase.failureException(
+ "Microversion is not reset to None in resource_cleanup method")
+
+ def setUp(self):
+ super(TestAPIMicroversionTest1, self).setUp()
+ # Check microversion is set in setUp method also.
+ self.assertEqual('2.30', base_compute_client.COMPUTE_MICROVERSION)
+ self.assertEqual('3.10', base_volume_client.VOLUME_MICROVERSION)
+ self.assertEqual('3.1', base_placement_client.PLACEMENT_MICROVERSION)
+
+ def tearDown(self):
+ super(TestAPIMicroversionTest1, self).tearDown()
+ # Check microversion is set in tearDown method also.
+ self.assertEqual('2.30', base_compute_client.COMPUTE_MICROVERSION)
+ self.assertEqual('3.10', base_volume_client.VOLUME_MICROVERSION)
+ self.assertEqual('3.1', base_placement_client.PLACEMENT_MICROVERSION)
+
+ def test_1(self):
+ self.assertEqual('2.30', base_compute_client.COMPUTE_MICROVERSION)
+ self.assertEqual('3.10', base_volume_client.VOLUME_MICROVERSION)
+ self.assertEqual('3.1', base_placement_client.PLACEMENT_MICROVERSION)
+
+ def test_2(self):
+ self.assertEqual('2.30', base_compute_client.COMPUTE_MICROVERSION)
+ self.assertEqual('3.10', base_volume_client.VOLUME_MICROVERSION)
+ self.assertEqual('3.1', base_placement_client.PLACEMENT_MICROVERSION)
+
+
+class TestAPIMicroversionTest2(test.BaseTestCase):
+
+ @classmethod
+ def resource_setup(cls):
+ super(TestAPIMicroversionTest2, cls).resource_setup()
+ # Setting microvesions different from what set in
+ # MicroversionTest1 and checks that every tests
+ # of this class will have the new microversion set
+ # on service clients requesting service APIs.
+ cls.setup_api_microversion_fixture(
+ compute_microversion='2.80',
+ volume_microversion='3.80',
+ placement_microversion='3.8')
+ # Check microvesion is set during resource_setup()
+ if base_compute_client.COMPUTE_MICROVERSION != '2.80':
+ raise testtools.TestCase.failureException(
+ "Microversion is not set in resource_setup method")
+ if base_volume_client.VOLUME_MICROVERSION != '3.80':
+ raise testtools.TestCase.failureException(
+ "Microversion is not set in resource_setup method")
+ if base_placement_client.PLACEMENT_MICROVERSION != '3.8':
+ raise testtools.TestCase.failureException(
+ "Microversion is not set in resource_setup method")
+
+ @classmethod
+ def resource_cleanup(cls):
+ super(TestAPIMicroversionTest2, cls).resource_cleanup()
+ # Check microversion is reset back to None in resource_cleanup()
+ if base_compute_client.COMPUTE_MICROVERSION is not None:
+ raise testtools.TestCase.failureException(
+ "Microversion is not reset to None in resource_cleanup method")
+ if base_volume_client.VOLUME_MICROVERSION is not None:
+ raise testtools.TestCase.failureException(
+ "Microversion is not reset to None in resource_cleanup method")
+ if base_placement_client.PLACEMENT_MICROVERSION is not None:
+ raise testtools.TestCase.failureException(
+ "Microversion is not reset to None in resource_cleanup method")
+
+ def setUp(self):
+ super(TestAPIMicroversionTest2, self).setUp()
+ # Check microversion is set in setUp method also.
+ self.assertEqual('2.80', base_compute_client.COMPUTE_MICROVERSION)
+ self.assertEqual('3.80', base_volume_client.VOLUME_MICROVERSION)
+ self.assertEqual('3.8', base_placement_client.PLACEMENT_MICROVERSION)
+
+ def tearDown(self):
+ super(TestAPIMicroversionTest2, self).tearDown()
+ # Check microversion is set in tearDown method also.
+ self.assertEqual('2.80', base_compute_client.COMPUTE_MICROVERSION)
+ self.assertEqual('3.80', base_volume_client.VOLUME_MICROVERSION)
+ self.assertEqual('3.8', base_placement_client.PLACEMENT_MICROVERSION)
+
+ def test_1(self):
+ self.assertEqual('2.80', base_compute_client.COMPUTE_MICROVERSION)
+ self.assertEqual('3.80', base_volume_client.VOLUME_MICROVERSION)
+ self.assertEqual('3.8', base_placement_client.PLACEMENT_MICROVERSION)
+
+ def test_2(self):
+ self.assertEqual('2.80', base_compute_client.COMPUTE_MICROVERSION)
+ self.assertEqual('3.80', base_volume_client.VOLUME_MICROVERSION)
+ self.assertEqual('3.8', base_placement_client.PLACEMENT_MICROVERSION)
+
+
+class TestAPIMicroversionTest3(test.BaseTestCase):
+
+ @classmethod
+ def resource_setup(cls):
+ super(TestAPIMicroversionTest3, cls).resource_setup()
+ # Not setting microversion for this test class so
+ # there should not be any micorversion set on service
+ # clients requesting services APIs.
+ # Check microvesion is not set during resource_setup()
+ if base_compute_client.COMPUTE_MICROVERSION is not None:
+ raise testtools.TestCase.failureException(
+ "Microversion is not set in resource_setup method")
+ if base_volume_client.VOLUME_MICROVERSION is not None:
+ raise testtools.TestCase.failureException(
+ "Microversion is not set in resource_setup method")
+ if base_placement_client.PLACEMENT_MICROVERSION is not None:
+ raise testtools.TestCase.failureException(
+ "Microversion is not set in resource_setup method")
+
+ @classmethod
+ def resource_cleanup(cls):
+ super(TestAPIMicroversionTest3, cls).resource_cleanup()
+ # Check microversion is set to None in resource_cleanup()
+ if base_compute_client.COMPUTE_MICROVERSION is not None:
+ raise testtools.TestCase.failureException(
+ "Microversion is not reset to None in resource_cleanup method")
+ if base_volume_client.VOLUME_MICROVERSION is not None:
+ raise testtools.TestCase.failureException(
+ "Microversion is not reset to None in resource_cleanup method")
+ if base_placement_client.PLACEMENT_MICROVERSION is not None:
+ raise testtools.TestCase.failureException(
+ "Microversion is not reset to None in resource_cleanup method")
+
+ def setUp(self):
+ super(TestAPIMicroversionTest3, self).setUp()
+ # Check microversion is None in setUp method also.
+ self.assertIsNone(base_compute_client.COMPUTE_MICROVERSION)
+ self.assertIsNone(base_volume_client.VOLUME_MICROVERSION)
+ self.assertIsNone(base_placement_client.PLACEMENT_MICROVERSION)
+
+ def tearDown(self):
+ super(TestAPIMicroversionTest3, self).tearDown()
+ # Check microversion is None in tearDown method also.
+ self.assertIsNone(base_compute_client.COMPUTE_MICROVERSION)
+ self.assertIsNone(base_volume_client.VOLUME_MICROVERSION)
+ self.assertIsNone(base_placement_client.PLACEMENT_MICROVERSION)
+
+ def test_1(self):
+ self.assertIsNone(base_compute_client.COMPUTE_MICROVERSION)
+ self.assertIsNone(base_volume_client.VOLUME_MICROVERSION)
+ self.assertIsNone(base_placement_client.PLACEMENT_MICROVERSION)
+
+ def test_2(self):
+ self.assertIsNone(base_compute_client.COMPUTE_MICROVERSION)
+ self.assertIsNone(base_volume_client.VOLUME_MICROVERSION)
+ self.assertIsNone(base_placement_client.PLACEMENT_MICROVERSION)
diff --git a/tox.ini b/tox.ini
index 8cfe5ff..18f2aa6 100644
--- a/tox.ini
+++ b/tox.ini
@@ -10,6 +10,7 @@
setenv =
VIRTUAL_ENV={envdir}
OS_TEST_PATH=./tempest/test_discover
+ OS_TEST_TIMEOUT={env:OS_TEST_TIMEOUT:1200}
deps =
-c{env:UPPER_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master}
-r{toxinidir}/requirements.txt
@@ -61,7 +62,6 @@
# 'all' includes slow tests
setenv =
{[tempestenv]setenv}
- OS_TEST_TIMEOUT={env:OS_TEST_TIMEOUT:1200}
deps = {[tempestenv]deps}
commands =
find . -type f -name "*.pyc" -delete
@@ -79,7 +79,6 @@
# 'all' includes slow tests
setenv =
{[tempestenv]setenv}
- OS_TEST_TIMEOUT={env:OS_TEST_TIMEOUT:1200}
basepython = {[tempestenv]basepython}
deps = {[tempestenv]deps}
commands =
@@ -93,7 +92,6 @@
# 'all' includes slow tests
setenv =
{[tempestenv]setenv}
- OS_TEST_TIMEOUT={env:OS_TEST_TIMEOUT:1200}
basepython = {[tempestenv]basepython}
deps = {[tempestenv]deps}
commands =
diff --git a/zuul.d/integrated-gate.yaml b/zuul.d/integrated-gate.yaml
index 753b8fe..b86268a 100644
--- a/zuul.d/integrated-gate.yaml
+++ b/zuul.d/integrated-gate.yaml
@@ -318,10 +318,12 @@
jobs:
- grenade
- tempest-integrated-networking
+ - openstacksdk-functional-devstack
gate:
jobs:
- grenade
- tempest-integrated-networking
+ - openstacksdk-functional-devstack
- project-template:
name: integrated-gate-compute
@@ -334,10 +336,12 @@
jobs:
- tempest-integrated-compute
- tempest-integrated-compute-centos-8-stream
+ - openstacksdk-functional-devstack
gate:
jobs:
- tempest-integrated-compute
- tempest-integrated-compute-centos-8-stream
+ - openstacksdk-functional-devstack
- project-template:
name: integrated-gate-placement
@@ -350,10 +354,12 @@
jobs:
- grenade
- tempest-integrated-placement
+ - openstacksdk-functional-devstack
gate:
jobs:
- grenade
- tempest-integrated-placement
+ - openstacksdk-functional-devstack
- project-template:
name: integrated-gate-storage
@@ -366,10 +372,12 @@
jobs:
- grenade
- tempest-integrated-storage
+ - openstacksdk-functional-devstack
gate:
jobs:
- grenade
- tempest-integrated-storage
+ - openstacksdk-functional-devstack
- project-template:
name: integrated-gate-object-storage
@@ -382,7 +390,9 @@
jobs:
- grenade
- tempest-integrated-object-storage
+ - openstacksdk-functional-devstack
gate:
jobs:
- grenade
- tempest-integrated-object-storage
+ - openstacksdk-functional-devstack
diff --git a/zuul.d/project.yaml b/zuul.d/project.yaml
index 36f4920..9ab10d7 100644
--- a/zuul.d/project.yaml
+++ b/zuul.d/project.yaml
@@ -43,8 +43,6 @@
irrelevant-files: *tempest-irrelevant-files
- tempest-full-ussuri-py3:
irrelevant-files: *tempest-irrelevant-files
- - tempest-full-train-py3:
- irrelevant-files: *tempest-irrelevant-files
- tempest-multinode-full-py3:
irrelevant-files: *tempest-irrelevant-files
- tempest-tox-plugin-sanity-check:
@@ -169,7 +167,6 @@
- tempest-full-wallaby-py3
- tempest-full-victoria-py3
- tempest-full-ussuri-py3
- - tempest-full-train-py3
periodic:
jobs:
- tempest-all
diff --git a/zuul.d/stable-jobs.yaml b/zuul.d/stable-jobs.yaml
index e682457..da6cc46 100644
--- a/zuul.d/stable-jobs.yaml
+++ b/zuul.d/stable-jobs.yaml
@@ -21,12 +21,6 @@
override-checkout: stable/ussuri
- job:
- name: tempest-full-train-py3
- parent: tempest-full-py3
- nodeset: openstack-single-node-bionic
- override-checkout: stable/train
-
-- job:
name: tempest-full-py3
parent: devstack-tempest
# This job version is with swift disabled on py3