Merge "[Service] Port all glanceWrapper to image_service"

This commit is contained in:
Jenkins
2017-03-31 13:07:14 +00:00
committed by Gerrit Code Review
18 changed files with 193 additions and 172 deletions

View File

@@ -23,7 +23,7 @@ from rally.common import logging
from rally import consts
from rally.plugins.openstack.cleanup import base
from rally.plugins.openstack.services.identity import identity
from rally.plugins.openstack.wrappers import glance as glance_wrapper
from rally.plugins.openstack.services.image import image
from rally.task import utils as task_utils
CONF = cfg.CONF
@@ -510,21 +510,18 @@ class ManilaSecurityService(base.ResourceManager):
class GlanceImage(base.ResourceManager):
def _client(self):
return getattr(self.admin or self.user, self._service)
def _wrapper(self):
return glance_wrapper.wrap(self._client(), self)
return image.Image(self.admin or self.user)
def list(self):
return self._wrapper().list_images(owner=self.tenant_uuid)
return self._client().list_images(owner=self.tenant_uuid)
def delete(self):
client = self._client()
client().images.delete(self.raw_resource.id)
client.delete_image(self.raw_resource.id)
task_utils.wait_for_status(
self.raw_resource, ["deleted"],
check_deletion=True,
update_resource=self._wrapper().get_image,
update_resource=self._client().get_image,
timeout=CONF.benchmark.glance_image_delete_timeout,
check_interval=CONF.benchmark.glance_image_delete_poll_interval)

View File

