Merge "[Service] Port all glanceWrapper to image_service"
This commit is contained in:
@@ -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)
|
||||
|
||||
|
||||
@@ -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"])
|
||||
|
||||
@@ -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"])
|
||||
|
||||
@@ -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"],
|
||||
|
||||
@@ -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."""
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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"):
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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"])
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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")]
|
||||
|
||||
Reference in New Issue
Block a user