From 96afb8b1b7b59a8a53b6614457fbbf36fc9882dc Mon Sep 17 00:00:00 2001 From: Amey Bhide Date: Mon, 1 Jun 2015 23:40:48 -0700 Subject: Add support for volume v2 commands Adds the following commands: openstack volume create openstack volume set openstack volume unset Implements: blueprint volume-v2 Change-Id: Icb7404815763aa88550112fb42f5200ce05c2486 --- openstackclient/volume/v2/volume.py | 235 ++++++++++++++++++++++++++++++++++++ 1 file changed, 235 insertions(+) (limited to 'openstackclient/volume') diff --git a/openstackclient/volume/v2/volume.py b/openstackclient/volume/v2/volume.py index e50a6f0c..d4536f51 100644 --- a/openstackclient/volume/v2/volume.py +++ b/openstackclient/volume/v2/volume.py @@ -20,9 +20,139 @@ from cliff import command from cliff import show import six +from openstackclient.common import parseractions from openstackclient.common import utils +class CreateVolume(show.ShowOne): + """Create new volume""" + + log = logging.getLogger(__name__ + ".CreateVolume") + + def get_parser(self, prog_name): + parser = super(CreateVolume, self).get_parser(prog_name) + parser.add_argument( + "name", + metavar="", + help="New volume name" + ) + parser.add_argument( + "--size", + metavar="", + type=int, + required=True, + help="New volume size in GB" + ) + parser.add_argument( + "--snapshot", + metavar="", + help="Use as source of new volume (name or ID)" + ) + parser.add_argument( + "--description", + metavar="", + help="New volume description" + ) + parser.add_argument( + "--type", + metavar="", + help="Use as the new volume type", + ) + parser.add_argument( + '--user', + metavar='', + help='Specify an alternate user (name or ID)', + ) + parser.add_argument( + '--project', + metavar='', + help='Specify an alternate project (name or ID)', + ) + parser.add_argument( + "--availability-zone", + metavar="", + help="Create new volume in " + ) + parser.add_argument( + "--image", + metavar="", + help="Use as source of new volume (name or ID)" + ) + parser.add_argument( + "--source", + metavar="", + help="Volume to clone (name or ID)" + ) + parser.add_argument( + "--property", + metavar="", + action=parseractions.KeyValueAction, + help="Set a property to this volume " + "(repeat option to set multiple properties)" + ) + return parser + + def take_action(self, parsed_args): + self.log.debug("take_action: (%s)", parsed_args) + + identity_client = self.app.client_manager.identity + volume_client = self.app.client_manager.volume + image_client = self.app.client_manager.image + + source_volume = None + if parsed_args.source: + source_volume = utils.find_resource( + volume_client.volumes, + parsed_args.source).id + + image = None + if parsed_args.image: + image = utils.find_resource( + image_client.images, + parsed_args.image).id + + snapshot = None + if parsed_args.snapshot: + snapshot = utils.find_resource( + volume_client.snapshots, + parsed_args.snapshot).id + + project = None + if parsed_args.project: + project = utils.find_resource( + identity_client.projects, + parsed_args.project).id + + user = None + if parsed_args.user: + user = utils.find_resource( + identity_client.users, + parsed_args.user).id + + volume = volume_client.volumes.create( + size=parsed_args.size, + snapshot_id=snapshot, + name=parsed_args.name, + description=parsed_args.description, + volume_type=parsed_args.type, + user_id=user, + project_id=project, + availability_zone=parsed_args.availability_zone, + metadata=parsed_args.property, + imageRef=image, + source_volid=source_volume + ) + # Remove key links from being displayed + volume._info.update( + { + 'properties': utils.format_dict(volume._info.pop('metadata')), + 'type': volume._info.pop('volume_type') + } + ) + volume._info.pop("links", None) + return zip(*sorted(six.iteritems(volume._info))) + + class DeleteVolume(command.Command): """Delete volume(s)""" @@ -59,6 +189,77 @@ class DeleteVolume(command.Command): return +class SetVolume(show.ShowOne): + """Set volume properties""" + + log = logging.getLogger(__name__ + '.SetVolume') + + def get_parser(self, prog_name): + parser = super(SetVolume, self).get_parser(prog_name) + parser.add_argument( + 'volume', + metavar='', + help='Volume to change (name or ID)', + ) + parser.add_argument( + '--name', + metavar='', + help='New volume name', + ) + parser.add_argument( + '--description', + metavar='', + help='New volume description', + ) + parser.add_argument( + '--size', + metavar='', + type=int, + help='Extend volume size in GB', + ) + parser.add_argument( + '--property', + metavar='', + action=parseractions.KeyValueAction, + help='Property to add or modify for this volume ' + '(repeat option to set multiple properties)', + ) + 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 parsed_args.size: + if volume.status != 'available': + self.app.log.error("Volume is in %s state, it must be " + "available before size can be extended" % + volume.status) + return + if parsed_args.size <= volume.size: + self.app.log.error("New size must be greater than %s GB" % + volume.size) + return + volume_client.volumes.extend(volume.id, parsed_args.size) + + if parsed_args.property: + volume_client.volumes.set_metadata(volume.id, parsed_args.property) + + kwargs = {} + if parsed_args.name: + kwargs['display_name'] = parsed_args.name + if parsed_args.description: + kwargs['display_description'] = parsed_args.description + if kwargs: + volume_client.volumes.update(volume.id, **kwargs) + + if not kwargs and not parsed_args.property and not parsed_args.size: + self.app.log.error("No changes requested\n") + + return + + class ShowVolume(show.ShowOne): """Display volume details""" @@ -81,3 +282,37 @@ class ShowVolume(show.ShowOne): # Remove key links from being displayed volume._info.pop("links", None) return zip(*sorted(six.iteritems(volume._info))) + + +class UnsetVolume(command.Command): + """Unset volume properties""" + + log = logging.getLogger(__name__ + '.UnsetVolume') + + def get_parser(self, prog_name): + parser = super(UnsetVolume, self).get_parser(prog_name) + parser.add_argument( + 'volume', + metavar='', + help='Volume to modify (name or ID)', + ) + parser.add_argument( + '--property', + metavar='', + required=True, + action='append', + default=[], + help='Property to remove from volume ' + '(repeat option to remove multiple properties)', + ) + 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) + + volume_client.volumes.delete_metadata( + volume.id, parsed_args.property) + return -- cgit v1.2.1