From e123abc10e76d4ff1ee498a66ea886c01d66f253 Mon Sep 17 00:00:00 2001 From: Chi Lo Date: Thu, 1 Oct 2020 10:06:01 -0700 Subject: [PATCH] Refactor image test cases for shared images Change-Id: Icd8a6417d9c0cd328bda9c6412e43851574f268c --- ranger_tempest_plugin/tests/api/ims_base.py | 34 ++--- .../tests/api/test_images.py | 137 ++++++++++++------ 2 files changed, 113 insertions(+), 58 deletions(-) diff --git a/ranger_tempest_plugin/tests/api/ims_base.py b/ranger_tempest_plugin/tests/api/ims_base.py index 92643f0..71d9fc5 100755 --- a/ranger_tempest_plugin/tests/api/ims_base.py +++ b/ranger_tempest_plugin/tests/api/ims_base.py @@ -48,7 +48,7 @@ class ImsBaseOrmTest(base.BaseOrmTest): @classmethod def _get_image_params(cls, set_region=True, single_tenant=True, - set_private=True, set_enabled=True): + set_shared=True, set_enabled=True): region, post_body = {}, {} post_body["id"] = uuid.uuid4().hex post_body["name"] = data_utils.rand_name( @@ -62,16 +62,16 @@ class ImsBaseOrmTest(base.BaseOrmTest): region["type"] = "single" # set enabled status to True or False based on set_enabled value - post_body["enabled"] = True if set_enabled else False + post_body["enabled"] = bool(set_enabled) # add region for the image as needed post_body["regions"] = [region] if set_region else [] - # create image with visibililty = "public" or "private" - post_body["visibility"] = "private" if set_private else "public" + # create image with visibililty = "public" or "shared" + post_body["visibility"] = "shared" if set_shared else "public" # set image tags post_body["tags"] = ["tag1", "tag2"] - # add tenant for the image only if set_private - if set_private: + # add tenant for the image only if set_shared + if set_shared: if single_tenant: post_body["customers"] = [cls.tenant_id] else: @@ -106,9 +106,9 @@ class ImsBaseOrmTest(base.BaseOrmTest): cls._wait_for_image_status_on_dcp(image_id, image_status) return image - else: - message = ('image %s not created successfully' % kwargs["name"]) - raise exceptions.TempestException(message) + + message = ('image %s not created successfully' % kwargs["name"]) + raise exceptions.TempestException(message) @classmethod def _wait_for_image_status_on_dcp(cls, image_id, status): @@ -140,12 +140,12 @@ class ImsBaseOrmTest(base.BaseOrmTest): if image_id not in image_ids: message = ('Image %s not in image list on LCP' % image_id) raise exceptions.TempestException(message) - else: - image_status = cls.client.show_image()["image"]["status"] - if image_status != status: - message = ('Image %s is in %s status instead of %s on LCP.' - % (image_id, image_status, status)) - raise exceptions.TempestException(message) + + image_status = cls.client.show_image()["image"]["status"] + if image_status != status: + message = ('Image %s is in %s status instead of %s on LCP.' + % (image_id, image_status, status)) + raise exceptions.TempestException(message) @classmethod def _update_img_validate_status_on_dcp_and_lcp(cls, image_id, para=None, @@ -202,8 +202,8 @@ class ImsBaseOrmTest(base.BaseOrmTest): time.sleep(cls.build_interval) _, image_list = cls.client.list_images()["images"] image_ids = [image["id"] - for image in image_list if image["id"] == - image_id] + for image in image_list if image["id"] + == image_id] if image_ids: image_status = image_list[0]["status"] _, body = cls.client.list_images()["images"] diff --git a/ranger_tempest_plugin/tests/api/test_images.py b/ranger_tempest_plugin/tests/api/test_images.py index 915c35d..2262647 100644 --- a/ranger_tempest_plugin/tests/api/test_images.py +++ b/ranger_tempest_plugin/tests/api/test_images.py @@ -45,10 +45,10 @@ class TestTempestIms(ims_base.ImsBaseOrmTest): @classmethod def resource_setup(cls): super(TestTempestIms, cls).resource_setup() - # setup public image for tempest testing + # setup image parameters for tempest testing cls.image_params_public = \ - cls._get_image_params(set_private=False) - cls.image_params_private = \ + cls._get_image_params(set_shared=False) + cls.image_params_shared = \ cls._get_image_params(set_enabled=False) cls.addClassResourceCleanup( @@ -56,17 +56,17 @@ class TestTempestIms(ims_base.ImsBaseOrmTest): cls.image_params_public['id']) cls.addClassResourceCleanup( cls._del_img_validate_deletion_on_dcp_and_lcp, - cls.image_params_private['id']) + cls.image_params_shared['id']) # setup public image for tempest testing cls.public_image = \ cls._create_img_and_validate_creation_on_dcp_and_lcp( **cls.image_params_public) - # setup private image for tempest testing - cls.private_image = \ + # setup shared image for tempest testing + cls.shared_image = \ cls._create_img_and_validate_creation_on_dcp_and_lcp( - **cls.image_params_private) + **cls.image_params_shared) def _update_region(self, region_name, status=None): if status is None: @@ -122,7 +122,7 @@ class TestTempestIms(ims_base.ImsBaseOrmTest): - no filter (i.e. list all images) - filter by region - filter by customer - - filter by visibility (public/private) + - filter by visibility (public/shared) """ # define the list customer filters to be used for this test @@ -130,24 +130,24 @@ class TestTempestIms(ims_base.ImsBaseOrmTest): customer_filter = "?customer=%s" % self.tenant_id region_filter = "?region=%s" % self.region_id public_filter = "?visibility=public" - private_filter = "?visibility=private" + shared_filter = "?visibility=shared" # list public images _, body = self.client.list_images(public_filter) image_ids = [img['id'] for img in body['images']] self.assertIn(self.public_image['id'], image_ids) - # list private images - _, body = self.client.list_images(private_filter) + # list shared images + _, body = self.client.list_images(shared_filter) image_ids = [img['id'] for img in body['images']] - self.assertIn(self.private_image['id'], image_ids) + self.assertIn(self.shared_image['id'], image_ids) # execute list_customers with the rest of the filters for list_filter in [no_filter, region_filter, customer_filter]: _, body = self.client.list_images(list_filter) images = [image['id'] for image in body['images']] - self.assertIn(self.private_image['id'], images) + self.assertIn(self.shared_image['id'], images) @decorators.idempotent_id('4435fef4-49a9-435b-8463-cf8a1e0b7cd8') def test_disable_image(self): @@ -162,10 +162,10 @@ class TestTempestIms(ims_base.ImsBaseOrmTest): @decorators.idempotent_id('f32a13e3-6f38-423b-a616-09c8d4e1c277') def test_enable_image(self): - # enable self.private_image and check if request is successful - self.client.enabled_image(self.private_image['id'], True) - self._wait_for_image_status_on_dcp(self.private_image['id'], 'Success') - _, body = self.client.get_image(self.private_image['id']) + # enable self.shared_image and check if request is successful + self.client.enabled_image(self.shared_image['id'], True) + self._wait_for_image_status_on_dcp(self.shared_image['id'], 'Success') + _, body = self.client.get_image(self.shared_image['id']) image = body["image"] # assert that the image["enabled"] value is 'True' @@ -199,49 +199,49 @@ class TestTempestIms(ims_base.ImsBaseOrmTest): @decorators.idempotent_id('0ee68189-66a8-4213-ad68-bc12991c174a') def test_add_delete_image_tenant(self): - # add alt tenant to self.private_image & check if status = "Success" - self.client.add_customer_to_image(self.private_image['id'], + # add alt tenant to self.shared_image & check if status = "Success" + self.client.add_customer_to_image(self.shared_image['id'], self.alt_tenant_id) - self._wait_for_image_status_on_dcp(self.private_image['id'], + self._wait_for_image_status_on_dcp(self.shared_image['id'], 'Success') - # check that alt tenant successfully added to image tenants array - _, body = self.client.get_image(self.private_image['id']) + # check that alt tenant successfully added to image tenants list + _, body = self.client.get_image(self.shared_image['id']) image = body["image"] self.assertEqual(len(image["customers"]), 2) self.assertIn(self.alt_tenant_id, image['customers']) # now delete alt_tenant_id and ensure operation is successful _, body = self.client.delete_customer_from_image( - self.private_image['id'], + self.shared_image['id'], self.alt_tenant_id) - self._wait_for_image_status_on_dcp(self.private_image['id'], 'Success') + self._wait_for_image_status_on_dcp(self.shared_image['id'], 'Success') # image region array should no longer contain alt tenant - _, body = self.client.get_image(self.private_image['id']) + _, body = self.client.get_image(self.shared_image['id']) image = body["image"] self.assertNotIn(self.alt_tenant_id, image['customers']) @decorators.idempotent_id('bac99348-6b13-4b30-958b-3c039b27eda3') def test_update_image_tenant(self): - # replace current tenant in self.private_image with alt tenant - self.client.update_customer(self.private_image['id'], + # replace current tenant in self.shared_image with alt tenant + self.client.update_customer(self.shared_image['id'], self.alt_tenant_id) - self._wait_for_image_status_on_dcp(self.private_image['id'], 'Success') + self._wait_for_image_status_on_dcp(self.shared_image['id'], 'Success') # check that image tenants array contains only alt tenant - _, body = self.client.get_image(self.private_image['id']) + _, body = self.client.get_image(self.shared_image['id']) image = body["image"] self.assertEqual(len(image["customers"]), 1) self.assertIn(self.alt_tenant_id, image['customers']) @decorators.idempotent_id('0331e02a-ab52-4341-b676-a02462244277') - def test_create_image(self): + def test_create_shared_image(self): post_body = self._get_image_params() self.addCleanup( self._del_img_validate_deletion_on_dcp_and_lcp, post_body['id']) - # call client create_IMAGE and wait till status equals 'Success' + # call client create_image and wait till status equals 'Success' _, body = self.client.create_image(**post_body) image = body["image"] self._wait_for_image_status_on_dcp(image['id'], 'Success') @@ -250,6 +250,61 @@ class TestTempestIms(ims_base.ImsBaseOrmTest): _, body = self.client.get_image(image['id']) image = body["image"] self.assertEqual(image["regions"][0]["name"], CONF.identity.region) + self.assertEqual(image["visibility"], post_body['visibility']) + + @decorators.idempotent_id('28fb9788-b3a2-4ea1-a3a2-fac63018c05b') + def test_create_private_image(self): + post_body = self._get_image_params(set_shared=False) + post_body["visibility"] = "private" + self.addCleanup( + self._del_img_validate_deletion_on_dcp_and_lcp, + post_body['id']) + # call client create_image and wait till status equals 'Success' + _, body = self.client.create_image(**post_body) + image = body["image"] + self._wait_for_image_status_on_dcp(image['id'], 'Success') + + # verify image record created successfully + _, body = self.client.get_image(image['id']) + image = body["image"] + self.assertEqual(image["regions"][0]["name"], CONF.identity.region) + self.assertEqual(image["visibility"], post_body['visibility']) + + @decorators.idempotent_id('01806310-2a14-4ebb-9679-cce5ee7401b0') + def test_create_private_image_with_customer(self): + post_body = self._get_image_params() + post_body["visibility"] = "private" + + # private image can not have associated customers list + self.assertRaises(exceptions.BadRequest, + self.client.create_image, **post_body) + + @decorators.idempotent_id('06defa6d-3ce9-4428-8b36-09a351dba872') + def test_create_community_image(self): + post_body = self._get_image_params(set_shared=False) + post_body["visibility"] = "community" + self.addCleanup( + self._del_img_validate_deletion_on_dcp_and_lcp, + post_body['id']) + # call client create_image and wait till status equals 'Success' + _, body = self.client.create_image(**post_body) + image = body["image"] + self._wait_for_image_status_on_dcp(image['id'], 'Success') + + # verify image record created successfully + _, body = self.client.get_image(image['id']) + image = body["image"] + self.assertEqual(image["regions"][0]["name"], CONF.identity.region) + self.assertEqual(image["visibility"], post_body['visibility']) + + @decorators.idempotent_id('298976ae-a6d6-4cdd-b679-786a29eefe2f') + def test_create_community_image_with_customer(self): + post_body = self._get_image_params() + post_body["visibility"] = "community" + + # private image can not have associated customers list + self.assertRaises(exceptions.BadRequest, + self.client.create_image, **post_body) @decorators.idempotent_id('01160918-e217-401d-a6a0-e7992ab76e41') def test_update_image(self): @@ -365,8 +420,8 @@ class TestTempestIms(ims_base.ImsBaseOrmTest): @decorators.idempotent_id('eae7ca20-5383-4579-9f73-0138b8b3ec85') def test_list_public_images(self): """List images with visibility = 'public'""" - # set_private = False to create image with visibility = 'public' - post_body = self._get_image_params(set_private=False) + # set_shared = False to create image with visibility = 'public' + post_body = self._get_image_params(set_shared=False) image = self._data_setup(post_body) test_image_id = image['id'] # confirm image visibility is set to "public" after image is created @@ -379,17 +434,17 @@ class TestTempestIms(ims_base.ImsBaseOrmTest): self.assertIn(test_image_id, image_ids) @decorators.idempotent_id('dc321d60-f3bd-477c-b7bf-1594626f0a12') - def test_list_private_images(self): - """List images with visibility = 'private' """ - # image data created with visibility = private set by default + def test_list_shared_images(self): + """List images with visibility = 'shared' """ + # image data created with visibility = shared set by default post_body = self._get_image_params() image = self._data_setup(post_body) - # confirm image visibility is set to "private" after image is created - self.assertEqual(image["visibility"], "private") - filter_private_images = "?visibility=%s" % image["visibility"] + # confirm image visibility is set to "shared" after image is created + self.assertEqual(image["visibility"], "shared") + filter_shared_images = "?visibility=%s" % image["visibility"] - # list all public images and check if image id is in the list - _, body = self.client.list_images(filter_private_images) + # list all shared images and check if image id is in the list + _, body = self.client.list_images(filter_shared_images) image_ids = [img['id'] for img in body['images']] self.assertIn(image['id'], image_ids)