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:
ghanshyam
2016-12-12 17:50:26 +09:00
committed by Ghanshyam Mann
parent 549cac3ed9
commit 9604aa0247
7 changed files with 78 additions and 71 deletions
@@ -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