Merge "Add metadata support for volume"

This commit is contained in:
Jenkins 2013-04-02 15:25:03 +00:00 committed by Gerrit Code Review
commit 95bf187a4f
2 changed files with 82 additions and 7 deletions
openstackclient/volume/v1
setup.py

@ -76,8 +76,8 @@ class CreateVolume(show.ShowOne):
help='Availability Zone to use', help='Availability Zone to use',
) )
parser.add_argument( parser.add_argument(
'--metadata', '--meta-data',
metavar='<metadata>', metavar='<key=value>',
help='Optional metadata to set on volume creation', help='Optional metadata to set on volume creation',
) )
parser.add_argument( parser.add_argument(
@ -97,6 +97,11 @@ class CreateVolume(show.ShowOne):
self.log.debug('take_action(%s)' % parsed_args) self.log.debug('take_action(%s)' % parsed_args)
volume_client = self.app.client_manager.volume volume_client = self.app.client_manager.volume
meta = None
if parsed_args.meta_data:
meta = dict(v.split('=') for v in parsed_args.meta_data.split(' '))
volume = volume_client.volumes.create( volume = volume_client.volumes.create(
parsed_args.size, parsed_args.size,
parsed_args.snapshot_id, parsed_args.snapshot_id,
@ -107,7 +112,7 @@ class CreateVolume(show.ShowOne):
parsed_args.user_id, parsed_args.user_id,
parsed_args.project_id, parsed_args.project_id,
parsed_args.availability_zone, parsed_args.availability_zone,
parsed_args.metadata, meta,
parsed_args.image_ref parsed_args.image_ref
) )
@ -172,12 +177,22 @@ class ListVolume(lister.Lister):
default=False, default=False,
help='Display information from all tenants (Admin-only)', help='Display information from all tenants (Admin-only)',
) )
parser.add_argument(
'--long',
action='store_true',
default=False,
help='Display meta-data',
)
return parser return parser
def take_action(self, parsed_args): def take_action(self, parsed_args):
self.log.debug('take_action(%s)' % parsed_args) self.log.debug('take_action(%s)' % parsed_args)
columns = ('ID', 'Status', 'Display Name', 'Size', columns = ('ID', 'Status', 'Display Name', 'Size',
'Volume Type', 'Bootable', 'Attached to') 'Volume Type', 'Bootable', 'Attached to')
if parsed_args.long:
columns = ('ID', 'Status', 'Display Name', 'Size',
'Volume Type', 'Bootable', 'Attached to', 'Meta-data')
search_opts = { search_opts = {
'all_tenants': parsed_args.all_tenants, 'all_tenants': parsed_args.all_tenants,
@ -191,7 +206,7 @@ class ListVolume(lister.Lister):
return (columns, return (columns,
(utils.get_item_properties( (utils.get_item_properties(
s, columns, s, columns,
formatters={}, formatters={'Meta-data': _format_meta_data},
) for s in data)) ) for s in data))
@ -206,7 +221,7 @@ class SetVolume(command.Command):
parser.add_argument( parser.add_argument(
'volume', 'volume',
metavar='<volume>', metavar='<volume>',
help='ID of volume to change') help='Name or ID of volume to change')
parser.add_argument( parser.add_argument(
'--name', '--name',
metavar='<new-volume-name>', metavar='<new-volume-name>',
@ -215,19 +230,29 @@ class SetVolume(command.Command):
'--description', '--description',
metavar='<volume-description>', metavar='<volume-description>',
help='New volume description') help='New volume description')
parser.add_argument(
'--meta-data',
metavar='<key=value>',
help='meta-data to add to volume')
return parser return parser
def take_action(self, parsed_args): def take_action(self, parsed_args):
self.log.debug('take_action(%s)' % parsed_args) self.log.debug('take_action(%s)' % parsed_args)
volume_client = self.app.client_manager.volume volume_client = self.app.client_manager.volume
volume = utils.find_resource(volume_client.volumes, parsed_args.volume) volume = utils.find_resource(volume_client.volumes, parsed_args.volume)
meta = None
if parsed_args.meta_data:
meta = dict(v.split('=') for v in parsed_args.meta_data.split(' '))
volume_client.volumes.set_metadata(volume.id, meta)
kwargs = {} kwargs = {}
if parsed_args.name: if parsed_args.name:
kwargs['display_name'] = parsed_args.name kwargs['display_name'] = parsed_args.name
if parsed_args.description: if parsed_args.description:
kwargs['display_description'] = parsed_args.description kwargs['display_description'] = parsed_args.description
if not kwargs: if not kwargs and not meta:
sys.stdout.write("Volume not updated, no arguments present \n") sys.stdout.write("Volume not updated, no arguments present \n")
return return
volume_client.volumes.update(volume.id, **kwargs) volume_client.volumes.update(volume.id, **kwargs)
@ -245,7 +270,7 @@ class ShowVolume(show.ShowOne):
parser.add_argument( parser.add_argument(
'volume', 'volume',
metavar='<volume>', metavar='<volume>',
help='ID of volume to display') help='Name or ID of volume to display')
return parser return parser
def take_action(self, parsed_args): def take_action(self, parsed_args):
@ -254,3 +279,52 @@ class ShowVolume(show.ShowOne):
volume = utils.find_resource(volume_client.volumes, parsed_args.volume) volume = utils.find_resource(volume_client.volumes, parsed_args.volume)
return zip(*sorted(volume._info.iteritems())) return zip(*sorted(volume._info.iteritems()))
class UnsetVolume(command.Command):
"""Unset volume command"""
api = 'volume'
log = logging.getLogger(__name__ + '.UnsetVolume')
def get_parser(self, prog_name):
parser = super(UnsetVolume, self).get_parser(prog_name)
parser.add_argument(
'volume',
metavar='<volume>',
help='Name or ID of volume to change')
parser.add_argument(
'--meta-data',
metavar='<key>',
help='meta-data to remove from volume (key only)')
return parser
def take_action(self, parsed_args):
self.log.debug('take_action(%s)' % parsed_args)
volume_client = self.app.client_manager.volume
volume = utils.find_resource(
volume_client.volumes, parsed_args.volume)
if not parsed_args.meta_data:
sys.stdout.write("Volume not updated, no arguments present \n")
return
key_list = []
key_list.append(parsed_args.meta_data)
volume_client.volumes.delete_metadata(volume.id, key_list)
return
def _format_meta_data(volume):
"""Return a string containing the key value pairs
:param server: a single volume resource
:rtype: a string formatted to key=value
"""
keys = volume.metadata
output = ""
for s in keys:
output = output + s + "=" + keys[s] + "; "
return output

@ -231,6 +231,7 @@ setuptools.setup(
'list_volume=openstackclient.volume.v1.volume:ListVolume', 'list_volume=openstackclient.volume.v1.volume:ListVolume',
'set_volume=openstackclient.volume.v1.volume:SetVolume', 'set_volume=openstackclient.volume.v1.volume:SetVolume',
'show_volume=openstackclient.volume.v1.volume:ShowVolume', 'show_volume=openstackclient.volume.v1.volume:ShowVolume',
'unset_volume=openstackclient.volume.v1.volume:UnsetVolume',
'create_volume-type=' 'create_volume-type='
'openstackclient.volume.v1.type:CreateVolumeType', 'openstackclient.volume.v1.type:CreateVolumeType',