Merge "Delete only images created by images context"

This commit is contained in:
Jenkins 2016-03-17 17:05:21 +00:00 committed by Gerrit Code Review
commit 0b40075bec
2 changed files with 73 additions and 33 deletions

View File

@ -16,8 +16,8 @@ from rally.common.i18n import _
from rally.common import logging from rally.common import logging
from rally.common import utils as rutils from rally.common import utils as rutils
from rally import consts from rally import consts
from rally.plugins.openstack.cleanup import manager as resource_manager from rally import osclients
from rally.plugins.openstack.scenarios.glance import utils as glance_utils from rally.plugins.openstack.wrappers import glance as glance_wrapper
from rally.task import context from rally.task import context
@ -78,10 +78,10 @@ class ImageGenerator(context.Context):
for user, tenant_id in rutils.iterate_per_tenants( for user, tenant_id in rutils.iterate_per_tenants(
self.context["users"]): self.context["users"]):
current_images = [] current_images = []
glance_scenario = glance_utils.GlanceScenario( clients = osclients.Clients(
{"user": user, "task": user["credential"],
self.context["task"], api_info=self.context["config"].get("api_versions"))
"config": self.context["config"]}) glance_wrap = glance_wrapper.wrap(clients.glance, self)
kwargs = self.config.get("image_args", {}) kwargs = self.config.get("image_args", {})
if self.config.get("min_ram") is not None: if self.config.get("min_ram") is not None:
@ -101,7 +101,7 @@ class ImageGenerator(context.Context):
else: else:
cur_name = self.generate_random_name() cur_name = self.generate_random_name()
image = glance_scenario._create_image( image = glance_wrap.create_image(
image_container, image_url, image_type, image_container, image_url, image_type,
name=cur_name, **kwargs) name=cur_name, **kwargs)
current_images.append(image.id) current_images.append(image.id)
@ -110,6 +110,11 @@ class ImageGenerator(context.Context):
@logging.log_task_wrapper(LOG.info, _("Exit context: `Images`")) @logging.log_task_wrapper(LOG.info, _("Exit context: `Images`"))
def cleanup(self): def cleanup(self):
# TODO(boris-42): Delete only resources created by this context for user, tenant_id in rutils.iterate_per_tenants(
resource_manager.cleanup(names=["glance.images"], self.context["users"]):
users=self.context.get("users", [])) clients = osclients.Clients(
user["credential"],
api_info=self.context["config"].get("api_versions"))
glance_wrap = glance_wrapper.wrap(clients.glance, self)
for image in self.context["tenants"][tenant_id].get("images", []):
glance_wrap.delete_image(glance_wrap.get_image(image))

View File