@@ -19,9 +19,9 @@ from rally.common import logging
from rally.common import utils as rutils
from rally import consts
from rally import osclients
from rally.plugins.openstack.cleanup import manager as resource_manager
from rally.plugins.openstack.services.image import image
from rally.task import context
from rally.task import utils
CONF = cfg.CONF
CONF.import_opt("glance_image_delete_timeout",
@@ -170,20 +170,9 @@ class ImageGenerator(context.Context):
@logging.log_task_wrapper(LOG.info, _("Exit context: `Images`"))
def cleanup(self):
for user, tenant_id in rutils.iterate_per_tenants(
self.context["users"]):
clients = osclients.Clients(
user["credential"],
api_info=self.context["config"].get("api_versions"))
image_service = image.Image(clients)
for image_id in self.context["tenants"][tenant_id].get(
"images", []):
image_service.delete_image(image_id=image_id)
utils.wait_for_status(
image_service.get_image(image_id=image_id),
["deleted", "pending_delete"],
check_deletion=True,
update_resource=image_service.get_image,
timeout=CONF.benchmark.glance_image_delete_timeout,
check_interval=CONF.benchmark.
glance_image_delete_poll_interval)
resource_manager.cleanup(names=["glance.images"],
users=self.context.get("users", []),
api_versions=self.context["config"].get(
"api_versions"),
superclass=self.__class__,
task_id=self.context["task"]["uuid"])

View File

@@ -19,8 +19,8 @@ from rally import consts
from rally import exceptions
from rally import osclients
from rally.plugins.openstack.cleanup import manager as resource_manager
from rally.plugins.openstack.scenarios.glance import utils as glance_utils
from rally.plugins.openstack.scenarios.sahara import utils
from rally.plugins.openstack.services.image import image as image_services
from rally.task import context
@@ -63,16 +63,17 @@ class SaharaImage(context.Context):
def _create_image(self, hadoop_version, image_url, plugin_name, user,
user_name):
scenario = glance_utils.GlanceScenario(
{"user": user, "task": self.context["task"]})
image_name = self.generate_random_name()
image = scenario._create_image(name=image_name,
container_format="bare",
image_location=image_url,
disk_format="qcow2")
scenario.clients("sahara").images.update_image(
clients = osclients.Clients(
user["credential"],
api_info=self.context["config"].get("api_versions"))
image_service = image_services.Image(
clients, name_generator=self.generate_random_name)
image = image_service.create_image(container_format="bare",
image_location=image_url,
disk_format="qcow2")
clients.sahara().images.update_image(
image_id=image.id, user_name=user_name, desc="")
scenario.clients("sahara").images.update_tags(
clients.sahara().images.update_tags(
image_id=image.id, new_tags=[plugin_name, hadoop_version])
return image.id
@@ -128,5 +129,5 @@ class SaharaImage(context.Context):
if self.context["sahara"]["need_image_cleanup"]:
resource_manager.cleanup(names=["glance.images"],
users=self.context.get("users", []),
superclass=glance_utils.GlanceScenario,
superclass=self.__class__,
task_id=self.context["task"]["uuid"])

View File

@@ -20,7 +20,7 @@ from rally import consts
from rally import exceptions
from rally.plugins.openstack import scenario
from rally.plugins.openstack.scenarios.cinder import utils as cinder_utils
from rally.plugins.openstack.scenarios.glance import utils as glance_utils
from rally.plugins.openstack.scenarios.glance import images
from rally.plugins.openstack.scenarios.nova import utils as nova_utils
from rally.task import atomic
from rally.task import types
@@ -549,8 +549,7 @@ class CreateNestedSnapshotsAndAttachVolume(cinder_utils.CinderBasic,
@scenario.configure(context={"cleanup": ["cinder"]},
name="CinderVolumes.create_and_list_snapshots")
class CreateAndListSnapshots(cinder_utils.CinderBasic,
nova_utils.NovaScenario,
glance_utils.GlanceScenario):
nova_utils.NovaScenario):
def run(self, force=False, detailed=True, **kwargs):
"""Create and then list a volume-snapshot.
@@ -574,7 +573,7 @@ class CreateAndListSnapshots(cinder_utils.CinderBasic,
@scenario.configure(context={"cleanup": ["cinder", "glance"]},
name="CinderVolumes.create_and_upload_volume_to_image")
class CreateAndUploadVolumeToImage(cinder_utils.CinderBasic,
glance_utils.GlanceScenario):
images.GlanceBasic):
def run(self, size, image=None, force=False, container_format="bare",
disk_format="raw", do_delete=True, **kwargs):
@@ -601,7 +600,7 @@ class CreateAndUploadVolumeToImage(cinder_utils.CinderBasic,
if do_delete:
self.cinder.delete_volume(volume)
self._delete_image(image)
self.glance.delete_image(image.id)
@validation.restricted_parameters(["name", "display_name"],

View File

@@ -15,6 +15,8 @@
from oslo_config import cfg
from rally.common.i18n import _
from rally.common import logging
from rally.plugins.openstack import scenario
from rally.plugins.openstack.wrappers import glance as glance_wrapper
from rally.task import atomic
@@ -33,11 +35,20 @@ GLANCE_BENCHMARK_OPTS = [
CONF = cfg.CONF
benchmark_group = cfg.OptGroup(name="benchmark", title="benchmark options")
CONF.register_opts(GLANCE_BENCHMARK_OPTS, group=benchmark_group)
LOG = logging.getLogger(__name__)
class GlanceScenario(scenario.OpenStackScenario):
"""Base class for Glance scenarios with basic atomic actions."""
def __init__(self, context=None, admin_clients=None, clients=None):
super(GlanceScenario, self).__init__(context, admin_clients, clients)
LOG.warning(_(
"Class %s is deprecated since Rally 0.10.0 and will be removed "
"soon. Use "
"rally.plugins.openstack.services.image.image.Image "
"instead.") % self.__class__)
@atomic.action_timer("glance.list_images")
def _list_images(self):
"""Returns user images list."""

View File

@@ -92,13 +92,15 @@ class GlanceV1Service(service.Service):
raise exceptions.GetResourceNotFound(resource=image)
@atomic.action_timer("glance_v1.list_images")
def list_images(self, status="active", is_public=None):
def list_images(self, status="active", is_public=None, owner=None):
"""List images.
:param status: Filter in images for the specified status
:param is_public: Filter in images for the specified public status
:param owner: Filter in images for tenant ID
"""
images = self._clients.glance("1").images.list(status=status)
images = self._clients.glance("1").images.list(status=status,
owner=owner)
if is_public in [True, False]:
return [i for i in images if i.is_public is is_public]
return images
@@ -156,11 +158,12 @@ class UnifiedGlanceV1Service(image.Image):
min_ram=min_ram)
return self._unify_image(image_obj)
def list_images(self, status="active", visibility=None):
def list_images(self, status="active", visibility=None, owner=None):
"""List images.
:param status: Filter in images for the specified status
:param visibility: Filter in images for the specified visibility
:param owner: Filter in images for tenant ID
"""
self._check_v1_visibility(visibility)

View File

@@ -104,17 +104,20 @@ class GlanceV2Service(service.Service):
raise exceptions.GetResourceNotFound(resource=image)
@atomic.action_timer("glance_v2.list_images")
def list_images(self, status="active", visibility=None):
def list_images(self, status="active", visibility=None, owner=None):
"""List images.
:param status: Filter in images for the specified status
:param visibility: Filter in images for the specified visibility
:param owner: Filter in images for tenant ID
"""
kwargs = {}
kwargs["status"] = status
filters = {}
filters["status"] = status
if visibility:
kwargs["visibility"] = visibility
images = self._clients.glance("2").images.list(**kwargs)
filters["visibility"] = visibility
if owner:
filters["owner"] = owner
images = self._clients.glance("2").images.list(filters=filters)
return images
@atomic.action_timer("glance_v2.set_visibility")
@@ -168,11 +171,12 @@ class UnifiedGlanceV2Service(image.Image):
min_ram=min_ram)
return self._unify_image(image_obj)
def list_images(self, status="active", visibility=None):
def list_images(self, status="active", visibility=None, owner=None):
"""List images.
:param status: Filter in images for the specified status
:param visibility: Filter in images for the specified visibility
:param owner: Filter in images for tenant ID
"""
self._check_v2_visibility(visibility)

View File

@@ -83,13 +83,16 @@ class Image(service.UnifiedOpenStackService):
return image
@service.should_be_overridden
def list_images(self, status="active", visibility=None):
def list_images(self, status="active", visibility=None, owner=None):
"""List images.
:param status: Filter in images for the specified status
:param visibility: Filter in images for the specified visibility
:param owner: Filter in images for tenant ID
"""
return self._impl.list_images(status=status, visibility=visibility)
return self._impl.list_images(status=status,
visibility=visibility,
owner=owner)
@service.should_be_overridden
def set_visibility(self, image_id, visibility="public"):

View File

@@ -22,8 +22,8 @@ from six.moves import configparser
from rally.common.i18n import _
from rally.common import logging
from rally import exceptions
from rally.plugins.openstack.services.image import image
from rally.plugins.openstack.verification.tempest import config as conf
from rally.plugins.openstack.wrappers import glance
from rally.plugins.openstack.wrappers import network
from rally.task import utils as task_utils
from rally.verification import context
@@ -156,15 +156,15 @@ class TempestContext(context.VerifierContext):
LOG.debug("Trying to discover a public image with name matching "
"regular expression '%s'. Note that case insensitive "
"matching is performed." % conf.CONF.tempest.img_name_regex)
glance_wrapper = glance.wrap(self.clients.glance, self)
images = glance_wrapper.list_images(status="active",
visibility="public")
for image in images:
if image.name and re.match(conf.CONF.tempest.img_name_regex,
image.name, re.IGNORECASE):
image_service = image.Image(self.clients)
images = image_service.list_images(status="active",
visibility="public")
for image_obj in images:
if image_obj.name and re.match(conf.CONF.tempest.img_name_regex,
image_obj.name, re.IGNORECASE):
LOG.debug("The following public "
"image discovered: '%s'." % image.name)
return image
"image discovered: '%s'." % image_obj.name)
return image_obj
LOG.debug("There is no public image with name matching regular "
"expression '%s'." % conf.CONF.tempest.img_name_regex)
@@ -218,27 +218,27 @@ class TempestContext(context.VerifierContext):
def _discover_or_create_image(self):
if conf.CONF.tempest.img_name_regex:
image = self._discover_image()
if image:
image_obj = self._discover_image()
if image_obj:
LOG.debug("Using image '%s' (ID = %s) "
"for the tests." % (image.name, image.id))
return image
"for the tests." % (image_obj.name, image_obj.id))
return image_obj
params = {
"name": self.generate_random_name(),
"image_name": self.generate_random_name(),
"disk_format": conf.CONF.tempest.img_disk_format,
"container_format": conf.CONF.tempest.img_container_format,
"image_location": os.path.join(self.data_dir, self.image_name),
"visibility": "public"
}
LOG.debug("Creating image '%s'." % params["name"])
glance_wrapper = glance.wrap(self.clients.glance, self)
image = glance_wrapper.create_image(**params)
LOG.debug("Creating image '%s'." % params["image_name"])
image_service = image.Image(self.clients)
image_obj = image_service.create_image(params)
LOG.debug("Image '%s' (ID = %s) has been "
"successfully created!" % (image.name, image.id))
self._created_images.append(image)
"successfully created!" % (image_obj.name, image_obj.id))
self._created_images.append(image_obj)
return image
return image_obj
def _discover_or_create_flavor(self, flv_ram):
novaclient = self.clients.nova()
@@ -290,19 +290,19 @@ class TempestContext(context.VerifierContext):
LOG.debug("Role '%s' has been deleted." % role.name)
def _cleanup_images(self):
glance_wrapper = glance.wrap(self.clients.glance, self)
for image in self._created_images:
LOG.debug("Deleting image '%s'." % image.name)
self.clients.glance().images.delete(image.id)
image_service = image.Image(self.clients)
for image_obj in self._created_images:
LOG.debug("Deleting image '%s'." % image_obj.name)
self.clients.glance().images.delete(image_obj.id)
task_utils.wait_for_status(
image, ["deleted", "pending_delete"],
image_obj, ["deleted", "pending_delete"],
check_deletion=True,
update_resource=glance_wrapper.get_image,
update_resource=image_service.get_image,
timeout=conf.CONF.benchmark.glance_image_delete_timeout,
check_interval=conf.CONF.benchmark.
glance_image_delete_poll_interval)
LOG.debug("Image '%s' has been deleted." % image.name)
self._remove_opt_value_from_config("compute", image.id)
LOG.debug("Image '%s' has been deleted." % image_obj.name)
self._remove_opt_value_from_config("compute", image_obj.id)
def _cleanup_flavors(self):
novaclient = self.clients.nova()

View File

@@ -59,7 +59,6 @@ class GlanceWrapper(object):
This serves to fetch the latest data on the image for the
various wait_for_*() functions.
Must raise rally.exceptions.GetResourceNotFound if the
resource is not found or deleted.
"""
@@ -210,6 +209,11 @@ class GlanceV2Wrapper(GlanceWrapper):
def wrap(client, owner):
"""Returns glanceclient wrapper based on glance client version."""
LOG.warning("Method wrap from %s and whole Glance wrappers are "
"deprecated since Rally 0.10.0 and will be removed soon. Use "
"rally.plugins.openstack.services.image.image.Image "
"instead." % __file__)
version = client.choose_version()
if version == "1":
return GlanceV1Wrapper(client(), owner)

View File

@@ -530,42 +530,42 @@ class NeutronQuotaTestCase(test.TestCase):
@ddt.ddt
class GlanceImageTestCase(test.TestCase):
@mock.patch("rally.plugins.openstack.wrappers.glance.wrap")
def test__wrapper_admin(self, mock_glance_wrap):
@mock.patch("rally.plugins.openstack.services.image.image.Image")
def test__client_admin(self, mock_image):
admin = mock.Mock()
glance = resources.GlanceImage(admin=admin)
wrapper = glance._wrapper()
client = glance._client()
mock_glance_wrap.assert_called_once_with(admin.glance, glance)
self.assertEqual(wrapper, mock_glance_wrap.return_value)
mock_image.assert_called_once_with(admin)
self.assertEqual(client, mock_image.return_value)
@mock.patch("rally.plugins.openstack.wrappers.glance.wrap")
def test__wrapper_user(self, mock_glance_wrap):
@mock.patch("rally.plugins.openstack.services.image.image.Image")
def test__client_user(self, mock_image):
user = mock.Mock()
glance = resources.GlanceImage(user=user)
wrapper = glance._wrapper()
wrapper = glance._client()
mock_glance_wrap.assert_called_once_with(user.glance, glance)
self.assertEqual(wrapper, mock_glance_wrap.return_value)
mock_image.assert_called_once_with(user)
self.assertEqual(wrapper, mock_image.return_value)
@mock.patch("rally.plugins.openstack.wrappers.glance.wrap")
def test__wrapper_admin_preferred(self, mock_glance_wrap):
@mock.patch("rally.plugins.openstack.services.image.image.Image")
def test__client_admin_preferred(self, mock_image):
admin = mock.Mock()
user = mock.Mock()
glance = resources.GlanceImage(admin=admin, user=user)
wrapper = glance._wrapper()
client = glance._client()
mock_glance_wrap.assert_called_once_with(admin.glance, glance)
self.assertEqual(wrapper, mock_glance_wrap.return_value)
mock_image.assert_called_once_with(admin)
self.assertEqual(client, mock_image.return_value)
def test_list(self):
glance = resources.GlanceImage()
glance._wrapper = mock.Mock()
glance._client = mock.Mock()
glance.tenant_uuid = mock.Mock()
self.assertEqual(glance.list(),
glance._wrapper.return_value.list_images.return_value)
glance._wrapper.return_value.list_images.assert_called_once_with(
glance._client.return_value.list_images.return_value)
glance._client.return_value.list_images.assert_called_once_with(
owner=glance.tenant_uuid)
def test_delete(self):
@@ -575,13 +575,12 @@ class GlanceImageTestCase(test.TestCase):
glance.raw_resource = mock.Mock()
client = glance._client.return_value
wrapper = glance._wrapper.return_value
deleted_image = mock.Mock(status="DELETED")
wrapper.get_image.side_effect = [glance.raw_resource, deleted_image]
client.get_image.side_effect = [glance.raw_resource, deleted_image]
glance.delete()
client().images.delete.assert_called_once_with(glance.raw_resource.id)
client.delete_image.assert_called_once_with(glance.raw_resource.id)
class CeilometerTestCase(test.TestCase):

View File

@@ -22,7 +22,7 @@ import mock
from rally.plugins.openstack.context.glance import images
from tests.unit import test
CTX = "rally.plugins.openstack.context.glance"
CTX = "rally.plugins.openstack.context.glance.images"
SCN = "rally.plugins.openstack.scenarios.glance"
@@ -160,9 +160,8 @@ class ImageGeneratorTestCase(test.ScenarioTestCase):
{},
{"api_versions": {"glance": {"version": 2, "service_type": "image"}}})
@ddt.unpack
def test_cleanup(self, api_versions=None):
image_service = self.mock_image.return_value
@mock.patch("%s.resource_manager.cleanup" % CTX)
def test_cleanup(self, mock_cleanup, api_versions=None):
images_per_tenant = 5
tenants = self._gen_tenants(self.tenants_num)
@@ -201,9 +200,12 @@ class ImageGeneratorTestCase(test.ScenarioTestCase):
"users": users,
"tenants": tenants
})
if api_versions:
self.context["config"]["api_versions"] = api_versions
images_ctx = images.ImageGenerator(self.context)
images_ctx.cleanup()
image_service.delete_image.assert_has_calls([])
mock_cleanup.assert_called_once_with(
names=["glance.images"],
users=self.context["users"],
api_versions=self.context["config"].get("api_versions"),
superclass=images_ctx.__class__,
task_id=self.context["task"]["uuid"])

