add support for set/unset of container properties

include docs and commands to set and unset container properties

Partial-Bug: #1501945

Change-Id: I8d7e8cf356a2321a37ed940c4e10cae411b94dfd
This commit is contained in:
Steve Martinelli 2015-09-11 00:00:00 -05:00
parent bf11960d55
commit abaf711e24
4 changed files with 168 additions and 18 deletions
doc/source/command-objects
openstackclient
setup.cfg

@ -89,6 +89,26 @@ Save container contents locally
Container to save Container to save
container set
-------------
Set container properties
.. program:: container set
.. code:: bash
os container set
[<container>]
[--property <key=value> [...] ]
.. describe:: <container>
Container to modify
.. option:: --property <key=value>
Set a property on this container (repeat option to set multiple properties)
container show container show
-------------- --------------
@ -103,3 +123,23 @@ Display container details
.. describe:: <container> .. describe:: <container>
Container to display Container to display
container unset
---------------
Unset container properties
.. program:: container unset
.. code:: bash
os container unset
[<container>]
[--property <key>]
.. describe:: <container>
Container to modify
.. option:: --property <key>
Property to remove from container (repeat option to remove multiple properties)

@ -139,6 +139,23 @@ class APIv1(api.BaseAPI):
for object in objects: for object in objects:
self.object_save(container=container, object=object['name']) 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( def container_show(
self, self,
container=None, container=None,
@ -168,6 +185,24 @@ class APIv1(api.BaseAPI):
} }
return data 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( def object_create(
self, self,
container=None, container=None,
@ -397,14 +432,7 @@ class APIv1(api.BaseAPI):
properties to add or update for the account properties to add or update for the account
""" """
# NOTE(stevemar): As per the API, the headers have to be in the form headers = self._set_properties(properties, 'X-Account-Meta-%s')
# of "X-Account-Meta-Book: MobyDick"
headers = {}
for k, v in properties.iteritems():
header_name = 'X-Account-Meta-%s' % k
headers[header_name] = v
if headers: if headers:
# NOTE(stevemar): The URL (first argument) in this case is already # NOTE(stevemar): The URL (first argument) in this case is already
# set to the swift account endpoint, because that's how it's # set to the swift account endpoint, because that's how it's
@ -438,19 +466,37 @@ class APIv1(api.BaseAPI):
properties to remove from the account properties to remove from the account
""" """
# NOTE(stevemar): As per the API, the headers have to be in the form headers = self._unset_properties(properties,
# of "X-Remove-Account-Meta-Book: x". In the case where metadata is 'X-Remove-Account-Meta-%s')
# removed, we can set the value of the header to anything, so it's
# set to 'x'
headers = {}
for k in properties:
header_name = 'X-Remove-Account-Meta-%s' % k
headers[header_name] = "x"
if headers: if headers:
self.create("", headers=headers) self.create("", headers=headers)
def _find_account_id(self): def _find_account_id(self):
url_parts = urlparse(self.endpoint) url_parts = urlparse(self.endpoint)
return url_parts.path.split('/')[-1] 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

@ -23,6 +23,7 @@ from cliff import command
from cliff import lister from cliff import lister
from cliff import show from cliff import show
from openstackclient.common import parseractions
from openstackclient.common import utils from openstackclient.common import utils
@ -178,6 +179,36 @@ class SaveContainer(command.Command):
) )
class SetContainer(command.Command):
"""Set container properties"""
log = logging.getLogger(__name__ + '.SetContainer')
def get_parser(self, prog_name):
parser = super(SetContainer, self).get_parser(prog_name)
parser.add_argument(
'container',
metavar='<container>',
help='Container to modify',
)
parser.add_argument(
"--property",
metavar="<key=value>",
required=True,
action=parseractions.KeyValueAction,
help="Set a property on this container "
"(repeat option to set multiple properties)"
)
return parser
@utils.log_method(log)
def take_action(self, parsed_args):
self.app.client_manager.object_store.container_set(
parsed_args.container,
properties=parsed_args.property,
)
class ShowContainer(show.ShowOne): class ShowContainer(show.ShowOne):
"""Display container details""" """Display container details"""
@ -200,3 +231,34 @@ class ShowContainer(show.ShowOne):
) )
return zip(*sorted(six.iteritems(data))) return zip(*sorted(six.iteritems(data)))
class UnsetContainer(command.Command):
"""Unset container properties"""
log = logging.getLogger(__name__ + '.UnsetContainer')
def get_parser(self, prog_name):
parser = super(UnsetContainer, self).get_parser(prog_name)
parser.add_argument(
'container',
metavar='<container>',
help='Container to modify',
)
parser.add_argument(
'--property',
metavar='<key>',
required=True,
action='append',
default=[],
help='Property to remove from container '
'(repeat option to remove multiple properties)',
)
return parser
@utils.log_method(log)
def take_action(self, parsed_args):
self.app.client_manager.object_store.container_unset(
parsed_args.container,
properties=parsed_args.property,
)

@ -339,7 +339,9 @@ openstack.object_store.v1 =
container_delete = openstackclient.object.v1.container:DeleteContainer container_delete = openstackclient.object.v1.container:DeleteContainer
container_list = openstackclient.object.v1.container:ListContainer container_list = openstackclient.object.v1.container:ListContainer
container_save = openstackclient.object.v1.container:SaveContainer container_save = openstackclient.object.v1.container:SaveContainer
container_set = openstackclient.object.v1.container:SetContainer
container_show = openstackclient.object.v1.container:ShowContainer container_show = openstackclient.object.v1.container:ShowContainer
container_unset = openstackclient.object.v1.container:UnsetContainer
object_create = openstackclient.object.v1.object:CreateObject object_create = openstackclient.object.v1.object:CreateObject
object_delete = openstackclient.object.v1.object:DeleteObject object_delete = openstackclient.object.v1.object:DeleteObject
object_list = openstackclient.object.v1.object:ListObject object_list = openstackclient.object.v1.object:ListObject