summaryrefslogtreecommitdiff
path: root/openstackclient/volume
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2015-07-25 03:25:57 +0000
committerGerrit Code Review <review@openstack.org>2015-07-25 03:25:57 +0000
commitcc6c4e5c399b92a8d6d958a8ff37458f1a072a1a (patch)
tree8a3f30b07bfe33e0501b47c2aa269a28a6770700 /openstackclient/volume
parent55d9eba0937944119e6209c85005980c7297d123 (diff)
parent96afb8b1b7b59a8a53b6614457fbbf36fc9882dc (diff)
downloadpython-openstackclient-cc6c4e5c399b92a8d6d958a8ff37458f1a072a1a.tar.gz
Merge "Add support for volume v2 commands"
Diffstat (limited to 'openstackclient/volume')
-rw-r--r--openstackclient/volume/v2/volume.py235
1 files changed, 235 insertions, 0 deletions
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="<name>",
+ help="New volume name"
+ )
+ parser.add_argument(
+ "--size",
+ metavar="<size>",
+ type=int,
+ required=True,
+ help="New volume size in GB"
+ )
+ parser.add_argument(
+ "--snapshot",
+ metavar="<snapshot>",
+ help="Use <snapshot> as source of new volume (name or ID)"
+ )
+ parser.add_argument(
+ "--description",
+ metavar="<description>",
+ help="New volume description"
+ )
+ parser.add_argument(
+ "--type",
+ metavar="<volume-type>",
+ help="Use <volume-type> as the new volume type",
+ )
+ parser.add_argument(
+ '--user',
+ metavar='<user>',
+ help='Specify an alternate user (name or ID)',
+ )
+ parser.add_argument(
+ '--project',
+ metavar='<project>',
+ help='Specify an alternate project (name or ID)',
+ )
+ parser.add_argument(
+ "--availability-zone",
+ metavar="<availability-zone>",
+ help="Create new volume in <availability_zone>"
+ )
+ parser.add_argument(
+ "--image",
+ metavar="<image>",
+ help="Use <image> as source of new volume (name or ID)"
+ )
+ parser.add_argument(
+ "--source",
+ metavar="<volume>",
+ help="Volume to clone (name or ID)"
+ )
+ parser.add_argument(
+ "--property",
+ metavar="<key=value>",
+ 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='<volume>',
+ help='Volume to change (name or ID)',
+ )
+ parser.add_argument(
+ '--name',
+ metavar='<name>',
+ help='New volume name',
+ )
+ parser.add_argument(
+ '--description',
+ metavar='<description>',
+ help='New volume description',
+ )
+ parser.add_argument(
+ '--size',
+ metavar='<size>',
+ type=int,
+ help='Extend volume size in GB',
+ )
+ parser.add_argument(
+ '--property',
+ metavar='<key=value>',
+ 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='<volume>',
+ help='Volume to modify (name or ID)',
+ )
+ parser.add_argument(
+ '--property',
+ metavar='<key>',
+ 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