@ -50,15 +50,17 @@ class ImageGeneratorTestCase(test.ScenarioTestCase):
{"min_disk": 1, "min_ram": 2}, {"min_disk": 1, "min_ram": 2},
{"image_name": "foo"}, {"image_name": "foo"},
{"tenants": 3, "users_per_tenant": 2, "images_per_tenant": 5}, {"tenants": 3, "users_per_tenant": 2, "images_per_tenant": 5},
{"image_args": {"min_disk": 1, "min_ram": 2, "visibility": "public"}}) {"image_args": {"min_disk": 1, "min_ram": 2, "visibility": "public"}},
{"api_versions": {"glance": {"version": 2, "service_type": "image"}}})
@ddt.unpack @ddt.unpack
@mock.patch("%s.utils.GlanceScenario._create_image" % SCN) @mock.patch("rally.plugins.openstack.wrappers.glance.wrap")
def test_setup(self, mock_glance_scenario__create_image, @mock.patch("rally.osclients.Clients")
def test_setup(self, mock_clients, mock_wrap,
image_container="bare", image_type="qcow2", image_container="bare", image_type="qcow2",
image_url="http://example.com/fake/url", image_url="http://example.com/fake/url",
tenants=1, users_per_tenant=1, images_per_tenant=1, tenants=1, users_per_tenant=1, images_per_tenant=1,
image_name=None, min_ram=None, min_disk=None, image_name=None, min_ram=None, min_disk=None,
image_args=None): image_args=None, api_versions=None):
tenant_data = self._gen_tenants(tenants) tenant_data = self._gen_tenants(tenants)
users = [] users = []
for tenant_id in tenant_data: for tenant_id in tenant_data:
@ -86,6 +88,8 @@ class ImageGeneratorTestCase(test.ScenarioTestCase):
"users": users, "users": users,
"tenants": tenant_data "tenants": tenant_data
}) })
if api_versions:
self.context["config"]["api_versions"] = api_versions
expected_image_args = {} expected_image_args = {}
if image_args is not None: if image_args is not None:
@ -100,52 +104,70 @@ class ImageGeneratorTestCase(test.ScenarioTestCase):
self.context["config"]["images"]["min_disk"] = min_disk self.context["config"]["images"]["min_disk"] = min_disk
expected_image_args["min_disk"] = min_disk expected_image_args["min_disk"] = min_disk
wrapper = mock_wrap.return_value
new_context = copy.deepcopy(self.context) new_context = copy.deepcopy(self.context)
for tenant_id in new_context["tenants"].keys(): for tenant_id in new_context["tenants"].keys():
new_context["tenants"][tenant_id]["images"] = [ new_context["tenants"][tenant_id]["images"] = [
mock_glance_scenario__create_image.return_value.id wrapper.create_image.return_value.id
] * images_per_tenant ] * images_per_tenant
images_ctx = images.ImageGenerator(self.context) images_ctx = images.ImageGenerator(self.context)
images_ctx.setup() images_ctx.setup()
self.assertEqual(new_context, self.context) self.assertEqual(new_context, self.context)
mock_glance_scenario__create_image.assert_has_calls(
[mock.call(image_container, image_url, image_type, wrapper_calls = []
name=mock.ANY, wrapper_calls.extend([mock.call(mock_clients.return_value.glance,
**expected_image_args)] * tenants * images_per_tenant) images_ctx)] * tenants)
wrapper_calls.extend(
[mock.call().create_image(
image_container, image_url, image_type,
name=mock.ANY, **expected_image_args)] *
tenants * images_per_tenant)
mock_wrap.assert_has_calls(wrapper_calls, any_order=True)
if image_name: if image_name:
for args in mock_glance_scenario__create_image.call_args_list: for args in wrapper.create_image.call_args_list:
self.assertTrue(args[1]["name"].startswith(image_name)) self.assertTrue(args[1]["name"].startswith(image_name))
mock_clients.assert_has_calls(
[mock.call(mock.ANY, api_info=api_versions)] * tenants)
@mock.patch("%s.images.resource_manager.cleanup" % CTX) @ddt.data(
def test_cleanup(self, mock_cleanup): {},
{"api_versions": {"glance": {"version": 2, "service_type": "image"}}})
@ddt.unpack
@mock.patch("rally.plugins.openstack.wrappers.glance.wrap")
@mock.patch("rally.osclients.Clients")
def test_cleanup(self, mock_clients, mock_wrap, api_versions=None):
tenants_count = 2 tenants_count = 2
users_per_tenant = 5 users_per_tenant = 5
images_per_tenant = 5 images_per_tenant = 5
tenants = self._gen_tenants(tenants_count) tenants = self._gen_tenants(tenants_count)
users = [] users = []
for id_ in tenants: created_images = []
for tenant_id in tenants:
for i in range(users_per_tenant): for i in range(users_per_tenant):
users.append({"id": i, "tenant_id": id_, users.append({"id": i, "tenant_id": tenant_id,
"credential": "credential"}) "credential": mock.MagicMock()})
tenants[id_].setdefault("images", []) tenants[tenant_id].setdefault("images", [])
for j in range(images_per_tenant): for j in range(images_per_tenant):
tenants[id_]["images"].append("uuid") image = mock.Mock()
created_images.append(image)
tenants[tenant_id]["images"].append(image)
self.context.update({ self.context.update({
"config": { "config": {
"users": { "users": {
"tenants": 2, "tenants": tenants_count,
"users_per_tenant": 5, "users_per_tenant": users_per_tenant,
"concurrent": 10, "concurrent": 10,
}, },
"images": { "images": {
"image_url": "mock_url", "image_url": "mock_url",
"image_type": "qcow2", "image_type": "qcow2",
"image_container": "bare", "image_container": "bare",
"images_per_tenant": 5, "images_per_tenant": images_per_tenant,
"image_name": "some_name", "image_name": "some_name",
"min_ram": 128, "min_ram": 128,
"min_disk": 1, "min_disk": 1,
@ -157,8 +179,21 @@ class ImageGeneratorTestCase(test.ScenarioTestCase):
"users": users, "users": users,
"tenants": tenants "tenants": tenants
}) })
if api_versions:
self.context["config"]["api_versions"] = api_versions
images_ctx = images.ImageGenerator(self.context) images_ctx = images.ImageGenerator(self.context)
images_ctx.cleanup() images_ctx.cleanup()
mock_cleanup.assert_called_once_with(names=["glance.images"],
users=self.context["users"]) wrapper = mock_wrap.return_value
wrapper_calls = []
wrapper_calls.extend([mock.call(mock_clients.return_value.glance,
images_ctx)] * tenants_count)
wrapper_calls.extend([mock.call().get_image(i)
for i in created_images])
wrapper_calls.extend(
[mock.call().delete_image(wrapper.get_image.return_value)] *
len(created_images))
mock_wrap.assert_has_calls(wrapper_calls, any_order=True)
mock_clients.assert_has_calls(
[mock.call(mock.ANY, api_info=api_versions)] * tenants_count)