summaryrefslogtreecommitdiff
path: root/openstackclient/api
diff options
context:
space:
mode:
Diffstat (limited to 'openstackclient/api')
-rw-r--r--openstackclient/api/object_store_v1.py166
1 files changed, 160 insertions, 6 deletions
diff --git a/openstackclient/api/object_store_v1.py b/openstackclient/api/object_store_v1.py
index c52eeb3a..c870332a 100644
--- a/openstackclient/api/object_store_v1.py
+++ b/openstackclient/api/object_store_v1.py
@@ -44,9 +44,8 @@ class APIv1(api.BaseAPI):
"""
response = self.create(container, method='PUT')
- url_parts = urlparse(self.endpoint)
data = {
- 'account': url_parts.path.split('/')[-1],
+ 'account': self._find_account_id(),
'container': container,
'x-trans-id': response.headers.get('x-trans-id', None),
}
@@ -140,6 +139,23 @@ class APIv1(api.BaseAPI):
for object in objects:
self.object_save(container=container, object=object['name'])
+ def container_set(
+ self,
+ container,
+ properties,
+ ):
+ """Set container properties
+
+ :param string container:
+ name of container to modify
+ :param dict properties:
+ properties to add or update for the container
+ """
+
+ headers = self._set_properties(properties, 'X-Container-Meta-%s')
+ if headers:
+ self.create(container, headers=headers)
+
def container_show(
self,
container=None,
@@ -154,12 +170,13 @@ class APIv1(api.BaseAPI):
response = self._request('HEAD', container)
data = {
- 'account': response.headers.get('x-container-meta-owner', None),
+ 'account': self._find_account_id(),
'container': container,
'object_count': response.headers.get(
'x-container-object-count',
None,
),
+ 'meta-owner': response.headers.get('x-container-meta-owner', None),
'bytes_used': response.headers.get('x-container-bytes-used', None),
'read_acl': response.headers.get('x-container-read', None),
'write_acl': response.headers.get('x-container-write', None),
@@ -168,6 +185,24 @@ class APIv1(api.BaseAPI):
}
return data
+ def container_unset(
+ self,
+ container,
+ properties,
+ ):
+ """Unset container properties
+
+ :param string container:
+ name of container to modify
+ :param dict properties:
+ properties to remove from the container
+ """
+
+ headers = self._unset_properties(properties,
+ 'X-Remove-Container-Meta-%s')
+ if headers:
+ self.create(container, headers=headers)
+
def object_create(
self,
container=None,
@@ -194,9 +229,8 @@ class APIv1(api.BaseAPI):
method='PUT',
data=f,
)
- url_parts = urlparse(self.endpoint)
data = {
- 'account': url_parts.path.split('/')[-1],
+ 'account': self._find_account_id(),
'container': container,
'object': object,
'x-trans-id': response.headers.get('X-Trans-Id', None),
@@ -332,6 +366,46 @@ class APIv1(api.BaseAPI):
for chunk in response.iter_content():
f.write(chunk)
+ def object_set(
+ self,
+ container,
+ object,
+ properties,
+ ):
+ """Set object properties
+
+ :param string container:
+ container name for object to modify
+ :param string object:
+ name of object to modify
+ :param dict properties:
+ properties to add or update for the container
+ """
+
+ headers = self._set_properties(properties, 'X-Object-Meta-%s')
+ if headers:
+ self.create("%s/%s" % (container, object), headers=headers)
+
+ def object_unset(
+ self,
+ container,
+ object,
+ properties,
+ ):
+ """Unset object properties
+
+ :param string container:
+ container name for object to modify
+ :param string object:
+ name of object to modify
+ :param dict properties:
+ properties to remove from the object
+ """
+
+ headers = self._unset_properties(properties, 'X-Remove-Object-Meta-%s')
+ if headers:
+ self.create("%s/%s" % (container, object), headers=headers)
+
def object_show(
self,
container=None,
@@ -352,10 +426,11 @@ class APIv1(api.BaseAPI):
response = self._request('HEAD', "%s/%s" % (container, object))
data = {
- 'account': response.headers.get('x-container-meta-owner', None),
+ 'account': self._find_account_id(),
'container': container,
'object': object,
'content-type': response.headers.get('content-type', None),
+ 'meta-owner': response.headers.get('x-container-meta-owner', None),
}
if 'content-length' in response.headers:
data['content-length'] = response.headers.get(
@@ -386,3 +461,82 @@ class APIv1(api.BaseAPI):
data[key.lower()] = value
return data
+
+ def account_set(
+ self,
+ properties,
+ ):
+ """Set account properties
+
+ :param dict properties:
+ properties to add or update for the account
+ """
+
+ headers = self._set_properties(properties, 'X-Account-Meta-%s')
+ if headers:
+ # NOTE(stevemar): The URL (first argument) in this case is already
+ # set to the swift account endpoint, because that's how it's
+ # registered in the catalog
+ self.create("", headers=headers)
+
+ def account_show(self):
+ """Show account details"""
+
+ # NOTE(stevemar): Just a HEAD request to the endpoint already in the
+ # catalog should be enough.
+ response = self._request("HEAD", "")
+ data = {}
+ for k, v in response.headers.iteritems():
+ data[k] = v
+ # Map containers, bytes and objects a bit nicer
+ data['Containers'] = data.pop('x-account-container-count', None)
+ data['Objects'] = data.pop('x-account-object-count', None)
+ data['Bytes'] = data.pop('x-account-bytes-used', None)
+ # Add in Account info too
+ data['Account'] = self._find_account_id()
+ return data
+
+ def account_unset(
+ self,
+ properties,
+ ):
+ """Unset account properties
+
+ :param dict properties:
+ properties to remove from the account
+ """
+
+ headers = self._unset_properties(properties,
+ 'X-Remove-Account-Meta-%s')
+ if headers:
+ self.create("", headers=headers)
+
+ def _find_account_id(self):
+ url_parts = urlparse(self.endpoint)
+ return url_parts.path.split('/')[-1]
+
+ def _unset_properties(self, properties, header_tag):
+ # NOTE(stevemar): As per the API, the headers have to be in the form
+ # of "X-Remove-Account-Meta-Book: x". In the case where metadata is
+ # removed, we can set the value of the header to anything, so it's
+ # set to 'x'. In the case of a Container property we use:
+ # "X-Remove-Container-Meta-Book: x", and the same logic applies for
+ # Object properties
+
+ headers = {}
+ for k in properties:
+ header_name = header_tag % k
+ headers[header_name] = 'x'
+ return headers
+
+ def _set_properties(self, properties, header_tag):
+ # NOTE(stevemar): As per the API, the headers have to be in the form
+ # of "X-Account-Meta-Book: MobyDick". In the case of a Container
+ # property we use: "X-Add-Container-Meta-Book: MobyDick", and the same
+ # logic applies for Object properties
+
+ headers = {}
+ for k, v in properties.iteritems():
+ header_name = header_tag % k
+ headers[header_name] = v
+ return headers