diff options
Diffstat (limited to 'openstackclient/object')
| -rw-r--r-- | openstackclient/object/client.py | 8 | ||||
| -rw-r--r-- | openstackclient/object/v1/container.py | 55 | ||||
| -rw-r--r-- | openstackclient/object/v1/lib/container.py | 78 | ||||
| -rw-r--r-- | openstackclient/object/v1/lib/object.py | 80 | ||||
| -rw-r--r-- | openstackclient/object/v1/object.py | 67 |
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, |
