diff --git a/tempest/api/object_storage/base.py b/tempest/api/object_storage/base.py index 24c9c248d2..ee7216354f 100644 --- a/tempest/api/object_storage/base.py +++ b/tempest/api/object_storage/base.py @@ -106,7 +106,7 @@ class BaseObjectTest(tempest.test.BaseTestCase): def create_container(cls): # wrapper that returns a test container container_name = data_utils.rand_name(name='TestContainer') - cls.container_client.create_container(container_name) + cls.container_client.update_container(container_name) cls.containers.append(container_name) return container_name diff --git a/tempest/api/object_storage/test_account_services.py b/tempest/api/object_storage/test_account_services.py index 0f865400a7..d7c85a2414 100644 --- a/tempest/api/object_storage/test_account_services.py +++ b/tempest/api/object_storage/test_account_services.py @@ -43,7 +43,7 @@ class AccountTest(base.BaseObjectTest): super(AccountTest, cls).resource_setup() for i in range(ord('a'), ord('f') + 1): name = data_utils.rand_name(name='%s-' % six.int2byte(i)) - cls.container_client.create_container(name) + cls.container_client.update_container(name) cls.containers.append(name) cls.containers_count = len(cls.containers) diff --git a/tempest/api/object_storage/test_container_acl_negative.py b/tempest/api/object_storage/test_container_acl_negative.py index 03a5879dbf..90b24b41f7 100644 --- a/tempest/api/object_storage/test_container_acl_negative.py +++ b/tempest/api/object_storage/test_container_acl_negative.py @@ -39,7 +39,7 @@ class ObjectACLsNegativeTest(base.BaseObjectTest): def setUp(self): super(ObjectACLsNegativeTest, self).setUp() self.container_name = data_utils.rand_name(name='TestContainer') - self.container_client.create_container(self.container_name) + self.container_client.update_container(self.container_name) def tearDown(self): self.delete_containers([self.container_name]) diff --git a/tempest/api/object_storage/test_container_services.py b/tempest/api/object_storage/test_container_services.py index c6f21ecedd..cdc420e507 100644 --- a/tempest/api/object_storage/test_container_services.py +++ b/tempest/api/object_storage/test_container_services.py @@ -27,7 +27,7 @@ class ContainerTest(base.BaseObjectTest): @decorators.idempotent_id('92139d73-7819-4db1-85f8-3f2f22a8d91f') def test_create_container(self): container_name = data_utils.rand_name(name='TestContainer') - resp, _ = self.container_client.create_container(container_name) + resp, _ = self.container_client.update_container(container_name) self.containers.append(container_name) self.assertHeaders(resp, 'Container', 'PUT') @@ -35,20 +35,20 @@ class ContainerTest(base.BaseObjectTest): def test_create_container_overwrite(self): # overwrite container with the same name container_name = data_utils.rand_name(name='TestContainer') - self.container_client.create_container(container_name) + self.container_client.update_container(container_name) self.containers.append(container_name) - resp, _ = self.container_client.create_container(container_name) + resp, _ = self.container_client.update_container(container_name) self.assertHeaders(resp, 'Container', 'PUT') @decorators.idempotent_id('c2ac4d59-d0f5-40d5-ba19-0635056d48cd') def test_create_container_with_metadata_key(self): # create container with the blank value of metadata container_name = data_utils.rand_name(name='TestContainer') - metadata = {'test-container-meta': ''} - resp, _ = self.container_client.create_container( + headers = {'X-Container-Meta-test-container-meta': ''} + resp, _ = self.container_client.update_container( container_name, - metadata=metadata) + **headers) self.containers.append(container_name) self.assertHeaders(resp, 'Container', 'PUT') @@ -64,10 +64,10 @@ class ContainerTest(base.BaseObjectTest): container_name = data_utils.rand_name(name='TestContainer') # metadata name using underscores should be converted to hyphens - metadata = {'test_container_meta': 'Meta1'} - resp, _ = self.container_client.create_container( + headers = {'X-Container-Meta-test_container_meta': 'Meta1'} + resp, _ = self.container_client.update_container( container_name, - metadata=metadata) + **headers) self.containers.append(container_name) self.assertHeaders(resp, 'Container', 'PUT') @@ -75,22 +75,20 @@ class ContainerTest(base.BaseObjectTest): container_name) self.assertIn('x-container-meta-test-container-meta', resp) self.assertEqual(resp['x-container-meta-test-container-meta'], - metadata['test_container_meta']) + headers['X-Container-Meta-test_container_meta']) @decorators.idempotent_id('24d16451-1c0c-4e4f-b59c-9840a3aba40e') def test_create_container_with_remove_metadata_key(self): # create container with the blank value of remove metadata container_name = data_utils.rand_name(name='TestContainer') - metadata_1 = {'test-container-meta': 'Meta1'} - self.container_client.create_container( - container_name, - metadata=metadata_1) + headers = {'X-Container-Meta-test-container-meta': 'Meta1'} + self.container_client.update_container(container_name, **headers) self.containers.append(container_name) - metadata_2 = {'test-container-meta': ''} - resp, _ = self.container_client.create_container( + headers = {'X-Remove-Container-Meta-test-container-meta': ''} + resp, _ = self.container_client.update_container( container_name, - remove_metadata=metadata_2) + **headers) self.assertHeaders(resp, 'Container', 'PUT') resp, _ = self.container_client.list_container_metadata( @@ -101,14 +99,13 @@ class ContainerTest(base.BaseObjectTest): def test_create_container_with_remove_metadata_value(self): # create container with remove metadata container_name = data_utils.rand_name(name='TestContainer') - metadata = {'test-container-meta': 'Meta1'} - self.container_client.create_container(container_name, - metadata=metadata) + headers = {'X-Container-Meta-test-container-meta': 'Meta1'} + self.container_client.update_container(container_name, **headers) self.containers.append(container_name) - - resp, _ = self.container_client.create_container( + headers = {'X-Remove-Container-Meta-test-container-meta': 'Meta1'} + resp, _ = self.container_client.update_container( container_name, - remove_metadata=metadata) + **headers) self.assertHeaders(resp, 'Container', 'PUT') resp, _ = self.container_client.list_container_metadata( @@ -301,9 +298,8 @@ class ContainerTest(base.BaseObjectTest): def test_update_container_metadata_with_create_and_delete_metadata(self): # Send one request of adding and deleting metadata container_name = data_utils.rand_name(name='TestContainer') - metadata_1 = {'test-container-meta1': 'Meta1'} - self.container_client.create_container(container_name, - metadata=metadata_1) + metadata_1 = {'X-Container-Meta-test-container-meta1': 'Meta1'} + self.container_client.update_container(container_name, **metadata_1) self.containers.append(container_name) metadata_2 = {'test-container-meta2': 'Meta2'} @@ -311,7 +307,7 @@ class ContainerTest(base.BaseObjectTest): self.container_client.create_update_or_delete_container_metadata( container_name, create_update_metadata=metadata_2, - delete_metadata=metadata_1)) + delete_metadata={'test-container-meta1': 'Meta1'})) self.assertHeaders(resp, 'Container', 'POST') resp, _ = self.container_client.list_container_metadata( @@ -343,15 +339,14 @@ class ContainerTest(base.BaseObjectTest): def test_update_container_metadata_with_delete_metadata(self): # update container metadata using delete metadata container_name = data_utils.rand_name(name='TestContainer') - metadata = {'test-container-meta1': 'Meta1'} - self.container_client.create_container(container_name, - metadata=metadata) + metadata = {'X-Container-Meta-test-container-meta1': 'Meta1'} + self.container_client.update_container(container_name, **metadata) self.containers.append(container_name) resp, _ = ( self.container_client.create_update_or_delete_container_metadata( container_name, - delete_metadata=metadata)) + delete_metadata={'test-container-meta1': 'Meta1'})) self.assertHeaders(resp, 'Container', 'POST') resp, _ = self.container_client.list_container_metadata( @@ -378,9 +373,8 @@ class ContainerTest(base.BaseObjectTest): def test_update_container_metadata_with_delete_metadata_key(self): # update container metadata with a blank value of metadata container_name = data_utils.rand_name(name='TestContainer') - metadata = {'test-container-meta1': 'Meta1'} - self.container_client.create_container(container_name, - metadata=metadata) + headers = {'X-Container-Meta-test-container-meta1': 'Meta1'} + self.container_client.update_container(container_name, **headers) self.containers.append(container_name) metadata = {'test-container-meta1': ''} diff --git a/tempest/api/object_storage/test_container_services_negative.py b/tempest/api/object_storage/test_container_services_negative.py index 707c016524..b8c83b7cc0 100644 --- a/tempest/api/object_storage/test_container_services_negative.py +++ b/tempest/api/object_storage/test_container_services_negative.py @@ -45,9 +45,10 @@ class ContainerNegativeTest(base.BaseObjectTest): max_length = self.constraints['max_container_name_length'] # create a container with long name container_name = data_utils.arbitrary_string(size=max_length + 1) - ex = self.assertRaises(exceptions.BadRequest, - self.container_client.create_container, - container_name) + ex = self.assertRaises( + exceptions.BadRequest, + self.container_client.update_container, + container_name) self.assertIn('Container name length of ' + str(max_length + 1) + ' longer than ' + str(max_length), str(ex)) @@ -61,11 +62,13 @@ class ContainerNegativeTest(base.BaseObjectTest): # that is longer than max. max_length = self.constraints['max_meta_name_length'] container_name = data_utils.rand_name(name='TestContainer') - metadata_name = data_utils.arbitrary_string(size=max_length + 1) + metadata_name = 'X-Container-Meta-' + data_utils.arbitrary_string( + size=max_length + 1) metadata = {metadata_name: 'penguin'} - ex = self.assertRaises(exceptions.BadRequest, - self.container_client.create_container, - container_name, metadata=metadata) + ex = self.assertRaises( + exceptions.BadRequest, + self.container_client.update_container, + container_name, **metadata) self.assertIn('Metadata name too long', str(ex)) @decorators.attr(type=["negative"]) @@ -79,10 +82,11 @@ class ContainerNegativeTest(base.BaseObjectTest): max_length = self.constraints['max_meta_value_length'] container_name = data_utils.rand_name(name='TestContainer') metadata_value = data_utils.arbitrary_string(size=max_length + 1) - metadata = {'animal': metadata_value} - ex = self.assertRaises(exceptions.BadRequest, - self.container_client.create_container, - container_name, metadata=metadata) + metadata = {'X-Container-Meta-animal': metadata_value} + ex = self.assertRaises( + exceptions.BadRequest, + self.container_client.update_container, + container_name, **metadata) self.assertIn('Metadata value longer than ' + str(max_length), str(ex)) @decorators.attr(type=["negative"]) @@ -97,11 +101,12 @@ class ContainerNegativeTest(base.BaseObjectTest): container_name = data_utils.rand_name(name='TestContainer') metadata = {} for i in range(max_count + 1): - metadata['animal-' + str(i)] = 'penguin' + metadata['X-Container-Meta-animal-' + str(i)] = 'penguin' - ex = self.assertRaises(exceptions.BadRequest, - self.container_client.create_container, - container_name, metadata=metadata) + ex = self.assertRaises( + exceptions.BadRequest, + self.container_client.update_container, + container_name, **metadata) self.assertIn('Too many metadata items; max ' + str(max_count), str(ex)) diff --git a/tempest/api/object_storage/test_object_services.py b/tempest/api/object_storage/test_object_services.py index 836a875dea..61cbe30a28 100644 --- a/tempest/api/object_storage/test_object_services.py +++ b/tempest/api/object_storage/test_object_services.py @@ -786,12 +786,12 @@ class ObjectTest(base.BaseObjectTest): def test_copy_object_across_containers(self): # create a container to use as a source container src_container_name = data_utils.rand_name(name='TestSourceContainer') - self.container_client.create_container(src_container_name) + self.container_client.update_container(src_container_name) self.containers.append(src_container_name) # create a container to use as a destination container dst_container_name = data_utils.rand_name( name='TestDestinationContainer') - self.container_client.create_container(dst_container_name) + self.container_client.update_container(dst_container_name) self.containers.append(dst_container_name) # create object in source container object_name = data_utils.rand_name(name='Object') @@ -977,7 +977,7 @@ class PublicObjectTest(base.BaseObjectTest): def setUp(self): super(PublicObjectTest, self).setUp() self.container_name = data_utils.rand_name(name='TestContainer') - self.container_client.create_container(self.container_name) + self.container_client.update_container(self.container_name) def tearDown(self): self.delete_containers([self.container_name]) diff --git a/tempest/api/object_storage/test_object_version.py b/tempest/api/object_storage/test_object_version.py index 479905398d..51b0a1d15f 100644 --- a/tempest/api/object_storage/test_object_version.py +++ b/tempest/api/object_storage/test_object_version.py @@ -51,18 +51,16 @@ class ContainerTest(base.BaseObjectTest): def test_versioned_container(self): # create container vers_container_name = data_utils.rand_name(name='TestVersionContainer') - resp, _ = self.container_client.create_container( - vers_container_name) + resp, _ = self.container_client.update_container(vers_container_name) self.containers.append(vers_container_name) self.assertHeaders(resp, 'Container', 'PUT') self.assertContainer(vers_container_name, '0', '0', 'Missing Header') base_container_name = data_utils.rand_name(name='TestBaseContainer') headers = {'X-versions-Location': vers_container_name} - resp, _ = self.container_client.create_container( + resp, _ = self.container_client.update_container( base_container_name, - metadata=headers, - metadata_prefix='') + **headers) self.containers.append(base_container_name) self.assertHeaders(resp, 'Container', 'PUT') self.assertContainer(base_container_name, '0', '0', diff --git a/tempest/scenario/manager.py b/tempest/scenario/manager.py index 91b92d90e2..c70ab494e0 100644 --- a/tempest/scenario/manager.py +++ b/tempest/scenario/manager.py @@ -1278,7 +1278,7 @@ class ObjectStorageScenarioTest(ScenarioTest): def create_container(self, container_name=None): name = container_name or data_utils.rand_name( 'swift-scenario-container') - self.container_client.create_container(name) + self.container_client.update_container(name) # look for the container to assure it is created self.list_and_check_container_objects(name) LOG.debug('Container %s created', name) diff --git a/tempest/services/object_storage/container_client.py b/tempest/services/object_storage/container_client.py index a2535998d3..2da8e24b64 100644 --- a/tempest/services/object_storage/container_client.py +++ b/tempest/services/object_storage/container_client.py @@ -24,30 +24,25 @@ from tempest.lib.common import rest_client class ContainerClient(rest_client.RestClient): - def create_container( - self, container_name, - metadata=None, - remove_metadata=None, - metadata_prefix='X-Container-Meta-', - remove_metadata_prefix='X-Remove-Container-Meta-'): - """Creates a container + def update_container(self, container_name, **headers): + """Creates or Updates a container - with optional metadata passed in as a dictionary + with optional metadata passed in as a dictionary. + Full list of allowed headers or value, please refer to the + official API reference: + https://developer.openstack.org/api-ref/object-store/#create-container """ url = str(container_name) - headers = {} - - if metadata is not None: - for key in metadata: - headers[metadata_prefix + key] = metadata[key] - if remove_metadata is not None: - for key in remove_metadata: - headers[remove_metadata_prefix + key] = remove_metadata[key] resp, body = self.put(url, body=None, headers=headers) self.expected_success([201, 202], resp.status) return resp, body + # NOTE: This alias is for the usability because PUT can be used for both + # updating/creating a resource and this PUT is mainly used for creating + # on Swift container API. + create_container = update_container + def delete_container(self, container_name): """Deletes the container (if it's empty).""" url = str(container_name)