Refactor image test cases for shared images

Change-Id: Icd8a6417d9c0cd328bda9c6412e43851574f268c
This commit is contained in:
Chi Lo 2020-10-01 10:06:01 -07:00
parent bd5acac654
commit e123abc10e
2 changed files with 113 additions and 58 deletions

View File

@ -48,7 +48,7 @@ class ImsBaseOrmTest(base.BaseOrmTest):
@classmethod @classmethod
def _get_image_params(cls, set_region=True, single_tenant=True, 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 = {}, {} region, post_body = {}, {}
post_body["id"] = uuid.uuid4().hex post_body["id"] = uuid.uuid4().hex
post_body["name"] = data_utils.rand_name( post_body["name"] = data_utils.rand_name(
@ -62,16 +62,16 @@ class ImsBaseOrmTest(base.BaseOrmTest):
region["type"] = "single" region["type"] = "single"
# set enabled status to True or False based on set_enabled value # 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 # add region for the image as needed
post_body["regions"] = [region] if set_region else [] post_body["regions"] = [region] if set_region else []
# create image with visibililty = "public" or "private" # create image with visibililty = "public" or "shared"
post_body["visibility"] = "private" if set_private else "public" post_body["visibility"] = "shared" if set_shared else "public"
# set image tags # set image tags
post_body["tags"] = ["tag1", "tag2"] post_body["tags"] = ["tag1", "tag2"]
# add tenant for the image only if set_private # add tenant for the image only if set_shared
if set_private: if set_shared:
if single_tenant: if single_tenant:
post_body["customers"] = [cls.tenant_id] post_body["customers"] = [cls.tenant_id]
else: else:
@ -106,9 +106,9 @@ class ImsBaseOrmTest(base.BaseOrmTest):
cls._wait_for_image_status_on_dcp(image_id, image_status) cls._wait_for_image_status_on_dcp(image_id, image_status)
return image return image
else:
message = ('image %s not created successfully' % kwargs["name"]) message = ('image %s not created successfully' % kwargs["name"])
raise exceptions.TempestException(message) raise exceptions.TempestException(message)
@classmethod @classmethod
def _wait_for_image_status_on_dcp(cls, image_id, status): 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: if image_id not in image_ids:
message = ('Image %s not in image list on LCP' % image_id) message = ('Image %s not in image list on LCP' % image_id)
raise exceptions.TempestException(message) raise exceptions.TempestException(message)
else:
image_status = cls.client.show_image()["image"]["status"] image_status = cls.client.show_image()["image"]["status"]
if image_status != status: if image_status != status:
message = ('Image %s is in %s status instead of %s on LCP.' message = ('Image %s is in %s status instead of %s on LCP.'
% (image_id, image_status, status)) % (image_id, image_status, status))
raise exceptions.TempestException(message) raise exceptions.TempestException(message)
@classmethod @classmethod
def _update_img_validate_status_on_dcp_and_lcp(cls, image_id, para=None, 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) time.sleep(cls.build_interval)
_, image_list = cls.client.list_images()["images"] _, image_list = cls.client.list_images()["images"]
image_ids = [image["id"] image_ids = [image["id"]
for image in image_list if image["id"] == for image in image_list if image["id"]
image_id] == image_id]
if image_ids: if image_ids:
image_status = image_list[0]["status"] image_status = image_list[0]["status"]
_, body = cls.client.list_images()["images"] _, body = cls.client.list_images()["images"]

View File

@ -45,10 +45,10 @@ class TestTempestIms(ims_base.ImsBaseOrmTest):
@classmethod @classmethod
def resource_setup(cls): def resource_setup(cls):
super(TestTempestIms, cls).resource_setup() super(TestTempestIms, cls).resource_setup()
# setup public image for tempest testing # setup image parameters for tempest testing
cls.image_params_public = \ cls.image_params_public = \
cls._get_image_params(set_private=False) cls._get_image_params(set_shared=False)
cls.image_params_private = \ cls.image_params_shared = \
cls._get_image_params(set_enabled=False) cls._get_image_params(set_enabled=False)
cls.addClassResourceCleanup( cls.addClassResourceCleanup(
@ -56,17 +56,17 @@ class TestTempestIms(ims_base.ImsBaseOrmTest):
cls.image_params_public['id']) cls.image_params_public['id'])
cls.addClassResourceCleanup( cls.addClassResourceCleanup(
cls._del_img_validate_deletion_on_dcp_and_lcp, 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 # setup public image for tempest testing
cls.public_image = \ cls.public_image = \
cls._create_img_and_validate_creation_on_dcp_and_lcp( cls._create_img_and_validate_creation_on_dcp_and_lcp(
**cls.image_params_public) **cls.image_params_public)
# setup private image for tempest testing # setup shared image for tempest testing
cls.private_image = \ cls.shared_image = \
cls._create_img_and_validate_creation_on_dcp_and_lcp( 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): def _update_region(self, region_name, status=None):
if status is None: if status is None:
@ -122,7 +122,7 @@ class TestTempestIms(ims_base.ImsBaseOrmTest):
- no filter (i.e. list all images) - no filter (i.e. list all images)
- filter by region - filter by region
- filter by customer - filter by customer
- filter by visibility (public/private) - filter by visibility (public/shared)
""" """
# define the list customer filters to be used for this test # 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 customer_filter = "?customer=%s" % self.tenant_id
region_filter = "?region=%s" % self.region_id region_filter = "?region=%s" % self.region_id
public_filter = "?visibility=public" public_filter = "?visibility=public"
private_filter = "?visibility=private" shared_filter = "?visibility=shared"
# list public images # list public images
_, body = self.client.list_images(public_filter) _, body = self.client.list_images(public_filter)
image_ids = [img['id'] for img in body['images']] image_ids = [img['id'] for img in body['images']]
self.assertIn(self.public_image['id'], image_ids) self.assertIn(self.public_image['id'], image_ids)
# list private images # list shared images
_, body = self.client.list_images(private_filter) _, body = self.client.list_images(shared_filter)
image_ids = [img['id'] for img in body['images']] 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 # execute list_customers with the rest of the filters
for list_filter in [no_filter, region_filter, for list_filter in [no_filter, region_filter,
customer_filter]: customer_filter]:
_, body = self.client.list_images(list_filter) _, body = self.client.list_images(list_filter)
images = [image['id'] for image in body['images']] 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') @decorators.idempotent_id('4435fef4-49a9-435b-8463-cf8a1e0b7cd8')
def test_disable_image(self): def test_disable_image(self):
@ -162,10 +162,10 @@ class TestTempestIms(ims_base.ImsBaseOrmTest):
@decorators.idempotent_id('f32a13e3-6f38-423b-a616-09c8d4e1c277') @decorators.idempotent_id('f32a13e3-6f38-423b-a616-09c8d4e1c277')
def test_enable_image(self): def test_enable_image(self):
# enable self.private_image and check if request is successful # enable self.shared_image and check if request is successful
self.client.enabled_image(self.private_image['id'], True) self.client.enabled_image(self.shared_image['id'], True)
self._wait_for_image_status_on_dcp(self.private_image['id'], 'Success') self._wait_for_image_status_on_dcp(self.shared_image['id'], 'Success')
_, body = self.client.get_image(self.private_image['id']) _, body = self.client.get_image(self.shared_image['id'])
image = body["image"] image = body["image"]
# assert that the image["enabled"] value is 'True' # 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') @decorators.idempotent_id('0ee68189-66a8-4213-ad68-bc12991c174a')
def test_add_delete_image_tenant(self): def test_add_delete_image_tenant(self):
# add alt tenant to self.private_image & check if status = "Success" # add alt tenant to self.shared_image & check if status = "Success"
self.client.add_customer_to_image(self.private_image['id'], self.client.add_customer_to_image(self.shared_image['id'],
self.alt_tenant_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') 'Success')
# check that alt tenant successfully added to image tenants array # check that alt tenant successfully added to image tenants list
_, body = self.client.get_image(self.private_image['id']) _, body = self.client.get_image(self.shared_image['id'])
image = body["image"] image = body["image"]
self.assertEqual(len(image["customers"]), 2) self.assertEqual(len(image["customers"]), 2)
self.assertIn(self.alt_tenant_id, image['customers']) self.assertIn(self.alt_tenant_id, image['customers'])
# now delete alt_tenant_id and ensure operation is successful # now delete alt_tenant_id and ensure operation is successful
_, body = self.client.delete_customer_from_image( _, body = self.client.delete_customer_from_image(
self.private_image['id'], self.shared_image['id'],
self.alt_tenant_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 # 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"] image = body["image"]
self.assertNotIn(self.alt_tenant_id, image['customers']) self.assertNotIn(self.alt_tenant_id, image['customers'])
@decorators.idempotent_id('bac99348-6b13-4b30-958b-3c039b27eda3') @decorators.idempotent_id('bac99348-6b13-4b30-958b-3c039b27eda3')
def test_update_image_tenant(self): def test_update_image_tenant(self):
# replace current tenant in self.private_image with alt tenant # replace current tenant in self.shared_image with alt tenant
self.client.update_customer(self.private_image['id'], self.client.update_customer(self.shared_image['id'],
self.alt_tenant_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 # 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"] image = body["image"]
self.assertEqual(len(image["customers"]), 1) self.assertEqual(len(image["customers"]), 1)
self.assertIn(self.alt_tenant_id, image['customers']) self.assertIn(self.alt_tenant_id, image['customers'])
@decorators.idempotent_id('0331e02a-ab52-4341-b676-a02462244277') @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() post_body = self._get_image_params()
self.addCleanup( self.addCleanup(
self._del_img_validate_deletion_on_dcp_and_lcp, self._del_img_validate_deletion_on_dcp_and_lcp,
post_body['id']) 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) _, body = self.client.create_image(**post_body)
image = body["image"] image = body["image"]
self._wait_for_image_status_on_dcp(image['id'], 'Success') 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']) _, body = self.client.get_image(image['id'])
image = body["image"] image = body["image"]
self.assertEqual(image["regions"][0]["name"], CONF.identity.region) 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') @decorators.idempotent_id('01160918-e217-401d-a6a0-e7992ab76e41')
def test_update_image(self): def test_update_image(self):
@ -365,8 +420,8 @@ class TestTempestIms(ims_base.ImsBaseOrmTest):
@decorators.idempotent_id('eae7ca20-5383-4579-9f73-0138b8b3ec85') @decorators.idempotent_id('eae7ca20-5383-4579-9f73-0138b8b3ec85')
def test_list_public_images(self): def test_list_public_images(self):
"""List images with visibility = 'public'""" """List images with visibility = 'public'"""
# set_private = False to create image with visibility = 'public' # set_shared = False to create image with visibility = 'public'
post_body = self._get_image_params(set_private=False) post_body = self._get_image_params(set_shared=False)
image = self._data_setup(post_body) image = self._data_setup(post_body)
test_image_id = image['id'] test_image_id = image['id']
# confirm image visibility is set to "public" after image is created # 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) self.assertIn(test_image_id, image_ids)
@decorators.idempotent_id('dc321d60-f3bd-477c-b7bf-1594626f0a12') @decorators.idempotent_id('dc321d60-f3bd-477c-b7bf-1594626f0a12')
def test_list_private_images(self): def test_list_shared_images(self):
"""List images with visibility = 'private' """ """List images with visibility = 'shared' """
# image data created with visibility = private set by default # image data created with visibility = shared set by default
post_body = self._get_image_params() post_body = self._get_image_params()
image = self._data_setup(post_body) image = self._data_setup(post_body)
# confirm image visibility is set to "private" after image is created # confirm image visibility is set to "shared" after image is created
self.assertEqual(image["visibility"], "private") self.assertEqual(image["visibility"], "shared")
filter_private_images = "?visibility=%s" % image["visibility"] filter_shared_images = "?visibility=%s" % image["visibility"]
# list all public images and check if image id is in the list # list all shared images and check if image id is in the list
_, body = self.client.list_images(filter_private_images) _, body = self.client.list_images(filter_shared_images)
image_ids = [img['id'] for img in body['images']] image_ids = [img['id'] for img in body['images']]
self.assertIn(image['id'], image_ids) self.assertIn(image['id'], image_ids)