From eed4031a9e6ff79b66248dae6f7c70a5227e55c4 Mon Sep 17 00:00:00 2001 From: ghanshyam Date: Fri, 15 Sep 2017 18:30:04 +0300 Subject: [PATCH] Fix create container method Swift accept lot many headers in create container API but service client method only accept the metadata headers. This commit makes the PUT method to accept headers as kwargs. Also this commit renames the PUT method to update_container because that is PUT operation. In addition, this adds create_container as the alias for the usability. Details- https://developer.openstack.org/api-ref/object-store/#create-container Partially implements blueprint consistent-service-method-names Change-Id: I2a722bf181853ca903d05d4518b4c98764fadc12 --- tempest/api/object_storage/base.py | 2 +- .../object_storage/test_account_services.py | 2 +- .../test_container_acl_negative.py | 2 +- .../object_storage/test_container_services.py | 62 +++++++++---------- .../test_container_services_negative.py | 35 ++++++----- .../object_storage/test_object_services.py | 6 +- .../api/object_storage/test_object_version.py | 8 +-- tempest/scenario/manager.py | 2 +- .../object_storage/container_client.py | 27 ++++---- 9 files changed, 69 insertions(+), 77 deletions(-) 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)