diff options
author | Dean Troyer <dtroyer@gmail.com> | 2014-09-18 00:54:52 -0500 |
---|---|---|
committer | Steve Martinelli <stevemar@ca.ibm.com> | 2014-10-01 13:50:13 -0400 |
commit | 31018bf7c2c57c530d55ed1dd90b9b65d489d557 (patch) | |
tree | 79f991b2c0b6c54c54b97c54cdf6db00a904cf86 /openstackclient/object | |
parent | e3b9b9658805f274283a498ed82014dce3833fe3 (diff) | |
download | python-openstackclient-31018bf7c2c57c530d55ed1dd90b9b65d489d557.tar.gz |
Move object-store commands to low-level API
api.object_store.APIv1 now contains the formerly top-level functions
implementing the object-store REST client. This replaces the old-style
ObjectClientv1 that is no longer necessary.
Change-Id: I7d8fea326b214481e7d6b24119bd41777c6aa968
Diffstat (limited to 'openstackclient/object')
-rw-r--r-- | openstackclient/object/client.py | 22 | ||||
-rw-r--r-- | openstackclient/object/v1/container.py | 29 | ||||
-rw-r--r-- | openstackclient/object/v1/lib/container.py | 170 | ||||
-rw-r--r-- | openstackclient/object/v1/lib/object.py | 221 | ||||
-rw-r--r-- | openstackclient/object/v1/object.py | 42 |
5 files changed, 30 insertions, 454 deletions
diff --git a/openstackclient/object/client.py b/openstackclient/object/client.py index b81ffaaf..887aa85b 100644 --- a/openstackclient/object/client.py +++ b/openstackclient/object/client.py @@ -17,6 +17,7 @@ import logging +from openstackclient.api import object_store_v1 from openstackclient.common import utils LOG = logging.getLogger(__name__) @@ -30,7 +31,7 @@ API_VERSIONS = { def make_client(instance): - """Returns an object service client.""" + """Returns an object-store API client.""" object_client = utils.get_client_class( API_NAME, @@ -42,9 +43,11 @@ def make_client(instance): endpoint = instance._url else: endpoint = instance.get_endpoint_for_service_type("object-store") - client = object_client( + + client = object_store_v1.APIv1( + session=instance.session, + service_type='object-store', endpoint=endpoint, - token=instance._token, ) return client @@ -61,16 +64,3 @@ def build_option_parser(parser): DEFAULT_OBJECT_API_VERSION + ' (Env: OS_OBJECT_API_VERSION)') return parser - - -class ObjectClientv1(object): - - def __init__( - self, - endpoint_type='publicURL', - endpoint=None, - token=None, - ): - self.endpoint_type = endpoint_type - self.endpoint = endpoint - self.token = token diff --git a/openstackclient/object/v1/container.py b/openstackclient/object/v1/container.py index 9d55381c..ead3df45 100644 --- a/openstackclient/object/v1/container.py +++ b/openstackclient/object/v1/container.py @@ -24,7 +24,6 @@ from cliff import lister from cliff import show from openstackclient.common import utils -from openstackclient.object.v1.lib import container as lib_container class CreateContainer(lister.Lister): @@ -47,10 +46,8 @@ class CreateContainer(lister.Lister): results = [] for container in parsed_args.containers: - data = lib_container.create_container( - self.app.client_manager.session, - self.app.client_manager.object_store.endpoint, - container, + data = self.app.client_manager.object_store.container_create( + container=container, ) results.append(data) @@ -81,10 +78,8 @@ class DeleteContainer(command.Command): self.log.debug('take_action(%s)', parsed_args) for container in parsed_args.containers: - lib_container.delete_container( - self.app.client_manager.session, - self.app.client_manager.object_store.endpoint, - container, + self.app.client_manager.object_store.container_delete( + container=container, ) @@ -150,9 +145,7 @@ class ListContainer(lister.Lister): if parsed_args.all: kwargs['full_listing'] = True - data = lib_container.list_containers( - self.app.client_manager.session, - self.app.client_manager.object_store.endpoint, + data = self.app.client_manager.object_store.container_list( **kwargs ) @@ -180,10 +173,8 @@ class SaveContainer(command.Command): def take_action(self, parsed_args): self.log.debug("take_action(%s)", parsed_args) - lib_container.save_container( - self.app.client_manager.session, - self.app.client_manager.object_store.endpoint, - parsed_args.container + self.app.client_manager.object_store.container_save( + container=parsed_args.container, ) @@ -204,10 +195,8 @@ class ShowContainer(show.ShowOne): def take_action(self, parsed_args): self.log.debug('take_action(%s)', parsed_args) - data = lib_container.show_container( - self.app.client_manager.session, - self.app.client_manager.object_store.endpoint, - parsed_args.container, + data = self.app.client_manager.object_store.container_show( + container=parsed_args.container, ) return zip(*sorted(six.iteritems(data))) diff --git a/openstackclient/object/v1/lib/container.py b/openstackclient/object/v1/lib/container.py deleted file mode 100644 index 4293ff4a..00000000 --- a/openstackclient/object/v1/lib/container.py +++ /dev/null @@ -1,170 +0,0 @@ -# Copyright 2010-2012 OpenStack Foundation -# Copyright 2013 Nebula Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. -# - -"""Object v1 API library""" - -try: - from urllib.parse import urlparse # noqa -except ImportError: - from urlparse import urlparse # noqa - -from openstackclient.object.v1.lib import object as object_lib - - -def create_container( - session, - url, - container, -): - """Create a container - - :param session: an authenticated keystoneclient.session.Session 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: an authenticated keystoneclient.session.Session object - :param url: endpoint - :param container: name of container to delete - """ - - session.delete("%s/%s" % (url, container)) - - -def list_containers( - session, - url, - marker=None, - limit=None, - end_marker=None, - prefix=None, - full_listing=False, -): - """Get containers in an account - - :param session: an authenticated keystoneclient.session.Session object - :param url: endpoint - :param marker: marker query - :param limit: limit query - :param end_marker: end_marker query - :param prefix: prefix query - :param full_listing: if True, return a full listing, else returns a max - of 10000 listings - :returns: list of containers - """ - - if full_listing: - data = listing = list_containers( - session, - url, - marker, - limit, - end_marker, - prefix, - ) - while listing: - marker = listing[-1]['name'] - listing = list_containers( - session, - url, - marker, - limit, - end_marker, - prefix, - ) - if listing: - data.extend(listing) - return data - - params = { - 'format': 'json', - } - if marker: - params['marker'] = marker - if limit: - params['limit'] = limit - if end_marker: - params['end_marker'] = end_marker - if prefix: - params['prefix'] = prefix - return session.get(url, params=params).json() - - -def save_container( - session, - url, - container -): - """Save all the content from a container - - :param session: an authenticated keystoneclient.session.Session object - :param url: endpoint - :param container: name of container to save - """ - - objects = object_lib.list_objects(session, url, container) - for object in objects: - object_lib.save_object(session, url, container, object['name']) - - -def show_container( - session, - url, - container, -): - """Get container details - - :param session: an authenticated keystoneclient.session.Session object - :param url: endpoint - :param container: name of container to show - :returns: dict of returned headers - """ - - response = session.head("%s/%s" % (url, container)) - data = { - '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), - } - - return data diff --git a/openstackclient/object/v1/lib/object.py b/openstackclient/object/v1/lib/object.py deleted file mode 100644 index 7a23fc76..00000000 --- a/openstackclient/object/v1/lib/object.py +++ /dev/null @@ -1,221 +0,0 @@ -# Copyright 2010-2012 OpenStack Foundation -# Copyright 2013 Nebula Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. -# - -"""Object v1 API library""" - -import os - -import six - -try: - from urllib.parse import urlparse # noqa -except ImportError: - from urlparse import urlparse # noqa - - -def create_object( - session, - url, - container, - object, -): - """Create an object, upload it to a container - - :param session: an authenticated keystoneclient.session.Session 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: an authenticated keystoneclient.session.Session 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( - session, - url, - container, - marker=None, - limit=None, - end_marker=None, - delimiter=None, - prefix=None, - path=None, - full_listing=False, -): - """Get objects in a container - - :param session: an authenticated keystoneclient.session.Session object - :param url: endpoint - :param container: container name to get a listing for - :param marker: marker query - :param limit: limit query - :param end_marker: marker query - :param delimiter: string to delimit the queries on - :param prefix: prefix query - :param path: path query (equivalent: "delimiter=/" and "prefix=path/") - :param full_listing: if True, return a full listing, else returns a max - of 10000 listings - :returns: a tuple of (response headers, a list of objects) The response - headers will be a dict and all header names will be lowercase. - """ - - if full_listing: - data = listing = list_objects( - session, - url, - container, - marker, - limit, - end_marker, - delimiter, - prefix, - path, - ) - while listing: - if delimiter: - marker = listing[-1].get('name', listing[-1].get('subdir')) - else: - marker = listing[-1]['name'] - listing = list_objects( - session, - url, - container, - marker, - limit, - end_marker, - delimiter, - prefix, - path, - ) - if listing: - data.extend(listing) - return data - - params = { - 'format': 'json', - } - if marker: - params['marker'] = marker - if limit: - params['limit'] = limit - if end_marker: - params['end_marker'] = end_marker - if delimiter: - params['delimiter'] = delimiter - if prefix: - params['prefix'] = prefix - if path: - params['path'] = path - requrl = "%s/%s" % (url, container) - return session.get(requrl, params=params).json() - - -def save_object( - session, - url, - container, - obj, - file=None -): - """Save an object stored in a container - - :param session: an authenticated keystoneclient.session.Session object - :param url: endpoint - :param container: name of container that stores object - :param object: name of object to save - :param file: local name of object - """ - - if not file: - file = obj - - response = session.get("%s/%s/%s" % (url, container, obj), stream=True) - if response.status_code == 200: - if not os.path.exists(os.path.dirname(file)): - os.makedirs(os.path.dirname(file)) - with open(file, 'wb') as f: - for chunk in response.iter_content(): - f.write(chunk) - - -def show_object( - session, - url, - container, - obj, -): - """Get object details - - :param session: an authenticated keystoneclient.session.Session object - :param url: endpoint - :param container: container name to get a listing for - :returns: dict of object properties - """ - - response = session.head("%s/%s/%s" % (url, container, obj)) - data = { - 'account': response.headers.get('x-container-meta-owner', None), - 'container': container, - 'object': obj, - '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: - data['last-modified'] = response.headers.get('last-modified', None) - if 'etag' in response.headers: - data['etag'] = response.headers.get('etag', None) - if 'x-object-manifest' in response.headers: - data['x-object-manifest'] = response.headers.get( - 'x-object-manifest', None) - for key, value in six.iteritems(response.headers): - if key.startswith('x-object-meta-'): - data[key[len('x-object-meta-'):].lower()] = value - elif key not in ( - 'content-type', 'content-length', 'last-modified', - '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 f0ea7633..cbe9da2f 100644 --- a/openstackclient/object/v1/object.py +++ b/openstackclient/object/v1/object.py @@ -24,7 +24,6 @@ from cliff import lister from cliff import show from openstackclient.common import utils -from openstackclient.object.v1.lib import object as lib_object class CreateObject(lister.Lister): @@ -52,11 +51,9 @@ class CreateObject(lister.Lister): results = [] for obj in parsed_args.objects: - data = lib_object.create_object( - self.app.client_manager.session, - self.app.client_manager.object_store.endpoint, - parsed_args.container, - obj, + data = self.app.client_manager.object_store.object_create( + container=parsed_args.container, + object=obj, ) results.append(data) @@ -92,12 +89,9 @@ class DeleteObject(command.Command): self.log.debug('take_action(%s)', parsed_args) for obj in parsed_args.objects: - lib_object.delete_object( - self.app.restapi, - self.app.client_manager.session, - self.app.client_manager.object_store.endpoint, - parsed_args.container, - obj, + self.app.client_manager.object_store.object_delete( + container=parsed_args.container, + object=obj, ) @@ -181,10 +175,8 @@ class ListObject(lister.Lister): if parsed_args.all: kwargs['full_listing'] = True - data = lib_object.list_objects( - self.app.client_manager.session, - self.app.client_manager.object_store.endpoint, - parsed_args.container, + data = self.app.client_manager.object_store.object_list( + container=parsed_args.container, **kwargs ) @@ -222,12 +214,10 @@ class SaveObject(command.Command): def take_action(self, parsed_args): self.log.debug("take_action(%s)", parsed_args) - lib_object.save_object( - self.app.client_manager.session, - self.app.client_manager.object_store.endpoint, - parsed_args.container, - parsed_args.object, - parsed_args.file, + self.app.client_manager.object_store.object_save( + container=parsed_args.container, + object=parsed_args.object, + file=parsed_args.file, ) @@ -253,11 +243,9 @@ class ShowObject(show.ShowOne): def take_action(self, parsed_args): self.log.debug('take_action(%s)', parsed_args) - data = lib_object.show_object( - self.app.client_manager.session, - self.app.client_manager.object_store.endpoint, - parsed_args.container, - parsed_args.object, + data = self.app.client_manager.object_store.object_show( + container=parsed_args.container, + object=parsed_args.object, ) return zip(*sorted(six.iteritems(data))) |