Fix create, update or delete account metadata method
Swift provides a single API to Create, Update or Delete account metadata. With different headers or values those operation can be achieved. For example: - delete metadata by passing metadata without value - update metadata by passing updated value with same key Details- http://developer.openstack.org/api-ref/object-storage/?expanded=create-update-or-delete-account-metadata-detail But current service client for account has 3 different method for these operation. create_, delete_ and create_and_delete_ To make it consistent with other service client and to have single service client method per API, this patch merge those methods. Partially implements blueprint consistent-service-method-names Change-Id: I098e4ccc0d7b443d77ee055f39958e983acf7113
This commit is contained in:
committed by
Ghanshyam Mann
parent
549cac3ed9
commit
9604aa0247
@@ -82,11 +82,13 @@ class AccountQuotasNegativeTest(base.BaseObjectTest):
|
||||
"""Test that a user cannot modify or remove a quota on its account."""
|
||||
|
||||
# Not able to remove quota
|
||||
self.assertRaises(lib_exc.Forbidden,
|
||||
self.account_client.create_account_metadata,
|
||||
{"Quota-Bytes": ""})
|
||||
self.assertRaises(
|
||||
lib_exc.Forbidden,
|
||||
self.account_client.create_update_or_delete_account_metadata,
|
||||
create_update_metadata={"Quota-Bytes": ""})
|
||||
|
||||
# Not able to modify quota
|
||||
self.assertRaises(lib_exc.Forbidden,
|
||||
self.account_client.create_account_metadata,
|
||||
{"Quota-Bytes": "100"})
|
||||
self.assertRaises(
|
||||
lib_exc.Forbidden,
|
||||
self.account_client.create_update_or_delete_account_metadata,
|
||||
create_update_metadata={"Quota-Bytes": "100"})
|
||||
|
||||
@@ -272,13 +272,15 @@ class AccountTest(base.BaseObjectTest):
|
||||
# set metadata to account
|
||||
metadata = {'test-account-meta1': 'Meta1',
|
||||
'test-account-meta2': 'Meta2'}
|
||||
resp, _ = self.account_client.create_account_metadata(metadata)
|
||||
resp, _ = self.account_client.create_update_or_delete_account_metadata(
|
||||
create_update_metadata=metadata)
|
||||
|
||||
resp, _ = self.account_client.list_account_metadata()
|
||||
self.assertHeaders(resp, 'Account', 'HEAD')
|
||||
self.assertIn('x-account-meta-test-account-meta1', resp)
|
||||
self.assertIn('x-account-meta-test-account-meta2', resp)
|
||||
self.account_client.delete_account_metadata(metadata)
|
||||
self.account_client.create_update_or_delete_account_metadata(
|
||||
delete_metadata=metadata)
|
||||
|
||||
@decorators.idempotent_id('b904c2e3-24c2-4dba-ad7d-04e90a761be5')
|
||||
def test_list_no_account_metadata(self):
|
||||
@@ -291,7 +293,8 @@ class AccountTest(base.BaseObjectTest):
|
||||
def test_update_account_metadata_with_create_metadata(self):
|
||||
# add metadata to account
|
||||
metadata = {'test-account-meta1': 'Meta1'}
|
||||
resp, _ = self.account_client.create_account_metadata(metadata)
|
||||
resp, _ = self.account_client.create_update_or_delete_account_metadata(
|
||||
create_update_metadata=metadata)
|
||||
self.assertHeaders(resp, 'Account', 'POST')
|
||||
|
||||
resp, body = self.account_client.list_account_metadata()
|
||||
@@ -299,14 +302,17 @@ class AccountTest(base.BaseObjectTest):
|
||||
self.assertEqual(resp['x-account-meta-test-account-meta1'],
|
||||
metadata['test-account-meta1'])
|
||||
|
||||
self.account_client.delete_account_metadata(metadata)
|
||||
self.account_client.create_update_or_delete_account_metadata(
|
||||
delete_metadata=metadata)
|
||||
|
||||
@decorators.idempotent_id('9f60348d-c46f-4465-ae06-d51dbd470953')
|
||||
def test_update_account_metadata_with_delete_metadata(self):
|
||||
# delete metadata from account
|
||||
metadata = {'test-account-meta1': 'Meta1'}
|
||||
self.account_client.create_account_metadata(metadata)
|
||||
resp, _ = self.account_client.delete_account_metadata(metadata)
|
||||
self.account_client.create_update_or_delete_account_metadata(
|
||||
create_update_metadata=metadata)
|
||||
resp, _ = self.account_client.create_update_or_delete_account_metadata(
|
||||
delete_metadata=metadata)
|
||||
self.assertHeaders(resp, 'Account', 'POST')
|
||||
|
||||
resp, _ = self.account_client.list_account_metadata()
|
||||
@@ -317,7 +323,8 @@ class AccountTest(base.BaseObjectTest):
|
||||
# if the value of metadata is not set, the metadata is not
|
||||
# registered at a server
|
||||
metadata = {'test-account-meta1': ''}
|
||||
resp, _ = self.account_client.create_account_metadata(metadata)
|
||||
resp, _ = self.account_client.create_update_or_delete_account_metadata(
|
||||
create_update_metadata=metadata)
|
||||
self.assertHeaders(resp, 'Account', 'POST')
|
||||
|
||||
resp, _ = self.account_client.list_account_metadata()
|
||||
@@ -328,9 +335,11 @@ class AccountTest(base.BaseObjectTest):
|
||||
# Although the value of metadata is not set, the feature of
|
||||
# deleting metadata is valid
|
||||
metadata_1 = {'test-account-meta1': 'Meta1'}
|
||||
self.account_client.create_account_metadata(metadata_1)
|
||||
self.account_client.create_update_or_delete_account_metadata(
|
||||
create_update_metadata=metadata_1)
|
||||
metadata_2 = {'test-account-meta1': ''}
|
||||
resp, _ = self.account_client.delete_account_metadata(metadata_2)
|
||||
resp, _ = self.account_client.create_update_or_delete_account_metadata(
|
||||
delete_metadata=metadata_2)
|
||||
self.assertHeaders(resp, 'Account', 'POST')
|
||||
|
||||
resp, _ = self.account_client.list_account_metadata()
|
||||
@@ -340,11 +349,13 @@ class AccountTest(base.BaseObjectTest):
|
||||
def test_update_account_metadata_with_create_and_delete_metadata(self):
|
||||
# Send a request adding and deleting metadata requests simultaneously
|
||||
metadata_1 = {'test-account-meta1': 'Meta1'}
|
||||
self.account_client.create_account_metadata(metadata_1)
|
||||
self.account_client.create_update_or_delete_account_metadata(
|
||||
create_update_metadata=metadata_1)
|
||||
metadata_2 = {'test-account-meta2': 'Meta2'}
|
||||
resp, body = self.account_client.create_and_delete_account_metadata(
|
||||
metadata_2,
|
||||
metadata_1)
|
||||
resp, body = (
|
||||
self.account_client.create_update_or_delete_account_metadata(
|
||||
create_update_metadata=metadata_2,
|
||||
delete_metadata=metadata_1))
|
||||
self.assertHeaders(resp, 'Account', 'POST')
|
||||
|
||||
resp, _ = self.account_client.list_account_metadata()
|
||||
@@ -353,4 +364,5 @@ class AccountTest(base.BaseObjectTest):
|
||||
self.assertEqual(resp['x-account-meta-test-account-meta2'],
|
||||
metadata_2['test-account-meta2'])
|
||||
|
||||
self.account_client.delete_account_metadata(metadata_2)
|
||||
self.account_client.create_update_or_delete_account_metadata(
|
||||
delete_metadata=metadata_2)
|
||||
|
||||
@@ -37,7 +37,8 @@ class ObjectFormPostTest(base.BaseObjectTest):
|
||||
|
||||
cls.key = 'Meta'
|
||||
cls.metadata = {'Temp-URL-Key': cls.key}
|
||||
cls.account_client.create_account_metadata(metadata=cls.metadata)
|
||||
cls.account_client.create_update_or_delete_account_metadata(
|
||||
create_update_metadata=cls.metadata)
|
||||
|
||||
def setUp(self):
|
||||
super(ObjectFormPostTest, self).setUp()
|
||||
@@ -53,7 +54,8 @@ class ObjectFormPostTest(base.BaseObjectTest):
|
||||
|
||||
@classmethod
|
||||
def resource_cleanup(cls):
|
||||
cls.account_client.delete_account_metadata(metadata=cls.metadata)
|
||||
cls.account_client.create_update_or_delete_account_metadata(
|
||||
delete_metadata=cls.metadata)
|
||||
cls.delete_containers()
|
||||
super(ObjectFormPostTest, cls).resource_cleanup()
|
||||
|
||||
|
||||
@@ -38,7 +38,8 @@ class ObjectFormPostNegativeTest(base.BaseObjectTest):
|
||||
|
||||
cls.key = 'Meta'
|
||||
cls.metadata = {'Temp-URL-Key': cls.key}
|
||||
cls.account_client.create_account_metadata(metadata=cls.metadata)
|
||||
cls.account_client.create_update_or_delete_account_metadata(
|
||||
create_update_metadata=cls.metadata)
|
||||
|
||||
def setUp(self):
|
||||
super(ObjectFormPostNegativeTest, self).setUp()
|
||||
@@ -54,7 +55,8 @@ class ObjectFormPostNegativeTest(base.BaseObjectTest):
|
||||
|
||||
@classmethod
|
||||
def resource_cleanup(cls):
|
||||
cls.account_client.delete_account_metadata(metadata=cls.metadata)
|
||||
cls.account_client.create_update_or_delete_account_metadata(
|
||||
delete_metadata=cls.metadata)
|
||||
cls.delete_containers()
|
||||
super(ObjectFormPostNegativeTest, cls).resource_cleanup()
|
||||
|
||||
|
||||
@@ -37,7 +37,8 @@ class ObjectTempUrlTest(base.BaseObjectTest):
|
||||
cls.metadatas = []
|
||||
metadata = {'Temp-URL-Key': cls.key}
|
||||
cls.metadatas.append(metadata)
|
||||
cls.account_client.create_account_metadata(metadata=metadata)
|
||||
cls.account_client.create_update_or_delete_account_metadata(
|
||||
create_update_metadata=metadata)
|
||||
|
||||
# create an object
|
||||
cls.object_name, cls.content = cls.create_object(cls.container_name)
|
||||
@@ -45,8 +46,8 @@ class ObjectTempUrlTest(base.BaseObjectTest):
|
||||
@classmethod
|
||||
def resource_cleanup(cls):
|
||||
for metadata in cls.metadatas:
|
||||
cls.account_client.delete_account_metadata(
|
||||
metadata=metadata)
|
||||
cls.account_client.create_update_or_delete_account_metadata(
|
||||
delete_metadata=metadata)
|
||||
|
||||
cls.delete_containers()
|
||||
|
||||
@@ -110,7 +111,8 @@ class ObjectTempUrlTest(base.BaseObjectTest):
|
||||
def test_get_object_using_temp_url_key_2(self):
|
||||
key2 = 'Meta2-'
|
||||
metadata = {'Temp-URL-Key-2': key2}
|
||||
self.account_client.create_account_metadata(metadata=metadata)
|
||||
self.account_client.create_update_or_delete_account_metadata(
|
||||
create_update_metadata=metadata)
|
||||
self.metadatas.append(metadata)
|
||||
|
||||
# make sure the metadata has been set
|
||||
|
||||
@@ -39,14 +39,15 @@ class ObjectTempUrlNegativeTest(base.BaseObjectTest):
|
||||
# update account metadata
|
||||
cls.key = 'Meta'
|
||||
cls.metadata = {'Temp-URL-Key': cls.key}
|
||||
cls.account_client.create_account_metadata(metadata=cls.metadata)
|
||||
cls.account_client.create_update_or_delete_account_metadata(
|
||||
create_update_metadata=cls.metadata)
|
||||
cls.account_client_metadata, _ = \
|
||||
cls.account_client.list_account_metadata()
|
||||
|
||||
@classmethod
|
||||
def resource_cleanup(cls):
|
||||
resp, _ = cls.account_client.delete_account_metadata(
|
||||
metadata=cls.metadata)
|
||||
resp, _ = cls.account_client.create_update_or_delete_account_metadata(
|
||||
delete_metadata=cls.metadata)
|
||||
|
||||
cls.delete_containers()
|
||||
|
||||
|
||||
@@ -23,6 +23,32 @@ from tempest.lib.common import rest_client
|
||||
|
||||
class AccountClient(rest_client.RestClient):
|
||||
|
||||
def create_update_or_delete_account_metadata(
|
||||
self,
|
||||
create_update_metadata=None,
|
||||
delete_metadata=None,
|
||||
create_update_metadata_prefix='X-Account-Meta-',
|
||||
delete_metadata_prefix='X-Remove-Account-Meta-'):
|
||||
"""Creates, Updates or deletes an account metadata entry.
|
||||
|
||||
Account Metadata can be created, updated or deleted based on
|
||||
metadata header or value. For detailed info, please refer to the
|
||||
official API reference:
|
||||
http://developer.openstack.org/api-ref/object-storage/?expanded=create-update-or-delete-account-metadata-detail
|
||||
"""
|
||||
headers = {}
|
||||
if create_update_metadata:
|
||||
for key in create_update_metadata:
|
||||
metadata_header_name = create_update_metadata_prefix + key
|
||||
headers[metadata_header_name] = create_update_metadata[key]
|
||||
if delete_metadata:
|
||||
for key in delete_metadata:
|
||||
headers[delete_metadata_prefix + key] = delete_metadata[key]
|
||||
|
||||
resp, body = self.post('', headers=headers, body=None)
|
||||
self.expected_success([200, 204], resp.status)
|
||||
return resp, body
|
||||
|
||||
def list_account_metadata(self):
|
||||
"""HEAD on the storage URL
|
||||
|
||||
@@ -32,46 +58,6 @@ class AccountClient(rest_client.RestClient):
|
||||
self.expected_success(204, resp.status)
|
||||
return resp, body
|
||||
|
||||
def create_account_metadata(self, metadata,
|
||||
metadata_prefix='X-Account-Meta-'):
|
||||
"""Creates an account metadata entry."""
|
||||
headers = {}
|
||||
if metadata:
|
||||
for key in metadata:
|
||||
headers[metadata_prefix + key] = metadata[key]
|
||||
|
||||
resp, body = self.post('', headers=headers, body=None)
|
||||
self.expected_success([200, 204], resp.status)
|
||||
return resp, body
|
||||
|
||||
def delete_account_metadata(self, metadata,
|
||||
metadata_prefix='X-Remove-Account-Meta-'):
|
||||
"""Deletes an account metadata entry."""
|
||||
|
||||
headers = {}
|
||||
for item in metadata:
|
||||
headers[metadata_prefix + item] = metadata[item]
|
||||
resp, body = self.post('', headers=headers, body=None)
|
||||
self.expected_success(204, resp.status)
|
||||
return resp, body
|
||||
|
||||
def create_and_delete_account_metadata(
|
||||
self,
|
||||
create_metadata=None,
|
||||
delete_metadata=None,
|
||||
create_metadata_prefix='X-Account-Meta-',
|
||||
delete_metadata_prefix='X-Remove-Account-Meta-'):
|
||||
"""Creates and deletes an account metadata entry."""
|
||||
headers = {}
|
||||
for key in create_metadata:
|
||||
headers[create_metadata_prefix + key] = create_metadata[key]
|
||||
for key in delete_metadata:
|
||||
headers[delete_metadata_prefix + key] = delete_metadata[key]
|
||||
|
||||
resp, body = self.post('', headers=headers, body=None)
|
||||
self.expected_success(204, resp.status)
|
||||
return resp, body
|
||||
|
||||
def list_account_containers(self, params=None):
|
||||
"""GET on the (base) storage URL
|
||||
|
||||
|
||||
Reference in New Issue
Block a user