summaryrefslogtreecommitdiff
path: root/openstackclient/object
diff options
context:
space:
mode:
Diffstat (limited to 'openstackclient/object')
-rw-r--r--openstackclient/object/client.py8
-rw-r--r--openstackclient/object/v1/container.py55
-rw-r--r--openstackclient/object/v1/lib/container.py78
-rw-r--r--openstackclient/object/v1/lib/object.py80
-rw-r--r--openstackclient/object/v1/object.py67
5 files changed, 244 insertions, 44 deletions
diff --git a/openstackclient/object/client.py b/openstackclient/object/client.py
index 273bea6e..b81ffaaf 100644
--- a/openstackclient/object/client.py
+++ b/openstackclient/object/client.py
@@ -23,7 +23,7 @@ LOG = logging.getLogger(__name__)
DEFAULT_OBJECT_API_VERSION = '1'
API_VERSION_OPTION = 'os_object_api_version'
-API_NAME = 'object-store'
+API_NAME = 'object_store'
API_VERSIONS = {
'1': 'openstackclient.object.client.ObjectClientv1',
}
@@ -31,15 +31,17 @@ API_VERSIONS = {
def make_client(instance):
"""Returns an object service client."""
+
object_client = utils.get_client_class(
API_NAME,
instance._api_version[API_NAME],
API_VERSIONS)
+ LOG.debug('Instantiating object client: %s', object_client)
+
if instance._url:
endpoint = instance._url
else:
- endpoint = instance.get_endpoint_for_service_type(API_NAME)
- LOG.debug('instantiating object client')
+ endpoint = instance.get_endpoint_for_service_type("object-store")
client = object_client(
endpoint=endpoint,
token=instance._token,
diff --git a/openstackclient/object/v1/container.py b/openstackclient/object/v1/container.py
index 1e252aaf..1ca07f3a 100644
--- a/openstackclient/object/v1/container.py
+++ b/openstackclient/object/v1/container.py
@@ -19,6 +19,7 @@
import logging
import six
+from cliff import command
from cliff import lister
from cliff import show
@@ -26,6 +27,56 @@ from openstackclient.common import utils
from openstackclient.object.v1.lib import container as lib_container
+class CreateContainer(show.ShowOne):
+ """Create a container"""
+
+ log = logging.getLogger(__name__ + '.CreateContainer')
+
+ def get_parser(self, prog_name):
+ parser = super(CreateContainer, self).get_parser(prog_name)
+ parser.add_argument(
+ 'container',
+ metavar='<container>',
+ help='New container name',
+ )
+ return parser
+
+ def take_action(self, parsed_args):
+ self.log.debug('take_action(%s)', parsed_args)
+
+ data = lib_container.create_container(
+ self.app.client_manager.session,
+ self.app.client_manager.object_store.endpoint,
+ parsed_args.container,
+ )
+
+ return zip(*sorted(six.iteritems(data)))
+
+
+class DeleteContainer(command.Command):
+ """Delete a container"""
+
+ log = logging.getLogger(__name__ + '.DeleteContainer')
+
+ def get_parser(self, prog_name):
+ parser = super(DeleteContainer, self).get_parser(prog_name)
+ parser.add_argument(
+ 'container',
+ metavar='<container>',
+ help='Container name to delete',
+ )
+ return parser
+
+ def take_action(self, parsed_args):
+ self.log.debug('take_action(%s)', parsed_args)
+
+ lib_container.delete_container(
+ self.app.client_manager.session,
+ self.app.client_manager.object_store.endpoint,
+ parsed_args.container,
+ )
+
+
class ListContainer(lister.Lister):
"""List containers"""
@@ -89,7 +140,7 @@ class ListContainer(lister.Lister):
kwargs['full_listing'] = True
data = lib_container.list_containers(
- self.app.restapi,
+ self.app.client_manager.session,
self.app.client_manager.object_store.endpoint,
**kwargs
)
@@ -119,7 +170,7 @@ class ShowContainer(show.ShowOne):
self.log.debug('take_action(%s)', parsed_args)
data = lib_container.show_container(
- self.app.restapi,
+ self.app.client_manager.session,
self.app.client_manager.object_store.endpoint,
parsed_args.container,
)
diff --git a/openstackclient/object/v1/lib/container.py b/openstackclient/object/v1/lib/container.py
index 0bae2349..65a9fe4d 100644
--- a/openstackclient/object/v1/lib/container.py
+++ b/openstackclient/object/v1/lib/container.py
@@ -17,13 +17,52 @@
"""Object v1 API library"""
try:
- from urllib.parse import urlparse
+ from urllib.parse import urlparse # noqa
except ImportError:
- from urlparse import urlparse
+ from urlparse import urlparse # noqa
+
+
+def create_container(
+ session,
+ url,
+ container,
+):
+ """Create a container
+
+ :param session: a restapi object
+ :param url: endpoint
+ :param container: name of container to create
+ :returns: dict of returned headers
+ """
+
+ response = session.put("%s/%s" % (url, container))
+ url_parts = urlparse(url)
+ data = {
+ 'account': url_parts.path.split('/')[-1],
+ 'container': container,
+ 'x-trans-id': response.headers.get('x-trans-id', None),
+ }
+
+ return data
+
+
+def delete_container(
+ session,
+ url,
+ container,
+):
+ """Delete a container
+
+ :param session: a restapi object
+ :param url: endpoint
+ :param container: name of container to delete
+ """
+
+ session.delete("%s/%s" % (url, container))
def list_containers(
- api,
+ session,
url,
marker=None,
limit=None,
@@ -33,7 +72,7 @@ def list_containers(
):
"""Get containers in an account
- :param api: a restapi object
+ :param session: a restapi object
:param url: endpoint
:param marker: marker query
:param limit: limit query
@@ -46,7 +85,7 @@ def list_containers(
if full_listing:
data = listing = list_containers(
- api,
+ session,
url,
marker,
limit,
@@ -56,7 +95,7 @@ def list_containers(
while listing:
marker = listing[-1]['name']
listing = list_containers(
- api,
+ session,
url,
marker,
limit,
@@ -78,34 +117,35 @@ def list_containers(
params['end_marker'] = end_marker
if prefix:
params['prefix'] = prefix
- return api.list(url, params=params)
+ return session.get(url, params=params).json()
def show_container(
- api,
+ session,
url,
container,
):
"""Get container details
- :param api: a restapi object
+ :param session: a restapi object
:param url: endpoint
:param container: name of container to show
:returns: dict of returned headers
"""
- response = api.head("%s/%s" % (url, container))
- url_parts = urlparse(url)
+ response = session.head("%s/%s" % (url, container))
data = {
- 'account': url_parts.path.split('/')[-1],
+ 'account': response.headers.get('x-container-meta-owner', None),
'container': container,
+ 'object_count': response.headers.get(
+ 'x-container-object-count',
+ 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),
+ 'sync_to': response.headers.get('x-container-sync-to', None),
+ 'sync_key': response.headers.get('x-container-sync-key', None),
}
- data['object_count'] = response.headers.get(
- 'x-container-object-count', None)
- data['bytes_used'] = response.headers.get('x-container-bytes-used', None)
- data['read_acl'] = response.headers.get('x-container-read', None)
- data['write_acl'] = response.headers.get('x-container-write', None)
- data['sync_to'] = response.headers.get('x-container-sync-to', None)
- data['sync_key'] = response.headers.get('x-container-sync-key', None)
return data
diff --git a/openstackclient/object/v1/lib/object.py b/openstackclient/object/v1/lib/object.py
index 646737bd..0ded0dad 100644
--- a/openstackclient/object/v1/lib/object.py
+++ b/openstackclient/object/v1/lib/object.py
@@ -19,13 +19,59 @@
import six
try:
- from urllib.parse import urlparse
+ from urllib.parse import urlparse # noqa
except ImportError:
- from urlparse import urlparse
+ from urlparse import urlparse # noqa
+
+
+def create_object(
+ session,
+ url,
+ container,
+ object,
+):
+ """Create an object, upload it to a container
+
+ :param session: a restapi object
+ :param url: endpoint
+ :param container: name of container to store object
+ :param object: local path to object
+ :returns: dict of returned headers
+ """
+
+ full_url = "%s/%s/%s" % (url, container, object)
+ response = session.put(full_url, data=open(object))
+ url_parts = urlparse(url)
+ data = {
+ 'account': url_parts.path.split('/')[-1],
+ 'container': container,
+ 'object': object,
+ 'x-trans-id': response.headers.get('X-Trans-Id', None),
+ 'etag': response.headers.get('Etag', None),
+ }
+
+ return data
+
+
+def delete_object(
+ session,
+ url,
+ container,
+ object,
+):
+ """Delete an object stored in a container
+
+ :param session: a restapi object
+ :param url: endpoint
+ :param container: name of container that stores object
+ :param container: name of object to delete
+ """
+
+ session.delete("%s/%s/%s" % (url, container, object))
def list_objects(
- api,
+ session,
url,
container,
marker=None,
@@ -38,7 +84,7 @@ def list_objects(
):
"""Get objects in a container
- :param api: a restapi object
+ :param session: a restapi object
:param url: endpoint
:param container: container name to get a listing for
:param marker: marker query
@@ -55,7 +101,7 @@ def list_objects(
if full_listing:
data = listing = list_objects(
- api,
+ session,
url,
container,
marker,
@@ -71,7 +117,7 @@ def list_objects(
else:
marker = listing[-1]['name']
listing = list_objects(
- api,
+ session,
url,
container,
marker,
@@ -85,7 +131,6 @@ def list_objects(
data.extend(listing)
return data
- object_url = url
params = {
'format': 'json',
}
@@ -101,32 +146,31 @@ def list_objects(
params['prefix'] = prefix
if path:
params['path'] = path
- url = "%s/%s" % (object_url, container)
- return api.list(url, params=params)
+ requrl = "%s/%s" % (url, container)
+ return session.get(requrl, params=params).json()
def show_object(
- api,
+ session,
url,
container,
obj,
):
"""Get object details
- :param api: a restapi object
+ :param session: a restapi object
:param url: endpoint
:param container: container name to get a listing for
:returns: dict of object properties
"""
- response = api.head("%s/%s/%s" % (url, container, obj))
- url_parts = urlparse(url)
+ response = session.head("%s/%s/%s" % (url, container, obj))
data = {
- 'account': url_parts.path.split('/')[-1],
+ 'account': response.headers.get('x-container-meta-owner', None),
'container': container,
'object': obj,
+ 'content-type': response.headers.get('content-type', None),
}
- data['content-type'] = response.headers.get('content-type', None)
if 'content-length' in response.headers:
data['content-length'] = response.headers.get('content-length', None)
if 'last-modified' in response.headers:
@@ -138,10 +182,10 @@ def show_object(
'x-object-manifest', None)
for key, value in six.iteritems(response.headers):
if key.startswith('x-object-meta-'):
- data[key[len('x-object-meta-'):].title()] = value
+ data[key[len('x-object-meta-'):].lower()] = value
elif key not in (
'content-type', 'content-length', 'last-modified',
- 'etag', 'date', 'x-object-manifest'):
- data[key.title()] = value
+ 'etag', 'date', 'x-object-manifest', 'x-container-meta-owner'):
+ data[key.lower()] = value
return data
diff --git a/openstackclient/object/v1/object.py b/openstackclient/object/v1/object.py
index ee30c842..812ad6e1 100644
--- a/openstackclient/object/v1/object.py
+++ b/openstackclient/object/v1/object.py
@@ -19,6 +19,7 @@
import logging
import six
+from cliff import command
from cliff import lister
from cliff import show
@@ -26,6 +27,68 @@ from openstackclient.common import utils
from openstackclient.object.v1.lib import object as lib_object
+class CreateObject(show.ShowOne):
+ """Upload an object to a container"""
+
+ log = logging.getLogger(__name__ + '.CreateObject')
+
+ def get_parser(self, prog_name):
+ parser = super(CreateObject, self).get_parser(prog_name)
+ parser.add_argument(
+ 'container',
+ metavar='<container>',
+ help='Container to store new object',
+ )
+ parser.add_argument(
+ 'object',
+ metavar='<object-name>',
+ help='Local path of object to upload',
+ )
+ return parser
+
+ def take_action(self, parsed_args):
+ self.log.debug('take_action(%s)', parsed_args)
+
+ data = lib_object.create_object(
+ self.app.client_manager.session,
+ self.app.client_manager.object_store.endpoint,
+ parsed_args.container,
+ parsed_args.object,
+ )
+
+ return zip(*sorted(six.iteritems(data)))
+
+
+class DeleteObject(command.Command):
+ """Delete an object within a container"""
+
+ log = logging.getLogger(__name__ + '.DeleteObject')
+
+ def get_parser(self, prog_name):
+ parser = super(DeleteObject, self).get_parser(prog_name)
+ parser.add_argument(
+ 'container',
+ metavar='<container>',
+ help='Container that stores the object to delete',
+ )
+ parser.add_argument(
+ 'object',
+ metavar='<object-name>',
+ help='Object to delete',
+ )
+ return parser
+
+ def take_action(self, parsed_args):
+ self.log.debug('take_action(%s)', parsed_args)
+
+ lib_object.delete_object(
+ self.app.client_manager.session,
+ self.app.client_manager.object_store.endpoint,
+ parsed_args.container,
+ parsed_args.object,
+ )
+
+
class ListObject(lister.Lister):
"""List objects"""
@@ -107,7 +170,7 @@ class ListObject(lister.Lister):
kwargs['full_listing'] = True
data = lib_object.list_objects(
- self.app.restapi,
+ self.app.client_manager.session,
self.app.client_manager.object_store.endpoint,
parsed_args.container,
**kwargs
@@ -143,7 +206,7 @@ class ShowObject(show.ShowOne):
self.log.debug('take_action(%s)', parsed_args)
data = lib_object.show_object(
- self.app.restapi,
+ self.app.client_manager.session,
self.app.client_manager.object_store.endpoint,
parsed_args.container,
parsed_args.object,