From 5534590861807b39ec935bedfe5cf749e42936c2 Mon Sep 17 00:00:00 2001 From: Monty Taylor Date: Wed, 7 Aug 2019 15:48:50 -0400 Subject: [PATCH] Replace catalog-v3.json with keystoneauth fixture As a first step to having a reusable fixture, replace our use of catalog-v3.json with a fixture built on top of keystoneauth token fixtures. Make a catalog containing all of the openstack services. There are a bunch of places where we just have some things hardcoded that change with the auto-generation - like bare-metal to baremetal. Those are whatever. There are also places where the test code is requesting an admin url but in the old catalog the admin and non-admin were the same, so we were not catching that this was incorrect. Started to fix this, but it got hairy and it's only a keystone v2 thing which is on lifesupport. Make the admin and public urls the same just for ease of landing this patch. We can go back in and make them different and audit all the v2 keystone codepaths if anyone decides to care about keystone v2. There was a bunch of things hardcoded for block-storage which break when we actually use proxies, which in turn breaks when we try to properly use a better catalog fixture. As a followup, we should stop forcing block_storage_api_version=2 because that's absurd, but this is a big enough patch as it is. Also, volume quota calls were in the image file. Ooops. Change-Id: I308cd159a5b71c94511f86c9d46bdbc589580c6d --- openstack/cloud/_block_storage.py | 204 +++++++++++----- openstack/cloud/_image.py | 54 ----- openstack/cloud/openstackcloud.py | 3 +- openstack/fixture/__init__.py | 0 openstack/fixture/connection.py | 107 +++++++++ .../functional/cloud/test_volume_type.py | 4 +- openstack/tests/unit/base.py | 96 ++++---- openstack/tests/unit/cloud/test_caching.py | 6 +- .../unit/cloud/test_cluster_templates.py | 58 ++--- .../tests/unit/cloud/test_coe_clusters.py | 38 +-- .../cloud/test_coe_clusters_certificate.py | 15 +- .../unit/cloud/test_create_volume_snapshot.py | 4 + .../unit/cloud/test_delete_volume_snapshot.py | 4 + openstack/tests/unit/cloud/test_domains.py | 4 +- openstack/tests/unit/cloud/test_endpoints.py | 2 +- openstack/tests/unit/cloud/test_groups.py | 4 +- .../tests/unit/cloud/test_identity_roles.py | 2 +- openstack/tests/unit/cloud/test_image.py | 8 +- .../tests/unit/cloud/test_magnum_services.py | 4 +- openstack/tests/unit/cloud/test_meta.py | 3 +- openstack/tests/unit/cloud/test_normalize.py | 8 +- .../tests/unit/cloud/test_operator_noauth.py | 32 +-- openstack/tests/unit/cloud/test_project.py | 2 +- openstack/tests/unit/cloud/test_quotas.py | 3 + .../tests/unit/cloud/test_role_assignment.py | 2 +- openstack/tests/unit/cloud/test_services.py | 2 +- openstack/tests/unit/cloud/test_users.py | 2 +- openstack/tests/unit/cloud/test_volume.py | 16 +- .../tests/unit/cloud/test_volume_access.py | 4 + .../tests/unit/cloud/test_volume_backups.py | 4 + openstack/tests/unit/config/test_from_conf.py | 1 + openstack/tests/unit/fixtures/baremetal.json | 4 +- .../unit/fixtures/catalog-bogus-glance.json | 52 ----- openstack/tests/unit/fixtures/catalog-v2.json | 177 -------------- .../unit/fixtures/catalog-v3-fake-v1.json | 71 ------ .../unit/fixtures/catalog-v3-fake-v2.json | 71 ------ .../unit/fixtures/catalog-v3-suburl.json | 198 ---------------- .../unit/fixtures/catalog-v3-suffix.json | 211 ----------------- openstack/tests/unit/fixtures/catalog-v3.json | 217 ------------------ .../tests/unit/fixtures/clouds/clouds.yaml | 1 + openstack/tests/unit/test_connection.py | 33 ++- openstack/tests/unit/test_missing_version.py | 7 +- openstack/tests/unit/test_stats.py | 6 +- 43 files changed, 483 insertions(+), 1261 deletions(-) create mode 100644 openstack/fixture/__init__.py create mode 100644 openstack/fixture/connection.py delete mode 100644 openstack/tests/unit/fixtures/catalog-bogus-glance.json delete mode 100644 openstack/tests/unit/fixtures/catalog-v2.json delete mode 100644 openstack/tests/unit/fixtures/catalog-v3-fake-v1.json delete mode 100644 openstack/tests/unit/fixtures/catalog-v3-fake-v2.json delete mode 100644 openstack/tests/unit/fixtures/catalog-v3-suburl.json delete mode 100644 openstack/tests/unit/fixtures/catalog-v3-suffix.json delete mode 100644 openstack/tests/unit/fixtures/catalog-v3.json diff --git a/openstack/cloud/_block_storage.py b/openstack/cloud/_block_storage.py index d0ede10f8..f78cd6919 100644 --- a/openstack/cloud/_block_storage.py +++ b/openstack/cloud/_block_storage.py @@ -33,13 +33,6 @@ def _no_pending_volumes(volumes): class BlockStorageCloudMixin(_normalize.Normalizer): - @property - def _volume_client(self): - if 'block-storage' not in self._raw_clients: - client = self._get_raw_client('block-storage') - self._raw_clients['block-storage'] = client - return self._raw_clients['block-storage'] - @_utils.cache_on_arguments(should_cache_fn=_no_pending_volumes) def list_volumes(self, cache=True): """List all available volumes. @@ -56,7 +49,8 @@ class BlockStorageCloudMixin(_normalize.Normalizer): break if endpoint: try: - _list(self._volume_client.get(endpoint)) + _list(proxy._json_response( + self.block_storage.get(endpoint))) except exc.OpenStackCloudURINotFound: # Catch and re-raise here because we are making recursive # calls and we just have context for the log here @@ -75,7 +69,8 @@ class BlockStorageCloudMixin(_normalize.Normalizer): attempts = 5 for _ in range(attempts): volumes = [] - data = self._volume_client.get('/volumes/detail') + data = proxy._json_response( + self.block_storage.get('/volumes/detail')) if 'volumes_links' not in data: # no pagination needed volumes.extend(data.get('volumes', [])) @@ -103,9 +98,11 @@ class BlockStorageCloudMixin(_normalize.Normalizer): :returns: A list of volume ``munch.Munch``. """ - data = self._volume_client.get( + resp = self.block_storage.get( '/types', - params=dict(is_public='None'), + params=dict(is_public='None')) + data = proxy._json_response( + resp, error_message='Error fetching volume_type list') return self._normalize_volume_types( self._get_and_munchify('volume_types', data)) @@ -141,8 +138,9 @@ class BlockStorageCloudMixin(_normalize.Normalizer): :param id: ID of the volume. :returns: A volume ``munch.Munch``. """ - data = self._volume_client.get( - '/volumes/{id}'.format(id=id), + resp = self.block_storage.get('/volumes/{id}'.format(id=id)) + data = proxy._json_response( + resp, error_message="Error getting volume with ID {id}".format(id=id) ) volume = self._normalize_volume( @@ -214,9 +212,11 @@ class BlockStorageCloudMixin(_normalize.Normalizer): if 'scheduler_hints' in kwargs: payload['OS-SCH-HNT:scheduler_hints'] = kwargs.pop( 'scheduler_hints', None) - data = self._volume_client.post( + resp = self.block_storage.post( '/volumes', - json=dict(payload), + json=dict(payload)) + data = proxy._json_response( + resp, error_message='Error in creating volume') volume = self._get_and_munchify('volume', data) self.list_volumes.invalidate(self) @@ -254,9 +254,11 @@ class BlockStorageCloudMixin(_normalize.Normalizer): raise exc.OpenStackCloudException( "Volume %s not found." % name_or_id) - data = self._volume_client.put( + resp = self.block_storage.put( '/volumes/{volume_id}'.format(volume_id=volume.id), - json=dict({'volume': kwargs}), + json=dict({'volume': kwargs})) + data = proxy._json_response( + resp, error_message='Error updating volume') self.list_volumes.invalidate(self) @@ -281,9 +283,11 @@ class BlockStorageCloudMixin(_normalize.Normalizer): "Volume {name_or_id} does not exist".format( name_or_id=name_or_id)) - self._volume_client.post( + resp = self.block_storage.post( 'volumes/{id}/action'.format(id=volume['id']), - json={'os-set_bootable': {'bootable': bootable}}, + json={'os-set_bootable': {'bootable': bootable}}) + proxy._json_response( + resp, error_message="Error setting bootable on volume {volume}".format( volume=volume['id']) ) @@ -315,12 +319,12 @@ class BlockStorageCloudMixin(_normalize.Normalizer): with _utils.shade_exceptions("Error in deleting volume"): try: if force: - self._volume_client.post( + proxy._json_response(self.block_storage.post( 'volumes/{id}/action'.format(id=volume['id']), - json={'os-force_delete': None}) + json={'os-force_delete': None})) else: - self._volume_client.delete( - 'volumes/{id}'.format(id=volume['id'])) + proxy._json_response(self.block_storage.delete( + 'volumes/{id}'.format(id=volume['id']))) except exc.OpenStackCloudURINotFound: self.log.debug( "Volume {id} not found when deleting. Ignoring.".format( @@ -368,7 +372,8 @@ class BlockStorageCloudMixin(_normalize.Normalizer): error_msg = "{msg} for the project: {project} ".format( msg=error_msg, project=name_or_id) - data = self._volume_client.get('/limits', params=params) + data = proxy._json_response( + self.block_storage.get('/limits', params=params)) limits = self._get_and_munchify('limits', data) return limits @@ -516,12 +521,12 @@ class BlockStorageCloudMixin(_normalize.Normalizer): description = kwargs.pop('description', kwargs.pop('display_description', None)) if name: - if self._is_client_version('volume', 2): + if self.block_storage._version_matches(2): kwargs['name'] = name else: kwargs['display_name'] = name if description: - if self._is_client_version('volume', 2): + if self.block_storage._version_matches(2): kwargs['description'] = description else: kwargs['display_description'] = description @@ -553,9 +558,11 @@ class BlockStorageCloudMixin(_normalize.Normalizer): kwargs = self._get_volume_kwargs(kwargs) payload = {'volume_id': volume_id, 'force': force} payload.update(kwargs) - data = self._volume_client.post( + resp = self.block_storage.post( '/snapshots', - json=dict(snapshot=payload), + json=dict(snapshot=payload)) + data = proxy._json_response( + resp, error_message="Error creating snapshot of volume " "{volume_id}".format(volume_id=volume_id)) snapshot = self._get_and_munchify('snapshot', data) @@ -588,8 +595,10 @@ class BlockStorageCloudMixin(_normalize.Normalizer): param: snapshot_id: ID of the volume snapshot. """ - data = self._volume_client.get( - '/snapshots/{snapshot_id}'.format(snapshot_id=snapshot_id), + resp = self.block_storage.get( + '/snapshots/{snapshot_id}'.format(snapshot_id=snapshot_id)) + data = proxy._json_response( + resp, error_message="Error getting snapshot " "{snapshot_id}".format(snapshot_id=snapshot_id)) return self._normalize_volume( @@ -647,8 +656,10 @@ class BlockStorageCloudMixin(_normalize.Normalizer): 'force': force, } - data = self._volume_client.post( - '/backups', json=dict(backup=payload), + resp = self.block_storage.post( + '/backups', json=dict(backup=payload)) + data = proxy._json_response( + resp, error_message="Error creating backup of volume " "{volume_id}".format(volume_id=volume_id)) backup = self._get_and_munchify('backup', data) @@ -686,9 +697,11 @@ class BlockStorageCloudMixin(_normalize.Normalizer): """ endpoint = '/snapshots/detail' if detailed else '/snapshots' - data = self._volume_client.get( + resp = self.block_storage.get( endpoint, - params=search_opts, + params=search_opts) + data = proxy._json_response( + resp, error_message="Error getting a list of snapshots") return self._get_and_munchify('snapshots', data) @@ -710,8 +723,10 @@ class BlockStorageCloudMixin(_normalize.Normalizer): :returns: A list of volume backups ``munch.Munch``. """ endpoint = '/backups/detail' if detailed else '/backups' - data = self._volume_client.get( - endpoint, params=search_opts, + resp = self.block_storage.get( + endpoint, params=search_opts) + data = proxy._json_response( + resp, error_message="Error getting a list of backups") return self._get_and_munchify('backups', data) @@ -736,16 +751,15 @@ class BlockStorageCloudMixin(_normalize.Normalizer): msg = "Error in deleting volume backup" if force: - self._volume_client.post( + resp = self.block_storage.post( '/backups/{backup_id}/action'.format( backup_id=volume_backup['id']), - json={'os-force_delete': None}, - error_message=msg) + json={'os-force_delete': None}) else: - self._volume_client.delete( + resp = self.block_storage.delete( '/backups/{backup_id}'.format( - backup_id=volume_backup['id']), - error_message=msg) + backup_id=volume_backup['id'])) + proxy._json_response(resp, error_message=msg) if wait: msg = "Timeout waiting for the volume backup to be deleted." for count in utils.iterate_timeout(timeout, msg): @@ -772,9 +786,11 @@ class BlockStorageCloudMixin(_normalize.Normalizer): if not volumesnapshot: return False - self._volume_client.delete( + resp = self.block_storage.delete( '/snapshots/{snapshot_id}'.format( - snapshot_id=volumesnapshot['id']), + snapshot_id=volumesnapshot['id'])) + proxy._json_response( + resp, error_message="Error in deleting volume snapshot") if wait: @@ -818,8 +834,10 @@ class BlockStorageCloudMixin(_normalize.Normalizer): raise exc.OpenStackCloudException( "VolumeType not found: %s" % name_or_id) - data = self._volume_client.get( - '/types/{id}/os-volume-type-access'.format(id=volume_type.id), + resp = self.block_storage.get( + '/types/{id}/os-volume-type-access'.format(id=volume_type.id)) + data = proxy._json_response( + resp, error_message="Unable to get volume type access" " {name}".format(name=name_or_id)) return self._normalize_volume_type_accesses( @@ -839,14 +857,15 @@ class BlockStorageCloudMixin(_normalize.Normalizer): if not volume_type: raise exc.OpenStackCloudException( "VolumeType not found: %s" % name_or_id) - with _utils.shade_exceptions(): - payload = {'project': project_id} - self._volume_client.post( - '/types/{id}/action'.format(id=volume_type.id), - json=dict(addProjectAccess=payload), - error_message="Unable to authorize {project} " - "to use volume type {name}".format( - name=name_or_id, project=project_id)) + payload = {'project': project_id} + resp = self.block_storage.post( + '/types/{id}/action'.format(id=volume_type.id), + json=dict(addProjectAccess=payload)) + proxy._json_response( + resp, + error_message="Unable to authorize {project} " + "to use volume type {name}".format( + name=name_or_id, project=project_id)) def remove_volume_type_access(self, name_or_id, project_id): """Revoke access on a volume_type to a project. @@ -860,11 +879,72 @@ class BlockStorageCloudMixin(_normalize.Normalizer): if not volume_type: raise exc.OpenStackCloudException( "VolumeType not found: %s" % name_or_id) - with _utils.shade_exceptions(): - payload = {'project': project_id} - self._volume_client.post( - '/types/{id}/action'.format(id=volume_type.id), - json=dict(removeProjectAccess=payload), - error_message="Unable to revoke {project} " - "to use volume type {name}".format( - name=name_or_id, project=project_id)) + payload = {'project': project_id} + resp = self.block_storage.post( + '/types/{id}/action'.format(id=volume_type.id), + json=dict(removeProjectAccess=payload)) + proxy._json_response( + resp, + error_message="Unable to revoke {project} " + "to use volume type {name}".format( + name=name_or_id, project=project_id)) + + def set_volume_quotas(self, name_or_id, **kwargs): + """ Set a volume quota in a project + + :param name_or_id: project name or id + :param kwargs: key/value pairs of quota name and quota value + + :raises: OpenStackCloudException if the resource to set the + quota does not exist. + """ + + proj = self.get_project(name_or_id) + if not proj: + raise exc.OpenStackCloudException("project does not exist") + + kwargs['tenant_id'] = proj.id + resp = self.block_storage.put( + '/os-quota-sets/{tenant_id}'.format(tenant_id=proj.id), + json={'quota_set': kwargs}) + proxy._json_response( + resp, + error_message="No valid quota or resource") + + def get_volume_quotas(self, name_or_id): + """ Get volume quotas for a project + + :param name_or_id: project name or id + :raises: OpenStackCloudException if it's not a valid project + + :returns: Munch object with the quotas + """ + proj = self.get_project(name_or_id) + if not proj: + raise exc.OpenStackCloudException("project does not exist") + + resp = self.block_storage.get( + '/os-quota-sets/{tenant_id}'.format(tenant_id=proj.id)) + data = proxy._json_response( + resp, + error_message="cinder client call failed") + return self._get_and_munchify('quota_set', data) + + def delete_volume_quotas(self, name_or_id): + """ Delete volume quotas for a project + + :param name_or_id: project name or id + :raises: OpenStackCloudException if it's not a valid project or the + cinder client call failed + + :returns: dict with the quotas + """ + proj = self.get_project(name_or_id) + if not proj: + raise exc.OpenStackCloudException("project does not exist") + + resp = self.block_storage.delete( + '/os-quota-sets/{tenant_id}'.format(tenant_id=proj.id)) + return proxy._json_response( + resp, + error_message="cinder client call failed") diff --git a/openstack/cloud/_image.py b/openstack/cloud/_image.py index 90872bc70..53265d9e1 100644 --- a/openstack/cloud/_image.py +++ b/openstack/cloud/_image.py @@ -328,57 +328,3 @@ class ImageCloudMixin(_normalize.Normalizer): image = image or name_or_id return self.image.update_image_properties( image=image, meta=meta, **properties) - - def set_volume_quotas(self, name_or_id, **kwargs): - """ Set a volume quota in a project - - :param name_or_id: project name or id - :param kwargs: key/value pairs of quota name and quota value - - :raises: OpenStackCloudException if the resource to set the - quota does not exist. - """ - - proj = self.get_project(name_or_id) - if not proj: - raise exc.OpenStackCloudException("project does not exist") - - kwargs['tenant_id'] = proj.id - self._volume_client.put( - '/os-quota-sets/{tenant_id}'.format(tenant_id=proj.id), - json={'quota_set': kwargs}, - error_message="No valid quota or resource") - - def get_volume_quotas(self, name_or_id): - """ Get volume quotas for a project - - :param name_or_id: project name or id - :raises: OpenStackCloudException if it's not a valid project - - :returns: Munch object with the quotas - """ - proj = self.get_project(name_or_id) - if not proj: - raise exc.OpenStackCloudException("project does not exist") - - data = self._volume_client.get( - '/os-quota-sets/{tenant_id}'.format(tenant_id=proj.id), - error_message="cinder client call failed") - return self._get_and_munchify('quota_set', data) - - def delete_volume_quotas(self, name_or_id): - """ Delete volume quotas for a project - - :param name_or_id: project name or id - :raises: OpenStackCloudException if it's not a valid project or the - cinder client call failed - - :returns: dict with the quotas - """ - proj = self.get_project(name_or_id) - if not proj: - raise exc.OpenStackCloudException("project does not exist") - - return self._volume_client.delete( - '/os-quota-sets/{tenant_id}'.format(tenant_id=proj.id), - error_message="cinder client call failed") diff --git a/openstack/cloud/openstackcloud.py b/openstack/cloud/openstackcloud.py index dfc8af553..8f59bc19b 100755 --- a/openstack/cloud/openstackcloud.py +++ b/openstack/cloud/openstackcloud.py @@ -453,7 +453,8 @@ class _OpenStackCloudMixin(object): region_name=self.config.get_region_name(service_type)) def _is_client_version(self, client, version): - client_name = '_{client}_client'.format(client=client) + client_name = '_{client}_client'.format( + client=client.replace('-', '_')) client = getattr(self, client_name) return client._version_matches(version) diff --git a/openstack/fixture/__init__.py b/openstack/fixture/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/openstack/fixture/connection.py b/openstack/fixture/connection.py new file mode 100644 index 000000000..52ee4b12e --- /dev/null +++ b/openstack/fixture/connection.py @@ -0,0 +1,107 @@ +# Copyright 2019 Red Hat, Inc. +# +# 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 uuid + +import fixtures +from keystoneauth1.fixture import v2 +from keystoneauth1.fixture import v3 +import os_service_types + +_service_type_manager = os_service_types.ServiceTypes() + +_SUBURL_TEMPLATES = { + 'public': 'https://example.com/{service_type}', + 'internal': 'https://internal.example.com/{service_type}', + 'admin': 'https://example.com/{service_type}', +} +_ENDPOINT_TEMPLATES = { + 'public': 'https://{service_type}.example.com', + 'internal': 'https://internal.{service_type}.example.com', + 'admin': 'https://{service_type}.example.com', +} + + +class ConnectionFixture(fixtures.Fixture): + + _suffixes = { + 'baremetal': '/', + 'block-storage': '/{project_id}', + 'compute': '/v2.1/', + 'container-infrastructure-management': '/v1', + 'object-store': '/v1/{project_id}', + 'orchestration': '/v1/{project_id}', + 'volumev2': '/v2/{project_id}', + 'volumev3': '/v3/{project_id}', + } + + def __init__(self, suburl=False, project_id=None, *args, **kwargs): + super(ConnectionFixture, self).__init__(*args, **kwargs) + self._endpoint_templates = _ENDPOINT_TEMPLATES + if suburl: + self.use_suburl() + self.project_id = project_id or uuid.uuid4().hex.replace('-', '') + self.build_tokens() + + def use_suburl(self): + self._endpoint_templates = _SUBURL_TEMPLATES + + def _get_endpoint_templates(self, service_type, alias=None, v2=False): + templates = {} + for k, v in self._endpoint_templates.items(): + suffix = self._suffixes.get( + alias, self._suffixes.get(service_type, '')) + # For a keystone v2 catalog, we want to list the + # versioned endpoint in the catalog, because that's + # more likely how those were deployed. + if v2: + suffix = '/v2.0' + templates[k] = (v + suffix).format( + service_type=service_type, + project_id=self.project_id, + ) + return templates + + def _setUp(self): + pass + + def clear_tokens(self): + self.v2_token = v2.Token(tenant_id=self.project_id) + self.v3_token = v3.Token(project_id=self.project_id) + + def build_tokens(self): + self.clear_tokens() + for service in _service_type_manager.services: + service_type = service['service_type'] + if service_type == 'ec2-api': + continue + service_name = service['project'] + ets = self._get_endpoint_templates(service_type) + v3_svc = self.v3_token.add_service( + service_type, name=service_name) + v2_svc = self.v2_token.add_service( + service_type, name=service_name) + v3_svc.add_standard_endpoints(region='RegionOne', **ets) + if service_type == 'identity': + ets = self._get_endpoint_templates(service_type, v2=True) + v2_svc.add_endpoint(region='RegionOne', **ets) + for alias in service.get('aliases', []): + ets = self._get_endpoint_templates(service_type, alias=alias) + v3_svc = self.v3_token.add_service(alias, name=service_name) + v2_svc = self.v2_token.add_service(alias, name=service_name) + v3_svc.add_standard_endpoints(region='RegionOne', **ets) + v2_svc.add_endpoint(region='RegionOne', **ets) + + def _cleanup(self): + pass diff --git a/openstack/tests/functional/cloud/test_volume_type.py b/openstack/tests/functional/cloud/test_volume_type.py index 1eda9f8aa..ce0d553e5 100644 --- a/openstack/tests/functional/cloud/test_volume_type.py +++ b/openstack/tests/functional/cloud/test_volume_type.py @@ -38,13 +38,13 @@ class TestVolumeType(base.BaseFunctionalTest): "name": 'test-volume-type', "description": None, "os-volume-type-access:is_public": False} - self.operator_cloud._volume_client.post( + self.operator_cloud.block_storage.post( '/types', json={'volume_type': volume_type}) def tearDown(self): ret = self.operator_cloud.get_volume_type('test-volume-type') if ret.get('id'): - self.operator_cloud._volume_client.delete( + self.operator_cloud.block_storage.delete( '/types/{volume_type_id}'.format(volume_type_id=ret.id)) super(TestVolumeType, self).tearDown() diff --git a/openstack/tests/unit/base.py b/openstack/tests/unit/base.py index 9a439d451..78758eee9 100644 --- a/openstack/tests/unit/base.py +++ b/openstack/tests/unit/base.py @@ -29,6 +29,8 @@ import tempfile import openstack.cloud import openstack.connection +from openstack.tests import fakes +from openstack.fixture import connection as os_fixture from openstack.tests import base @@ -101,6 +103,8 @@ class TestCase(base.TestCase): 'time.sleep', _nosleep)) self.fixtures_directory = 'openstack/tests/unit/fixtures' + self.os_fixture = self.useFixture( + os_fixture.ConnectionFixture(project_id=fakes.PROJECT_ID)) # Isolate openstack.config from test environment config = tempfile.NamedTemporaryFile(delete=False) @@ -422,45 +426,42 @@ class TestCase(base.TestCase): def get_keystone_v3_token( self, - catalog='catalog-v3.json', project_name='admin', ): - catalog_file = os.path.join(self.fixtures_directory, catalog) - with open(catalog_file, 'r') as tokens_file: - return dict( - method='POST', - uri='https://identity.example.com/v3/auth/tokens', - headers={ - 'X-Subject-Token': self.getUniqueString('KeystoneToken') - }, - text=tokens_file.read(), - validate=dict(json={ - 'auth': { - 'identity': { - 'methods': ['password'], - 'password': { - 'user': { - 'domain': { - 'name': 'default', - }, - 'name': 'admin', - 'password': 'password' - } - } - }, - 'scope': { - 'project': { + return dict( + method='POST', + uri='https://identity.example.com/v3/auth/tokens', + headers={ + 'X-Subject-Token': self.getUniqueString('KeystoneToken') + }, + json=self.os_fixture.v3_token, + validate=dict(json={ + 'auth': { + 'identity': { + 'methods': ['password'], + 'password': { + 'user': { 'domain': { - 'name': 'default' + 'name': 'default', }, - 'name': project_name + 'name': 'admin', + 'password': 'password' } } + }, + 'scope': { + 'project': { + 'domain': { + 'name': 'default' + }, + 'name': project_name + } } - }), - ) + } + }), + ) - def get_keystone_v3_discovery(self): + def get_keystone_discovery(self): with open(self.discovery_json, 'r') as discovery_file: return dict( method='GET', @@ -468,13 +469,13 @@ class TestCase(base.TestCase): text=discovery_file.read(), ) - def use_keystone_v3(self, catalog='catalog-v3.json'): + def use_keystone_v3(self): self.adapter = self.useFixture(rm_fixture.Fixture()) self.calls = [] self._uri_registry.clear() self.__do_register_uris([ - self.get_keystone_v3_discovery(), - self.get_keystone_v3_token(catalog), + self.get_keystone_discovery(), + self.get_keystone_v3_token(), ]) self._make_test_cloud(identity_api_version='3') @@ -483,18 +484,13 @@ class TestCase(base.TestCase): self.calls = [] self._uri_registry.clear() - with open(self.discovery_json, 'r') as discovery_file, \ - open(os.path.join( - self.fixtures_directory, - 'catalog-v2.json'), 'r') as tokens_file: - self.__do_register_uris([ - dict(method='GET', uri='https://identity.example.com/', - text=discovery_file.read()), - dict(method='POST', - uri='https://identity.example.com/v2.0/tokens', - text=tokens_file.read() - ), - ]) + self.__do_register_uris([ + self.get_keystone_discovery(), + dict(method='POST', + uri='https://identity.example.com/v2.0/tokens', + json=self.os_fixture.v2_token, + ), + ]) self._make_test_cloud(cloud_name='_test_cloud_v2_', identity_api_version='2.0') @@ -509,7 +505,7 @@ class TestCase(base.TestCase): def get_cinder_discovery_mock_dict( self, block_storage_version_json='block-storage-version.json', - block_storage_discovery_url='https://volume.example.com/'): + block_storage_discovery_url='https://block-storage.example.com/'): discovery_fixture = os.path.join( self.fixtures_directory, block_storage_version_json) return dict(method='GET', uri=block_storage_discovery_url, @@ -551,7 +547,7 @@ class TestCase(base.TestCase): def get_ironic_discovery_mock_dict(self): discovery_fixture = os.path.join( self.fixtures_directory, "baremetal.json") - return dict(method='GET', uri="https://bare-metal.example.com/", + return dict(method='GET', uri="https://baremetal.example.com/", text=open(discovery_fixture, 'r').read()) def get_senlin_discovery_mock_dict(self): @@ -580,6 +576,10 @@ class TestCase(base.TestCase): self.get_glance_discovery_mock_dict( image_version_json, image_discovery_url)]) + def use_cinder(self): + self.__do_register_uris([ + self.get_cinder_discovery_mock_dict()]) + def use_placement(self): self.__do_register_uris([ self.get_placement_discovery_mock_dict()]) diff --git a/openstack/tests/unit/cloud/test_caching.py b/openstack/tests/unit/cloud/test_caching.py index 4e769a6cb..f4e79ee65 100644 --- a/openstack/tests/unit/cloud/test_caching.py +++ b/openstack/tests/unit/cloud/test_caching.py @@ -117,7 +117,7 @@ class TestMemoryCache(base.TestCase): for p in project_list]} mock_uri = self.get_mock_url( - service_type='identity', interface='admin', resource='projects', + service_type='identity', resource='projects', base_url_append='v3') self.register_uris([ @@ -206,6 +206,7 @@ class TestMemoryCache(base.TestCase): 'Volume 2 Display Name') fake_volume2_dict = meta.obj_to_munch(fake_volume2) self.register_uris([ + self.get_cinder_discovery_mock_dict(), dict(method='GET', uri=self.get_mock_url( 'volumev2', 'public', append=['volumes', 'detail']), @@ -236,6 +237,7 @@ class TestMemoryCache(base.TestCase): 'Volume 2 Display Name') fake_volume2_dict = meta.obj_to_munch(fake_volume2) self.register_uris([ + self.get_cinder_discovery_mock_dict(), dict(method='GET', uri=self.get_mock_url( 'volumev2', 'public', append=['volumes', 'detail']), @@ -266,6 +268,7 @@ class TestMemoryCache(base.TestCase): fake_vol_avail['status'] = 'deleting' self.register_uris([ + self.get_cinder_discovery_mock_dict(), dict(method='GET', uri=self.get_mock_url( 'volumev2', 'public', append=['volumes', 'detail']), @@ -323,7 +326,6 @@ class TestMemoryCache(base.TestCase): dict(method='GET', uri=self.get_mock_url( service_type='identity', - interface='admin', resource='users', base_url_append='v3'), status_code=200, diff --git a/openstack/tests/unit/cloud/test_cluster_templates.py b/openstack/tests/unit/cloud/test_cluster_templates.py index 2e9f03be4..e0dc2c31b 100644 --- a/openstack/tests/unit/cloud/test_cluster_templates.py +++ b/openstack/tests/unit/cloud/test_cluster_templates.py @@ -51,16 +51,24 @@ cluster_template_obj = munch.Munch( class TestClusterTemplates(base.TestCase): + def get_mock_url( + self, + service_type='container-infrastructure-management', + base_url_append=None, append=None, resource=None): + return super(TestClusterTemplates, self).get_mock_url( + service_type=service_type, resource=resource, + append=append, base_url_append=base_url_append) + def test_list_cluster_templates_without_detail(self): self.register_uris([ dict( method='GET', - uri='https://container-infra.example.com/v1/clustertemplates', + uri=self.get_mock_url(resource='clustertemplates'), status_code=404), dict( method='GET', - uri='https://container-infra.example.com/v1/baymodels/detail', + uri=self.get_mock_url(resource='baymodels/detail'), json=dict(baymodels=[cluster_template_obj.toDict()]))]) cluster_templates_list = self.cloud.list_cluster_templates() self.assertEqual( @@ -72,11 +80,11 @@ class TestClusterTemplates(base.TestCase): self.register_uris([ dict( method='GET', - uri='https://container-infra.example.com/v1/clustertemplates', + uri=self.get_mock_url(resource='clustertemplates'), status_code=404), dict( method='GET', - uri='https://container-infra.example.com/v1/baymodels/detail', + uri=self.get_mock_url(resource='baymodels/detail'), json=dict(baymodels=[cluster_template_obj.toDict()]))]) cluster_templates_list = self.cloud.list_cluster_templates(detail=True) self.assertEqual( @@ -88,11 +96,11 @@ class TestClusterTemplates(base.TestCase): self.register_uris([ dict( method='GET', - uri='https://container-infra.example.com/v1/clustertemplates', + uri=self.get_mock_url(resource='clustertemplates'), status_code=404), dict( method='GET', - uri='https://container-infra.example.com/v1/baymodels/detail', + uri=self.get_mock_url(resource='baymodels/detail'), json=dict(baymodels=[cluster_template_obj.toDict()]))]) cluster_templates = self.cloud.search_cluster_templates( @@ -107,11 +115,11 @@ class TestClusterTemplates(base.TestCase): self.register_uris([ dict( method='GET', - uri='https://container-infra.example.com/v1/clustertemplates', + uri=self.get_mock_url(resource='clustertemplates'), status_code=404), dict( method='GET', - uri='https://container-infra.example.com/v1/baymodels/detail', + uri=self.get_mock_url(resource='baymodels/detail'), json=dict(baymodels=[cluster_template_obj.toDict()]))]) cluster_templates = self.cloud.search_cluster_templates( @@ -124,11 +132,11 @@ class TestClusterTemplates(base.TestCase): self.register_uris([ dict( method='GET', - uri='https://container-infra.example.com/v1/clustertemplates', + uri=self.get_mock_url(resource='clustertemplates'), status_code=404), dict( method='GET', - uri='https://container-infra.example.com/v1/baymodels/detail', + uri=self.get_mock_url(resource='baymodels/detail'), json=dict(baymodels=[cluster_template_obj.toDict()]))]) r = self.cloud.get_cluster_template('fake-cluster-template') @@ -141,11 +149,11 @@ class TestClusterTemplates(base.TestCase): self.register_uris([ dict( method='GET', - uri='https://container-infra.example.com/v1/clustertemplates', + uri=self.get_mock_url(resource='clustertemplates'), status_code=404), dict( method='GET', - uri='https://container-infra.example.com/v1/baymodels/detail', + uri=self.get_mock_url(resource='baymodels/detail'), json=dict(baymodels=[]))]) r = self.cloud.get_cluster_template('doesNotExist') self.assertIsNone(r) @@ -155,11 +163,11 @@ class TestClusterTemplates(base.TestCase): self.register_uris([ dict( method='POST', - uri='https://container-infra.example.com/v1/clustertemplates', + uri=self.get_mock_url(resource='clustertemplates'), status_code=404), dict( method='POST', - uri='https://container-infra.example.com/v1/baymodels', + uri=self.get_mock_url(resource='baymodels'), json=dict(baymodels=[cluster_template_obj.toDict()]), validate=dict(json={ 'coe': 'fake-coe', @@ -177,11 +185,11 @@ class TestClusterTemplates(base.TestCase): self.register_uris([ dict( method='POST', - uri='https://container-infra.example.com/v1/clustertemplates', + uri=self.get_mock_url(resource='clustertemplates'), status_code=404), dict( method='POST', - uri='https://container-infra.example.com/v1/baymodels', + uri=self.get_mock_url(resource='baymodels'), status_code=403)]) # TODO(mordred) requests here doens't give us a great story # for matching the old error message text. Investigate plumbing @@ -196,37 +204,35 @@ class TestClusterTemplates(base.TestCase): self.assert_calls() def test_delete_cluster_template(self): - uri = 'https://container-infra.example.com/v1/baymodels/fake-uuid' self.register_uris([ dict( method='GET', - uri='https://container-infra.example.com/v1/clustertemplates', + uri=self.get_mock_url(resource='clustertemplates'), status_code=404), dict( method='GET', - uri='https://container-infra.example.com/v1/baymodels/detail', + uri=self.get_mock_url(resource='baymodels/detail'), json=dict(baymodels=[cluster_template_obj.toDict()])), dict( method='DELETE', - uri=uri), + uri=self.get_mock_url(resource='baymodels/fake-uuid')), ]) self.cloud.delete_cluster_template('fake-uuid') self.assert_calls() def test_update_cluster_template(self): - uri = 'https://container-infra.example.com/v1/baymodels/fake-uuid' self.register_uris([ dict( method='GET', - uri='https://container-infra.example.com/v1/clustertemplates', + uri=self.get_mock_url(resource='clustertemplates'), status_code=404), dict( method='GET', - uri='https://container-infra.example.com/v1/baymodels/detail', + uri=self.get_mock_url(resource='baymodels/detail'), json=dict(baymodels=[cluster_template_obj.toDict()])), dict( method='PATCH', - uri=uri, + uri=self.get_mock_url(resource='baymodels/fake-uuid'), status_code=200, validate=dict( json=[{ @@ -237,7 +243,7 @@ class TestClusterTemplates(base.TestCase): )), dict( method='GET', - uri='https://container-infra.example.com/v1/clustertemplates', + uri=self.get_mock_url(resource='clustertemplates'), # This json value is not meaningful to the test - it just has # to be valid. json=dict(baymodels=[cluster_template_obj.toDict()])), @@ -251,7 +257,7 @@ class TestClusterTemplates(base.TestCase): self.register_uris([ dict( method='GET', - uri='https://container-infra.example.com/v1/clustertemplates', + uri=self.get_mock_url(resource='clustertemplates'), json=dict(clustertemplates=[cluster_template_obj.toDict()]))]) r = self.cloud.get_coe_cluster_template('fake-cluster-template') diff --git a/openstack/tests/unit/cloud/test_coe_clusters.py b/openstack/tests/unit/cloud/test_coe_clusters.py index 1ef38cb4b..aff92a088 100644 --- a/openstack/tests/unit/cloud/test_coe_clusters.py +++ b/openstack/tests/unit/cloud/test_coe_clusters.py @@ -39,11 +39,19 @@ coe_cluster_obj = munch.Munch( class TestCOEClusters(base.TestCase): + def get_mock_url( + self, + service_type='container-infrastructure-management', + base_url_append=None, append=None, resource=None): + return super(TestCOEClusters, self).get_mock_url( + service_type=service_type, resource=resource, + append=append, base_url_append=base_url_append) + def test_list_coe_clusters(self): self.register_uris([dict( method='GET', - uri='https://container-infra.example.com/v1/clusters', + uri=self.get_mock_url(resource='clusters'), json=dict(clusters=[coe_cluster_obj.toDict()]))]) cluster_list = self.cloud.list_coe_clusters() self.assertEqual( @@ -54,7 +62,7 @@ class TestCOEClusters(base.TestCase): def test_create_coe_cluster(self): self.register_uris([dict( method='POST', - uri='https://container-infra.example.com/v1/clusters', + uri=self.get_mock_url(resource='clusters'), json=dict(baymodels=[coe_cluster_obj.toDict()]), validate=dict(json={ 'name': 'k8s', @@ -72,7 +80,7 @@ class TestCOEClusters(base.TestCase): def test_search_coe_cluster_by_name(self): self.register_uris([dict( method='GET', - uri='https://container-infra.example.com/v1/clusters', + uri=self.get_mock_url(resource='clusters'), json=dict(clusters=[coe_cluster_obj.toDict()]))]) coe_clusters = self.cloud.search_coe_clusters( @@ -86,7 +94,7 @@ class TestCOEClusters(base.TestCase): self.register_uris([dict( method='GET', - uri='https://container-infra.example.com/v1/clusters', + uri=self.get_mock_url(resource='clusters'), json=dict(clusters=[coe_cluster_obj.toDict()]))]) coe_clusters = self.cloud.search_coe_clusters( @@ -98,7 +106,7 @@ class TestCOEClusters(base.TestCase): def test_get_coe_cluster(self): self.register_uris([dict( method='GET', - uri='https://container-infra.example.com/v1/clusters', + uri=self.get_mock_url(resource='clusters'), json=dict(clusters=[coe_cluster_obj.toDict()]))]) r = self.cloud.get_coe_cluster(coe_cluster_obj.name) @@ -110,38 +118,38 @@ class TestCOEClusters(base.TestCase): def test_get_coe_cluster_not_found(self): self.register_uris([dict( method='GET', - uri='https://container-infra.example.com/v1/clusters', + uri=self.get_mock_url(resource='clusters'), json=dict(clusters=[]))]) r = self.cloud.get_coe_cluster('doesNotExist') self.assertIsNone(r) self.assert_calls() def test_delete_coe_cluster(self): - uri = ('https://container-infra.example.com/v1/clusters/%s' % - coe_cluster_obj.uuid) self.register_uris([ dict( method='GET', - uri='https://container-infra.example.com/v1/clusters', + uri=self.get_mock_url(resource='clusters'), json=dict(clusters=[coe_cluster_obj.toDict()])), dict( method='DELETE', - uri=uri), + uri=self.get_mock_url( + resource='clusters', + append=[coe_cluster_obj.uuid])), ]) self.cloud.delete_coe_cluster(coe_cluster_obj.uuid) self.assert_calls() def test_update_coe_cluster(self): - uri = ('https://container-infra.example.com/v1/clusters/%s' % - coe_cluster_obj.uuid) self.register_uris([ dict( method='GET', - uri='https://container-infra.example.com/v1/clusters', + uri=self.get_mock_url(resource='clusters'), json=dict(clusters=[coe_cluster_obj.toDict()])), dict( method='PATCH', - uri=uri, + uri=self.get_mock_url( + resource='clusters', + append=[coe_cluster_obj.uuid]), status_code=200, validate=dict( json=[{ @@ -152,7 +160,7 @@ class TestCOEClusters(base.TestCase): )), dict( method='GET', - uri='https://container-infra.example.com/v1/clusters', + uri=self.get_mock_url(resource='clusters'), # This json value is not meaningful to the test - it just has # to be valid. json=dict(clusters=[coe_cluster_obj.toDict()])), diff --git a/openstack/tests/unit/cloud/test_coe_clusters_certificate.py b/openstack/tests/unit/cloud/test_coe_clusters_certificate.py index 88fe7fa37..8e448d549 100644 --- a/openstack/tests/unit/cloud/test_coe_clusters_certificate.py +++ b/openstack/tests/unit/cloud/test_coe_clusters_certificate.py @@ -34,11 +34,20 @@ coe_cluster_signed_cert_obj = munch.Munch( class TestCOEClusters(base.TestCase): + def get_mock_url( + self, + service_type='container-infrastructure-management', + base_url_append=None, append=None, resource=None): + return super(TestCOEClusters, self).get_mock_url( + service_type=service_type, resource=resource, + append=append, base_url_append=base_url_append) + def test_get_coe_cluster_certificate(self): self.register_uris([dict( method='GET', - uri=('https://container-infra.example.com/v1/certificates/%s' % - coe_cluster_ca_obj.cluster_uuid), + uri=self.get_mock_url( + resource='certificates', + append=[coe_cluster_ca_obj.cluster_uuid]), json=coe_cluster_ca_obj) ]) ca_cert = self.cloud.get_coe_cluster_certificate( @@ -51,7 +60,7 @@ class TestCOEClusters(base.TestCase): def test_sign_coe_cluster_certificate(self): self.register_uris([dict( method='POST', - uri='https://container-infra.example.com/v1/certificates', + uri=self.get_mock_url(resource='certificates'), json={"cluster_uuid": coe_cluster_signed_cert_obj.cluster_uuid, "csr": coe_cluster_signed_cert_obj.csr} )]) diff --git a/openstack/tests/unit/cloud/test_create_volume_snapshot.py b/openstack/tests/unit/cloud/test_create_volume_snapshot.py index 1986fdb12..bdca61e96 100644 --- a/openstack/tests/unit/cloud/test_create_volume_snapshot.py +++ b/openstack/tests/unit/cloud/test_create_volume_snapshot.py @@ -25,6 +25,10 @@ from openstack.tests.unit import base class TestCreateVolumeSnapshot(base.TestCase): + def setUp(self): + super(TestCreateVolumeSnapshot, self).setUp() + self.use_cinder() + def test_create_volume_snapshot_wait(self): """ Test that create_volume_snapshot with a wait returns the volume diff --git a/openstack/tests/unit/cloud/test_delete_volume_snapshot.py b/openstack/tests/unit/cloud/test_delete_volume_snapshot.py index f3504d6f9..0365b7945 100644 --- a/openstack/tests/unit/cloud/test_delete_volume_snapshot.py +++ b/openstack/tests/unit/cloud/test_delete_volume_snapshot.py @@ -25,6 +25,10 @@ from openstack.tests.unit import base class TestDeleteVolumeSnapshot(base.TestCase): + def setUp(self): + super(TestDeleteVolumeSnapshot, self).setUp() + self.use_cinder() + def test_delete_volume_snapshot(self): """ Test that delete_volume_snapshot without a wait returns True instance diff --git a/openstack/tests/unit/cloud/test_domains.py b/openstack/tests/unit/cloud/test_domains.py index babdbd395..f57b0514d 100644 --- a/openstack/tests/unit/cloud/test_domains.py +++ b/openstack/tests/unit/cloud/test_domains.py @@ -25,10 +25,10 @@ from openstack.tests.unit import base class TestDomains(base.TestCase): def get_mock_url(self, service_type='identity', - interface='admin', resource='domains', + resource='domains', append=None, base_url_append='v3'): return super(TestDomains, self).get_mock_url( - service_type=service_type, interface=interface, resource=resource, + service_type=service_type, resource=resource, append=append, base_url_append=base_url_append) def test_list_domains(self): diff --git a/openstack/tests/unit/cloud/test_endpoints.py b/openstack/tests/unit/cloud/test_endpoints.py index 74d3c5cb7..d05735d5e 100644 --- a/openstack/tests/unit/cloud/test_endpoints.py +++ b/openstack/tests/unit/cloud/test_endpoints.py @@ -29,7 +29,7 @@ from testtools import matchers class TestCloudEndpoints(base.TestCase): - def get_mock_url(self, service_type='identity', interface='admin', + def get_mock_url(self, service_type='identity', interface='public', resource='endpoints', append=None, base_url_append='v3'): return super(TestCloudEndpoints, self).get_mock_url( service_type, interface, resource, append, base_url_append) diff --git a/openstack/tests/unit/cloud/test_groups.py b/openstack/tests/unit/cloud/test_groups.py index a5f6c336e..52eb8ff68 100644 --- a/openstack/tests/unit/cloud/test_groups.py +++ b/openstack/tests/unit/cloud/test_groups.py @@ -20,10 +20,10 @@ class TestGroups(base.TestCase): cloud_config_fixture=cloud_config_fixture) self.addCleanup(self.assert_calls) - def get_mock_url(self, service_type='identity', interface='admin', + def get_mock_url(self, service_type='identity', interface='public', resource='groups', append=None, base_url_append='v3'): return super(TestGroups, self).get_mock_url( - service_type='identity', interface='admin', resource=resource, + service_type='identity', interface=interface, resource=resource, append=append, base_url_append=base_url_append) def test_list_groups(self): diff --git a/openstack/tests/unit/cloud/test_identity_roles.py b/openstack/tests/unit/cloud/test_identity_roles.py index 3409e7b63..89eeddc1a 100644 --- a/openstack/tests/unit/cloud/test_identity_roles.py +++ b/openstack/tests/unit/cloud/test_identity_roles.py @@ -36,7 +36,7 @@ RAW_ROLE_ASSIGNMENTS = [ class TestIdentityRoles(base.TestCase): - def get_mock_url(self, service_type='identity', interface='admin', + def get_mock_url(self, service_type='identity', interface='public', resource='roles', append=None, base_url_append='v3', qs_elements=None): return super(TestIdentityRoles, self).get_mock_url( diff --git a/openstack/tests/unit/cloud/test_image.py b/openstack/tests/unit/cloud/test_image.py index 27f4662bb..78c56c4b4 100644 --- a/openstack/tests/unit/cloud/test_image.py +++ b/openstack/tests/unit/cloud/test_image.py @@ -24,9 +24,6 @@ from openstack.tests import fakes from openstack.tests.unit import base -CINDER_URL = 'https://volume.example.com/v2/1c36b64c840a42cd9e9b931a369337f0' - - class BaseTestImage(base.TestCase): def setUp(self): @@ -1045,7 +1042,9 @@ class TestImageSuburl(BaseTestImage): def setUp(self): super(TestImageSuburl, self).setUp() - self.use_keystone_v3(catalog='catalog-v3-suburl.json') + self.os_fixture.use_suburl() + self.os_fixture.build_tokens() + self.use_keystone_v3() self.use_glance( image_version_json='image-version-suburl.json', image_discovery_url='https://example.com/image') @@ -1142,7 +1141,6 @@ class TestImageVolume(BaseTestImage): self.volume_id = str(uuid.uuid4()) def test_create_image_volume(self): - self.register_uris([ self.get_cinder_discovery_mock_dict(), dict(method='POST', diff --git a/openstack/tests/unit/cloud/test_magnum_services.py b/openstack/tests/unit/cloud/test_magnum_services.py index a410201a8..f5dee60e5 100644 --- a/openstack/tests/unit/cloud/test_magnum_services.py +++ b/openstack/tests/unit/cloud/test_magnum_services.py @@ -31,7 +31,9 @@ class TestMagnumServices(base.TestCase): def test_list_magnum_services(self): self.register_uris([dict( method='GET', - uri='https://container-infra.example.com/v1/mservices', + uri=self.get_mock_url( + service_type='container-infrastructure-management', + resource='mservices'), json=dict(mservices=[magnum_service_obj]))]) mservices_list = self.cloud.list_magnum_services() self.assertEqual( diff --git a/openstack/tests/unit/cloud/test_meta.py b/openstack/tests/unit/cloud/test_meta.py index e162e5eb8..0de6620d3 100644 --- a/openstack/tests/unit/cloud/test_meta.py +++ b/openstack/tests/unit/cloud/test_meta.py @@ -991,7 +991,8 @@ class TestMeta(base.TestCase): self.assertIn('location', hostvars) self.assertEqual('_test_cloud_', hostvars['location']['cloud']) self.assertEqual('RegionOne', hostvars['location']['region_name']) - self.assertEqual('admin', hostvars['location']['project']['name']) + self.assertEqual( + fakes.PROJECT_ID, hostvars['location']['project']['id']) self.assertEqual("test-image-name", hostvars['image']['name']) self.assertEqual( standard_fake_server['image']['id'], hostvars['image']['id']) diff --git a/openstack/tests/unit/cloud/test_normalize.py b/openstack/tests/unit/cloud/test_normalize.py index 03fcc188d..228e09548 100644 --- a/openstack/tests/unit/cloud/test_normalize.py +++ b/openstack/tests/unit/cloud/test_normalize.py @@ -667,12 +667,6 @@ class TestNormalize(base.TestCase): status='in-use', created_at='2015-08-27T09:49:58-05:00', ) - self.register_uris([ - dict(method='GET', - uri=self.get_mock_url( - 'block-storage', 'public', append=['volumes', 'detail']), - json={'volumes': [vol]}), - ]) expected = { 'attachments': [], 'availability_zone': None, @@ -712,7 +706,7 @@ class TestNormalize(base.TestCase): 'updated_at': None, 'volume_type': None, } - retval = self.cloud.list_volumes(vol)[0] + retval = self.cloud._normalize_volume(vol) self.assertEqual(expected, retval) def test_normalize_volumes_v2(self): diff --git a/openstack/tests/unit/cloud/test_operator_noauth.py b/openstack/tests/unit/cloud/test_operator_noauth.py index d9faee222..1c098962a 100644 --- a/openstack/tests/unit/cloud/test_operator_noauth.py +++ b/openstack/tests/unit/cloud/test_operator_noauth.py @@ -37,7 +37,7 @@ class TestOpenStackCloudOperatorNoAuth(base.TestCase): uri=self.get_mock_url( service_type='baremetal', base_url_append='v1'), json={'id': 'v1', - 'links': [{"href": "https://bare-metal.example.com/v1", + 'links': [{"href": "https://baremetal.example.com/v1", "rel": "self"}]}), dict(method='GET', uri=self.get_mock_url( @@ -58,7 +58,7 @@ class TestOpenStackCloudOperatorNoAuth(base.TestCase): # client library. self.cloud_noauth = openstack.connect( auth_type='none', - baremetal_endpoint_override="https://bare-metal.example.com/v1") + baremetal_endpoint_override="https://baremetal.example.com/v1") self.cloud_noauth.list_machines() @@ -73,11 +73,11 @@ class TestOpenStackCloudOperatorNoAuth(base.TestCase): clouds: bifrost: auth_type: "none" - endpoint: https://bare-metal.example.com + endpoint: https://baremetal.example.com """ self.cloud_noauth = openstack.connect( auth_type='none', - endpoint='https://bare-metal.example.com/v1', + endpoint='https://baremetal.example.com/v1', ) self.cloud_noauth.list_machines() @@ -92,7 +92,7 @@ class TestOpenStackCloudOperatorNoAuth(base.TestCase): self.cloud_noauth = openstack.connect( auth_type='admin_token', auth=dict( - endpoint='https://bare-metal.example.com/v1', + endpoint='https://baremetal.example.com/v1', token='ignored')) self.cloud_noauth.list_machines() @@ -118,7 +118,7 @@ class TestOpenStackCloudOperatorNoAuthUnversioned(base.TestCase): self._uri_registry.clear() self.register_uris([ dict(method='GET', - uri='https://bare-metal.example.com/', + uri='https://baremetal.example.com/', json={ "default_version": { "status": "CURRENT", @@ -126,7 +126,7 @@ class TestOpenStackCloudOperatorNoAuthUnversioned(base.TestCase): "version": "1.46", "id": "v1", "links": [{ - "href": "https://bare-metal.example.com/v1", + "href": "https://baremetal.example.com/v1", "rel": "self" }]}, "versions": [{ @@ -135,7 +135,7 @@ class TestOpenStackCloudOperatorNoAuthUnversioned(base.TestCase): "version": "1.46", "id": "v1", "links": [{ - "href": "https://bare-metal.example.com/v1", + "href": "https://baremetal.example.com/v1", "rel": "self" }]}], "name": "OpenStack Ironic API", @@ -150,21 +150,21 @@ class TestOpenStackCloudOperatorNoAuthUnversioned(base.TestCase): "type": "application/vnd.openstack.ironic.v1+json" }], "links": [{ - "href": "https://bare-metal.example.com/v1", + "href": "https://baremetal.example.com/v1", "rel": "self" }], "ports": [{ - "href": "https://bare-metal.example.com/v1/ports/", + "href": "https://baremetal.example.com/v1/ports/", "rel": "self" }, { - "href": "https://bare-metal.example.com/ports/", + "href": "https://baremetal.example.com/ports/", "rel": "bookmark" }], "nodes": [{ - "href": "https://bare-metal.example.com/v1/nodes/", + "href": "https://baremetal.example.com/v1/nodes/", "rel": "self" }, { - "href": "https://bare-metal.example.com/nodes/", + "href": "https://baremetal.example.com/nodes/", "rel": "bookmark" }], "id": "v1" @@ -188,7 +188,7 @@ class TestOpenStackCloudOperatorNoAuthUnversioned(base.TestCase): # client library. self.cloud_noauth = openstack.connect( auth_type='none', - baremetal_endpoint_override="https://bare-metal.example.com") + baremetal_endpoint_override="https://baremetal.example.com") self.cloud_noauth.list_machines() @@ -203,11 +203,11 @@ class TestOpenStackCloudOperatorNoAuthUnversioned(base.TestCase): clouds: bifrost: auth_type: "none" - endpoint: https://bare-metal.example.com + endpoint: https://baremetal.example.com """ self.cloud_noauth = openstack.connect( auth_type='none', - endpoint='https://bare-metal.example.com/', + endpoint='https://baremetal.example.com/', ) self.cloud_noauth.list_machines() diff --git a/openstack/tests/unit/cloud/test_project.py b/openstack/tests/unit/cloud/test_project.py index 4bb337af0..02e534453 100644 --- a/openstack/tests/unit/cloud/test_project.py +++ b/openstack/tests/unit/cloud/test_project.py @@ -20,7 +20,7 @@ from openstack.tests.unit import base class TestProject(base.TestCase): - def get_mock_url(self, service_type='identity', interface='admin', + def get_mock_url(self, service_type='identity', interface='public', resource=None, append=None, base_url_append=None, v3=True): if v3 and resource is None: diff --git a/openstack/tests/unit/cloud/test_quotas.py b/openstack/tests/unit/cloud/test_quotas.py index ade487987..cb42290c1 100644 --- a/openstack/tests/unit/cloud/test_quotas.py +++ b/openstack/tests/unit/cloud/test_quotas.py @@ -109,6 +109,7 @@ class TestQuotas(base.TestCase): project = self.mock_for_keystone_projects(project_count=1, list_get=True)[0] self.register_uris([ + self.get_cinder_discovery_mock_dict(), dict(method='PUT', uri=self.get_mock_url( 'volumev2', 'public', @@ -125,6 +126,7 @@ class TestQuotas(base.TestCase): project = self.mock_for_keystone_projects(project_count=1, list_get=True)[0] self.register_uris([ + self.get_cinder_discovery_mock_dict(), dict(method='GET', uri=self.get_mock_url( 'volumev2', 'public', @@ -137,6 +139,7 @@ class TestQuotas(base.TestCase): project = self.mock_for_keystone_projects(project_count=1, list_get=True)[0] self.register_uris([ + self.get_cinder_discovery_mock_dict(), dict(method='DELETE', uri=self.get_mock_url( 'volumev2', 'public', diff --git a/openstack/tests/unit/cloud/test_role_assignment.py b/openstack/tests/unit/cloud/test_role_assignment.py index 10c3079df..2e4b89181 100644 --- a/openstack/tests/unit/cloud/test_role_assignment.py +++ b/openstack/tests/unit/cloud/test_role_assignment.py @@ -84,7 +84,7 @@ class TestRoleAssignment(base.TestCase): self.addCleanup(delattr, self, 'user_domain_assignment') self.addCleanup(delattr, self, 'group_domain_assignment') - def get_mock_url(self, service_type='identity', interface='admin', + def get_mock_url(self, service_type='identity', interface='public', resource='role_assignments', append=None, base_url_append='v3', qs_elements=None): return super(TestRoleAssignment, self).get_mock_url( diff --git a/openstack/tests/unit/cloud/test_services.py b/openstack/tests/unit/cloud/test_services.py index c120aaa8a..b718d57f5 100644 --- a/openstack/tests/unit/cloud/test_services.py +++ b/openstack/tests/unit/cloud/test_services.py @@ -30,7 +30,7 @@ class CloudServices(base.TestCase): def setUp(self, cloud_config_fixture='clouds.yaml'): super(CloudServices, self).setUp(cloud_config_fixture) - def get_mock_url(self, service_type='identity', interface='admin', + def get_mock_url(self, service_type='identity', interface='public', resource='services', append=None, base_url_append='v3'): return super(CloudServices, self).get_mock_url( diff --git a/openstack/tests/unit/cloud/test_users.py b/openstack/tests/unit/cloud/test_users.py index c3cd40cb5..44c28c9c3 100644 --- a/openstack/tests/unit/cloud/test_users.py +++ b/openstack/tests/unit/cloud/test_users.py @@ -25,7 +25,7 @@ class TestUsers(base.TestCase): if v3: base_url_append = 'v3' return self.get_mock_url( - service_type='identity', interface='admin', resource=resource, + service_type='identity', resource=resource, append=append, base_url_append=base_url_append) def _get_user_list(self, user_data): diff --git a/openstack/tests/unit/cloud/test_volume.py b/openstack/tests/unit/cloud/test_volume.py index 72ce1a095..1c5735595 100644 --- a/openstack/tests/unit/cloud/test_volume.py +++ b/openstack/tests/unit/cloud/test_volume.py @@ -88,6 +88,7 @@ class TestVolume(base.TestCase): validate=dict(json={ 'volumeAttachment': { 'volumeId': vol['id']}})), + self.get_cinder_discovery_mock_dict(), dict(method='GET', uri=self.get_mock_url( 'volumev2', 'public', append=['volumes', 'detail']), @@ -120,6 +121,7 @@ class TestVolume(base.TestCase): validate=dict(json={ 'volumeAttachment': { 'volumeId': vol['id']}})), + self.get_cinder_discovery_mock_dict(), dict(method='GET', uri=self.get_mock_url( 'volumev2', 'public', append=['volumes', 'detail']), @@ -211,6 +213,7 @@ class TestVolume(base.TestCase): 'compute', 'public', append=['servers', server['id'], 'os-volume_attachments', volume.id])), + self.get_cinder_discovery_mock_dict(), dict(method='GET', uri=self.get_mock_url( 'volumev2', 'public', append=['volumes', 'detail']), @@ -233,6 +236,7 @@ class TestVolume(base.TestCase): 'compute', 'public', append=['servers', server['id'], 'os-volume_attachments', volume.id])), + self.get_cinder_discovery_mock_dict(), dict(method='GET', uri=self.get_mock_url( 'volumev2', 'public', append=['volumes', 'detail']), @@ -249,6 +253,7 @@ class TestVolume(base.TestCase): 'name': '', 'attachments': []} volume = meta.obj_to_munch(fakes.FakeVolume(**vol)) self.register_uris([ + self.get_cinder_discovery_mock_dict(), dict(method='GET', uri=self.get_mock_url( 'volumev2', 'public', append=['volumes', 'detail']), @@ -268,6 +273,7 @@ class TestVolume(base.TestCase): 'name': '', 'attachments': []} volume = meta.obj_to_munch(fakes.FakeVolume(**vol)) self.register_uris([ + self.get_cinder_discovery_mock_dict(), dict(method='GET', uri=self.get_mock_url( 'volumev2', 'public', append=['volumes', 'detail']), @@ -284,6 +290,7 @@ class TestVolume(base.TestCase): 'name': '', 'attachments': []} volume = meta.obj_to_munch(fakes.FakeVolume(**vol)) self.register_uris([ + self.get_cinder_discovery_mock_dict(), dict(method='GET', uri=self.get_mock_url( 'volumev2', 'public', append=['volumes', 'detail']), @@ -306,6 +313,7 @@ class TestVolume(base.TestCase): 'name': '', 'attachments': []} volume = meta.obj_to_munch(fakes.FakeVolume(**vol)) self.register_uris([ + self.get_cinder_discovery_mock_dict(), dict(method='GET', uri=self.get_mock_url( 'volumev2', 'public', append=['volumes', 'detail']), @@ -324,6 +332,7 @@ class TestVolume(base.TestCase): 'name': '', 'attachments': []} volume = meta.obj_to_munch(fakes.FakeVolume(**vol)) self.register_uris([ + self.get_cinder_discovery_mock_dict(), dict(method='GET', uri=self.get_mock_url( 'volumev2', 'public', append=['volumes', 'detail']), @@ -341,6 +350,7 @@ class TestVolume(base.TestCase): vol1 = meta.obj_to_munch(fakes.FakeVolume('01', 'available', 'vol1')) vol2 = meta.obj_to_munch(fakes.FakeVolume('02', 'available', 'vol2')) self.register_uris([ + self.get_cinder_discovery_mock_dict(), dict(method='GET', uri=self.get_mock_url( 'volumev2', 'public', @@ -382,6 +392,7 @@ class TestVolume(base.TestCase): vol1 = meta.obj_to_munch(fakes.FakeVolume('01', 'available', 'vol1')) vol2 = meta.obj_to_munch(fakes.FakeVolume('02', 'available', 'vol2')) self.register_uris([ + self.get_cinder_discovery_mock_dict(), dict(method='GET', uri=self.get_mock_url( 'volumev2', 'public', @@ -440,7 +451,7 @@ class TestVolume(base.TestCase): def test_list_volumes_with_pagination_next_link_fails_all_attempts(self): vol1 = meta.obj_to_munch(fakes.FakeVolume('01', 'available', 'vol1')) - uris = [] + uris = [self.get_cinder_discovery_mock_dict()] attempts = 5 for i in range(attempts): uris.extend([ @@ -474,6 +485,7 @@ class TestVolume(base.TestCase): def test_get_volume_by_id(self): vol1 = meta.obj_to_munch(fakes.FakeVolume('01', 'available', 'vol1')) self.register_uris([ + self.get_cinder_discovery_mock_dict(), dict(method='GET', uri=self.get_mock_url( 'volumev2', 'public', @@ -489,6 +501,7 @@ class TestVolume(base.TestCase): def test_create_volume(self): vol1 = meta.obj_to_munch(fakes.FakeVolume('01', 'available', 'vol1')) self.register_uris([ + self.get_cinder_discovery_mock_dict(), dict(method='POST', uri=self.get_mock_url( 'volumev2', 'public', append=['volumes']), @@ -511,6 +524,7 @@ class TestVolume(base.TestCase): def test_create_bootable_volume(self): vol1 = meta.obj_to_munch(fakes.FakeVolume('01', 'available', 'vol1')) self.register_uris([ + self.get_cinder_discovery_mock_dict(), dict(method='POST', uri=self.get_mock_url( 'volumev2', 'public', append=['volumes']), diff --git a/openstack/tests/unit/cloud/test_volume_access.py b/openstack/tests/unit/cloud/test_volume_access.py index 02ecc4054..ec83ea4c5 100644 --- a/openstack/tests/unit/cloud/test_volume_access.py +++ b/openstack/tests/unit/cloud/test_volume_access.py @@ -20,6 +20,10 @@ from openstack.tests.unit import base class TestVolumeAccess(base.TestCase): + def setUp(self): + super(TestVolumeAccess, self).setUp() + self.use_cinder() + def test_list_volume_types(self): volume_type = dict( id='voltype01', description='volume type description', diff --git a/openstack/tests/unit/cloud/test_volume_backups.py b/openstack/tests/unit/cloud/test_volume_backups.py index 49479d31e..7bec56429 100644 --- a/openstack/tests/unit/cloud/test_volume_backups.py +++ b/openstack/tests/unit/cloud/test_volume_backups.py @@ -14,6 +14,10 @@ from openstack.tests.unit import base class TestVolumeBackups(base.TestCase): + def setUp(self): + super(TestVolumeBackups, self).setUp() + self.use_cinder() + def test_search_volume_backups(self): name = 'Volume1' vol1 = {'name': name, 'availability_zone': 'az1'} diff --git a/openstack/tests/unit/config/test_from_conf.py b/openstack/tests/unit/config/test_from_conf.py index 49b8e4a68..918661d94 100644 --- a/openstack/tests/unit/config/test_from_conf.py +++ b/openstack/tests/unit/config/test_from_conf.py @@ -194,6 +194,7 @@ class TestFromConf(base.TestCase): def test_no_endpoint(self): """Conf contains adapter opts, but service type not in catalog.""" + self.os_fixture.v3_token.remove_service('monitoring') conn = self._get_conn() # Monasca is not in the service catalog self.assertRaises(ks_exc.catalog.EndpointNotFound, diff --git a/openstack/tests/unit/fixtures/baremetal.json b/openstack/tests/unit/fixtures/baremetal.json index fa0a9e7a7..4712764fd 100644 --- a/openstack/tests/unit/fixtures/baremetal.json +++ b/openstack/tests/unit/fixtures/baremetal.json @@ -3,7 +3,7 @@ "id": "v1", "links": [ { - "href": "https://bare-metal.example.com/v1/", + "href": "https://baremetal.example.com/v1/", "rel": "self" } ], @@ -18,7 +18,7 @@ "id": "v1", "links": [ { - "href": "https://bare-metal.example.com/v1/", + "href": "https://baremetal.example.com/v1/", "rel": "self" } ], diff --git a/openstack/tests/unit/fixtures/catalog-bogus-glance.json b/openstack/tests/unit/fixtures/catalog-bogus-glance.json deleted file mode 100644 index 3a47d3f9e..000000000 --- a/openstack/tests/unit/fixtures/catalog-bogus-glance.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "token": { - "audit_ids": [ - "Rvn7eHkiSeOwucBIPaKdYA" - ], - "catalog": [ - { - "endpoints": [ - { - "id": "32466f357f3545248c47471ca51b0d3a", - "interface": "public", - "region": "RegionOne", - "url": "https://example.com/image/" - } - ], - "name": "glance", - "type": "image" - } - ], - "expires_at": "9999-12-31T23:59:59Z", - "issued_at": "2016-12-17T14:25:05.000000Z", - "methods": [ - "password" - ], - "project": { - "domain": { - "id": "default", - "name": "default" - }, - "id": "1c36b64c840a42cd9e9b931a369337f0", - "name": "Default Project" - }, - "roles": [ - { - "id": "9fe2ff9ee4384b1894a90878d3e92bab", - "name": "_member_" - }, - { - "id": "37071fc082e14c2284c32a2761f71c63", - "name": "swiftoperator" - } - ], - "user": { - "domain": { - "id": "default", - "name": "default" - }, - "id": "c17534835f8f42bf98fc367e0bf35e09", - "name": "mordred" - } - } -} diff --git a/openstack/tests/unit/fixtures/catalog-v2.json b/openstack/tests/unit/fixtures/catalog-v2.json deleted file mode 100644 index 54cc2b064..000000000 --- a/openstack/tests/unit/fixtures/catalog-v2.json +++ /dev/null @@ -1,177 +0,0 @@ -{ - "access": { - "token": { - "issued_at": "2016-04-14T10:09:58.014014Z", - "expires": "9999-12-31T23:59:59Z", - "id": "7fa3037ae2fe48ada8c626a51dc01ffd", - "tenant": { - "enabled": true, - "description": "Bootstrap project for initializing the cloud.", - "name": "admin", - "id": "1c36b64c840a42cd9e9b931a369337f0" - }, - "audit_ids": [ - "FgG3Q8T3Sh21r_7HyjHP8A" - ] - }, - "serviceCatalog": [ - { - "endpoints_links": [], - "endpoints": [ - { - "adminURL": "https://compute.example.com/v2.1/1c36b64c840a42cd9e9b931a369337f0", - "region": "RegionOne", - "publicURL": "https://compute.example.com/v2.1/1c36b64c840a42cd9e9b931a369337f0", - "internalURL": "https://compute.example.com/v2.1/1c36b64c840a42cd9e9b931a369337f0", - "id": "32466f357f3545248c47471ca51b0d3a" - } - ], - "type": "compute", - "name": "nova" - }, - { - "endpoints_links": [], - "endpoints": [ - { - "adminURL": "https://volume.example.com/v2/1c36b64c840a42cd9e9b931a369337f0", - "region": "RegionOne", - "publicURL": "https://volume.example.com/v2/1c36b64c840a42cd9e9b931a369337f0", - "internalURL": "https://volume.example.com/v2/1c36b64c840a42cd9e9b931a369337f0", - "id": "1e875ca2225b408bbf3520a1b8e1a537" - } - ], - "type": "volumev2", - "name": "cinderv2" - }, - { - "endpoints_links": [], - "endpoints": [ - { - "adminURL": "https://image.example.com/v2", - "region": "RegionOne", - "publicURL": "https://image.example.com/v2", - "internalURL": "https://image.example.com/v2", - "id": "5a64de3c4a614d8d8f8d1ba3dee5f45f" - } - ], - "type": "image", - "name": "glance" - }, - { - "endpoints_links": [], - "endpoints": [ - { - "adminURL": "https://volume.example.com/v1/1c36b64c840a42cd9e9b931a369337f0", - "region": "RegionOne", - "publicURL": "https://volume.example.com/v1/1c36b64c840a42cd9e9b931a369337f0", - "internalURL": "https://volume.example.com/v1/1c36b64c840a42cd9e9b931a369337f0", - "id": "3d15fdfc7d424f3c8923324417e1a3d1" - } - ], - "type": "volume", - "name": "cinder" - }, - { - "endpoints_links": [], - "endpoints": [ - { - "adminURL": "https://identity.example.com/v2.0", - "region": "RegionOne", - "publicURL": "https://identity.example.com/v2.0", - "internalURL": "https://identity.example.com/v2.0", - "id": "4deb4d0504a044a395d4480741ba628c" - } - ], - "type": "identity", - "name": "keystone" - }, - { - "endpoints_links": [], - "endpoints": [ - { - "adminURL": "https://network.example.com", - "region": "RegionOne", - "publicURL": "https://network.example.com", - "internalURL": "https://network.example.com", - "id": "4deb4d0504a044a395d4480741ba628d" - } - ], - "type": "network", - "name": "neutron" - }, - { - "endpoints_links": [], - "endpoints": [ - { - "adminURL": "https://object-store.example.com/v1/1c36b64c840a42cd9e9b931a369337f0", - "region": "RegionOne", - "publicURL": "https://object-store.example.com/v1/1c36b64c840a42cd9e9b931a369337f0", - "internalURL": "https://object-store.example.com/v1/1c36b64c840a42cd9e9b931a369337f0", - "id": "4deb4d0504a044a395d4480741ba628c" - } - ], - "type": "object-store", - "name": "swift" - }, - { - "endpoints_links": [], - "endpoints": [ - { - "adminURL": "https://placement.example.com", - "region": "RegionOne", - "publicURL": "https://placement.example.com", - "internalURL": "https://placement.example.com", - "id": "652f0612744042bfbb8a8bb2c777a16e" - } - ], - "type": "placement", - "name": "placement" - }, - { - "endpoints_links": [], - "endpoints": [ - { - "adminURL": "https://dns.example.com", - "region": "RegionOne", - "publicURL": "https://dns.example.com", - "internalURL": "https://dns.example.com", - "id": "652f0612744042bfbb8a8bb2c777a16d" - } - ], - "type": "dns", - "name": "designate" - }, - { - "endpoints_links": [], - "endpoints": [ - { - "adminURL": "https://clustering.example.com", - "region": "RegionOne", - "publicURL": "https://clustering.example.com", - "internalURL": "https://clustering.example.com", - "id": "4deb4d0504a044a395d4480741ba624z" - } - ], - "type": "clustering", - "name": "senlin" - } - ], - "user": { - "username": "dummy", - "roles_links": [], - "id": "71675f719c3343e8ac441cc28f396474", - "roles": [ - { - "name": "admin" - } - ], - "name": "admin" - }, - "metadata": { - "is_admin": 0, - "roles": [ - "6d813db50b6e4a1ababdbbb5a83c7de5" - ] - } - } -} diff --git a/openstack/tests/unit/fixtures/catalog-v3-fake-v1.json b/openstack/tests/unit/fixtures/catalog-v3-fake-v1.json deleted file mode 100644 index c32617577..000000000 --- a/openstack/tests/unit/fixtures/catalog-v3-fake-v1.json +++ /dev/null @@ -1,71 +0,0 @@ -{ - "token": { - "audit_ids": [ - "Rvn7eHkiSeOwucBIPaKdYA" - ], - "catalog": [ - { - "endpoints": [ - { - "id": "4deb4d0504a044a395d4480741ba628c", - "interface": "public", - "region": "RegionOne", - "url": "https://identity.example.com" - }, - { - "id": "012322eeedcd459edabb4933021112bc", - "interface": "admin", - "region": "RegionOne", - "url": "https://identity.example.com" - } - ], - "endpoints_links": [], - "name": "keystone", - "type": "identity" - }, - { - "endpoints": [ - { - "id": "1e875ca2225b408bbf3520a1b8e1a537", - "interface": "public", - "region": "RegionOne", - "url": "https://fake.example.com/v1/1c36b64c840a42cd9e9b931a369337f0" - } - ], - "name": "fake_service", - "type": "fake" - } - ], - "expires_at": "9999-12-31T23:59:59Z", - "issued_at": "2016-12-17T14:25:05.000000Z", - "methods": [ - "password" - ], - "project": { - "domain": { - "id": "default", - "name": "default" - }, - "id": "1c36b64c840a42cd9e9b931a369337f0", - "name": "Default Project" - }, - "roles": [ - { - "id": "9fe2ff9ee4384b1894a90878d3e92bab", - "name": "_member_" - }, - { - "id": "37071fc082e14c2284c32a2761f71c63", - "name": "swiftoperator" - } - ], - "user": { - "domain": { - "id": "default", - "name": "default" - }, - "id": "c17534835f8f42bf98fc367e0bf35e09", - "name": "mordred" - } - } -} diff --git a/openstack/tests/unit/fixtures/catalog-v3-fake-v2.json b/openstack/tests/unit/fixtures/catalog-v3-fake-v2.json deleted file mode 100644 index 9ce0b7f50..000000000 --- a/openstack/tests/unit/fixtures/catalog-v3-fake-v2.json +++ /dev/null @@ -1,71 +0,0 @@ -{ - "token": { - "audit_ids": [ - "Rvn7eHkiSeOwucBIPaKdYA" - ], - "catalog": [ - { - "endpoints": [ - { - "id": "4deb4d0504a044a395d4480741ba628c", - "interface": "public", - "region": "RegionOne", - "url": "https://identity.example.com" - }, - { - "id": "012322eeedcd459edabb4933021112bc", - "interface": "admin", - "region": "RegionOne", - "url": "https://identity.example.com" - } - ], - "endpoints_links": [], - "name": "keystone", - "type": "identity" - }, - { - "endpoints": [ - { - "id": "1e875ca2225b408bbf3520a1b8e1a537", - "interface": "public", - "region": "RegionOne", - "url": "https://fake.example.com/v2/1c36b64c840a42cd9e9b931a369337f0" - } - ], - "name": "fake_service", - "type": "fake" - } - ], - "expires_at": "9999-12-31T23:59:59Z", - "issued_at": "2016-12-17T14:25:05.000000Z", - "methods": [ - "password" - ], - "project": { - "domain": { - "id": "default", - "name": "default" - }, - "id": "1c36b64c840a42cd9e9b931a369337f0", - "name": "Default Project" - }, - "roles": [ - { - "id": "9fe2ff9ee4384b1894a90878d3e92bab", - "name": "_member_" - }, - { - "id": "37071fc082e14c2284c32a2761f71c63", - "name": "swiftoperator" - } - ], - "user": { - "domain": { - "id": "default", - "name": "default" - }, - "id": "c17534835f8f42bf98fc367e0bf35e09", - "name": "mordred" - } - } -} diff --git a/openstack/tests/unit/fixtures/catalog-v3-suburl.json b/openstack/tests/unit/fixtures/catalog-v3-suburl.json deleted file mode 100644 index ca2b68107..000000000 --- a/openstack/tests/unit/fixtures/catalog-v3-suburl.json +++ /dev/null @@ -1,198 +0,0 @@ -{ - "token": { - "audit_ids": [ - "Rvn7eHkiSeOwucBIPaKdYA" - ], - "catalog": [ - { - "endpoints": [ - { - "id": "32466f357f3545248c47471ca51b0d3a", - "interface": "public", - "region": "RegionOne", - "url": "https://example.com/compute/v2.1/" - } - ], - "name": "nova", - "type": "compute" - }, - { - "endpoints": [ - { - "id": "1e875ca2225b408bbf3520a1b8e1a537", - "interface": "public", - "region": "RegionOne", - "url": "https://example.com/volumev2/v2/1c36b64c840a42cd9e9b931a369337f0" - } - ], - "name": "cinderv2", - "type": "volumev2" - }, - { - "endpoints": [ - { - "id": "5a64de3c4a614d8d8f8d1ba3dee5f45f", - "interface": "public", - "region": "RegionOne", - "url": "https://example.com/image" - } - ], - "name": "glance", - "type": "image" - }, - { - "endpoints": [ - { - "id": "3d15fdfc7d424f3c8923324417e1a3d1", - "interface": "public", - "region": "RegionOne", - "url": "https://example.com/volume/v1/1c36b64c840a42cd9e9b931a369337f0" - } - ], - "name": "cinder", - "type": "volume" - }, - { - "endpoints": [ - { - "id": "4deb4d0504a044a395d4480741ba628c", - "interface": "public", - "region": "RegionOne", - "url": "https://identity.example.com" - }, - { - "id": "012322eeedcd459edabb4933021112bc", - "interface": "admin", - "region": "RegionOne", - "url": "https://example.com/identity" - } - ], - "endpoints_links": [], - "name": "keystone", - "type": "identity" - }, - { - "endpoints": [ - { - "id": "4deb4d0504a044a395d4480741ba628d", - "interface": "public", - "region": "RegionOne", - "url": "https://example.com/example" - } - ], - "endpoints_links": [], - "name": "neutron", - "type": "network" - }, - { - "endpoints": [ - { - "id": "4deb4d0504a044a395d4480741ba628e", - "interface": "public", - "region": "RegionOne", - "url": "https://example.com/container-infra/v1" - } - ], - "endpoints_links": [], - "name": "magnum", - "type": "container-infra" - }, - { - "endpoints": [ - { - "id": "4deb4d0504a044a395d4480741ba628c", - "interface": "public", - "region": "RegionOne", - "url": "https://example.com/object-store/v1/1c36b64c840a42cd9e9b931a369337f0" - } - ], - "endpoints_links": [], - "name": "swift", - "type": "object-store" - }, - { - "endpoints": [ - { - "id": "652f0612744042bfbb8a8bb2c777a16d", - "interface": "public", - "region": "RegionOne", - "url": "https://example.com/bare-metal" - } - ], - "endpoints_links": [], - "name": "ironic", - "type": "baremetal" - }, - { - "endpoints": [ - { - "id": "4deb4d0504a044a395d4480741ba628c", - "interface": "public", - "region": "RegionOne", - "url": "https://example.com/orchestration/v1/1c36b64c840a42cd9e9b931a369337f0" - } - ], - "endpoints_links": [], - "name": "heat", - "type": "orchestration" - }, - { - "endpoints": [ - { - "id": "10c76ffd2b744a67950ed1365190d352", - "interface": "public", - "region": "RegionOne", - "url": "https://example.com/dns" - } - ], - "endpoints_links": [], - "name": "designate", - "type": "dns" - }, - { - "endpoints": [ - { - "id": "4deb4d0504a044a395d4480741ba624z", - "interface": "public", - "region": "RegionOne", - "url": "https://example.com/clustering" - } - ], - "endpoint_links": [], - "name": "senlin", - "type": "clustering" - } - ], - "expires_at": "9999-12-31T23:59:59Z", - "issued_at": "2016-12-17T14:25:05.000000Z", - "methods": [ - "password" - ], - "project": { - "domain": { - "id": "default", - "name": "default" - }, - "id": "1c36b64c840a42cd9e9b931a369337f0", - "name": "Default Project" - }, - "roles": [ - { - "id": "9fe2ff9ee4384b1894a90878d3e92bab", - "name": "_member_" - }, - { - "id": "37071fc082e14c2284c32a2761f71c63", - "name": "swiftoperator" - } - ], - "user": { - "domain": { - "id": "default", - "name": "default" - }, - "id": "c17534835f8f42bf98fc367e0bf35e09", - "name": "mordred" - } - } -} diff --git a/openstack/tests/unit/fixtures/catalog-v3-suffix.json b/openstack/tests/unit/fixtures/catalog-v3-suffix.json deleted file mode 100644 index a2a2633bc..000000000 --- a/openstack/tests/unit/fixtures/catalog-v3-suffix.json +++ /dev/null @@ -1,211 +0,0 @@ -{ - "token": { - "audit_ids": [ - "Rvn7eHkiSeOwucBIPaKdYA" - ], - "catalog": [ - { - "endpoints": [ - { - "id": "32466f357f3545248c47471ca51b0d3a", - "interface": "public", - "region": "RegionOne", - "url": "https://compute.example.com/v2.1/" - } - ], - "name": "nova", - "type": "compute" - }, - { - "endpoints": [ - { - "id": "1e875ca2225b408bbf3520a1b8e1a537", - "interface": "public", - "region": "RegionOne", - "url": "https://volume.example.com/v2/1c36b64c840a42cd9e9b931a369337f0" - } - ], - "name": "cinderv2", - "type": "volumev2" - }, - { - "endpoints": [ - { - "id": "5a64de3c4a614d8d8f8d1ba3dee5f45f", - "interface": "public", - "region": "RegionOne", - "url": "https://image.example.com" - } - ], - "name": "glance", - "type": "image" - }, - { - "endpoints": [ - { - "id": "3d15fdfc7d424f3c8923324417e1a3d1", - "interface": "public", - "region": "RegionOne", - "url": "https://volume.example.com/v1/1c36b64c840a42cd9e9b931a369337f0" - } - ], - "name": "cinder", - "type": "volume" - }, - { - "endpoints": [ - { - "id": "4deb4d0504a044a395d4480741ba628c", - "interface": "public", - "region": "RegionOne", - "url": "https://identity.example.com" - }, - { - "id": "012322eeedcd459edabb4933021112bc", - "interface": "admin", - "region": "RegionOne", - "url": "https://identity.example.com" - } - ], - "endpoints_links": [], - "name": "keystone", - "type": "identity" - }, - { - "endpoints": [ - { - "id": "4deb4d0504a044a395d4480741ba628d", - "interface": "public", - "region": "RegionOne", - "url": "https://network.example.com/v2.0" - } - ], - "endpoints_links": [], - "name": "neutron", - "type": "network" - }, - { - "endpoints": [ - { - "id": "4deb4d0504a044a395d4480741ba628e", - "interface": "public", - "region": "RegionOne", - "url": "https://container-infra.example.com/v1" - } - ], - "endpoints_links": [], - "name": "magnum", - "type": "container-infra" - }, - { - "endpoints": [ - { - "id": "4deb4d0504a044a395d4480741ba628c", - "interface": "public", - "region": "RegionOne", - "url": "https://object-store.example.com/v1/1c36b64c840a42cd9e9b931a369337f0" - } - ], - "endpoints_links": [], - "name": "swift", - "type": "object-store" - }, - { - "endpoints": [ - { - "id": "652f0612744042bfbb8a8bb2c777a16d", - "interface": "public", - "region": "RegionOne", - "url": "https://bare-metal.example.com/" - } - ], - "endpoints_links": [], - "name": "ironic", - "type": "baremetal" - }, - { - "endpoints": [ - { - "id": "4deb4d0504a044a395d4480741ba628c", - "interface": "public", - "region": "RegionOne", - "url": "https://orchestration.example.com/v1/1c36b64c840a42cd9e9b931a369337f0" - } - ], - "endpoints_links": [], - "name": "heat", - "type": "orchestration" - }, - { - "endpoints": [ - { - "id": "10c76ffd2b744a67950ed1365190d353", - "interface": "public", - "region": "RegionOne", - "url": "https://placement.example.com" - } - ], - "endpoints_links": [], - "name": "placement", - "type": "placement" - }, - { - "endpoints": [ - { - "id": "10c76ffd2b744a67950ed1365190d352", - "interface": "public", - "region": "RegionOne", - "url": "https://dns.example.com" - } - ], - "endpoints_links": [], - "name": "designate", - "type": "dns" - }, - { - "endpoints": [ - { - "id": "4deb4d0504a044a395d4480741ba624z", - "interface": "public", - "region": "RegionOne", - "url": "https://clustering.example.com" - } - ], - "endpoints_links": [], - "name": "senlin", - "type": "clustering" - } - ], - "expires_at": "9999-12-31T23:59:59Z", - "issued_at": "2016-12-17T14:25:05.000000Z", - "methods": [ - "password" - ], - "project": { - "domain": { - "id": "default", - "name": "default" - }, - "id": "1c36b64c840a42cd9e9b931a369337f0", - "name": "Default Project" - }, - "roles": [ - { - "id": "9fe2ff9ee4384b1894a90878d3e92bab", - "name": "_member_" - }, - { - "id": "37071fc082e14c2284c32a2761f71c63", - "name": "swiftoperator" - } - ], - "user": { - "domain": { - "id": "default", - "name": "default" - }, - "id": "c17534835f8f42bf98fc367e0bf35e09", - "name": "mordred" - } - } -} diff --git a/openstack/tests/unit/fixtures/catalog-v3.json b/openstack/tests/unit/fixtures/catalog-v3.json deleted file mode 100644 index 40bc7bb39..000000000 --- a/openstack/tests/unit/fixtures/catalog-v3.json +++ /dev/null @@ -1,217 +0,0 @@ -{ - "token": { - "audit_ids": [ - "Rvn7eHkiSeOwucBIPaKdYA" - ], - "catalog": [ - { - "endpoints": [ - { - "id": "32466f357f3545248c47471ca51b0d3a", - "interface": "public", - "region": "RegionOne", - "url": "https://compute.example.com/v2.1/" - }, - { - "id": "32466f357f3545248c47471ca51b0d3b", - "interface": "internal", - "region": "RegionOne", - "url": "https://internal.compute.example.com/v2.1/" - } - ], - "name": "nova", - "type": "compute" - }, - { - "endpoints": [ - { - "id": "1e875ca2225b408bbf3520a1b8e1a537", - "interface": "public", - "region": "RegionOne", - "url": "https://volume.example.com/v2/1c36b64c840a42cd9e9b931a369337f0" - } - ], - "name": "cinderv2", - "type": "volumev2" - }, - { - "endpoints": [ - { - "id": "5a64de3c4a614d8d8f8d1ba3dee5f45f", - "interface": "public", - "region": "RegionOne", - "url": "https://image.example.com" - } - ], - "name": "glance", - "type": "image" - }, - { - "endpoints": [ - { - "id": "3d15fdfc7d424f3c8923324417e1a3d1", - "interface": "public", - "region": "RegionOne", - "url": "https://volume.example.com/v1/1c36b64c840a42cd9e9b931a369337f0" - } - ], - "name": "cinder", - "type": "volume" - }, - { - "endpoints": [ - { - "id": "4deb4d0504a044a395d4480741ba628c", - "interface": "public", - "region": "RegionOne", - "url": "https://identity.example.com" - }, - { - "id": "012322eeedcd459edabb4933021112bc", - "interface": "admin", - "region": "RegionOne", - "url": "https://identity.example.com" - } - ], - "endpoints_links": [], - "name": "keystone", - "type": "identity" - }, - { - "endpoints": [ - { - "id": "4deb4d0504a044a395d4480741ba628d", - "interface": "public", - "region": "RegionOne", - "url": "https://network.example.com" - } - ], - "endpoints_links": [], - "name": "neutron", - "type": "network" - }, - { - "endpoints": [ - { - "id": "4deb4d0504a044a395d4480741ba628e", - "interface": "public", - "region": "RegionOne", - "url": "https://container-infra.example.com/v1" - } - ], - "endpoints_links": [], - "name": "magnum", - "type": "container-infra" - }, - { - "endpoints": [ - { - "id": "4deb4d0504a044a395d4480741ba628c", - "interface": "public", - "region": "RegionOne", - "url": "https://object-store.example.com/v1/1c36b64c840a42cd9e9b931a369337f0" - } - ], - "endpoints_links": [], - "name": "swift", - "type": "object-store" - }, - { - "endpoints": [ - { - "id": "652f0612744042bfbb8a8bb2c777a16d", - "interface": "public", - "region": "RegionOne", - "url": "https://bare-metal.example.com/" - } - ], - "endpoints_links": [], - "name": "ironic", - "type": "baremetal" - }, - { - "endpoints": [ - { - "id": "4deb4d0504a044a395d4480741ba628c", - "interface": "public", - "region": "RegionOne", - "url": "https://orchestration.example.com/v1/1c36b64c840a42cd9e9b931a369337f0" - } - ], - "endpoints_links": [], - "name": "heat", - "type": "orchestration" - }, - { - "endpoints": [ - { - "id": "10c76ffd2b744a67950ed1365190d353", - "interface": "public", - "region": "RegionOne", - "url": "https://placement.example.com" - } - ], - "endpoints_links": [], - "name": "placement", - "type": "placement" - }, - { - "endpoints": [ - { - "id": "10c76ffd2b744a67950ed1365190d352", - "interface": "public", - "region": "RegionOne", - "url": "https://dns.example.com" - } - ], - "endpoints_links": [], - "name": "designate", - "type": "dns" - }, - { - "endpoints": [ - { - "id": "4deb4d0504a044a395d4480741ba624z", - "interface": "public", - "region": "RegionOne", - "url": "https://clustering.example.com" - } - ], - "endpoints_links": [], - "name": "senlin", - "type": "clustering" - } - ], - "expires_at": "9999-12-31T23:59:59Z", - "issued_at": "2016-12-17T14:25:05.000000Z", - "methods": [ - "password" - ], - "project": { - "domain": { - "id": "default", - "name": "default" - }, - "id": "1c36b64c840a42cd9e9b931a369337f0", - "name": "Default Project" - }, - "roles": [ - { - "id": "9fe2ff9ee4384b1894a90878d3e92bab", - "name": "_member_" - }, - { - "id": "37071fc082e14c2284c32a2761f71c63", - "name": "swiftoperator" - } - ], - "user": { - "domain": { - "id": "default", - "name": "default" - }, - "id": "c17534835f8f42bf98fc367e0bf35e09", - "name": "mordred" - } - } -} diff --git a/openstack/tests/unit/fixtures/clouds/clouds.yaml b/openstack/tests/unit/fixtures/clouds/clouds.yaml index ebd4cc0ba..99bae938f 100644 --- a/openstack/tests/unit/fixtures/clouds/clouds.yaml +++ b/openstack/tests/unit/fixtures/clouds/clouds.yaml @@ -7,6 +7,7 @@ clouds: username: admin user_domain_name: default project_domain_name: default + block_storage_api_version: 2 region_name: RegionOne _test_cloud_v2_: auth: diff --git a/openstack/tests/unit/test_connection.py b/openstack/tests/unit/test_connection.py index b3e4c51dd..721bc59a2 100644 --- a/openstack/tests/unit/test_connection.py +++ b/openstack/tests/unit/test_connection.py @@ -21,6 +21,7 @@ from openstack import connection from openstack import proxy import openstack.config from openstack import service_description +from openstack.tests import fakes from openstack.tests.unit import base from openstack.tests.unit.fake import fake_service @@ -290,7 +291,13 @@ class TestNetworkConnection(base.TestCase): # Verify that if the catalog has the suffix we don't mess things up. def test_network_proxy(self): - self.use_keystone_v3(catalog='catalog-v3-suffix.json') + self.os_fixture.v3_token.remove_service('network') + svc = self.os_fixture.v3_token.add_service('network') + svc.add_endpoint( + interface='public', + url='https://network.example.com/v2.0', + region='RegionOne') + self.use_keystone_v3() self.assertEqual( 'openstack.network.v2._proxy', self.cloud.network.__class__.__module__) @@ -330,7 +337,13 @@ class TestAuthorize(base.TestCase): class TestNewService(base.TestCase): def test_add_service_v1(self): - self.use_keystone_v3(catalog='catalog-v3-fake-v1.json') + svc = self.os_fixture.v3_token.add_service('fake') + svc.add_endpoint( + interface='public', + region='RegionOne', + url='https://fake.example.com/v1/{0}'.format(fakes.PROJECT_ID), + ) + self.use_keystone_v3() conn = self.cloud service = fake_service.FakeService('fake') @@ -358,7 +371,13 @@ class TestNewService(base.TestCase): self.assertTrue(conn.fake.dummy()) def test_add_service_v2(self): - self.use_keystone_v3(catalog='catalog-v3-fake-v2.json') + svc = self.os_fixture.v3_token.add_service('fake') + svc.add_endpoint( + interface='public', + region='RegionOne', + url='https://fake.example.com/v2/{0}'.format(fakes.PROJECT_ID), + ) + self.use_keystone_v3() conn = self.cloud self.register_uris([ @@ -383,7 +402,13 @@ class TestNewService(base.TestCase): self.assertFalse(conn.fake.dummy()) def test_replace_system_service(self): - self.use_keystone_v3(catalog='catalog-v3-fake-v2.json') + svc = self.os_fixture.v3_token.add_service('fake') + svc.add_endpoint( + interface='public', + region='RegionOne', + url='https://fake.example.com/v2/{0}'.format(fakes.PROJECT_ID), + ) + self.use_keystone_v3() conn = self.cloud # delete native dns service diff --git a/openstack/tests/unit/test_missing_version.py b/openstack/tests/unit/test_missing_version.py index b1cdaa44e..6e1d5b975 100644 --- a/openstack/tests/unit/test_missing_version.py +++ b/openstack/tests/unit/test_missing_version.py @@ -21,7 +21,12 @@ class TestMissingVersion(base.TestCase): def setUp(self): super(TestMissingVersion, self).setUp() - self.use_keystone_v3(catalog='catalog-bogus-glance.json') + self.os_fixture.clear_tokens() + svc = self.os_fixture.v3_token.add_service('image') + svc.add_endpoint( + url='https://example.com/image/', + region='RegionOne', interface='public') + self.use_keystone_v3() self.use_glance( image_version_json='bad-glance-version.json', image_discovery_url='https://example.com/image/') diff --git a/openstack/tests/unit/test_stats.py b/openstack/tests/unit/test_stats.py index a556c1f14..801354545 100644 --- a/openstack/tests/unit/test_stats.py +++ b/openstack/tests/unit/test_stats.py @@ -164,7 +164,7 @@ class TestStats(base.TestCase): def test_list_projects(self): mock_uri = self.get_mock_url( - service_type='identity', interface='admin', resource='projects', + service_type='identity', resource='projects', base_url_append='v3') self.register_uris([ @@ -185,7 +185,7 @@ class TestStats(base.TestCase): def test_projects(self): mock_uri = self.get_mock_url( - service_type='identity', interface='admin', resource='projects', + service_type='identity', resource='projects', base_url_append='v3') self.register_uris([ @@ -256,7 +256,7 @@ class TestNoStats(base.TestCase): def test_no_stats(self): mock_uri = self.get_mock_url( - service_type='identity', interface='admin', resource='projects', + service_type='identity', resource='projects', base_url_append='v3') self.register_uris([