diff --git a/openstackclient/volume/v1/volume.py b/openstackclient/volume/v1/volume.py index 6e110a4ae3..174ca3d410 100644 --- a/openstackclient/volume/v1/volume.py +++ b/openstackclient/volume/v1/volume.py @@ -76,8 +76,8 @@ class CreateVolume(show.ShowOne): help='Availability Zone to use', ) parser.add_argument( - '--metadata', - metavar='<metadata>', + '--meta-data', + metavar='<key=value>', help='Optional metadata to set on volume creation', ) parser.add_argument( @@ -97,6 +97,11 @@ class CreateVolume(show.ShowOne): self.log.debug('take_action(%s)' % parsed_args) 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( parsed_args.size, parsed_args.snapshot_id, @@ -107,7 +112,7 @@ class CreateVolume(show.ShowOne): parsed_args.user_id, parsed_args.project_id, parsed_args.availability_zone, - parsed_args.metadata, + meta, parsed_args.image_ref ) @@ -172,12 +177,22 @@ class ListVolume(lister.Lister): default=False, help='Display information from all tenants (Admin-only)', ) + parser.add_argument( + '--long', + action='store_true', + default=False, + help='Display meta-data', + ) return parser def take_action(self, parsed_args): self.log.debug('take_action(%s)' % parsed_args) + columns = ('ID', 'Status', 'Display Name', 'Size', 'Volume Type', 'Bootable', 'Attached to') + if parsed_args.long: + columns = ('ID', 'Status', 'Display Name', 'Size', + 'Volume Type', 'Bootable', 'Attached to', 'Meta-data') search_opts = { 'all_tenants': parsed_args.all_tenants, @@ -191,7 +206,7 @@ class ListVolume(lister.Lister): return (columns, (utils.get_item_properties( s, columns, - formatters={}, + formatters={'Meta-data': _format_meta_data}, ) for s in data)) @@ -206,7 +221,7 @@ class SetVolume(command.Command): parser.add_argument( 'volume', metavar='<volume>', - help='ID of volume to change') + help='Name or ID of volume to change') parser.add_argument( '--name', metavar='<new-volume-name>', @@ -215,19 +230,29 @@ class SetVolume(command.Command): '--description', metavar='<volume-description>', help='New volume description') + parser.add_argument( + '--meta-data', + metavar='<key=value>', + help='meta-data to add to volume') 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) + + 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 = {} if parsed_args.name: kwargs['display_name'] = parsed_args.name if 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") return volume_client.volumes.update(volume.id, **kwargs) @@ -245,7 +270,7 @@ class ShowVolume(show.ShowOne): parser.add_argument( 'volume', metavar='<volume>', - help='ID of volume to display') + help='Name or ID of volume to display') return parser def take_action(self, parsed_args): @@ -254,3 +279,52 @@ class ShowVolume(show.ShowOne): volume = utils.find_resource(volume_client.volumes, parsed_args.volume) 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 diff --git a/setup.py b/setup.py index 336c7898f7..f3b7deb629 100644 --- a/setup.py +++ b/setup.py @@ -225,6 +225,7 @@ setuptools.setup( 'list_volume=openstackclient.volume.v1.volume:ListVolume', 'set_volume=openstackclient.volume.v1.volume:SetVolume', 'show_volume=openstackclient.volume.v1.volume:ShowVolume', + 'unset_volume=openstackclient.volume.v1.volume:UnsetVolume', 'create_volume-type=' 'openstackclient.volume.v1.type:CreateVolumeType',