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
This commit is contained in:
ghanshyam 2017-09-15 18:30:04 +03:00 committed by Ken'ichi Ohmichi
parent cc255bbbf4
commit eed4031a9e
9 changed files with 69 additions and 77 deletions

View File

@ -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

View File

@ -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)

View File

@ -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])

View File

@ -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': ''}

View File

@ -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))

View File

@ -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])

View File

@ -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',

View File

@ -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)

View File

@ -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)