diff --git a/openstackclient/object/v1/lib/object.py b/openstackclient/object/v1/lib/object.py index ffc7e9b8e..2473caa39 100644 --- a/openstackclient/object/v1/lib/object.py +++ b/openstackclient/object/v1/lib/object.py @@ -24,6 +24,52 @@ except ImportError: from urlparse import urlparse # noqa +def create_object( + api, + url, + container, + object, +): + """Create an object, upload it to a container + + :param api: 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 = api.put(full_url, data=open(object)) + url_parts = urlparse(url) + data = { + 'account': url_parts.path.split('/')[-1], + 'container': container, + 'object': object, + } + data['x-trans-id'] = response.headers.get('X-Trans-Id', None) + data['etag'] = response.headers.get('Etag', None) + + return data + + +def delete_object( + api, + url, + container, + object, +): + """Delete an object stored in a container + + :param api: a restapi object + :param url: endpoint + :param container: name of container that stores object + :param container: name of object to delete + """ + + api.delete("%s/%s/%s" % (url, container, object)) + + def list_objects( api, url, diff --git a/openstackclient/object/v1/object.py b/openstackclient/object/v1/object.py index ee30c8421..4a99a8f19 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='', + help='Container to store new object', + ) + parser.add_argument( + 'object', + metavar='', + 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.restapi, + 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='', + help='Container that stores the object to delete', + ) + parser.add_argument( + 'object', + metavar='', + 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.restapi, + self.app.client_manager.object_store.endpoint, + parsed_args.container, + parsed_args.object, + ) + + class ListObject(lister.Lister): """List objects""" diff --git a/setup.cfg b/setup.cfg index 7f07286c0..b1b80a06b 100644 --- a/setup.cfg +++ b/setup.cfg @@ -272,6 +272,8 @@ openstack.object_store.v1 = container_delete = openstackclient.object.v1.container:DeleteContainer container_list = openstackclient.object.v1.container:ListContainer container_show = openstackclient.object.v1.container:ShowContainer + object_create = openstackclient.object.v1.object:CreateObject + object_delete = openstackclient.object.v1.object:DeleteObject object_list = openstackclient.object.v1.object:ListObject object_show = openstackclient.object.v1.object:ShowObject