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:
parent
cc255bbbf4
commit
eed4031a9e
@ -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
|
||||
|
@ -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)
|
||||
|
||||
|
@ -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])
|
||||
|
@ -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': ''}
|
||||
|
@ -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))
|
||||
|
||||
|
@ -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])
|
||||
|
@ -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',
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user