From cc45581a18df45d2c30b1a6eee8976943105b3a4 Mon Sep 17 00:00:00 2001 From: Stephen Finucane Date: Tue, 11 Aug 2020 11:35:04 +0100 Subject: [PATCH] functional: Add and use 'GlanceFixture' This rather beefy (but also quite simple) patch replaces the 'stub_out_image_service' call and associated cleanup in all functional tests with a new 'GlanceFixture', based on the old 'FakeImageService'. The use of a fixture means we don't have to worry about teardown and allows us to stub Glance in the same manners as Cinder, Neutron, Placement etc. Unit test cleanup is handled in a later patch. Change-Id: I6daea47988181dfa6dde3d9c42004c0ecf6ae87a Signed-off-by: Stephen Finucane --- nova/tests/fixtures.py | 315 ++++++++++++++++++ .../api_sample_tests/test_aggregates.py | 3 +- .../api_sample_tests/test_create_backup.py | 4 +- .../api_sample_tests/test_images.py | 13 +- .../api_sample_tests/test_multiple_create.py | 5 +- .../test_preserve_ephemeral_rebuild.py | 4 +- .../api_sample_tests/test_servers.py | 33 +- .../compute/test_resource_tracker.py | 8 +- nova/tests/functional/integrated_helpers.py | 13 +- .../tests/functional/libvirt/test_evacuate.py | 9 +- .../functional/libvirt/test_numa_servers.py | 2 +- .../libvirt/test_shared_resource_provider.py | 12 +- .../notification_sample_base.py | 6 +- .../regressions/test_bug_1522536.py | 8 +- .../regressions/test_bug_1541691.py | 11 +- .../regressions/test_bug_1548980.py | 15 +- .../regressions/test_bug_1558866.py | 8 +- .../regressions/test_bug_1595962.py | 7 +- .../regressions/test_bug_1620248.py | 6 +- .../regressions/test_bug_1670627.py | 6 +- .../regressions/test_bug_1671648.py | 8 +- .../regressions/test_bug_1675570.py | 5 +- .../regressions/test_bug_1679750.py | 4 +- .../regressions/test_bug_1682693.py | 4 +- .../regressions/test_bug_1689692.py | 4 +- .../regressions/test_bug_1702454.py | 4 +- .../regressions/test_bug_1713783.py | 6 +- .../regressions/test_bug_1718455.py | 5 +- .../regressions/test_bug_1718512.py | 4 +- .../regressions/test_bug_1719730.py | 4 +- .../regressions/test_bug_1735407.py | 7 +- .../regressions/test_bug_1741307.py | 5 +- .../regressions/test_bug_1746483.py | 7 +- .../regressions/test_bug_1764556.py | 4 +- .../regressions/test_bug_1764883.py | 8 +- .../regressions/test_bug_1780373.py | 13 +- .../regressions/test_bug_1781286.py | 8 +- .../regressions/test_bug_1781710.py | 9 +- .../regressions/test_bug_1784353.py | 8 +- .../regressions/test_bug_1797580.py | 9 +- .../regressions/test_bug_1806515.py | 6 +- .../regressions/test_bug_1815153.py | 5 +- .../regressions/test_bug_1825020.py | 4 +- .../regressions/test_bug_1825034.py | 5 +- .../regressions/test_bug_1830747.py | 4 +- .../regressions/test_bug_1835822.py | 7 +- .../regressions/test_bug_1843708.py | 3 +- .../regressions/test_bug_1849409.py | 5 +- .../regressions/test_bug_1852458.py | 4 +- .../regressions/test_bug_1862633.py | 4 +- .../regressions/test_bug_1893284.py | 13 +- nova/tests/functional/test_aggregates.py | 33 +- .../functional/test_availability_zones.py | 5 +- .../tests/functional/test_boot_from_volume.py | 6 +- nova/tests/functional/test_cross_az_attach.py | 4 +- .../functional/test_cross_cell_migrate.py | 6 +- .../functional/test_external_networks.py | 4 +- .../tests/functional/test_instance_actions.py | 4 +- .../functional/test_list_servers_ip_filter.py | 10 +- nova/tests/functional/test_metadata.py | 4 +- nova/tests/functional/test_nova_manage.py | 5 +- nova/tests/functional/test_policy.py | 4 +- nova/tests/functional/test_scheduler.py | 4 +- nova/tests/functional/test_server_faults.py | 5 +- nova/tests/functional/test_server_group.py | 16 +- nova/tests/functional/test_servers.py | 12 +- nova/tests/functional/test_service.py | 5 +- nova/tests/functional/wsgi/test_secgroup.py | 5 +- nova/tests/functional/wsgi/test_servers.py | 22 +- nova/tests/unit/test_fixtures.py | 100 ++++++ 70 files changed, 568 insertions(+), 360 deletions(-) diff --git a/nova/tests/fixtures.py b/nova/tests/fixtures.py index 0736f760187a..11b5f7bd3f1b 100644 --- a/nova/tests/fixtures.py +++ b/nova/tests/fixtures.py @@ -15,9 +15,11 @@ # under the License. """Fixtures for Nova tests.""" + import collections from contextlib import contextmanager import copy +import datetime import logging as std_logging import os import random @@ -56,6 +58,7 @@ from nova.network import constants as neutron_constants from nova.network import model as network_model from nova import objects from nova.objects import base as obj_base +from nova.objects import fields as obj_fields from nova.objects import service as service_obj import nova.privsep from nova import quota as nova_quota @@ -2046,6 +2049,318 @@ class EventReporterStub(fixtures.Fixture): lambda *args, **kwargs: mock.MagicMock())) +class GlanceFixture(fixtures.Fixture): + """A fixture for simulating Glance.""" + + # NOTE(justinsb): The OpenStack API can't upload an image? + # So, make sure we've got one.. + timestamp = datetime.datetime(2011, 1, 1, 1, 2, 3) + + image1 = { + 'id': '155d900f-4e14-4e4c-a73d-069cbf4541e6', + 'name': 'fakeimage123456', + 'created_at': timestamp, + 'updated_at': timestamp, + 'deleted_at': None, + 'deleted': False, + 'status': 'active', + 'is_public': False, + 'container_format': 'raw', + 'disk_format': 'raw', + 'size': '25165824', + 'min_ram': 0, + 'min_disk': 0, + 'protected': False, + 'visibility': 'public', + 'tags': ['tag1', 'tag2'], + 'properties': { + 'kernel_id': 'nokernel', + 'ramdisk_id': 'nokernel', + 'architecture': obj_fields.Architecture.X86_64, + }, + } + + image2 = { + 'id': 'a2459075-d96c-40d5-893e-577ff92e721c', + 'name': 'fakeimage123456', + 'created_at': timestamp, + 'updated_at': timestamp, + 'deleted_at': None, + 'deleted': False, + 'status': 'active', + 'is_public': True, + 'container_format': 'ami', + 'disk_format': 'ami', + 'size': '58145823', + 'min_ram': 0, + 'min_disk': 0, + 'protected': False, + 'visibility': 'public', + 'tags': [], + 'properties': { + 'kernel_id': 'nokernel', + 'ramdisk_id': 'nokernel', + }, + } + + image3 = { + 'id': '76fa36fc-c930-4bf3-8c8a-ea2a2420deb6', + 'name': 'fakeimage123456', + 'created_at': timestamp, + 'updated_at': timestamp, + 'deleted_at': None, + 'deleted': False, + 'status': 'active', + 'is_public': True, + 'container_format': 'bare', + 'disk_format': 'raw', + 'size': '83594576', + 'min_ram': 0, + 'min_disk': 0, + 'protected': False, + 'visibility': 'public', + 'tags': ['tag3', 'tag4'], + 'properties': { + 'kernel_id': 'nokernel', + 'ramdisk_id': 'nokernel', + 'architecture': obj_fields.Architecture.X86_64, + }, + } + + image4 = { + 'id': 'cedef40a-ed67-4d10-800e-17455edce175', + 'name': 'fakeimage123456', + 'created_at': timestamp, + 'updated_at': timestamp, + 'deleted_at': None, + 'deleted': False, + 'status': 'active', + 'is_public': True, + 'container_format': 'ami', + 'disk_format': 'ami', + 'size': '84035174', + 'min_ram': 0, + 'min_disk': 0, + 'protected': False, + 'visibility': 'public', + 'tags': [], + 'properties': { + 'kernel_id': 'nokernel', + 'ramdisk_id': 'nokernel', + }, + } + + image5 = { + 'id': 'c905cedb-7281-47e4-8a62-f26bc5fc4c77', + 'name': 'fakeimage123456', + 'created_at': timestamp, + 'updated_at': timestamp, + 'deleted_at': None, + 'deleted': False, + 'status': 'active', + 'is_public': True, + 'container_format': 'ami', + 'disk_format': 'ami', + 'size': '26360814', + 'min_ram': 0, + 'min_disk': 0, + 'protected': False, + 'visibility': 'public', + 'tags': [], + 'properties': { + 'kernel_id': '155d900f-4e14-4e4c-a73d-069cbf4541e6', + 'ramdisk_id': None, + }, + } + + auto_disk_config_disabled_image = { + 'id': 'a440c04b-79fa-479c-bed1-0b816eaec379', + 'name': 'fakeimage6', + 'created_at': timestamp, + 'updated_at': timestamp, + 'deleted_at': None, + 'deleted': False, + 'status': 'active', + 'is_public': False, + 'container_format': 'ova', + 'disk_format': 'vhd', + 'size': '49163826', + 'min_ram': 0, + 'min_disk': 0, + 'protected': False, + 'visibility': 'public', + 'tags': [], + 'properties': { + 'kernel_id': 'nokernel', + 'ramdisk_id': 'nokernel', + 'architecture': obj_fields.Architecture.X86_64, + 'auto_disk_config': 'False', + }, + } + + auto_disk_config_enabled_image = { + 'id': '70a599e0-31e7-49b7-b260-868f441e862b', + 'name': 'fakeimage7', + 'created_at': timestamp, + 'updated_at': timestamp, + 'deleted_at': None, + 'deleted': False, + 'status': 'active', + 'is_public': False, + 'container_format': 'ova', + 'disk_format': 'vhd', + 'size': '74185822', + 'min_ram': 0, + 'min_disk': 0, + 'protected': False, + 'visibility': 'public', + 'tags': [], + 'properties': { + 'kernel_id': 'nokernel', + 'ramdisk_id': 'nokernel', + 'architecture': obj_fields.Architecture.X86_64, + 'auto_disk_config': 'True', + }, + } + + def __init__(self, test): + super().__init__() + self.test = test + self.images = {} + + def setUp(self): + super().setUp() + + self.test.useFixture( + ConfPatcher(group='glance', api_servers=['http://localhost:9292']) + ) + self.test.stub_out( + 'nova.image.glance.API.get_remote_image_service', + lambda context, image_href: (self, image_href)) + self.test.stub_out( + 'nova.image.glance.get_default_image_service', + lambda: self) + + self.create(None, self.image1) + self.create(None, self.image2) + self.create(None, self.image3) + self.create(None, self.image4) + self.create(None, self.image5) + self.create(None, self.auto_disk_config_disabled_image) + self.create(None, self.auto_disk_config_enabled_image) + + self._imagedata = {} + + # TODO(bcwaldon): implement optional kwargs such as limit, sort_dir + def detail(self, context, **kwargs): + """Return list of detailed image information.""" + return copy.deepcopy(list(self.images.values())) + + def download( + self, context, image_id, data=None, dst_path=None, trusted_certs=None, + ): + self.show(context, image_id) + if data: + data.write(self._imagedata.get(image_id, b'')) + elif dst_path: + with open(dst_path, 'wb') as data: + data.write(self._imagedata.get(image_id, b'')) + + def show( + self, context, image_id, include_locations=False, show_deleted=True, + ): + """Get data about specified image. + + Returns a dict containing image data for the given opaque image id. + """ + image = self.images.get(str(image_id)) + if image: + return copy.deepcopy(image) + + LOG.warning( + 'Unable to find image id %s. Have images: %s', + image_id, self.images) + raise exception.ImageNotFound(image_id=image_id) + + def create(self, context, metadata, data=None): + """Store the image data and return the new image id. + + :raises: Duplicate if the image already exist. + + """ + image_id = str(metadata.get('id', uuidutils.generate_uuid())) + metadata['id'] = image_id + if image_id in self.images: + raise exception.CouldNotUploadImage(image_id=image_id) + + image_meta = copy.deepcopy(metadata) + + # Glance sets the size value when an image is created, so we + # need to do that here to fake things out if it's not provided + # by the caller. This is needed to avoid a KeyError in the + # image-size API. + if 'size' not in image_meta: + image_meta['size'] = None + + # Similarly, Glance provides the status on the image once it's created + # and this is checked in the compute API when booting a server from + # this image, so we just fake it out to be 'active' even though this + # is mostly a lie on a newly created image. + if 'status' not in metadata: + image_meta['status'] = 'active' + + # The owner of the image is by default the request context project_id. + if context and 'owner' not in image_meta.get('properties', {}): + # Note that normally "owner" is a top-level field in an image + # resource in glance but we have to fake this out for the images + # proxy API by throwing it into the generic "properties" dict. + image_meta.get('properties', {})['owner'] = context.project_id + + self.images[image_id] = image_meta + + if data: + self._imagedata[image_id] = data.read() + + return self.images[image_id] + + def update(self, context, image_id, metadata, data=None, + purge_props=False): + """Replace the contents of the given image with the new data. + + :raises: ImageNotFound if the image does not exist. + """ + if not self.images.get(image_id): + raise exception.ImageNotFound(image_id=image_id) + + if purge_props: + self.images[image_id] = copy.deepcopy(metadata) + else: + image = self.images[image_id] + + try: + image['properties'].update(metadata.pop('properties')) + except KeyError: + pass + + image.update(metadata) + + return self.images[image_id] + + def delete(self, context, image_id): + """Delete the given image. + + :raises: ImageNotFound if the image does not exist. + """ + removed = self.images.pop(image_id, None) + if not removed: + raise exception.ImageNotFound(image_id=image_id) + + def get_location(self, context, image_id): + if image_id in self.images: + return 'fake_location' + return None + + class CinderFixture(fixtures.Fixture): """A fixture to volume operations with the new Cinder attach/detach API""" diff --git a/nova/tests/functional/api_sample_tests/test_aggregates.py b/nova/tests/functional/api_sample_tests/test_aggregates.py index 81ca6b5083d1..185747e78a1b 100644 --- a/nova/tests/functional/api_sample_tests/test_aggregates.py +++ b/nova/tests/functional/api_sample_tests/test_aggregates.py @@ -16,7 +16,6 @@ from oslo_serialization import jsonutils from nova.tests.functional.api_sample_tests import api_sample_base -from nova.tests.unit.image import fake as fake_image class AggregatesSampleJsonTest(api_sample_base.ApiSampleTestBaseV21): @@ -132,7 +131,7 @@ class AggregatesV2_81_SampleJsonTest(AggregatesV2_41_SampleJsonTest): def test_images(self): agg_id = self._test_aggregate_create() - image = fake_image.get_valid_image_id() + image = self.glance.auto_disk_config_enabled_image['id'] response = self._do_post('os-aggregates/%s/images' % agg_id, 'aggregate-images-post-req', {'image_id': image}) diff --git a/nova/tests/functional/api_sample_tests/test_create_backup.py b/nova/tests/functional/api_sample_tests/test_create_backup.py index 533897c34c46..2e5758c36ef2 100644 --- a/nova/tests/functional/api_sample_tests/test_create_backup.py +++ b/nova/tests/functional/api_sample_tests/test_create_backup.py @@ -15,8 +15,8 @@ import mock +from nova.tests import fixtures from nova.tests.functional.api_sample_tests import test_servers -from nova.tests.unit.image import fake class CreateBackupSamplesJsonTest(test_servers.ServersSampleBase): @@ -30,7 +30,7 @@ class CreateBackupSamplesJsonTest(test_servers.ServersSampleBase): super(CreateBackupSamplesJsonTest, self).setUp() self.uuid = self._post_server() - @mock.patch.object(fake._FakeImageService, 'detail', return_value=[]) + @mock.patch.object(fixtures.GlanceFixture, 'detail', return_value=[]) def test_post_backup_server(self, mock_method): # Get api samples to backup server request. response = self._do_post('servers/%s/action' % self.uuid, diff --git a/nova/tests/functional/api_sample_tests/test_images.py b/nova/tests/functional/api_sample_tests/test_images.py index b0868ce4d0fd..924bc7768fba 100644 --- a/nova/tests/functional/api_sample_tests/test_images.py +++ b/nova/tests/functional/api_sample_tests/test_images.py @@ -14,7 +14,6 @@ # under the License. from nova.tests.functional.api_sample_tests import api_sample_base -from nova.tests.unit.image import fake class ImagesSampleJsonTest(api_sample_base.ApiSampleTestBaseV21): @@ -27,7 +26,7 @@ class ImagesSampleJsonTest(api_sample_base.ApiSampleTestBaseV21): def test_image_get(self): # Get api sample of one single image details request. - image_id = fake.get_valid_image_id() + image_id = self.glance.auto_disk_config_enabled_image['id'] response = self._do_get('images/%s' % image_id) subs = {'image_id': image_id} self._verify_response('image-get-resp', subs, response, 200) @@ -39,14 +38,14 @@ class ImagesSampleJsonTest(api_sample_base.ApiSampleTestBaseV21): def test_image_metadata_get(self): # Get api sample of an image metadata request. - image_id = fake.get_valid_image_id() + image_id = self.glance.auto_disk_config_enabled_image['id'] response = self._do_get('images/%s/metadata' % image_id) subs = {'image_id': image_id} self._verify_response('image-metadata-get-resp', subs, response, 200) def test_image_metadata_post(self): # Get api sample to update metadata of an image metadata request. - image_id = fake.get_valid_image_id() + image_id = self.glance.auto_disk_config_enabled_image['id'] response = self._do_post( 'images/%s/metadata' % image_id, 'image-metadata-post-req', {}) @@ -54,21 +53,21 @@ class ImagesSampleJsonTest(api_sample_base.ApiSampleTestBaseV21): def test_image_metadata_put(self): # Get api sample of image metadata put request. - image_id = fake.get_valid_image_id() + image_id = self.glance.auto_disk_config_enabled_image['id'] response = self._do_put('images/%s/metadata' % (image_id), 'image-metadata-put-req', {}) self._verify_response('image-metadata-put-resp', {}, response, 200) def test_image_meta_key_get(self): # Get api sample of an image metadata key request. - image_id = fake.get_valid_image_id() + image_id = self.glance.auto_disk_config_enabled_image['id'] key = "kernel_id" response = self._do_get('images/%s/metadata/%s' % (image_id, key)) self._verify_response('image-meta-key-get', {}, response, 200) def test_image_meta_key_put(self): # Get api sample of image metadata key put request. - image_id = fake.get_valid_image_id() + image_id = self.glance.auto_disk_config_enabled_image['id'] key = "auto_disk_config" response = self._do_put('images/%s/metadata/%s' % (image_id, key), 'image-meta-key-put-req', {}) diff --git a/nova/tests/functional/api_sample_tests/test_multiple_create.py b/nova/tests/functional/api_sample_tests/test_multiple_create.py index db06c947821b..d2fdae1887bb 100644 --- a/nova/tests/functional/api_sample_tests/test_multiple_create.py +++ b/nova/tests/functional/api_sample_tests/test_multiple_create.py @@ -14,7 +14,6 @@ # under the License. from nova.tests.functional.api_sample_tests import test_servers -from nova.tests.unit.image import fake class MultipleCreateJsonTest(test_servers.ServersSampleBase): @@ -22,7 +21,7 @@ class MultipleCreateJsonTest(test_servers.ServersSampleBase): def test_multiple_create(self): subs = { - 'image_id': fake.get_valid_image_id(), + 'image_id': self.glance.auto_disk_config_enabled_image['id'], 'compute_endpoint': self._get_compute_endpoint(), 'min_count': "2", 'max_count': "3" @@ -32,7 +31,7 @@ class MultipleCreateJsonTest(test_servers.ServersSampleBase): def test_multiple_create_without_reservation_id(self): subs = { - 'image_id': fake.get_valid_image_id(), + 'image_id': self.glance.auto_disk_config_enabled_image['id'], 'compute_endpoint': self._get_compute_endpoint(), 'min_count': "2", 'max_count': "3" diff --git a/nova/tests/functional/api_sample_tests/test_preserve_ephemeral_rebuild.py b/nova/tests/functional/api_sample_tests/test_preserve_ephemeral_rebuild.py index 35cf22a18594..ddc9c65b5778 100644 --- a/nova/tests/functional/api_sample_tests/test_preserve_ephemeral_rebuild.py +++ b/nova/tests/functional/api_sample_tests/test_preserve_ephemeral_rebuild.py @@ -14,7 +14,6 @@ from nova.compute import api as compute_api from nova.tests.functional.api_sample_tests import test_servers -from nova.tests.unit.image import fake class PreserveEphemeralOnRebuildJsonTest(test_servers.ServersSampleBase): @@ -22,9 +21,8 @@ class PreserveEphemeralOnRebuildJsonTest(test_servers.ServersSampleBase): def _test_server_rebuild_preserve_ephemeral(self, value, resp_tpl=None): uuid = self._post_server() - image = fake.get_valid_image_id() subs = {'host': self._get_host(), - 'uuid': image, + 'uuid': self.glance.auto_disk_config_enabled_image['id'], 'name': 'foobar', 'pass': 'seekr3t', 'hostid': '[a-f0-9]+', diff --git a/nova/tests/functional/api_sample_tests/test_servers.py b/nova/tests/functional/api_sample_tests/test_servers.py index 17ecc1964962..858c71f43765 100644 --- a/nova/tests/functional/api_sample_tests/test_servers.py +++ b/nova/tests/functional/api_sample_tests/test_servers.py @@ -25,7 +25,6 @@ import nova.conf from nova.tests import fixtures as nova_fixtures from nova.tests.functional.api_sample_tests import api_sample_base from nova.tests.unit.api.openstack import fakes -from nova.tests.unit.image import fake CONF = nova.conf.CONF @@ -61,7 +60,7 @@ class ServersSampleBase(api_sample_base.ApiSampleTestBaseV21): # common server sample files from 'servers' directory. # Set False if tests need to use extension specific sample files subs = { - 'image_id': fake.get_valid_image_id(), + 'image_id': self.glance.auto_disk_config_enabled_image['id'], 'host': self._get_host(), 'compute_endpoint': self._get_compute_endpoint(), 'versioned_compute_endpoint': self._get_vers_compute_endpoint(), @@ -192,7 +191,7 @@ class ServersSampleJson219Test(ServersSampleJsonTest): uuid = self.test_servers_post() response = self._do_put('servers/%s' % uuid, 'server-put-req', {}) subs = { - 'image_id': fake.get_valid_image_id(), + 'image_id': self.glance.auto_disk_config_enabled_image['id'], 'hostid': '[a-f0-9]+', 'glance_host': self._get_glance_host(), 'access_ip_v4': '1.2.3.4', @@ -235,9 +234,8 @@ class ServersSampleJson247Test(ServersSampleJsonTest): def test_server_rebuild(self): uuid = self._post_server() - image = fake.get_valid_image_id() params = { - 'uuid': image, + 'uuid': self.glance.auto_disk_config_enabled_image['id'], 'name': 'foobar', 'pass': 'seekr3t', 'hostid': '[a-f0-9]+', @@ -284,10 +282,8 @@ class ServersSampleJson263Test(ServersSampleBase): def test_server_rebuild(self): uuid = self._post_server(use_common_server_api_samples=False) fakes.stub_out_key_pair_funcs(self) - image = fake.get_valid_image_id() - params = { - 'uuid': image, + 'uuid': self.glance.auto_disk_config_enabled_image['id'], 'name': 'foobar', 'key_name': 'new-key', 'description': 'description of foobar', @@ -484,9 +480,8 @@ class ServersSampleJson271Test(ServersSampleBase): def test_servers_rebuild_with_server_groups(self): uuid = self._test_servers_post() fakes.stub_out_key_pair_funcs(self) - image = fake.get_valid_image_id() params = { - 'uuid': image, + 'uuid': self.glance.auto_disk_config_enabled_image['id'], 'name': 'foobar', 'key_name': 'new-key', 'description': 'description of foobar', @@ -558,9 +553,8 @@ class ServersSampleJson273Test(ServersSampleBase): def test_server_rebuild_with_empty_locked_reason(self): uuid = self._post_server(use_common_server_api_samples=False) - image = fake.get_valid_image_id() params = { - 'uuid': image, + 'uuid': self.glance.auto_disk_config_enabled_image['id'], 'name': 'foobar', 'pass': 'seekr3t', 'hostid': '[a-f0-9]+', @@ -647,9 +641,8 @@ class ServersSampleJson275Test(ServersUpdateSampleJsonTest): def test_server_rebuild(self): uuid = self._post_server() - image = fake.get_valid_image_id() params = { - 'uuid': image, + 'uuid': self.glance.auto_disk_config_enabled_image['id'], 'name': 'foobar', 'pass': 'seekr3t', 'hostid': '[a-f0-9]+', @@ -711,9 +704,8 @@ class ServersActionsJsonTest(ServersSampleBase, _ServersActionsJsonTestMixin): def test_server_rebuild(self): uuid = self._post_server() - image = fake.get_valid_image_id() params = { - 'uuid': image, + 'uuid': self.glance.auto_disk_config_enabled_image['id'], 'name': 'foobar', 'pass': 'seekr3t', 'hostid': '[a-f0-9]+', @@ -828,9 +820,8 @@ class ServersActionsJson219Test(ServersSampleBase): def test_server_rebuild(self): uuid = self._post_server() - image = fake.get_valid_image_id() params = { - 'uuid': image, + 'uuid': self.glance.auto_disk_config_enabled_image['id'], 'name': 'foobar', 'description': 'description of foobar', 'pass': 'seekr3t', @@ -855,9 +846,8 @@ class ServersActionsJson226Test(ServersSampleBase): def test_server_rebuild(self): uuid = self._post_server() - image = fake.get_valid_image_id() params = { - 'uuid': image, + 'uuid': self.glance.auto_disk_config_enabled_image['id'], 'access_ip_v4': '1.2.3.4', 'access_ip_v6': '80fe::', 'disk_config': 'AUTO', @@ -895,9 +885,8 @@ class ServersActionsJson254Test(ServersSampleBase): def test_server_rebuild(self): fakes.stub_out_key_pair_funcs(self) uuid = self._create_server() - image = fake.get_valid_image_id() params = { - 'uuid': image, + 'uuid': self.glance.auto_disk_config_enabled_image['id'], 'name': 'foobar', 'key_name': 'new-key', 'description': 'description of foobar', diff --git a/nova/tests/functional/compute/test_resource_tracker.py b/nova/tests/functional/compute/test_resource_tracker.py index 39cca32650d8..e57e5abf9207 100644 --- a/nova/tests/functional/compute/test_resource_tracker.py +++ b/nova/tests/functional/compute/test_resource_tracker.py @@ -33,7 +33,6 @@ from nova.tests import fixtures as nova_fixtures from nova.tests.functional import fixtures as func_fixtures from nova.tests.functional import integrated_helpers from nova.tests.unit import fake_notifier -from nova.tests.unit.image import fake as fake_image from nova.virt import driver as virt_driver @@ -697,10 +696,9 @@ class TestProviderConfig(integrated_helpers.ProviderUsageBaseTestCase): compute service that provides that trait. """ - self.neutron = nova_fixtures.NeutronFixture(self) - self.useFixture(self.neutron) - fake_image.stub_out_image_service(self) - self.addCleanup(fake_image.FakeImageService_reset) + self.useFixture(nova_fixtures.NeutronFixture(self)) + self.useFixture(nova_fixtures.GlanceFixture(self)) + # Start nova services. self.api = self.useFixture(nova_fixtures.OSAPIFixture( api_version='v2.1')).admin_api diff --git a/nova/tests/functional/integrated_helpers.py b/nova/tests/functional/integrated_helpers.py index 5dec6bae502e..f0e7e148ebd1 100644 --- a/nova/tests/functional/integrated_helpers.py +++ b/nova/tests/functional/integrated_helpers.py @@ -42,7 +42,6 @@ from nova.tests.functional.api import client as api_client from nova.tests.functional import fixtures as func_fixtures from nova.tests.unit import cast_as_call from nova.tests.unit import fake_notifier -import nova.tests.unit.image.fake from nova.tests.unit import policy_fixture from nova import utils @@ -1050,15 +1049,12 @@ class _IntegratedTestBase(test.TestCase, PlacementInstanceHelperMixin): def setUp(self): super(_IntegratedTestBase, self).setUp() - self.fake_image_service =\ - nova.tests.unit.image.fake.stub_out_image_service(self) - self.addCleanup(nova.tests.unit.image.fake.FakeImageService_reset) - self.useFixture(cast_as_call.CastAsCall(self)) self.placement = self.useFixture(func_fixtures.PlacementFixture()).api self.neutron = self.useFixture(nova_fixtures.NeutronFixture(self)) self.cinder = self.useFixture(nova_fixtures.CinderFixture(self)) + self.glance = self.useFixture(nova_fixtures.GlanceFixture(self)) self.policy = self.useFixture(policy_fixture.RealPolicyFixture()) fake_notifier.stub_notifier(self) @@ -1128,6 +1124,7 @@ class ProviderUsageBaseTestCase(test.TestCase, PlacementInstanceHelperMixin): self.policy = self.useFixture(policy_fixture.RealPolicyFixture()) self.neutron = self.useFixture(nova_fixtures.NeutronFixture(self)) + self.glance = self.useFixture(nova_fixtures.GlanceFixture(self)) self.placement = self.useFixture(func_fixtures.PlacementFixture()).api self.useFixture(nova_fixtures.AllServicesCurrent()) @@ -1141,11 +1138,5 @@ class ProviderUsageBaseTestCase(test.TestCase, PlacementInstanceHelperMixin): self.admin_api.microversion = self.microversion self.api = self.admin_api - # the image fake backend needed for image discovery - self.image_service = ( - nova.tests.unit.image.fake.stub_out_image_service(self)) - self.start_service('conductor') self.scheduler_service = self.start_service('scheduler') - - self.addCleanup(nova.tests.unit.image.fake.FakeImageService_reset) diff --git a/nova/tests/functional/libvirt/test_evacuate.py b/nova/tests/functional/libvirt/test_evacuate.py index c36e5ca64866..d9bcf0e21c23 100644 --- a/nova/tests/functional/libvirt/test_evacuate.py +++ b/nova/tests/functional/libvirt/test_evacuate.py @@ -31,7 +31,6 @@ from nova.tests.functional import fixtures as func_fixtures from nova.tests.functional import integrated_helpers from nova.tests.unit import fake_network from nova.tests.unit import fake_notifier -import nova.tests.unit.image.fake as fake_image from nova.tests.unit.virt.libvirt import fakelibvirt from nova.virt.libvirt import config as libvirt_config @@ -50,10 +49,8 @@ FLAVOR_FIXTURES = [ 'root_gb': 1, 'ephemeral_gb': 0, 'swap': 1}, ] - # Choice of image id is arbitrary, but fixed for consistency. -IMAGE_ID = fake_image.AUTO_DISK_CONFIG_ENABLED_IMAGE_UUID - +IMAGE_ID = nova_fixtures.GlanceFixture.auto_disk_config_enabled_image['id'] # NOTE(mdbooth): Change I76448196 tests for creation of any local disk, and # short-circuits as soon as it sees one created. Disks are created in order: @@ -423,6 +420,7 @@ class _LibvirtEvacuateTest(integrated_helpers.InstanceHelperMixin): self.useFixture(nova_fixtures.CinderFixture(self)) self.useFixture(nova_fixtures.NeutronFixture(self)) + self.useFixture(nova_fixtures.GlanceFixture(self)) self.useFixture(func_fixtures.PlacementFixture()) fake_network.set_stub_network_methods(self) @@ -433,9 +431,6 @@ class _LibvirtEvacuateTest(integrated_helpers.InstanceHelperMixin): # force_down and evacuate without onSharedStorage self.api.microversion = '2.14' - fake_image.stub_out_image_service(self) - self.addCleanup(fake_image.FakeImageService_reset) - fake_notifier.stub_notifier(self) self.addCleanup(fake_notifier.reset) diff --git a/nova/tests/functional/libvirt/test_numa_servers.py b/nova/tests/functional/libvirt/test_numa_servers.py index a0da12c7cbd3..28f8463aeaed 100644 --- a/nova/tests/functional/libvirt/test_numa_servers.py +++ b/nova/tests/functional/libvirt/test_numa_servers.py @@ -1251,7 +1251,7 @@ class NUMAServersRebuildTests(NUMAServersTestBase): # 2 virtual numa nodes. ctx = nova_context.get_admin_context() image_meta = {'properties': {'hw_numa_nodes': 2}} - self.fake_image_service.update(ctx, self.image_ref_1, image_meta) + self.glance.update(ctx, self.image_ref_1, image_meta) # NOTE(sean-k-mooney): this should fail because rebuild uses noop # claims therefore it is not allowed for the NUMA topology or resource diff --git a/nova/tests/functional/libvirt/test_shared_resource_provider.py b/nova/tests/functional/libvirt/test_shared_resource_provider.py index 86e720510586..f2644c0936d2 100644 --- a/nova/tests/functional/libvirt/test_shared_resource_provider.py +++ b/nova/tests/functional/libvirt/test_shared_resource_provider.py @@ -19,7 +19,7 @@ import unittest from nova.compute import instance_actions from nova import conf from nova.tests.functional.libvirt import integrated_helpers -import nova.tests.unit.image.fake +from nova import utils CONF = conf.CONF @@ -126,10 +126,9 @@ class SharedStorageProviderUsageTestCase( networks='none' ) - rebuild_image_ref = ( - nova.tests.unit.image.fake.AUTO_DISK_CONFIG_ENABLED_IMAGE_UUID) + rebuild_image_ref = self.glance.auto_disk_config_enabled_image['id'] - with nova.utils.temporary_mutation(self.api, microversion='2.35'): + with utils.temporary_mutation(self.api, microversion='2.35'): self.api.api_put('/images/%s/metadata' % rebuild_image_ref, {'metadata': { 'trait:STORAGE_DISK_SSD': 'required'}}) @@ -185,10 +184,9 @@ class SharedStorageProviderUsageTestCase( networks='none', ) - rebuild_image_ref = ( - nova.tests.unit.image.fake.AUTO_DISK_CONFIG_ENABLED_IMAGE_UUID) + rebuild_image_ref = self.glance.auto_disk_config_enabled_image['id'] - with nova.utils.temporary_mutation(self.api, microversion='2.35'): + with utils.temporary_mutation(self.api, microversion='2.35'): self.api.api_put('/images/%s/metadata' % rebuild_image_ref, {'metadata': { 'trait:CUSTOM_FOO': 'required'}}) diff --git a/nova/tests/functional/notification_sample_tests/notification_sample_base.py b/nova/tests/functional/notification_sample_tests/notification_sample_base.py index d7d16ed01c7e..b6f25f459cfd 100644 --- a/nova/tests/functional/notification_sample_tests/notification_sample_base.py +++ b/nova/tests/functional/notification_sample_tests/notification_sample_base.py @@ -28,7 +28,6 @@ from nova.tests import json_ref from nova.tests.unit.api.openstack.compute import test_services from nova.tests.unit import fake_crypto from nova.tests.unit import fake_notifier -import nova.tests.unit.image.fake CONF = cfg.CONF @@ -80,10 +79,7 @@ class NotificationSampleTestBase(test.TestCase, self.addCleanup(fake_notifier.reset) self.useFixture(utils_fixture.TimeFixture(test_services.fake_utcnow())) - - # the image fake backend needed for image discovery - nova.tests.unit.image.fake.stub_out_image_service(self) - self.addCleanup(nova.tests.unit.image.fake.FakeImageService_reset) + self.useFixture(nova_fixtures.GlanceFixture(self)) self.useFixture(func_fixtures.PlacementFixture()) context_patcher = self.mock_gen_request_id = mock.patch( diff --git a/nova/tests/functional/regressions/test_bug_1522536.py b/nova/tests/functional/regressions/test_bug_1522536.py index bc32fd366ee5..3d02469e0787 100644 --- a/nova/tests/functional/regressions/test_bug_1522536.py +++ b/nova/tests/functional/regressions/test_bug_1522536.py @@ -12,13 +12,10 @@ # License for the specific language governing permissions and limitations # under the License. -import nova.scheduler.utils -import nova.servicegroup from nova import test from nova.tests import fixtures as nova_fixtures from nova.tests.functional.api import client from nova.tests.unit import cast_as_call -import nova.tests.unit.image.fake from nova.tests.unit import policy_fixture @@ -29,20 +26,17 @@ class TestServerGet(test.TestCase): super(TestServerGet, self).setUp() self.useFixture(policy_fixture.RealPolicyFixture()) self.useFixture(nova_fixtures.NeutronFixture(self)) + self.useFixture(nova_fixtures.GlanceFixture(self)) api_fixture = self.useFixture(nova_fixtures.OSAPIFixture( api_version='v2.1')) self.api = api_fixture.api - # the image fake backend needed for image discovery - nova.tests.unit.image.fake.stub_out_image_service(self) - self.start_service('conductor') self.start_service('scheduler') self.compute = self.start_service('compute') self.useFixture(cast_as_call.CastAsCall(self)) - self.addCleanup(nova.tests.unit.image.fake.FakeImageService_reset) self.image_id = self.api.get_images()[0]['id'] self.flavor_id = self.api.get_flavors()[0]['id'] diff --git a/nova/tests/functional/regressions/test_bug_1541691.py b/nova/tests/functional/regressions/test_bug_1541691.py index 84f6f599b302..f44b55b5a039 100644 --- a/nova/tests/functional/regressions/test_bug_1541691.py +++ b/nova/tests/functional/regressions/test_bug_1541691.py @@ -12,12 +12,9 @@ # License for the specific language governing permissions and limitations # under the License. -import nova.scheduler.utils -import nova.servicegroup from nova import test from nova.tests import fixtures as nova_fixtures from nova.tests.functional.api import client -import nova.tests.unit.image.fake from nova.tests.unit import policy_fixture @@ -28,14 +25,12 @@ class TestServerValidation(test.TestCase): def setUp(self): super(TestServerValidation, self).setUp() self.useFixture(policy_fixture.RealPolicyFixture()) + self.useFixture(nova_fixtures.GlanceFixture(self)) + api_fixture = self.useFixture(nova_fixtures.OSAPIFixture( api_version='v2.1')) - - # the image fake backend needed for image discovery - nova.tests.unit.image.fake.stub_out_image_service(self) - self.addCleanup(nova.tests.unit.image.fake.FakeImageService_reset) - self.api = api_fixture.api + self.image_id = self.api.get_images()[0]['id'] self.flavor_id = self.api.get_flavors()[0]['id'] diff --git a/nova/tests/functional/regressions/test_bug_1548980.py b/nova/tests/functional/regressions/test_bug_1548980.py index 9aa4d358b689..94828b90dcde 100644 --- a/nova/tests/functional/regressions/test_bug_1548980.py +++ b/nova/tests/functional/regressions/test_bug_1548980.py @@ -14,13 +14,10 @@ import time -import nova.scheduler.utils -import nova.servicegroup from nova import test from nova.tests import fixtures as nova_fixtures from nova.tests.functional.api import client from nova.tests.unit import cast_as_call -import nova.tests.unit.image.fake from nova.tests.unit import policy_fixture @@ -31,27 +28,23 @@ class TestServerGet(test.TestCase): super(TestServerGet, self).setUp() self.useFixture(policy_fixture.RealPolicyFixture()) self.useFixture(nova_fixtures.NeutronFixture(self)) - api_fixture = self.useFixture(nova_fixtures.OSAPIFixture( - api_version='v2.1')) + self.useFixture(nova_fixtures.GlanceFixture(self)) + self.useFixture(cast_as_call.CastAsCall(self)) # The non-admin API client is fine to stay at 2.1 since it just creates # and deletes the server. + api_fixture = self.useFixture(nova_fixtures.OSAPIFixture( + api_version='v2.1')) self.api = api_fixture.api self.admin_api = api_fixture.admin_api # The admin API client needs to be at microversion 2.16 to exhibit the # regression. self.admin_api.microversion = '2.16' - # the image fake backend needed for image discovery - nova.tests.unit.image.fake.stub_out_image_service(self) - self.start_service('conductor') self.start_service('scheduler') self.compute = self.start_service('compute') - self.useFixture(cast_as_call.CastAsCall(self)) - self.addCleanup(nova.tests.unit.image.fake.FakeImageService_reset) - self.image_id = self.api.get_images()[0]['id'] self.flavor_id = self.api.get_flavors()[0]['id'] diff --git a/nova/tests/functional/regressions/test_bug_1558866.py b/nova/tests/functional/regressions/test_bug_1558866.py index b40d55b528dd..e7ef7b7dfd9f 100644 --- a/nova/tests/functional/regressions/test_bug_1558866.py +++ b/nova/tests/functional/regressions/test_bug_1558866.py @@ -17,7 +17,6 @@ import datetime from nova import test from nova.tests import fixtures as nova_fixtures from nova.tests.functional.api import client as api_client -from nova.tests.unit.image import fake as fake_image from nova.tests.unit import policy_fixture @@ -27,15 +26,12 @@ class TestServerGet(test.TestCase): super(TestServerGet, self).setUp() self.useFixture(policy_fixture.RealPolicyFixture()) self.useFixture(nova_fixtures.NeutronFixture(self)) + self.glance = self.useFixture(nova_fixtures.GlanceFixture(self)) api_fixture = self.useFixture(nova_fixtures.OSAPIFixture( api_version='v2.1')) self.api = api_fixture.api - # the image fake backend needed for image discovery - image_service = fake_image.stub_out_image_service(self) - self.addCleanup(fake_image.FakeImageService_reset) - # NOTE(mriedem): This image has an invalid architecture metadata value # and is used for negative testing in the functional stack. timestamp = datetime.datetime(2011, 1, 1, 1, 2, 3) @@ -53,7 +49,7 @@ class TestServerGet(test.TestCase): 'properties': {'kernel_id': 'nokernel', 'ramdisk_id': 'nokernel', 'architecture': 'x64'}} - self.image_id = image_service.create(None, image)['id'] + self.image_id = self.glance.create(None, image)['id'] self.flavor_id = self.api.get_flavors()[0]['id'] def test_boot_server_with_invalid_image_meta(self): diff --git a/nova/tests/functional/regressions/test_bug_1595962.py b/nova/tests/functional/regressions/test_bug_1595962.py index f124996544bb..bf1c7e53be8f 100644 --- a/nova/tests/functional/regressions/test_bug_1595962.py +++ b/nova/tests/functional/regressions/test_bug_1595962.py @@ -18,7 +18,6 @@ import fixtures import io import mock -import nova from nova import test from nova.tests import fixtures as nova_fixtures from nova.tests.functional import fixtures as func_fixtures @@ -35,6 +34,7 @@ class TestSerialConsoleLiveMigrate(test.TestCase): super(TestSerialConsoleLiveMigrate, self).setUp() self.useFixture(policy_fixture.RealPolicyFixture()) self.useFixture(nova_fixtures.NeutronFixture(self)) + self.useFixture(nova_fixtures.GlanceFixture(self)) self.useFixture(func_fixtures.PlacementFixture()) api_fixture = self.useFixture(nova_fixtures.OSAPIFixture( api_version='v2.1')) @@ -53,10 +53,6 @@ class TestSerialConsoleLiveMigrate(test.TestCase): self.admin_api = api_fixture.admin_api self.api = api_fixture.api - # the image fake backend needed for image discovery - nova.tests.unit.image.fake.stub_out_image_service(self) - nova.tests.unit.fake_network.set_stub_network_methods(self) - self.flags(compute_driver='libvirt.LibvirtDriver') self.flags(enabled=True, group="serial_console") self.flags(enabled=False, group="vnc") @@ -68,7 +64,6 @@ class TestSerialConsoleLiveMigrate(test.TestCase): self.compute = self.start_service('compute', host='test_compute1') self.useFixture(cast_as_call.CastAsCall(self)) - self.addCleanup(nova.tests.unit.image.fake.FakeImageService_reset) self.image_id = self.api.get_images()[0]['id'] self.flavor_id = self.api.get_flavors()[0]['id'] diff --git a/nova/tests/functional/regressions/test_bug_1620248.py b/nova/tests/functional/regressions/test_bug_1620248.py index 72360b1bae6b..ebc817ac0d3b 100644 --- a/nova/tests/functional/regressions/test_bug_1620248.py +++ b/nova/tests/functional/regressions/test_bug_1620248.py @@ -13,7 +13,6 @@ from nova import test from nova.tests import fixtures as nova_fixtures from nova.tests.unit import cast_as_call -import nova.tests.unit.image.fake from nova.tests.unit import policy_fixture @@ -24,6 +23,7 @@ class TestServerUpdate(test.TestCase): super(TestServerUpdate, self).setUp() self.useFixture(policy_fixture.RealPolicyFixture()) self.useFixture(nova_fixtures.NeutronFixture(self)) + self.useFixture(nova_fixtures.GlanceFixture(self)) # Simulate requests coming in before the instance is scheduled by # using a no-op for conductor build_instances self.useFixture(nova_fixtures.NoopConductorFixture()) @@ -32,11 +32,7 @@ class TestServerUpdate(test.TestCase): self.api = api_fixture.api - # the image fake backend needed for image discovery - nova.tests.unit.image.fake.stub_out_image_service(self) - self.useFixture(cast_as_call.CastAsCall(self)) - self.addCleanup(nova.tests.unit.image.fake.FakeImageService_reset) self.image_id = self.api.get_images()[0]['id'] self.flavor_id = self.api.get_flavors()[0]['id'] diff --git a/nova/tests/functional/regressions/test_bug_1670627.py b/nova/tests/functional/regressions/test_bug_1670627.py index cd3169643539..d0af5ed53b2d 100644 --- a/nova/tests/functional/regressions/test_bug_1670627.py +++ b/nova/tests/functional/regressions/test_bug_1670627.py @@ -18,7 +18,6 @@ from nova import test from nova.tests import fixtures as nova_fixtures from nova.tests.functional.api import client from nova.tests.unit import cast_as_call -import nova.tests.unit.image.fake from nova.tests.unit import policy_fixture @@ -50,13 +49,12 @@ class TestDeleteFromCell0CheckQuota(test.TestCase): super(TestDeleteFromCell0CheckQuota, self).setUp() self.useFixture(policy_fixture.RealPolicyFixture()) self.useFixture(nova_fixtures.NeutronFixture(self)) + self.useFixture(nova_fixtures.GlanceFixture(self)) + api_fixture = self.useFixture(nova_fixtures.OSAPIFixture( api_version='v2.1')) self.api = api_fixture.api - # the image fake backend needed for image discovery - nova.tests.unit.image.fake.stub_out_image_service(self) - self.start_service('conductor') self.start_service('scheduler') diff --git a/nova/tests/functional/regressions/test_bug_1671648.py b/nova/tests/functional/regressions/test_bug_1671648.py index 4db7835fdc36..5166c713dcf1 100644 --- a/nova/tests/functional/regressions/test_bug_1671648.py +++ b/nova/tests/functional/regressions/test_bug_1671648.py @@ -14,14 +14,13 @@ import time -import nova.compute.resource_tracker +from nova.compute import resource_tracker from nova import exception from nova import test from nova.tests import fixtures as nova_fixtures from nova.tests.functional import fixtures as func_fixtures from nova.tests.unit import cast_as_call from nova.tests.unit import fake_network -import nova.tests.unit.image.fake from nova.tests.unit import policy_fixture @@ -59,7 +58,7 @@ class TestRetryBetweenComputeNodeBuilds(test.TestCase): self.admin_api = api_fixture.admin_api # the image fake backend needed for image discovery - nova.tests.unit.image.fake.stub_out_image_service(self) + self.useFixture(nova_fixtures.GlanceFixture(self)) self.start_service('conductor') @@ -86,8 +85,7 @@ class TestRetryBetweenComputeNodeBuilds(test.TestCase): # https://opendev.org/openstack/nova/src/commit/ # bb02d1110a9529217a5e9b1e1fe8ca25873cac59/ # nova/compute/resource_tracker.py#L121-L130 - real_instance_claim =\ - nova.compute.resource_tracker.ResourceTracker.instance_claim + real_instance_claim = resource_tracker.ResourceTracker.instance_claim def fake_instance_claim(_self, *args, **kwargs): self.attempts += 1 diff --git a/nova/tests/functional/regressions/test_bug_1675570.py b/nova/tests/functional/regressions/test_bug_1675570.py index 63120956b065..999c79271130 100644 --- a/nova/tests/functional/regressions/test_bug_1675570.py +++ b/nova/tests/functional/regressions/test_bug_1675570.py @@ -21,7 +21,6 @@ from nova.tests import fixtures as nova_fixtures from nova.tests.functional.api import client from nova.tests.functional import fixtures as func_fixtures from nova.tests.unit import cast_as_call -import nova.tests.unit.image.fake from nova.tests.unit import policy_fixture LOG = logging.getLogger(__name__) @@ -60,7 +59,7 @@ class TestLocalDeleteAttachedVolumes(test.TestCase): self.api.microversion = 'latest' # the image fake backend needed for image discovery - nova.tests.unit.image.fake.stub_out_image_service(self) + self.useFixture(nova_fixtures.GlanceFixture(self)) self.start_service('conductor') self.start_service('scheduler') @@ -128,7 +127,7 @@ class TestLocalDeleteAttachedVolumes(test.TestCase): LOG.info('Creating server and waiting for it to be ACTIVE.') server = dict( name='local-delete-volume-attach-test', - # The image ID comes from nova.tests.unit.image.fake. + # The image ID comes from GlanceFixture imageRef='76fa36fc-c930-4bf3-8c8a-ea2a2420deb6', flavorRef=self.flavor_id, # Bypass network setup on the compute. diff --git a/nova/tests/functional/regressions/test_bug_1679750.py b/nova/tests/functional/regressions/test_bug_1679750.py index eae1aec271e8..dc579b082722 100644 --- a/nova/tests/functional/regressions/test_bug_1679750.py +++ b/nova/tests/functional/regressions/test_bug_1679750.py @@ -19,7 +19,6 @@ from nova import test from nova.tests import fixtures as nova_fixtures from nova.tests.functional import fixtures as func_fixtures from nova.tests.functional import integrated_helpers -import nova.tests.unit.image.fake from nova.tests.unit import policy_fixture @@ -30,14 +29,13 @@ class TestLocalDeleteAllocations(test.TestCase, self.useFixture(policy_fixture.RealPolicyFixture()) # The NeutronFixture is needed to show security groups for a server. self.useFixture(nova_fixtures.NeutronFixture(self)) + self.useFixture(nova_fixtures.GlanceFixture(self)) api_fixture = self.useFixture(nova_fixtures.OSAPIFixture( api_version='v2.1')) self.api = api_fixture.api self.admin_api = api_fixture.admin_api # We need the latest microversion to force-down the compute service self.admin_api.microversion = 'latest' - # the image fake backend needed for image discovery - nova.tests.unit.image.fake.stub_out_image_service(self) self.start_service('conductor') diff --git a/nova/tests/functional/regressions/test_bug_1682693.py b/nova/tests/functional/regressions/test_bug_1682693.py index 6d060047d5a6..7de224604c65 100644 --- a/nova/tests/functional/regressions/test_bug_1682693.py +++ b/nova/tests/functional/regressions/test_bug_1682693.py @@ -16,7 +16,6 @@ from nova import test from nova.tests import fixtures as nova_fixtures from nova.tests.functional import fixtures as func_fixtures from nova.tests.functional import integrated_helpers -from nova.tests.unit.image import fake as image_fake from nova.tests.unit import policy_fixture @@ -41,8 +40,7 @@ class ServerTagsFilteringTest(test.TestCase, self.api = api_fixture.api # the image fake backend needed for image discovery - image_fake.stub_out_image_service(self) - self.addCleanup(image_fake.FakeImageService_reset) + self.useFixture(nova_fixtures.GlanceFixture(self)) # Use the latest microversion available to make sure something does # not regress in new microversions; cap as necessary. diff --git a/nova/tests/functional/regressions/test_bug_1689692.py b/nova/tests/functional/regressions/test_bug_1689692.py index ea0d5671f004..9ff0336fd891 100644 --- a/nova/tests/functional/regressions/test_bug_1689692.py +++ b/nova/tests/functional/regressions/test_bug_1689692.py @@ -16,7 +16,6 @@ from nova import test from nova.tests import fixtures as nova_fixtures from nova.tests.functional import integrated_helpers from nova.tests.unit import cast_as_call -from nova.tests.unit.image import fake as image_fake from nova.tests.unit import policy_fixture @@ -42,8 +41,7 @@ class ServerListLimitMarkerCell0Test(test.TestCase, self.api = api_fixture.api # the image fake backend needed for image discovery - image_fake.stub_out_image_service(self) - self.addCleanup(image_fake.FakeImageService_reset) + self.useFixture(nova_fixtures.GlanceFixture(self)) # Use the latest microversion available to make sure something does # not regress in new microversions; cap as necessary. diff --git a/nova/tests/functional/regressions/test_bug_1702454.py b/nova/tests/functional/regressions/test_bug_1702454.py index 5fe15cd37628..097f6cedaec7 100644 --- a/nova/tests/functional/regressions/test_bug_1702454.py +++ b/nova/tests/functional/regressions/test_bug_1702454.py @@ -15,7 +15,6 @@ from nova.tests import fixtures as nova_fixtures from nova.tests.functional import fixtures as func_fixtures from nova.tests.functional import integrated_helpers from nova.tests.unit import cast_as_call -from nova.tests.unit.image import fake as image_fake from nova.tests.unit import policy_fixture @@ -59,8 +58,7 @@ class SchedulerOnlyChecksTargetTest(test.TestCase, self.api = api_fixture.api # the image fake backend needed for image discovery - image_fake.stub_out_image_service(self) - self.addCleanup(image_fake.FakeImageService_reset) + self.useFixture(nova_fixtures.GlanceFixture(self)) self.start_service('conductor') diff --git a/nova/tests/functional/regressions/test_bug_1713783.py b/nova/tests/functional/regressions/test_bug_1713783.py index 8fc12fdfc833..521d4470794b 100644 --- a/nova/tests/functional/regressions/test_bug_1713783.py +++ b/nova/tests/functional/regressions/test_bug_1713783.py @@ -22,7 +22,6 @@ from nova.tests.functional import fixtures as func_fixtures from nova.tests.functional import integrated_helpers from nova.tests.unit import fake_network from nova.tests.unit import fake_notifier -import nova.tests.unit.image.fake from nova.tests.unit import policy_fixture @@ -47,6 +46,7 @@ class FailedEvacuateStateTests(test.TestCase, self.useFixture(policy_fixture.RealPolicyFixture()) self.useFixture(nova_fixtures.NeutronFixture(self)) + self.useFixture(nova_fixtures.GlanceFixture(self)) self.useFixture(func_fixtures.PlacementFixture()) api_fixture = self.useFixture(nova_fixtures.OSAPIFixture( @@ -55,13 +55,9 @@ class FailedEvacuateStateTests(test.TestCase, self.api = api_fixture.admin_api self.api.microversion = self.microversion - nova.tests.unit.image.fake.stub_out_image_service(self) - self.start_service('conductor') self.start_service('scheduler') - self.addCleanup(nova.tests.unit.image.fake.FakeImageService_reset) - self.hostname = 'host1' self.compute1 = self.start_service('compute', host=self.hostname) fake_network.set_stub_network_methods(self) diff --git a/nova/tests/functional/regressions/test_bug_1718455.py b/nova/tests/functional/regressions/test_bug_1718455.py index 0fc08e06fbb4..5ef576097615 100644 --- a/nova/tests/functional/regressions/test_bug_1718455.py +++ b/nova/tests/functional/regressions/test_bug_1718455.py @@ -17,7 +17,6 @@ from nova.tests import fixtures as nova_fixtures from nova.tests.functional import fixtures as func_fixtures from nova.tests.functional import integrated_helpers from nova.tests.unit import fake_network -import nova.tests.unit.image.fake from nova.tests.unit import policy_fixture @@ -46,6 +45,7 @@ class TestLiveMigrateOneOfConcurrentlyCreatedInstances( self.useFixture(policy_fixture.RealPolicyFixture()) self.useFixture(nova_fixtures.NeutronFixture(self)) + self.useFixture(nova_fixtures.GlanceFixture(self)) self.useFixture(func_fixtures.PlacementFixture()) api_fixture = self.useFixture(nova_fixtures.OSAPIFixture( @@ -54,9 +54,6 @@ class TestLiveMigrateOneOfConcurrentlyCreatedInstances( self.api = api_fixture.admin_api self.api.microversion = self.microversion - nova.tests.unit.image.fake.stub_out_image_service(self) - self.addCleanup(nova.tests.unit.image.fake.FakeImageService_reset) - self.start_service('conductor') self.start_service('scheduler') diff --git a/nova/tests/functional/regressions/test_bug_1718512.py b/nova/tests/functional/regressions/test_bug_1718512.py index 22d3edc51731..0c96a934e76b 100644 --- a/nova/tests/functional/regressions/test_bug_1718512.py +++ b/nova/tests/functional/regressions/test_bug_1718512.py @@ -17,7 +17,6 @@ from nova import test from nova.tests import fixtures as nova_fixtures from nova.tests.functional import fixtures as func_fixtures from nova.tests.functional import integrated_helpers -from nova.tests.unit.image import fake as image_fake from nova.tests.unit import policy_fixture @@ -52,8 +51,7 @@ class TestRequestSpecRetryReschedule(test.TestCase, self.api = api_fixture.api # the image fake backend needed for image discovery - image_fake.stub_out_image_service(self) - self.addCleanup(image_fake.FakeImageService_reset) + self.useFixture(nova_fixtures.GlanceFixture(self)) self.start_service('conductor') diff --git a/nova/tests/functional/regressions/test_bug_1719730.py b/nova/tests/functional/regressions/test_bug_1719730.py index 054c6a535bf3..18093bc8e674 100644 --- a/nova/tests/functional/regressions/test_bug_1719730.py +++ b/nova/tests/functional/regressions/test_bug_1719730.py @@ -16,7 +16,6 @@ from nova.tests import fixtures as nova_fixtures from nova.tests.functional import fixtures as func_fixtures from nova.tests.functional import integrated_helpers from nova.tests.unit import fake_network -import nova.tests.unit.image.fake from nova.tests.unit import policy_fixture @@ -56,8 +55,7 @@ class TestRescheduleWithServerGroup(test.TestCase, self.admin_api = api_fixture.admin_api # the image fake backend needed for image discovery - nova.tests.unit.image.fake.stub_out_image_service(self) - self.addCleanup(nova.tests.unit.image.fake.FakeImageService_reset) + self.useFixture(nova_fixtures.GlanceFixture(self)) self.start_service('conductor') self.start_service('scheduler') diff --git a/nova/tests/functional/regressions/test_bug_1735407.py b/nova/tests/functional/regressions/test_bug_1735407.py index 3488b1d6a05b..68d219526d43 100644 --- a/nova/tests/functional/regressions/test_bug_1735407.py +++ b/nova/tests/functional/regressions/test_bug_1735407.py @@ -10,13 +10,13 @@ # See the License for the specific language governing permissions and # limitations under the License. +from nova.compute import manager from nova import test from nova.tests import fixtures as nova_fixtures from nova.tests.functional import fixtures as func_fixtures from nova.tests.functional import integrated_helpers from nova.tests.unit import fake_network from nova.tests.unit import fake_notifier -import nova.tests.unit.image.fake from nova.tests.unit import policy_fixture @@ -52,8 +52,7 @@ class TestParallelEvacuationWithServerGroup( self.addCleanup(fake_notifier.reset) # the image fake backend needed for image discovery - nova.tests.unit.image.fake.stub_out_image_service(self) - self.addCleanup(nova.tests.unit.image.fake.FakeImageService_reset) + self.useFixture(nova_fixtures.GlanceFixture(self)) self.start_service('conductor') self.start_service('scheduler') @@ -66,7 +65,7 @@ class TestParallelEvacuationWithServerGroup( self.image_id = self.api.get_images()[0]['id'] self.flavor_id = self.api.get_flavors()[0]['id'] - manager_class = nova.compute.manager.ComputeManager + manager_class = manager.ComputeManager original_rebuild = manager_class._do_rebuild_instance def fake_rebuild(self_, context, instance, *args, **kwargs): diff --git a/nova/tests/functional/regressions/test_bug_1741307.py b/nova/tests/functional/regressions/test_bug_1741307.py index 087957351db1..5ed9d698b300 100644 --- a/nova/tests/functional/regressions/test_bug_1741307.py +++ b/nova/tests/functional/regressions/test_bug_1741307.py @@ -14,7 +14,6 @@ from nova import test from nova.tests import fixtures as nova_fixtures from nova.tests.functional import fixtures as func_fixtures from nova.tests.functional import integrated_helpers -import nova.tests.unit.image.fake from nova.tests.unit import policy_fixture @@ -47,6 +46,7 @@ class TestResizeWithNoAllocationScheduler( super(TestResizeWithNoAllocationScheduler, self).setUp() self.useFixture(policy_fixture.RealPolicyFixture()) + self.useFixture(nova_fixtures.GlanceFixture(self)) self.useFixture(nova_fixtures.NeutronFixture(self)) self.useFixture(func_fixtures.PlacementFixture()) @@ -56,9 +56,6 @@ class TestResizeWithNoAllocationScheduler( self.api = api_fixture.admin_api self.api.microversion = self.microversion - nova.tests.unit.image.fake.stub_out_image_service(self) - self.addCleanup(nova.tests.unit.image.fake.FakeImageService_reset) - self.start_service('conductor') # Create two compute nodes/services. diff --git a/nova/tests/functional/regressions/test_bug_1746483.py b/nova/tests/functional/regressions/test_bug_1746483.py index 3471a5822687..e0b48cb07097 100644 --- a/nova/tests/functional/regressions/test_bug_1746483.py +++ b/nova/tests/functional/regressions/test_bug_1746483.py @@ -15,7 +15,6 @@ from nova import test from nova.tests import fixtures as nova_fixtures from nova.tests.functional import fixtures as func_fixtures from nova.tests.functional import integrated_helpers -from nova.tests.unit.image import fake as image_fakes from nova.tests.unit import policy_fixture from nova import utils @@ -39,6 +38,7 @@ class TestBootFromVolumeIsolatedHostsFilter( self.useFixture(policy_fixture.RealPolicyFixture()) self.useFixture(nova_fixtures.NeutronFixture(self)) + self.glance = self.useFixture(nova_fixtures.GlanceFixture(self)) self.useFixture(nova_fixtures.CinderFixture(self)) self.useFixture(func_fixtures.PlacementFixture()) @@ -47,9 +47,6 @@ class TestBootFromVolumeIsolatedHostsFilter( self.api = api_fixture.admin_api - image_fakes.stub_out_image_service(self) - self.addCleanup(image_fakes.FakeImageService_reset) - self.start_service('conductor') # Add the IsolatedHostsFilter to the list of enabled filters since it @@ -58,7 +55,7 @@ class TestBootFromVolumeIsolatedHostsFilter( enabled_filters.append('IsolatedHostsFilter') self.flags( enabled_filters=enabled_filters, - isolated_images=[image_fakes.AUTO_DISK_CONFIG_ENABLED_IMAGE_UUID], + isolated_images=[self.glance.auto_disk_config_enabled_image['id']], isolated_hosts=['host1'], restrict_isolated_hosts_to_isolated_images=True, group='filter_scheduler') diff --git a/nova/tests/functional/regressions/test_bug_1764556.py b/nova/tests/functional/regressions/test_bug_1764556.py index baeea1b459ca..9913b9731dbc 100644 --- a/nova/tests/functional/regressions/test_bug_1764556.py +++ b/nova/tests/functional/regressions/test_bug_1764556.py @@ -16,7 +16,6 @@ from nova import test from nova.tests import fixtures as nova_fixtures from nova.tests.functional import fixtures as func_fixtures from nova.tests.functional import integrated_helpers -from nova.tests.unit.image import fake as fake_image from nova.tests.unit import policy_fixture from nova import utils @@ -49,8 +48,7 @@ class InstanceListWithDeletedServicesTestCase( self.admin_api.microversion = 'latest' # the image fake backend needed for image discovery - fake_image.stub_out_image_service(self) - self.addCleanup(fake_image.FakeImageService_reset) + self.useFixture(nova_fixtures.GlanceFixture(self)) self.api.microversion = 'latest' diff --git a/nova/tests/functional/regressions/test_bug_1764883.py b/nova/tests/functional/regressions/test_bug_1764883.py index 3d82bd267144..d8d97276e63f 100644 --- a/nova/tests/functional/regressions/test_bug_1764883.py +++ b/nova/tests/functional/regressions/test_bug_1764883.py @@ -10,14 +10,13 @@ # See the License for the specific language governing permissions and # limitations under the License. - +from nova.compute import manager from nova import test from nova.tests import fixtures as nova_fixtures from nova.tests.functional import fixtures as func_fixtures from nova.tests.functional import integrated_helpers from nova.tests.unit import fake_network from nova.tests.unit import fake_notifier -import nova.tests.unit.image.fake from nova.tests.unit import policy_fixture @@ -53,8 +52,7 @@ class TestEvacuationWithSourceReturningDuringRebuild( self.api.microversion = '2.14' # the image fake backend needed for image discovery - nova.tests.unit.image.fake.stub_out_image_service(self) - self.addCleanup(nova.tests.unit.image.fake.FakeImageService_reset) + self.useFixture(nova_fixtures.GlanceFixture(self)) self.start_service('conductor') self.start_service('scheduler') @@ -71,7 +69,7 @@ class TestEvacuationWithSourceReturningDuringRebuild( # Stub out rebuild with a slower method allowing the src compute to be # restarted once the migration hits pre-migrating after claiming # resources on the dest. - manager_class = nova.compute.manager.ComputeManager + manager_class = manager.ComputeManager original_rebuild = manager_class._do_rebuild_instance def start_src_rebuild(self_, context, instance, *args, **kwargs): diff --git a/nova/tests/functional/regressions/test_bug_1780373.py b/nova/tests/functional/regressions/test_bug_1780373.py index 8d0182ef58eb..3ba0a96b84cd 100644 --- a/nova/tests/functional/regressions/test_bug_1780373.py +++ b/nova/tests/functional/regressions/test_bug_1780373.py @@ -14,7 +14,6 @@ from nova import test from nova.tests import fixtures as nova_fixtures from nova.tests.functional import fixtures as func_fixtures from nova.tests.functional import integrated_helpers -from nova.tests.unit.image import fake as fake_image from nova.tests.unit import policy_fixture @@ -41,6 +40,7 @@ class TestMultiCreateServerGroupMemberOverQuota( self.flags(server_group_members=2, group='quota') self.useFixture(policy_fixture.RealPolicyFixture()) self.useFixture(nova_fixtures.NeutronFixture(self)) + self.glance = self.useFixture(nova_fixtures.GlanceFixture(self)) self.useFixture(func_fixtures.PlacementFixture()) api_fixture = self.useFixture(nova_fixtures.OSAPIFixture( @@ -48,9 +48,6 @@ class TestMultiCreateServerGroupMemberOverQuota( self.api = api_fixture.api self.api.microversion = '2.37' # so we can specify networks='none' - fake_image.stub_out_image_service(self) - self.addCleanup(fake_image.FakeImageService_reset) - group = {'name': 'test group', 'policies': ['soft-anti-affinity']} self.created_group = self.api.post_server_groups(group) @@ -59,9 +56,7 @@ class TestMultiCreateServerGroupMemberOverQuota( server group and then create 3 servers in the group using a multi-create POST /servers request. """ - server_req = self._build_server( - image_uuid=fake_image.AUTO_DISK_CONFIG_ENABLED_IMAGE_UUID, - networks='none') + server_req = self._build_server(networks='none') server_req['min_count'] = 3 server_req['return_reservation_id'] = True hints = {'group': self.created_group['id']} @@ -86,9 +81,7 @@ class TestMultiCreateServerGroupMemberOverQuota( # by using NoopConductorFixture. self.useFixture(nova_fixtures.NoopConductorFixture()) for x in range(3): - server_req = self._build_server( - image_uuid=fake_image.AUTO_DISK_CONFIG_ENABLED_IMAGE_UUID, - networks='none') + server_req = self._build_server(networks='none') hints = {'group': self.created_group['id']} # This should result in a 403 response on the 3rd server. if x == 2: diff --git a/nova/tests/functional/regressions/test_bug_1781286.py b/nova/tests/functional/regressions/test_bug_1781286.py index 6bafe4b8dfd9..04b1112121f2 100644 --- a/nova/tests/functional/regressions/test_bug_1781286.py +++ b/nova/tests/functional/regressions/test_bug_1781286.py @@ -21,7 +21,6 @@ from nova.tests import fixtures as nova_fixtures from nova.tests.functional import fixtures as func_fixtures from nova.tests.functional import integrated_helpers from nova.tests.unit import fake_notifier -from nova.tests.unit.image import fake as fake_image from nova.tests.unit import policy_fixture @@ -39,10 +38,10 @@ class RescheduleBuildAvailabilityZoneUpCall( super(RescheduleBuildAvailabilityZoneUpCall, self).setUp() # Use the standard fixtures. self.useFixture(policy_fixture.RealPolicyFixture()) + self.useFixture(nova_fixtures.GlanceFixture(self)) self.useFixture(nova_fixtures.NeutronFixture(self)) self.useFixture(func_fixtures.PlacementFixture()) - fake_image.stub_out_image_service(self) - self.addCleanup(fake_image.FakeImageService_reset) + # Start controller services. self.api = self.useFixture(nova_fixtures.OSAPIFixture( api_version='v2.1')).admin_api @@ -103,10 +102,9 @@ class RescheduleMigrateAvailabilityZoneUpCall( super(RescheduleMigrateAvailabilityZoneUpCall, self).setUp() # Use the standard fixtures. self.useFixture(policy_fixture.RealPolicyFixture()) + self.useFixture(nova_fixtures.GlanceFixture(self)) self.useFixture(nova_fixtures.NeutronFixture(self)) self.useFixture(func_fixtures.PlacementFixture()) - fake_image.stub_out_image_service(self) - self.addCleanup(fake_image.FakeImageService_reset) # Start controller services. self.api = self.useFixture(nova_fixtures.OSAPIFixture( api_version='v2.1')).admin_api diff --git a/nova/tests/functional/regressions/test_bug_1781710.py b/nova/tests/functional/regressions/test_bug_1781710.py index 42d1d4ec09ca..69cda308e305 100644 --- a/nova/tests/functional/regressions/test_bug_1781710.py +++ b/nova/tests/functional/regressions/test_bug_1781710.py @@ -15,7 +15,6 @@ from nova import test from nova.tests import fixtures as nova_fixtures from nova.tests.functional import fixtures as func_fixtures from nova.tests.functional import integrated_helpers -from nova.tests.unit.image import fake as image_fake from nova.tests.unit import policy_fixture @@ -40,6 +39,7 @@ class AntiAffinityMultiCreateRequest(test.TestCase, def setUp(self): super(AntiAffinityMultiCreateRequest, self).setUp() self.useFixture(policy_fixture.RealPolicyFixture()) + self.glance = self.useFixture(nova_fixtures.GlanceFixture(self)) self.useFixture(nova_fixtures.NeutronFixture(self)) self.useFixture(func_fixtures.PlacementFixture()) @@ -50,9 +50,6 @@ class AntiAffinityMultiCreateRequest(test.TestCase, self.admin_api = api_fixture.admin_api self.api = api_fixture.api - image_fake.stub_out_image_service(self) - self.addCleanup(image_fake.FakeImageService_reset) - self.start_service('conductor') # Use the latest microversion available to make sure something does @@ -102,9 +99,7 @@ class AntiAffinityMultiCreateRequest(test.TestCase, '_get_alternate_hosts', stub_get_alternate_hosts) # Now create two servers in that group. - server_req = self._build_server( - image_uuid=image_fake.AUTO_DISK_CONFIG_ENABLED_IMAGE_UUID, - networks='none') + server_req = self._build_server(networks='none') server_req['min_count'] = 2 self.api.api_post( '/servers', {'server': server_req, diff --git a/nova/tests/functional/regressions/test_bug_1784353.py b/nova/tests/functional/regressions/test_bug_1784353.py index 9d0115982cf3..21ced73e6599 100644 --- a/nova/tests/functional/regressions/test_bug_1784353.py +++ b/nova/tests/functional/regressions/test_bug_1784353.py @@ -15,7 +15,6 @@ from nova.tests import fixtures as nova_fixtures from nova.tests.functional import fixtures as func_fixtures from nova.tests.functional import integrated_helpers from nova.tests.unit import fake_network -import nova.tests.unit.image.fake from nova.tests.unit import policy_fixture @@ -32,10 +31,10 @@ class TestRescheduleWithVolumesAttached( super(TestRescheduleWithVolumesAttached, self).setUp() # Use the new attach flow fixture for cinder - cinder_fixture = nova_fixtures.CinderFixture(self) - self.cinder = self.useFixture(cinder_fixture) + self.cinder = self.useFixture(nova_fixtures.CinderFixture(self)) self.useFixture(policy_fixture.RealPolicyFixture()) self.useFixture(nova_fixtures.NeutronFixture(self)) + self.useFixture(nova_fixtures.GlanceFixture(self)) fake_network.set_stub_network_methods(self) @@ -45,9 +44,6 @@ class TestRescheduleWithVolumesAttached( api_version='v2.1')) self.api = api_fixture.admin_api - nova.tests.unit.image.fake.stub_out_image_service(self) - self.addCleanup(nova.tests.unit.image.fake.FakeImageService_reset) - self.flags(compute_driver='fake.FakeRescheduleDriver') self.start_service('conductor') diff --git a/nova/tests/functional/regressions/test_bug_1797580.py b/nova/tests/functional/regressions/test_bug_1797580.py index 51b44542de33..c92b56093a3e 100644 --- a/nova/tests/functional/regressions/test_bug_1797580.py +++ b/nova/tests/functional/regressions/test_bug_1797580.py @@ -14,7 +14,6 @@ from nova import test from nova.tests import fixtures as nova_fixtures from nova.tests.functional import fixtures as func_fixtures from nova.tests.functional import integrated_helpers -from nova.tests.unit.image import fake as image_fake from nova.tests.unit import policy_fixture @@ -40,6 +39,7 @@ class ColdMigrateTargetHostThenLiveMigrateTest( super(ColdMigrateTargetHostThenLiveMigrateTest, self).setUp() self.useFixture(policy_fixture.RealPolicyFixture()) self.useFixture(nova_fixtures.NeutronFixture(self)) + self.glance = self.useFixture(nova_fixtures.GlanceFixture(self)) self.useFixture(func_fixtures.PlacementFixture()) api_fixture = self.useFixture(nova_fixtures.OSAPIFixture( @@ -53,9 +53,6 @@ class ColdMigrateTargetHostThenLiveMigrateTest( self.admin_api.microversion = 'latest' self.api.microversion = 'latest' - image_fake.stub_out_image_service(self) - self.addCleanup(image_fake.FakeImageService_reset) - self.start_service('conductor') self.start_service('scheduler') @@ -64,9 +61,7 @@ class ColdMigrateTargetHostThenLiveMigrateTest( def test_cold_migrate_target_host_then_live_migrate(self): # Create a server, it doesn't matter on which host it builds. - server = self._build_server( - image_uuid=image_fake.AUTO_DISK_CONFIG_ENABLED_IMAGE_UUID, - networks='none') + server = self._build_server(networks='none') server = self.api.post_server({'server': server}) server = self._wait_for_state_change(server, 'ACTIVE') original_host = server['OS-EXT-SRV-ATTR:host'] diff --git a/nova/tests/functional/regressions/test_bug_1806515.py b/nova/tests/functional/regressions/test_bug_1806515.py index ae093c6f2a22..6d2675af27e8 100644 --- a/nova/tests/functional/regressions/test_bug_1806515.py +++ b/nova/tests/functional/regressions/test_bug_1806515.py @@ -14,7 +14,6 @@ from nova import test from nova.tests import fixtures as nova_fixtures from nova.tests.functional import integrated_helpers from nova.tests.unit import fake_notifier -import nova.tests.unit.image.fake class ShowErrorServerWithTags(test.TestCase, @@ -33,14 +32,11 @@ class ShowErrorServerWithTags(test.TestCase, self.api = api_fixture.admin_api self.useFixture(nova_fixtures.NeutronFixture(self)) + self.useFixture(nova_fixtures.GlanceFixture(self)) self.start_service('conductor') self.start_service('scheduler') - # the image fake backend needed for image discovery - nova.tests.unit.image.fake.stub_out_image_service(self) - self.addCleanup(nova.tests.unit.image.fake.FakeImageService_reset) - self.image_id = self.api.get_images()[0]['id'] self.api.microversion = 'latest' diff --git a/nova/tests/functional/regressions/test_bug_1815153.py b/nova/tests/functional/regressions/test_bug_1815153.py index eb1e3bdbd374..cadd20c8d878 100644 --- a/nova/tests/functional/regressions/test_bug_1815153.py +++ b/nova/tests/functional/regressions/test_bug_1815153.py @@ -19,7 +19,6 @@ from nova import test from nova.tests import fixtures as nova_fixtures from nova.tests.functional import fixtures as func_fixtures from nova.tests.functional import integrated_helpers -from nova.tests.unit.image import fake as image_fake from nova.tests.unit import policy_fixture @@ -49,6 +48,7 @@ class NonPersistentFieldNotResetTest( super(NonPersistentFieldNotResetTest, self).setUp() self.useFixture(policy_fixture.RealPolicyFixture()) self.useFixture(nova_fixtures.NeutronFixture(self)) + self.useFixture(nova_fixtures.GlanceFixture(self)) self.useFixture(func_fixtures.PlacementFixture()) api_fixture = self.useFixture(nova_fixtures.OSAPIFixture( @@ -58,9 +58,6 @@ class NonPersistentFieldNotResetTest( # not regress in new microversions; cap as necessary. self.api.microversion = 'latest' - image_fake.stub_out_image_service(self) - self.addCleanup(image_fake.FakeImageService_reset) - self.start_service('conductor') self.start_service('scheduler') diff --git a/nova/tests/functional/regressions/test_bug_1825020.py b/nova/tests/functional/regressions/test_bug_1825020.py index 8b8c47422db0..11cb08096c01 100644 --- a/nova/tests/functional/regressions/test_bug_1825020.py +++ b/nova/tests/functional/regressions/test_bug_1825020.py @@ -14,7 +14,6 @@ from nova import test from nova.tests import fixtures as nova_fixtures from nova.tests.functional import fixtures as func_fixtures from nova.tests.functional import integrated_helpers -from nova.tests.unit.image import fake as fake_image class VolumeBackedResizeDiskDown(test.TestCase, @@ -36,10 +35,9 @@ class VolumeBackedResizeDiskDown(test.TestCase, self.api = api_fixture.admin_api self.useFixture(nova_fixtures.NeutronFixture(self)) + self.useFixture(nova_fixtures.GlanceFixture(self)) self.useFixture(nova_fixtures.CinderFixture(self)) self.useFixture(func_fixtures.PlacementFixture()) - fake_image.stub_out_image_service(self) - self.addCleanup(fake_image.FakeImageService_reset) self.start_service('conductor') self.start_service('scheduler') diff --git a/nova/tests/functional/regressions/test_bug_1825034.py b/nova/tests/functional/regressions/test_bug_1825034.py index aeb970234aea..99b66c01304b 100644 --- a/nova/tests/functional/regressions/test_bug_1825034.py +++ b/nova/tests/functional/regressions/test_bug_1825034.py @@ -17,7 +17,6 @@ from nova import test from nova.tests import fixtures as nova_fixtures from nova.tests.functional import fixtures as func_fixtures from nova.tests.functional import integrated_helpers -from nova.tests.unit.image import fake as fake_image class FillVirtualInterfaceListMigration( @@ -38,13 +37,11 @@ class FillVirtualInterfaceListMigration( api_version='v2.1')) self.api = api_fixture.admin_api self.useFixture(nova_fixtures.NeutronFixture(self)) + self.useFixture(nova_fixtures.GlanceFixture(self)) self.useFixture(func_fixtures.PlacementFixture()) self.start_service('conductor') self.start_service('scheduler') self.start_service('compute') - # the image fake backend needed for image discovery - fake_image.stub_out_image_service(self) - self.addCleanup(fake_image.FakeImageService_reset) def test_fill_vifs_migration(self): # Create a test server. diff --git a/nova/tests/functional/regressions/test_bug_1830747.py b/nova/tests/functional/regressions/test_bug_1830747.py index 849fe81c51a2..4cd8c3b1af0a 100644 --- a/nova/tests/functional/regressions/test_bug_1830747.py +++ b/nova/tests/functional/regressions/test_bug_1830747.py @@ -19,7 +19,6 @@ from nova import test from nova.tests import fixtures as nova_fixtures from nova.tests.functional import fixtures as func_fixtures from nova.tests.functional import integrated_helpers -from nova.tests.unit.image import fake as fake_image class MissingReqSpecInstanceGroupUUIDTestCase( @@ -51,9 +50,8 @@ class MissingReqSpecInstanceGroupUUIDTestCase( super(MissingReqSpecInstanceGroupUUIDTestCase, self).setUp() # Stub out external dependencies. self.useFixture(nova_fixtures.NeutronFixture(self)) + self.useFixture(nova_fixtures.GlanceFixture(self)) self.useFixture(func_fixtures.PlacementFixture()) - fake_image.stub_out_image_service(self) - self.addCleanup(fake_image.FakeImageService_reset) # Configure the API to allow resizing to the same host so we can keep # the number of computes down to two in the test. self.flags(allow_resize_to_same_host=True) diff --git a/nova/tests/functional/regressions/test_bug_1835822.py b/nova/tests/functional/regressions/test_bug_1835822.py index 51bb793eec81..581410d4579e 100644 --- a/nova/tests/functional/regressions/test_bug_1835822.py +++ b/nova/tests/functional/regressions/test_bug_1835822.py @@ -15,7 +15,6 @@ from nova.tests import fixtures as nova_fixtures from nova.tests.functional import fixtures as func_fixtures from nova.tests.functional import integrated_helpers from nova.tests.unit import fake_notifier -from nova.tests.unit.image import fake as fake_image from nova.tests.unit import policy_fixture @@ -27,16 +26,16 @@ class RegressionTest1835822( super(RegressionTest1835822, self).setUp() # Use the standard fixtures. self.useFixture(policy_fixture.RealPolicyFixture()) + self.useFixture(nova_fixtures.GlanceFixture(self)) self.useFixture(nova_fixtures.NeutronFixture(self)) self.useFixture(func_fixtures.PlacementFixture()) + self.api = self.useFixture(nova_fixtures.OSAPIFixture( api_version='v2.1')).api self.start_service('conductor') self.start_service('scheduler') self.start_service('compute') - # the image fake backend needed for image discovery - fake_image.stub_out_image_service(self) - self.addCleanup(fake_image.FakeImageService_reset) + images = self.api.get_images() self.image_ref_0 = images[0]['id'] self.image_ref_1 = images[1]['id'] diff --git a/nova/tests/functional/regressions/test_bug_1843708.py b/nova/tests/functional/regressions/test_bug_1843708.py index 59d57ac531b1..d04dbb1cdae7 100644 --- a/nova/tests/functional/regressions/test_bug_1843708.py +++ b/nova/tests/functional/regressions/test_bug_1843708.py @@ -16,7 +16,6 @@ from nova import context from nova import objects from nova.tests.functional import integrated_helpers from nova.tests.unit import fake_notifier -from nova.tests.unit.image import fake as fake_image class RebuildWithKeypairTestCase(integrated_helpers._IntegratedTestBase): @@ -55,7 +54,7 @@ class RebuildWithKeypairTestCase(integrated_helpers._IntegratedTestBase): # Rebuild a server with keypair 'test-key2' body = { 'rebuild': { - 'imageRef': fake_image.get_valid_image_id(), + 'imageRef': self.glance.auto_disk_config_enabled_image['id'], 'key_name': 'test-key2', }, } diff --git a/nova/tests/functional/regressions/test_bug_1849409.py b/nova/tests/functional/regressions/test_bug_1849409.py index 2014d71dcc66..2ee240b212e7 100644 --- a/nova/tests/functional/regressions/test_bug_1849409.py +++ b/nova/tests/functional/regressions/test_bug_1849409.py @@ -14,7 +14,6 @@ from nova import test from nova.tests import fixtures as nova_fixtures from nova.tests.functional import fixtures as func_fixtures from nova.tests.functional import integrated_helpers -from nova.tests.unit.image import fake as fake_image class ListDeletedServersWithMarker(test.TestCase, @@ -30,8 +29,8 @@ class ListDeletedServersWithMarker(test.TestCase, # Start standard fixtures. self.useFixture(func_fixtures.PlacementFixture()) self.useFixture(nova_fixtures.NeutronFixture(self)) - fake_image.stub_out_image_service(self) - self.addCleanup(fake_image.FakeImageService_reset) + self.useFixture(nova_fixtures.GlanceFixture(self)) + # Start nova services. self.api = self.useFixture(nova_fixtures.OSAPIFixture( api_version='v2.1')).admin_api diff --git a/nova/tests/functional/regressions/test_bug_1852458.py b/nova/tests/functional/regressions/test_bug_1852458.py index 1d3374278ee5..a529b7a2244d 100644 --- a/nova/tests/functional/regressions/test_bug_1852458.py +++ b/nova/tests/functional/regressions/test_bug_1852458.py @@ -15,7 +15,6 @@ from nova import test from nova.tests import fixtures as nova_fixtures from nova.tests.functional import fixtures as func_fixtures from nova.tests.functional import integrated_helpers -from nova.tests.unit.image import fake as fake_image from nova.tests.unit import policy_fixture from nova import utils @@ -29,10 +28,9 @@ class TestInstanceActionBuryInCell0(test.TestCase, def setUp(self): super(TestInstanceActionBuryInCell0, self).setUp() # Setup common fixtures. - fake_image.stub_out_image_service(self) - self.addCleanup(fake_image.FakeImageService_reset) self.useFixture(func_fixtures.PlacementFixture()) self.useFixture(nova_fixtures.NeutronFixture(self)) + self.useFixture(nova_fixtures.GlanceFixture(self)) policy = self.useFixture(policy_fixture.RealPolicyFixture()) # Allow non-admins to see instance action events. policy.set_rules({ diff --git a/nova/tests/functional/regressions/test_bug_1862633.py b/nova/tests/functional/regressions/test_bug_1862633.py index 6f55aae621f6..90de77628588 100644 --- a/nova/tests/functional/regressions/test_bug_1862633.py +++ b/nova/tests/functional/regressions/test_bug_1862633.py @@ -17,7 +17,6 @@ from nova.tests import fixtures as nova_fixtures from nova.tests.functional import fixtures as func_fixtures from nova.tests.functional import integrated_helpers from nova.tests.unit import fake_notifier -from nova.tests.unit.image import fake as fake_image class UnshelveNeutronErrorTest( @@ -30,8 +29,7 @@ class UnshelveNeutronErrorTest( self.placement = placement.api self.neutron = nova_fixtures.NeutronFixture(self) self.useFixture(self.neutron) - fake_image.stub_out_image_service(self) - self.addCleanup(fake_image.FakeImageService_reset) + self.useFixture(nova_fixtures.GlanceFixture(self)) # Start nova services. self.api = self.useFixture(nova_fixtures.OSAPIFixture( api_version='v2.1')).admin_api diff --git a/nova/tests/functional/regressions/test_bug_1893284.py b/nova/tests/functional/regressions/test_bug_1893284.py index 91774c9834b9..059bb48a1370 100644 --- a/nova/tests/functional/regressions/test_bug_1893284.py +++ b/nova/tests/functional/regressions/test_bug_1893284.py @@ -15,7 +15,6 @@ from nova.tests import fixtures as nova_fixtures from nova.tests.functional.api import client as api_client from nova.tests.functional import fixtures as func_fixtures from nova.tests.functional import integrated_helpers -from nova.tests.unit.image import fake as fake_image from nova.tests.unit import policy_fixture @@ -45,6 +44,7 @@ class TestServersPerUserQuota(test.TestCase, self.useFixture(policy_fixture.RealPolicyFixture()) self.useFixture(nova_fixtures.NeutronFixture(self)) self.useFixture(func_fixtures.PlacementFixture()) + self.glance = self.useFixture(nova_fixtures.GlanceFixture(self)) api_fixture = self.useFixture(nova_fixtures.OSAPIFixture( api_version='v2.1')) @@ -53,9 +53,6 @@ class TestServersPerUserQuota(test.TestCase, self.api.microversion = '2.37' # so we can specify networks='none' self.admin_api.microversion = '2.37' - fake_image.stub_out_image_service(self) - self.addCleanup(fake_image.FakeImageService_reset) - self.start_service('conductor') self.start_service('scheduler') self.start_service('compute') @@ -75,15 +72,11 @@ class TestServersPerUserQuota(test.TestCase, # Boot one instance into the default project as the admin user. # This results in usage of 1 instance for the project and 1 instance # for the admin user. - self._create_server( - image_uuid=fake_image.AUTO_DISK_CONFIG_ENABLED_IMAGE_UUID, - networks='none', api=self.admin_api) + self._create_server(networks='none', api=self.admin_api) # Now try to boot an instance as the non-admin user. # This should succeed because the non-admin user has 0 instances and # the project limit allows 10 instances. - server_req = self._build_server( - image_uuid=fake_image.AUTO_DISK_CONFIG_ENABLED_IMAGE_UUID, - networks='none') + server_req = self._build_server(networks='none') server = self.api.post_server({'server': server_req}) self._wait_for_state_change(server, 'ACTIVE') # A request to boot a second instance should fail because the diff --git a/nova/tests/functional/test_aggregates.py b/nova/tests/functional/test_aggregates.py index 0bf8fcfa09e9..a67d20314ea7 100644 --- a/nova/tests/functional/test_aggregates.py +++ b/nova/tests/functional/test_aggregates.py @@ -18,7 +18,6 @@ from nova.tests import fixtures as nova_fixtures from nova.tests.functional.api import client from nova.tests.functional import fixtures as func_fixtures from nova.tests.functional import integrated_helpers -import nova.tests.unit.image.fake from nova.tests.unit import policy_fixture from nova.tests.unit import utils as test_utils from nova import utils @@ -476,7 +475,8 @@ class IsolateAggregateFilterTest(AggregateRequestFiltersTest): self.useFixture(nova_fixtures.HostNameWeigherFixture()) super(IsolateAggregateFilterTest, self).setUp() - self.image_service = nova.tests.unit.image.fake.FakeImageService() + + self.glance = self.useFixture(nova_fixtures.GlanceFixture(self)) # setting traits to flavors flavor_body = {'flavor': {'name': 'test_flavor', 'ram': 512, @@ -610,10 +610,9 @@ class IsolateAggregateFilterTest(AggregateRequestFiltersTest): # Creating a new image and setting traits on it. with nova.utils.temporary_mutation(self.api, microversion='2.35'): self.ctxt = test_utils.get_test_admin_context() - img_ref = self.image_service.create(self.ctxt, {'name': 'image10'}) + img_ref = self.glance.create(self.ctxt, {'name': 'image10'}) image_id_with_trait = img_ref['id'] - self.addCleanup( - self.image_service.delete, self.ctxt, image_id_with_trait) + self.addCleanup(self.glance.delete, self.ctxt, image_id_with_trait) self.api.api_put('/images/%s/metadata' % image_id_with_trait, {'metadata': { 'trait:HW_CPU_X86_VMX': 'required'}}) @@ -640,10 +639,9 @@ class IsolateAggregateFilterTest(AggregateRequestFiltersTest): # Creating a new image and setting traits on it. with nova.utils.temporary_mutation(self.api, microversion='2.35'): self.ctxt = test_utils.get_test_admin_context() - img_ref = self.image_service.create(self.ctxt, {'name': 'image10'}) + img_ref = self.glance.create(self.ctxt, {'name': 'image10'}) image_id_with_trait = img_ref['id'] - self.addCleanup( - self.image_service.delete, self.ctxt, image_id_with_trait) + self.addCleanup(self.glance.delete, self.ctxt, image_id_with_trait) self.api.api_put('/images/%s/metadata' % image_id_with_trait, {'metadata': { 'trait:HW_CPU_X86_VMX': 'required'}}) @@ -674,10 +672,9 @@ class IsolateAggregateFilterTest(AggregateRequestFiltersTest): # Creating a new image and setting traits on it. with nova.utils.temporary_mutation(self.api, microversion='2.35'): self.ctxt = test_utils.get_test_admin_context() - img_ref = self.image_service.create(self.ctxt, {'name': 'image10'}) + img_ref = self.glance.create(self.ctxt, {'name': 'image10'}) image_id_with_trait = img_ref['id'] - self.addCleanup( - self.image_service.delete, self.ctxt, image_id_with_trait) + self.addCleanup(self.glance.delete, self.ctxt, image_id_with_trait) self.api.api_put('/images/%s/metadata' % image_id_with_trait, {'metadata': { 'trait:HW_CPU_X86_VMX': 'required'}}) @@ -832,10 +829,10 @@ class TestAggregateMultiTenancyIsolationFilter( def setUp(self): super(TestAggregateMultiTenancyIsolationFilter, self).setUp() # Stub out glance, placement and neutron. - nova.tests.unit.image.fake.stub_out_image_service(self) - self.addCleanup(nova.tests.unit.image.fake.FakeImageService_reset) + self.useFixture(nova_fixtures.GlanceFixture(self)) self.useFixture(func_fixtures.PlacementFixture()) self.useFixture(nova_fixtures.NeutronFixture(self)) + # Start nova services. self.start_service('conductor') self.admin_api = self.useFixture( @@ -937,6 +934,7 @@ class AggregateMultiTenancyIsolationColdMigrateTest( def setUp(self): super(AggregateMultiTenancyIsolationColdMigrateTest, self).setUp() self.useFixture(policy_fixture.RealPolicyFixture()) + self.glance = self.useFixture(nova_fixtures.GlanceFixture(self)) self.useFixture(nova_fixtures.NeutronFixture(self)) self.useFixture(func_fixtures.PlacementFixture()) # Intentionally keep these separate since we want to create the @@ -950,10 +948,6 @@ class AggregateMultiTenancyIsolationColdMigrateTest( self.api = user_api_fixture.api self.api.microversion = 'latest' - # the image fake backend needed for image discovery - nova.tests.unit.image.fake.stub_out_image_service(self) - self.addCleanup(nova.tests.unit.image.fake.FakeImageService_reset) - self.start_service('conductor') # Enable the AggregateMultiTenancyIsolation filter before starting the # scheduler service. @@ -1003,10 +997,7 @@ class AggregateMultiTenancyIsolationColdMigrateTest( the server and asserts the server goes to the other host in the isolated host aggregate via the AggregateMultiTenancyIsolation filter. """ - img = nova.tests.unit.image.fake.AUTO_DISK_CONFIG_ENABLED_IMAGE_UUID - server_req_body = self._build_server( - image_uuid=img, - networks='none') + server_req_body = self._build_server(networks='none') server = self.api.post_server({'server': server_req_body}) server = self._wait_for_state_change(server, 'ACTIVE') # Ensure the server ended up in host2 or host3 diff --git a/nova/tests/functional/test_availability_zones.py b/nova/tests/functional/test_availability_zones.py index 8f86755644d6..375b7dc9d9bf 100644 --- a/nova/tests/functional/test_availability_zones.py +++ b/nova/tests/functional/test_availability_zones.py @@ -16,7 +16,6 @@ from nova import test from nova.tests import fixtures as nova_fixtures from nova.tests.functional import fixtures as func_fixtures from nova.tests.functional import integrated_helpers -from nova.tests.unit.image import fake as fake_image from nova.tests.unit import policy_fixture @@ -27,6 +26,7 @@ class TestAvailabilityZoneScheduling( super(TestAvailabilityZoneScheduling, self).setUp() self.useFixture(policy_fixture.RealPolicyFixture()) + self.useFixture(nova_fixtures.GlanceFixture(self)) self.useFixture(nova_fixtures.NeutronFixture(self)) self.useFixture(func_fixtures.PlacementFixture()) @@ -36,9 +36,6 @@ class TestAvailabilityZoneScheduling( self.api = api_fixture.admin_api self.api.microversion = 'latest' - fake_image.stub_out_image_service(self) - self.addCleanup(fake_image.FakeImageService_reset) - self.start_service('conductor') self.start_service('scheduler') diff --git a/nova/tests/functional/test_boot_from_volume.py b/nova/tests/functional/test_boot_from_volume.py index 9eff36ea58c7..6de676dbd890 100644 --- a/nova/tests/functional/test_boot_from_volume.py +++ b/nova/tests/functional/test_boot_from_volume.py @@ -20,7 +20,6 @@ from nova.tests import fixtures as nova_fixtures from nova.tests.functional.api import client as api_client from nova.tests.functional import fixtures as func_fixtures from nova.tests.functional import integrated_helpers -from nova.tests.unit.image import fake as fake_image from nova.tests.unit import policy_fixture @@ -171,10 +170,9 @@ class BootFromVolumeLargeRequestTest(test.TestCase, super(BootFromVolumeLargeRequestTest, self).setUp() self.useFixture(policy_fixture.RealPolicyFixture()) self.useFixture(nova_fixtures.NeutronFixture(self)) + self.glance = self.useFixture(nova_fixtures.GlanceFixture(self)) self.useFixture(nova_fixtures.CinderFixture(self)) self.useFixture(func_fixtures.PlacementFixture()) - self.image_service = fake_image.stub_out_image_service(self) - self.addCleanup(fake_image.FakeImageService_reset) self.api = self.useFixture(nova_fixtures.OSAPIFixture( api_version='v2.1')).admin_api @@ -216,7 +214,7 @@ class BootFromVolumeLargeRequestTest(test.TestCase, # Wrap the image service get method to check how many times it was # called. with mock.patch('nova.image.glance.API.get', - wraps=self.image_service.show) as mock_image_get: + wraps=self.glance.show) as mock_image_get: self.api.post_server({'server': server}) # Assert that there was caching of the GET /v2/images/{image_id} # calls. The expected total in this case is 3: one for validating diff --git a/nova/tests/functional/test_cross_az_attach.py b/nova/tests/functional/test_cross_az_attach.py index 95ecf38268d7..3cf640201582 100644 --- a/nova/tests/functional/test_cross_az_attach.py +++ b/nova/tests/functional/test_cross_az_attach.py @@ -17,7 +17,6 @@ from nova.tests import fixtures as nova_fixtures from nova.tests.functional.api import client as api_client from nova.tests.functional import fixtures as func_fixtures from nova.tests.functional import integrated_helpers -from nova.tests.unit.image import fake as fake_image from nova.tests.unit import policy_fixture @@ -34,10 +33,9 @@ class CrossAZAttachTestCase(test.TestCase, # Use the standard fixtures. self.useFixture(policy_fixture.RealPolicyFixture()) self.useFixture(nova_fixtures.CinderFixture(self, az=self.az)) + self.useFixture(nova_fixtures.GlanceFixture(self)) self.useFixture(nova_fixtures.NeutronFixture(self)) self.useFixture(func_fixtures.PlacementFixture()) - fake_image.stub_out_image_service(self) - self.addCleanup(fake_image.FakeImageService_reset) # Start nova controller services. self.api = self.useFixture(nova_fixtures.OSAPIFixture( api_version='v2.1')).admin_api diff --git a/nova/tests/functional/test_cross_cell_migrate.py b/nova/tests/functional/test_cross_cell_migrate.py index f2064afdc93a..97dbb1039063 100644 --- a/nova/tests/functional/test_cross_cell_migrate.py +++ b/nova/tests/functional/test_cross_cell_migrate.py @@ -177,8 +177,8 @@ class TestMultiCellMigrate(integrated_helpers.ProviderUsageBaseTestCase): return server def stub_image_create(self): - """Stubs the _FakeImageService.create method to track created images""" - original_create = self.image_service.create + """Stubs the GlanceFixture.create method to track created images""" + original_create = self.glance.create def image_create_snooper(*args, **kwargs): image = original_create(*args, **kwargs) @@ -186,7 +186,7 @@ class TestMultiCellMigrate(integrated_helpers.ProviderUsageBaseTestCase): return image _p = mock.patch.object( - self.image_service, 'create', side_effect=image_create_snooper) + self.glance, 'create', side_effect=image_create_snooper) _p.start() self.addCleanup(_p.stop) diff --git a/nova/tests/functional/test_external_networks.py b/nova/tests/functional/test_external_networks.py index 5bb901acb26c..2dccc70aa8c7 100644 --- a/nova/tests/functional/test_external_networks.py +++ b/nova/tests/functional/test_external_networks.py @@ -18,7 +18,6 @@ from nova import test from nova.tests import fixtures as nova_fixtures from nova.tests.functional import fixtures as func_fixtures from nova.tests.functional import integrated_helpers -from nova.tests.unit.image import fake as fake_image from nova.tests.unit import policy_fixture @@ -32,8 +31,7 @@ class TestNeutronExternalNetworks(test.TestCase, # Use the standard fixtures. self.useFixture(policy_fixture.RealPolicyFixture()) self.useFixture(func_fixtures.PlacementFixture()) - fake_image.stub_out_image_service(self) - self.addCleanup(fake_image.FakeImageService_reset) + self.useFixture(nova_fixtures.GlanceFixture(self)) neutron = self.useFixture(nova_fixtures.NeutronFixture(self)) self._setup_external_network(neutron) # Start nova controller services. diff --git a/nova/tests/functional/test_instance_actions.py b/nova/tests/functional/test_instance_actions.py index 23ea37d3196d..b8abbff34808 100644 --- a/nova/tests/functional/test_instance_actions.py +++ b/nova/tests/functional/test_instance_actions.py @@ -22,7 +22,6 @@ from nova.tests import fixtures as nova_fixtures from nova.tests.functional.api import client from nova.tests.functional import fixtures as func_fixtures from nova.tests.functional import integrated_helpers -from nova.tests.unit.image import fake as fake_image from nova.tests.unit import policy_fixture @@ -73,8 +72,7 @@ class InstanceActionEventFaultsTestCase( def setUp(self): super(InstanceActionEventFaultsTestCase, self).setUp() # Setup the standard fixtures. - fake_image.stub_out_image_service(self) - self.addCleanup(fake_image.FakeImageService_reset) + self.useFixture(nova_fixtures.GlanceFixture(self)) self.useFixture(nova_fixtures.NeutronFixture(self)) self.useFixture(func_fixtures.PlacementFixture()) self.useFixture(policy_fixture.RealPolicyFixture()) diff --git a/nova/tests/functional/test_list_servers_ip_filter.py b/nova/tests/functional/test_list_servers_ip_filter.py index 375059487eae..948433e72a7d 100644 --- a/nova/tests/functional/test_list_servers_ip_filter.py +++ b/nova/tests/functional/test_list_servers_ip_filter.py @@ -14,13 +14,10 @@ import time -import nova.scheduler.utils -import nova.servicegroup from nova import test from nova.tests import fixtures as nova_fixtures from nova.tests.functional import fixtures as func_fixtures from nova.tests.unit import cast_as_call -import nova.tests.unit.image.fake from nova.tests.unit import policy_fixture @@ -29,17 +26,14 @@ class TestListServersIpFilter(test.TestCase): def setUp(self): super(TestListServersIpFilter, self).setUp() self.useFixture(policy_fixture.RealPolicyFixture()) - self.neutron = self.useFixture( - nova_fixtures.NeutronFixture(self)) + self.useFixture(nova_fixtures.GlanceFixture(self)) + self.neutron = self.useFixture(nova_fixtures.NeutronFixture(self)) # Add a 2nd port to the neutron fixture to have multiple ports self.neutron.create_port({'port': self.neutron.port_2}) api_fixture = self.useFixture(nova_fixtures.OSAPIFixture( api_version='v2.1')) self.api = api_fixture.api - # the image fake backend needed for image discovery - nova.tests.unit.image.fake.stub_out_image_service(self) - self.useFixture(func_fixtures.PlacementFixture()) self.start_service('conductor') diff --git a/nova/tests/functional/test_metadata.py b/nova/tests/functional/test_metadata.py index bc5b680a2cd2..bfee80cb3b27 100644 --- a/nova/tests/functional/test_metadata.py +++ b/nova/tests/functional/test_metadata.py @@ -24,7 +24,6 @@ from nova import test from nova.tests import fixtures as nova_fixtures from nova.tests.functional import fixtures as func_fixtures from nova.tests.functional import integrated_helpers -from nova.tests.unit.image import fake as fake_image class fake_result(object): @@ -50,8 +49,7 @@ class MetadataTest(test.TestCase, integrated_helpers.InstanceHelperMixin): def setUp(self): super(MetadataTest, self).setUp() - fake_image.stub_out_image_service(self) - self.addCleanup(fake_image.FakeImageService_reset) + self.useFixture(nova_fixtures.GlanceFixture(self)) self.useFixture(nova_fixtures.NeutronFixture(self)) self.useFixture(func_fixtures.PlacementFixture()) self.start_service('conductor') diff --git a/nova/tests/functional/test_nova_manage.py b/nova/tests/functional/test_nova_manage.py index b46c0b6fa409..8c81ac1cf34f 100644 --- a/nova/tests/functional/test_nova_manage.py +++ b/nova/tests/functional/test_nova_manage.py @@ -29,7 +29,6 @@ from nova.tests import fixtures as nova_fixtures from nova.tests.functional import fixtures as func_fixtures from nova.tests.functional import integrated_helpers from nova.tests.functional import test_servers -from nova.tests.unit.image import fake as image_fake CONF = config.CONF INCOMPLETE_CONSUMER_ID = '00000000-0000-0000-0000-000000000000' @@ -1814,6 +1813,7 @@ class TestDBArchiveDeletedRowsMultiCell(integrated_helpers.InstanceHelperMixin, def setUp(self): super(TestDBArchiveDeletedRowsMultiCell, self).setUp() self.useFixture(nova_fixtures.NeutronFixture(self)) + self.useFixture(nova_fixtures.GlanceFixture(self)) self.useFixture(func_fixtures.PlacementFixture()) api_fixture = self.useFixture(nova_fixtures.OSAPIFixture( @@ -1821,9 +1821,6 @@ class TestDBArchiveDeletedRowsMultiCell(integrated_helpers.InstanceHelperMixin, # We need the admin api to forced_host for server create self.api = api_fixture.admin_api - image_fake.stub_out_image_service(self) - self.addCleanup(image_fake.FakeImageService_reset) - self.start_service('conductor') self.start_service('scheduler') diff --git a/nova/tests/functional/test_policy.py b/nova/tests/functional/test_policy.py index 6f08c6432874..4d6344c318ad 100644 --- a/nova/tests/functional/test_policy.py +++ b/nova/tests/functional/test_policy.py @@ -19,7 +19,6 @@ from nova import test from nova.tests import fixtures as nova_fixtures from nova.tests.functional import fixtures as func_fixtures from nova.tests.functional import integrated_helpers -from nova.tests.unit.image import fake as fake_image from nova.tests.unit import policy_fixture from nova import utils @@ -35,8 +34,7 @@ class HostStatusPolicyTestCase(test.TestCase, def setUp(self): super(HostStatusPolicyTestCase, self).setUp() # Setup the standard fixtures. - fake_image.stub_out_image_service(self) - self.addCleanup(fake_image.FakeImageService_reset) + self.useFixture(nova_fixtures.GlanceFixture(self)) self.useFixture(nova_fixtures.NeutronFixture(self)) self.useFixture(func_fixtures.PlacementFixture()) self.useFixture(policy_fixture.RealPolicyFixture()) diff --git a/nova/tests/functional/test_scheduler.py b/nova/tests/functional/test_scheduler.py index 47667d250108..fd0363a839b1 100644 --- a/nova/tests/functional/test_scheduler.py +++ b/nova/tests/functional/test_scheduler.py @@ -16,7 +16,6 @@ from nova.tests import fixtures as nova_fixtures from nova.tests.functional import fixtures as func_fixtures from nova.tests.functional import integrated_helpers from nova.tests.unit import fake_network -import nova.tests.unit.image.fake as fake_image from nova.tests.unit import policy_fixture CELL1_NAME = 'cell1' @@ -32,6 +31,7 @@ class MultiCellSchedulerTestCase(test.TestCase, super(MultiCellSchedulerTestCase, self).setUp() self.useFixture(policy_fixture.RealPolicyFixture()) self.useFixture(nova_fixtures.NeutronFixture(self)) + self.useFixture(nova_fixtures.GlanceFixture(self)) self.useFixture(nova_fixtures.AllServicesCurrent()) self.useFixture(func_fixtures.PlacementFixture()) api_fixture = self.useFixture(nova_fixtures.OSAPIFixture( @@ -46,8 +46,6 @@ class MultiCellSchedulerTestCase(test.TestCase, group='filter_scheduler') self.start_service('conductor') self.start_service('scheduler') - fake_image.stub_out_image_service(self) - self.addCleanup(fake_image.FakeImageService_reset) def _test_create_and_migrate(self, expected_status, az=None): server = self._create_server(az=az) diff --git a/nova/tests/functional/test_server_faults.py b/nova/tests/functional/test_server_faults.py index 80e998d466af..237fb10c3dc2 100644 --- a/nova/tests/functional/test_server_faults.py +++ b/nova/tests/functional/test_server_faults.py @@ -16,7 +16,6 @@ from nova import test from nova.tests import fixtures as nova_fixtures from nova.tests.functional import fixtures as func_fixtures from nova.tests.functional import integrated_helpers -from nova.tests.unit.image import fake as fake_image from nova.tests.unit import policy_fixture @@ -31,11 +30,9 @@ class ServerFaultTestCase(test.TestCase, def setUp(self): super(ServerFaultTestCase, self).setUp() - # Setup the standard fixtures. - fake_image.stub_out_image_service(self) - self.addCleanup(fake_image.FakeImageService_reset) self.useFixture(nova_fixtures.NeutronFixture(self)) self.useFixture(func_fixtures.PlacementFixture()) + self.useFixture(nova_fixtures.GlanceFixture(self)) self.useFixture(policy_fixture.RealPolicyFixture()) # Start the compute services. diff --git a/nova/tests/functional/test_server_group.py b/nova/tests/functional/test_server_group.py index 6cc6c5d131e1..f46bd633a749 100644 --- a/nova/tests/functional/test_server_group.py +++ b/nova/tests/functional/test_server_group.py @@ -30,10 +30,6 @@ from nova.tests.unit import policy_fixture from nova import utils from nova.virt import fake -import nova.scheduler.utils -import nova.servicegroup -import nova.tests.unit.image.fake - # An alternate project id PROJECT_ID_ALT = "616c6c796f7572626173656172656f73" @@ -67,6 +63,7 @@ class ServerGroupTestBase(test.TestCase, group='filter_scheduler') self.useFixture(policy_fixture.RealPolicyFixture()) + self.useFixture(nova_fixtures.GlanceFixture(self)) self.useFixture(nova_fixtures.NeutronFixture(self)) self.useFixture(func_fixtures.PlacementFixture()) @@ -78,14 +75,9 @@ class ServerGroupTestBase(test.TestCase, self.admin_api = api_fixture.admin_api self.admin_api.microversion = self.microversion - # the image fake backend needed for image discovery - nova.tests.unit.image.fake.stub_out_image_service(self) - self.start_service('conductor') self.start_service('scheduler') - self.addCleanup(nova.tests.unit.image.fake.FakeImageService_reset) - def _boot_a_server_to_group(self, group, expected_status='ACTIVE', flavor=None, az=None): @@ -975,15 +967,15 @@ class TestAntiAffinityLiveMigration(test.TestCase, # Setup common fixtures. self.useFixture(policy_fixture.RealPolicyFixture()) self.useFixture(nova_fixtures.NeutronFixture(self)) + self.useFixture(nova_fixtures.GlanceFixture(self)) self.useFixture(func_fixtures.PlacementFixture()) + # Setup API. api_fixture = self.useFixture(nova_fixtures.OSAPIFixture( api_version='v2.1')) self.api = api_fixture.api self.admin_api = api_fixture.admin_api - # Fake out glance. - nova.tests.unit.image.fake.stub_out_image_service(self) - self.addCleanup(nova.tests.unit.image.fake.FakeImageService_reset) + # Start conductor, scheduler and two computes. self.start_service('conductor') self.start_service('scheduler') diff --git a/nova/tests/functional/test_servers.py b/nova/tests/functional/test_servers.py index 994f40367d34..dd528640560e 100644 --- a/nova/tests/functional/test_servers.py +++ b/nova/tests/functional/test_servers.py @@ -49,7 +49,6 @@ from nova.tests.unit.api.openstack import fakes from nova.tests.unit import fake_block_device from nova.tests.unit import fake_notifier from nova.tests.unit import fake_requests -from nova.tests.unit.image import fake as fake_image from nova.tests.unit.objects import test_instance_info_cache from nova import utils as nova_utils from nova.virt import fake @@ -1343,7 +1342,7 @@ class ServerRebuildTestCase(integrated_helpers._IntegratedTestBase): # Now update the image metadata to be something that won't work with # the fake compute driver we're using since the fake driver has an # "x86_64" architecture. - rebuild_image_ref = fake_image.AUTO_DISK_CONFIG_ENABLED_IMAGE_UUID + rebuild_image_ref = self.glance.auto_disk_config_enabled_image['id'] self.api.put_image_meta_key( rebuild_image_ref, 'hw_architecture', 'unicore32') # Now rebuild the server with that updated image and it should result @@ -1456,7 +1455,7 @@ class ServerRebuildTestCase(integrated_helpers._IntegratedTestBase): allocs = allocs[rp_uuid]['resources'] assertFlavorMatchesAllocation(flavor, allocs) - rebuild_image_ref = fake_image.AUTO_DISK_CONFIG_ENABLED_IMAGE_UUID + rebuild_image_ref = self.glance.auto_disk_config_enabled_image['id'] # Now rebuild the server with a different image. rebuild_req_body = { 'rebuild': { @@ -1508,7 +1507,7 @@ class ServerRebuildTestCase(integrated_helpers._IntegratedTestBase): # Now rebuild the server with a different image than was used to create # our fake volume. - rebuild_image_ref = fake_image.AUTO_DISK_CONFIG_ENABLED_IMAGE_UUID + rebuild_image_ref = self.glance.auto_disk_config_enabled_image['id'] rebuild_req_body = { 'rebuild': { 'imageRef': rebuild_image_ref @@ -8190,7 +8189,7 @@ class AcceleratorServerOpsTest(AcceleratorServerBase): self.assertEqual(evac_hostname, arqs_new[0]['hostname']) def test_rebuild_ok(self): - rebuild_image_ref = fake_image.AUTO_DISK_CONFIG_ENABLED_IMAGE_UUID + rebuild_image_ref = self.glance.auto_disk_config_enabled_image['id'] self.api.post_server_action(self.server['id'], {'rebuild': { 'imageRef': rebuild_image_ref, @@ -8248,7 +8247,8 @@ class AcceleratorServerOpsTest(AcceleratorServerBase): rebuild so OpenStackApiException is raised. """ old_compute_version.return_value = 52 - rebuild_image_ref = fake_image.AUTO_DISK_CONFIG_ENABLED_IMAGE_UUID + rebuild_image_ref = self.glance.auto_disk_config_enabled_image['id'] + ex = self.assertRaises(client.OpenStackApiException, self.api.post_server_action, self.server['id'], {'rebuild': { diff --git a/nova/tests/functional/test_service.py b/nova/tests/functional/test_service.py index c046772cd2b3..962245cf7077 100644 --- a/nova/tests/functional/test_service.py +++ b/nova/tests/functional/test_service.py @@ -15,7 +15,6 @@ from nova import test from nova.tests import fixtures as nova_fixtures from nova.tests.functional import fixtures as func_fixtures from nova.tests.functional import integrated_helpers -from nova.tests.unit.image import fake as fake_image from nova.tests.unit import policy_fixture @@ -29,9 +28,9 @@ class ServiceTestCase(test.TestCase, # Use the standard fixtures. self.useFixture(policy_fixture.RealPolicyFixture()) self.useFixture(nova_fixtures.NeutronFixture(self)) + self.useFixture(nova_fixtures.GlanceFixture(self)) self.useFixture(func_fixtures.PlacementFixture()) - fake_image.stub_out_image_service(self) - self.addCleanup(fake_image.FakeImageService_reset) + # Start nova controller services. self.api = self.useFixture(nova_fixtures.OSAPIFixture( api_version='v2.1')).api diff --git a/nova/tests/functional/wsgi/test_secgroup.py b/nova/tests/functional/wsgi/test_secgroup.py index 19e7e954a484..24c92507acb6 100644 --- a/nova/tests/functional/wsgi/test_secgroup.py +++ b/nova/tests/functional/wsgi/test_secgroup.py @@ -17,7 +17,6 @@ import testscenarios from nova import test from nova.tests import fixtures as nova_fixtures -import nova.tests.unit.image.fake from nova.tests.unit import policy_fixture LOG = logging.getLogger(__name__) @@ -46,13 +45,11 @@ class SecgroupsFullstack(testscenarios.WithScenarios, test.TestCase): def setUp(self): super(SecgroupsFullstack, self).setUp() self.useFixture(policy_fixture.RealPolicyFixture()) + self.useFixture(nova_fixtures.GlanceFixture(self)) api_fixture = self.useFixture(nova_fixtures.OSAPIFixture()) self.api = api_fixture.api - # the image fake backend needed for image discovery - nova.tests.unit.image.fake.stub_out_image_service(self) - # TODO(sdague): refactor this method into the API client, we're # going to use it a lot def _build_minimal_create_server_request(self, name): diff --git a/nova/tests/functional/wsgi/test_servers.py b/nova/tests/functional/wsgi/test_servers.py index 0ca2bcb12d02..8dd7ef03ddef 100644 --- a/nova/tests/functional/wsgi/test_servers.py +++ b/nova/tests/functional/wsgi/test_servers.py @@ -19,7 +19,6 @@ from nova.tests import fixtures as nova_fixtures from nova.tests.functional.api import client as api_client from nova.tests.functional import fixtures as func_fixtures from nova.tests.functional import integrated_helpers -from nova.tests.unit.image import fake as fake_image from nova.tests.unit import policy_fixture @@ -43,9 +42,9 @@ class ServersPreSchedulingTestCase(test.TestCase, def setUp(self): super(ServersPreSchedulingTestCase, self).setUp() - fake_image.stub_out_image_service(self) self.useFixture(policy_fixture.RealPolicyFixture()) self.useFixture(nova_fixtures.NoopConductorFixture()) + self.glance = self.useFixture(nova_fixtures.GlanceFixture(self)) self.useFixture(nova_fixtures.NeutronFixture(self)) self.useFixture(func_fixtures.PlacementFixture()) api_fixture = self.useFixture(nova_fixtures.OSAPIFixture( @@ -58,7 +57,7 @@ class ServersPreSchedulingTestCase(test.TestCase, def test_instance_from_buildrequest(self): self.useFixture(nova_fixtures.AllServicesCurrent()) - image_ref = fake_image.get_valid_image_id() + image_ref = self.glance.auto_disk_config_enabled_image['id'] body = { 'server': { 'name': 'foo', @@ -89,7 +88,7 @@ class ServersPreSchedulingTestCase(test.TestCase, self.assertEqual('BUILD', server['status']) def test_instance_from_buildrequest_old_service(self): - image_ref = fake_image.get_valid_image_id() + image_ref = self.glance.auto_disk_config_enabled_image['id'] body = { 'server': { 'name': 'foo', @@ -120,7 +119,7 @@ class ServersPreSchedulingTestCase(test.TestCase, def test_delete_instance_from_buildrequest(self): self.useFixture(nova_fixtures.AllServicesCurrent()) - image_ref = fake_image.get_valid_image_id() + image_ref = self.glance.auto_disk_config_enabled_image['id'] body = { 'server': { 'name': 'foo', @@ -137,7 +136,7 @@ class ServersPreSchedulingTestCase(test.TestCase, self.assertEqual(404, get_resp.status) def test_delete_instance_from_buildrequest_old_service(self): - image_ref = fake_image.get_valid_image_id() + image_ref = self.glance.auto_disk_config_enabled_image['id'] body = { 'server': { 'name': 'foo', @@ -154,7 +153,7 @@ class ServersPreSchedulingTestCase(test.TestCase, self.assertEqual(404, get_resp.status) def _test_instance_list_from_buildrequests(self): - image_ref = fake_image.get_valid_image_id() + image_ref = self.glance.auto_disk_config_enabled_image['id'] body = { 'server': { 'name': 'foo', @@ -198,7 +197,7 @@ class ServersPreSchedulingTestCase(test.TestCase, used to test the various tags filters working in the BuildRequestList. """ self.useFixture(nova_fixtures.AllServicesCurrent()) - image_ref = fake_image.get_valid_image_id() + image_ref = self.glance.auto_disk_config_enabled_image['id'] body = { 'server': { 'name': 'foo', @@ -297,7 +296,7 @@ class ServersPreSchedulingTestCase(test.TestCase, body = { 'server': { 'name': 'test_instance_list_build_request_marker_ip_filter', - 'imageRef': fake_image.get_valid_image_id(), + 'imageRef': self.glance.auto_disk_config_enabled_image['id'], 'flavorRef': '1', 'networks': 'none' } @@ -324,8 +323,7 @@ class EnforceVolumeBackedForZeroDiskFlavorTestCase( def setUp(self): super(EnforceVolumeBackedForZeroDiskFlavorTestCase, self).setUp() - fake_image.stub_out_image_service(self) - self.addCleanup(fake_image.FakeImageService_reset) + self.glance = self.useFixture(nova_fixtures.GlanceFixture(self)) self.useFixture(nova_fixtures.NeutronFixture(self)) self.policy_fixture = ( self.useFixture(policy_fixture.RealPolicyFixture())) @@ -354,7 +352,7 @@ class EnforceVolumeBackedForZeroDiskFlavorTestCase( servers_policies.ZERO_DISK_FLAVOR: base_policies.RULE_ADMIN_API}, overwrite=False) server_req = self._build_server( - image_uuid=fake_image.AUTO_DISK_CONFIG_ENABLED_IMAGE_UUID, + image_uuid=self.glance.auto_disk_config_enabled_image['id'], flavor_id=self.zero_disk_flavor['id']) ex = self.assertRaises(api_client.OpenStackApiException, self.api.post_server, {'server': server_req}) diff --git a/nova/tests/unit/test_fixtures.py b/nova/tests/unit/test_fixtures.py index d38815f247c3..fbc7a3f6a13e 100644 --- a/nova/tests/unit/test_fixtures.py +++ b/nova/tests/unit/test_fixtures.py @@ -15,6 +15,8 @@ # under the License. import copy +import datetime +import io import fixtures as fx import futurist @@ -564,3 +566,101 @@ class TestNeutronFixture(test.NoDBTestCase): port_id = self.neutron.port_with_resource_request['id'] ports = [port for port in ports if port_id == port['id']] self.assertIsNotNone(ports[0]['resource_request']) + + +class TestGlanceFixture(test.NoDBTestCase): + def setUp(self): + super().setUp() + self.image_service = self.useFixture(fixtures.GlanceFixture(self)) + self.context = context.get_admin_context() + + def test_detail(self): + res = self.image_service.detail(self.context) + for image in res: + self.assertEqual( + set(image.keys()), + { + 'id', 'name', 'created_at', 'updated_at', 'deleted_at', + 'deleted', 'status', 'is_public', 'properties', + 'disk_format', 'container_format', 'size', 'min_disk', + 'min_ram', 'protected', 'tags', 'visibility', + }, + ) + self.assertIsInstance(image['created_at'], datetime.datetime) + self.assertIsInstance(image['updated_at'], datetime.datetime) + + if not ( + isinstance(image['deleted_at'], datetime.datetime) or + image['deleted_at'] is None + ): + self.fail( + "image's 'deleted_at' attribute was neither a datetime " + "object nor None" + ) + + def check_is_bool(image, key): + val = image.get('deleted') + if not isinstance(val, bool): + self.fail( + "image's '%s' attribute wasn't a bool: %r" % (key, val) + ) + + check_is_bool(image, 'deleted') + check_is_bool(image, 'is_public') + + def test_show_raises_imagenotfound_for_invalid_id(self): + self.assertRaises( + exception.ImageNotFound, + self.image_service.show, + self.context, 'this image does not exist') + + def test_create_adds_id(self): + index = self.image_service.detail(self.context) + image_count = len(index) + + self.image_service.create(self.context, {}) + + index = self.image_service.detail(self.context) + self.assertEqual(len(index), image_count + 1) + self.assertTrue(index[0]['id']) + + def test_create_keeps_id(self): + self.image_service.create(self.context, {'id': '34'}) + self.image_service.show(self.context, '34') + + def test_create_rejects_duplicate_ids(self): + self.image_service.create(self.context, {'id': '34'}) + self.assertRaises( + exception.CouldNotUploadImage, + self.image_service.create, + self.context, {'id': '34'}) + + # Make sure there's still one left + self.image_service.show(self.context, '34') + + def test_update(self): + self.image_service.create( + self.context, {'id': '34', 'foo': 'bar'}) + + self.image_service.update( + self.context, '34', {'id': '34', 'foo': 'baz'}) + + img = self.image_service.show(self.context, '34') + self.assertEqual(img['foo'], 'baz') + + def test_delete(self): + self.image_service.create(self.context, {'id': '34', 'foo': 'bar'}) + self.image_service.delete(self.context, '34') + self.assertRaises( + exception.NotFound, + self.image_service.show, + self.context, '34') + + def test_create_then_get(self): + blob = 'some data' + s1 = io.StringIO(blob) + self.image_service.create( + self.context, {'id': '32', 'foo': 'bar'}, data=s1) + s2 = io.StringIO() + self.image_service.download(self.context, '32', data=s2) + self.assertEqual(s2.getvalue(), blob, 'Did not get blob back intact')