View File

@@ -16,7 +16,6 @@ import mock
from rally import exceptions
from rally.plugins.openstack.context.sahara import sahara_image
from rally.plugins.openstack.scenarios.glance import utils as glance_utils
from tests.unit import test
@@ -85,15 +84,23 @@ class SaharaImageTestCase(test.ScenarioTestCase):
})
return self.context
@mock.patch("%s.glance.utils.GlanceScenario._create_image" % SCN,
return_value=mock.MagicMock(id=42))
@mock.patch("rally.plugins.openstack.services."
"image.image.Image")
@mock.patch("%s.resource_manager.cleanup" % CTX)
def test_setup_and_cleanup_url_image(self, mock_cleanup,
mock_glance_scenario__create_image):
@mock.patch("rally.osclients.Clients")
def test_setup_and_cleanup_url_image(self, mock_clients,
mock_cleanup, mock_image):
ctx = self.url_image_context
sahara_ctx = sahara_image.SaharaImage(ctx)
sahara_ctx.generate_random_name = mock.Mock()
image_service = mock.Mock()
mock_image.return_value = image_service
image_service.create_image.return_value = mock.Mock(id=42)
clients = mock.Mock()
mock_clients.return_value = clients
sahara_client = mock.Mock()
clients.sahara.return_value = sahara_client
glance_calls = []
@@ -101,8 +108,7 @@ class SaharaImageTestCase(test.ScenarioTestCase):
glance_calls.append(
mock.call(container_format="bare",
image_location="http://somewhere",
disk_format="qcow2",
name=sahara_ctx.generate_random_name.return_value))
disk_format="qcow2"))
sahara_update_image_calls = []
sahara_update_tags_calls = []
@@ -116,17 +122,17 @@ class SaharaImageTestCase(test.ScenarioTestCase):
new_tags=["test_plugin", "test_version"]))
sahara_ctx.setup()
mock_glance_scenario__create_image.assert_has_calls(glance_calls)
self.clients("sahara").images.update_image.assert_has_calls(
image_service.create_image.assert_has_calls(glance_calls)
sahara_client.images.update_image.assert_has_calls(
sahara_update_image_calls)
self.clients("sahara").images.update_tags.assert_has_calls(
sahara_client.images.update_tags.assert_has_calls(
sahara_update_tags_calls)
sahara_ctx.cleanup()
mock_cleanup.assert_called_once_with(
names=["glance.images"],
users=ctx["users"],
superclass=glance_utils.GlanceScenario,
superclass=sahara_ctx.__class__,
task_id=ctx["task"]["uuid"])
@mock.patch("%s.glance.utils.GlanceScenario._create_image" % SCN,

View File

@@ -236,35 +236,35 @@ class CinderServersTestCase(test.ScenarioTestCase):
mock_service.create_volume.return_value)
scenario._delete_server.assert_called_once_with(fake_server)
def test_create_and_upload_volume_to_image(self):
mock_service = self.mock_cinder.return_value
@mock.patch("rally.plugins.openstack.services.image.image.Image")
def test_create_and_upload_volume_to_image(self, mock_image):
mock_volume_service = self.mock_cinder.return_value
mock_image_service = mock_image.return_value
scenario = volumes.CreateAndUploadVolumeToImage(self._get_context())
scenario._delete_image = mock.MagicMock()
scenario.run(2, image="img", container_format="fake",
disk_format="disk", do_delete=False, fakeargs="fakeargs")
mock_service.create_volume.assert_called_once_with(
mock_volume_service.create_volume.assert_called_once_with(
2, imageRef="img", fakeargs="fakeargs")
mock_service.upload_volume_to_image.assert_called_once_with(
mock_service.create_volume.return_value,
mock_volume_service.upload_volume_to_image.assert_called_once_with(
mock_volume_service.create_volume.return_value,
container_format="fake", disk_format="disk", force=False)
mock_service.create_volume.reset_mock()
mock_service.upload_volume_to_image.reset_mock()
mock_volume_service.create_volume.reset_mock()
mock_volume_service.upload_volume_to_image.reset_mock()
scenario.run(1, image=None, do_delete=True, fakeargs="fakeargs")
mock_service.create_volume.assert_called_once_with(
mock_volume_service.create_volume.assert_called_once_with(
1, fakeargs="fakeargs")
mock_service.upload_volume_to_image.assert_called_once_with(
mock_service.create_volume.return_value,
mock_volume_service.upload_volume_to_image.assert_called_once_with(
mock_volume_service.create_volume.return_value,
container_format="bare", disk_format="raw", force=False)
mock_service.delete_volume.assert_called_once_with(
mock_service.create_volume.return_value)
scenario._delete_image.assert_called_once_with(
mock_service.upload_volume_to_image.return_value)
mock_volume_service.delete_volume.assert_called_once_with(
mock_volume_service.create_volume.return_value)
mock_image_service.delete_image.assert_called_once_with(
mock_volume_service.upload_volume_to_image.return_value.id)
def test_create_snapshot_and_attach_volume(self):
mock_service = self.mock_cinder.return_value

View File

@@ -89,13 +89,15 @@ class GlanceV1ServiceTestCase(test.TestCase):
self.assertRaises(exceptions.GetResourceNotFound,
self.service.get_image, image_id)
@ddt.data({"status": "activate", "is_public": True},
{"status": "activate", "is_public": False},
{"status": "activate", "is_public": None})
@ddt.data({"status": "activate", "is_public": True, "owner": "owner"},
{"status": "activate", "is_public": False, "owner": "owner"},
{"status": "activate", "is_public": None, "owner": "owner"})
@ddt.unpack
def test_list_images(self, status, is_public):
self.service.list_images(is_public=is_public, status=status)
self.gc.images.list.assert_called_once_with(status=status)
def test_list_images(self, status, is_public, owner):
self.service.list_images(is_public=is_public, status=status,
owner=owner)
self.gc.images.list.assert_called_once_with(status=status,
owner=owner)
def test_set_visibility(self):
image_id = "image_id"

View File

@@ -91,10 +91,11 @@ class GlanceV2ServiceTestCase(test.TestCase):
def test_list_images(self):
status = "active"
kwargs = {"status": status}
filters = {"filters": kwargs}
self.assertEqual(self.gc.images.list.return_value,
self.service.list_images())
self.gc.images.list.assert_called_once_with(**kwargs)
self.gc.images.list.assert_called_once_with(**filters)
def test_set_visibility(self):
image_id = "image_id"

View File

@@ -62,13 +62,13 @@ class ImageTestCase(test.TestCase):
service.get_image(image=image_id)
service._impl.get_image.assert_called_once_with(image_id)
@ddt.data(("status", "visibility"))
@ddt.data(("status", "visibility", "owner"))
def test_list_images(self, params):
status, visibility = params
status, visibility, owner = params
service = self.get_service_with_fake_impl()
service.list_images(status=status, visibility=visibility)
service.list_images(status=status, visibility=visibility, owner=owner)
service._impl.list_images.assert_called_once_with(
status=status, visibility=visibility)
status=status, visibility=visibility, owner=owner)
@ddt.data(("image_id", "visibility"))
def test_set_visibility(self, params):

View File

@@ -159,9 +159,9 @@ class TempestContextTestCase(test.TestCase):
self.assertIn(role3, created_roles)
self.assertIn(role4, created_roles)
@mock.patch("rally.plugins.openstack.wrappers.glance.wrap")
def test__discover_image(self, mock_wrap):
client = mock_wrap.return_value
@mock.patch("rally.plugins.openstack.services.image.image.Image")
def test__discover_image(self, mock_image):
client = mock_image.return_value
client.list_images.return_value = [fakes.FakeImage(name="Foo"),
fakes.FakeImage(name="CirrOS")]
@@ -170,20 +170,20 @@ class TempestContextTestCase(test.TestCase):
@mock.patch("six.moves.builtins.open", side_effect=mock.mock_open(),
create=True)
@mock.patch("rally.plugins.openstack.wrappers.glance.wrap")
@mock.patch("rally.plugins.openstack.services.image.image.Image")
@mock.patch("os.path.isfile", return_value=False)
def test__download_image(self, mock_isfile, mock_wrap, mock_open):
def test__download_image(self, mock_isfile, mock_image, mock_open):
img_1 = mock.MagicMock()
img_1.name = "Foo"
img_2 = mock.MagicMock()
img_2.name = "CirrOS"
glanceclient = self.context.clients.glance()
glanceclient.images.data.return_value = "data"
mock_wrap.return_value.list_images.return_value = [img_1, img_2]
mock_image.return_value.list_images.return_value = [img_1, img_2]
self.context._download_image()
img_path = os.path.join(self.context.data_dir, self.context.image_name)
mock_wrap.return_value.list_images.assert_called_once_with(
mock_image.return_value.list_images.assert_called_once_with(
status="active", visibility="public")
glanceclient.images.data.assert_called_once_with(img_2.id)
mock_open.assert_called_once_with(img_path, "wb")
@@ -206,9 +206,9 @@ class TempestContextTestCase(test.TestCase):
result = self.context.conf.get("compute", "flavor_ref")
self.assertEqual("id1", result)
@mock.patch("rally.plugins.openstack.wrappers.glance.wrap")
def test__discover_or_create_image_when_image_exists(self, mock_wrap):
client = mock_wrap.return_value
@mock.patch("rally.plugins.openstack.services.image.image.Image")
def test__discover_or_create_image_when_image_exists(self, mock_image):
client = mock_image.return_value
client.list_images.return_value = [fakes.FakeImage(name="CirrOS")]
image = self.context._discover_or_create_image()
@@ -216,20 +216,20 @@ class TempestContextTestCase(test.TestCase):
self.assertEqual(0, client.create_image.call_count)
self.assertEqual(0, len(self.context._created_images))
@mock.patch("rally.plugins.openstack.wrappers.glance.wrap")
def test__discover_or_create_image(self, mock_wrap):
client = mock_wrap.return_value
@mock.patch("rally.plugins.openstack.services.image.image.Image")
def test__discover_or_create_image(self, mock_image):
client = mock_image.return_value
image = self.context._discover_or_create_image()
self.assertEqual(image, client.create_image.return_value)
self.assertEqual(image, mock_image().create_image.return_value)
self.assertEqual(self.context._created_images[0],
client.create_image.return_value)
client.create_image.assert_called_once_with(
container_format=CONF.tempest.img_container_format,
image_location=mock.ANY,
disk_format=CONF.tempest.img_disk_format,
name=mock.ANY,
visibility="public")
params = {"container_format": CONF.tempest.img_container_format,
"image_location": mock.ANY,
"disk_format": CONF.tempest.img_disk_format,
"image_name": mock.ANY,
"visibility": "public"}
client.create_image.assert_called_once_with(params)
def test__discover_or_create_flavor_when_flavor_exists(self):
client = self.context.clients.nova()
@@ -276,16 +276,16 @@ class TempestContextTestCase(test.TestCase):
client = self.context.clients.keystone()
self.assertEqual(client.roles.delete.call_count, 2)
@mock.patch("rally.plugins.openstack.wrappers.glance.wrap")
def test__cleanup_images(self, mock_wrap):
@mock.patch("rally.plugins.openstack.services.image.image.Image")
def test__cleanup_images(self, mock_image):
self.context._created_images = [fakes.FakeImage(id="id1"),
fakes.FakeImage(id="id2")]
self.context.conf.set("compute", "image_ref", "id1")
self.context.conf.set("compute", "image_ref_alt", "id2")
wrapper = mock_wrap.return_value
wrapper.get_image.side_effect = [
image_service = mock_image.return_value
image_service.get_image.side_effect = [
fakes.FakeImage(id="id1", status="DELETED"),
fakes.FakeImage(id="id2"),
fakes.FakeImage(id="id2", status="DELETED")]