summaryrefslogtreecommitdiff
path: root/openstackclient/volume/v2/volume.py
diff options
context:
space:
mode:
Diffstat (limited to 'openstackclient/volume/v2/volume.py')
-rw-r--r--openstackclient/volume/v2/volume.py417
1 files changed, 259 insertions, 158 deletions
diff --git a/openstackclient/volume/v2/volume.py b/openstackclient/volume/v2/volume.py
index a5e5a670..43a64664 100644
--- a/openstackclient/volume/v2/volume.py
+++ b/openstackclient/volume/v2/volume.py
@@ -71,10 +71,13 @@ def _check_size_arg(args):
volume is not specified.
"""
- if ((args.snapshot or args.source or args.backup)
- is None and args.size is None):
- msg = _("--size is a required option if snapshot, backup "
- "or source volume are not specified.")
+ if (
+ args.snapshot or args.source or args.backup
+ ) is None and args.size is None:
+ msg = _(
+ "--size is a required option if snapshot, backup "
+ "or source volume are not specified."
+ )
raise exceptions.CommandError(msg)
@@ -93,8 +96,10 @@ class CreateVolume(command.ShowOne):
"--size",
metavar="<size>",
type=int,
- help=_("Volume size in GB (required unless --snapshot, "
- "--source or --backup is specified)"),
+ help=_(
+ "Volume size in GB (required unless --snapshot, "
+ "--source or --backup is specified)"
+ ),
)
parser.add_argument(
"--type",
@@ -120,8 +125,10 @@ class CreateVolume(command.ShowOne):
source_group.add_argument(
"--backup",
metavar="<backup>",
- help=_("Restore backup to a volume (name or ID) "
- "(supported by --os-volume-api-version 3.47 or later)"),
+ help=_(
+ "Restore backup to a volume (name or ID) "
+ "(supported by --os-volume-api-version 3.47 or later)"
+ ),
)
source_group.add_argument(
"--source-replicated",
@@ -147,37 +154,41 @@ class CreateVolume(command.ShowOne):
"--property",
metavar="<key=value>",
action=parseractions.KeyValueAction,
- help=_("Set a property to this volume "
- "(repeat option to set multiple properties)"),
+ help=_(
+ "Set a property to this volume "
+ "(repeat option to set multiple properties)"
+ ),
)
parser.add_argument(
"--hint",
metavar="<key=value>",
action=parseractions.KeyValueAction,
- help=_("Arbitrary scheduler hint key-value pairs to help boot "
- "an instance (repeat option to set multiple hints)"),
+ help=_(
+ "Arbitrary scheduler hint key-value pairs to help boot "
+ "an instance (repeat option to set multiple hints)"
+ ),
)
bootable_group = parser.add_mutually_exclusive_group()
bootable_group.add_argument(
"--bootable",
action="store_true",
- help=_("Mark volume as bootable")
+ help=_("Mark volume as bootable"),
)
bootable_group.add_argument(
"--non-bootable",
action="store_true",
- help=_("Mark volume as non-bootable (default)")
+ help=_("Mark volume as non-bootable (default)"),
)
readonly_group = parser.add_mutually_exclusive_group()
readonly_group.add_argument(
"--read-only",
action="store_true",
- help=_("Set volume to read-only access mode")
+ help=_("Set volume to read-only access mode"),
)
readonly_group.add_argument(
"--read-write",
action="store_true",
- help=_("Set volume to read-write access mode (default)")
+ help=_("Set volume to read-write access mode (default)"),
)
return parser
@@ -193,35 +204,39 @@ class CreateVolume(command.ShowOne):
image_client = self.app.client_manager.image
if parsed_args.backup and not (
- volume_client.api_version.matches('3.47')):
- msg = _("--os-volume-api-version 3.47 or greater is required "
- "to create a volume from backup.")
+ volume_client.api_version.matches('3.47')
+ ):
+ msg = _(
+ "--os-volume-api-version 3.47 or greater is required "
+ "to create a volume from backup."
+ )
raise exceptions.CommandError(msg)
source_volume = None
if parsed_args.source:
source_volume_obj = utils.find_resource(
- volume_client.volumes,
- parsed_args.source)
+ volume_client.volumes, parsed_args.source
+ )
source_volume = source_volume_obj.id
size = max(size or 0, source_volume_obj.size)
consistency_group = None
if parsed_args.consistency_group:
consistency_group = utils.find_resource(
- volume_client.consistencygroups,
- parsed_args.consistency_group).id
+ volume_client.consistencygroups, parsed_args.consistency_group
+ ).id
image = None
if parsed_args.image:
- image = image_client.find_image(parsed_args.image,
- ignore_missing=False).id
+ image = image_client.find_image(
+ parsed_args.image, ignore_missing=False
+ ).id
snapshot = None
if parsed_args.snapshot:
snapshot_obj = utils.find_resource(
- volume_client.volume_snapshots,
- parsed_args.snapshot)
+ volume_client.volume_snapshots, parsed_args.snapshot
+ )
snapshot = snapshot_obj.id
# Cinder requires a value for size when creating a volume
# even if creating from a snapshot. Cinder will create the
@@ -234,8 +249,8 @@ class CreateVolume(command.ShowOne):
backup = None
if parsed_args.backup:
backup_obj = utils.find_resource(
- volume_client.backups,
- parsed_args.backup)
+ volume_client.backups, parsed_args.backup
+ )
backup = backup_obj.id
# As above
size = max(size or 0, backup_obj.size)
@@ -262,11 +277,10 @@ class CreateVolume(command.ShowOne):
volume.id,
success_status=['available'],
error_status=['error'],
- sleep_time=1
+ sleep_time=1,
):
volume_client.volumes.set_bootable(
- volume.id,
- parsed_args.bootable
+ volume.id, parsed_args.bootable
)
else:
msg = _(
@@ -283,11 +297,10 @@ class CreateVolume(command.ShowOne):
volume.id,
success_status=['available'],
error_status=['error'],
- sleep_time=1
+ sleep_time=1,
):
volume_client.volumes.update_readonly_flag(
- volume.id,
- parsed_args.read_only
+ volume.id, parsed_args.read_only
)
else:
msg = _(
@@ -296,15 +309,21 @@ class CreateVolume(command.ShowOne):
)
raise exceptions.CommandError(msg)
except Exception as e:
- LOG.error(_("Failed to set volume read-only access "
- "mode flag: %s"), e)
+ LOG.error(
+ _(
+ "Failed to set volume read-only access "
+ "mode flag: %s"
+ ),
+ e,
+ )
# Remove key links from being displayed
volume._info.update(
{
- 'properties':
- format_columns.DictColumn(volume._info.pop('metadata')),
- 'type': volume._info.pop('volume_type')
+ 'properties': format_columns.DictColumn(
+ volume._info.pop('metadata')
+ ),
+ 'type': volume._info.pop('volume_type'),
}
)
volume._info.pop("links", None)
@@ -320,20 +339,24 @@ class DeleteVolume(command.Command):
"volumes",
metavar="<volume>",
nargs="+",
- help=_("Volume(s) to delete (name or ID)")
+ help=_("Volume(s) to delete (name or ID)"),
)
group = parser.add_mutually_exclusive_group()
group.add_argument(
"--force",
action="store_true",
- help=_("Attempt forced removal of volume(s), regardless of state "
- "(defaults to False)")
+ help=_(
+ "Attempt forced removal of volume(s), regardless of state "
+ "(defaults to False)"
+ ),
)
group.add_argument(
"--purge",
action="store_true",
- help=_("Remove any snapshots along with volume(s) "
- "(defaults to False)")
+ help=_(
+ "Remove any snapshots along with volume(s) "
+ "(defaults to False)"
+ ),
)
return parser
@@ -343,23 +366,29 @@ class DeleteVolume(command.Command):
for i in parsed_args.volumes:
try:
- volume_obj = utils.find_resource(
- volume_client.volumes, i)
+ volume_obj = utils.find_resource(volume_client.volumes, i)
if parsed_args.force:
volume_client.volumes.force_delete(volume_obj.id)
else:
- volume_client.volumes.delete(volume_obj.id,
- cascade=parsed_args.purge)
+ volume_client.volumes.delete(
+ volume_obj.id, cascade=parsed_args.purge
+ )
except Exception as e:
result += 1
- LOG.error(_("Failed to delete volume with "
- "name or ID '%(volume)s': %(e)s"),
- {'volume': i, 'e': e})
+ LOG.error(
+ _(
+ "Failed to delete volume with "
+ "name or ID '%(volume)s': %(e)s"
+ ),
+ {'volume': i, 'e': e},
+ )
if result > 0:
total = len(parsed_args.volumes)
- msg = (_("%(result)s of %(total)s volumes failed "
- "to delete.") % {'result': result, 'total': total})
+ msg = _("%(result)s of %(total)s volumes failed " "to delete.") % {
+ 'result': result,
+ 'total': total,
+ }
raise exceptions.CommandError(msg)
@@ -371,13 +400,13 @@ class ListVolume(command.Lister):
parser.add_argument(
'--project',
metavar='<project>',
- help=_('Filter results by project (name or ID) (admin only)')
+ help=_('Filter results by project (name or ID) (admin only)'),
)
identity_common.add_project_domain_option_to_parser(parser)
parser.add_argument(
'--user',
metavar='<user>',
- help=_('Filter results by user (name or ID) (admin only)')
+ help=_('Filter results by user (name or ID) (admin only)'),
)
identity_common.add_user_domain_option_to_parser(parser)
parser.add_argument(
@@ -417,7 +446,6 @@ class ListVolume(command.Lister):
return parser
def take_action(self, parsed_args):
-
volume_client = self.app.client_manager.volume
identity_client = self.app.client_manager.identity
@@ -457,20 +485,22 @@ class ListVolume(command.Lister):
# Just forget it if there's any trouble
pass
AttachmentsColumnWithCache = functools.partial(
- AttachmentsColumn, server_cache=server_cache)
+ AttachmentsColumn, server_cache=server_cache
+ )
project_id = None
if parsed_args.project:
project_id = identity_common.find_project(
identity_client,
parsed_args.project,
- parsed_args.project_domain).id
+ parsed_args.project_domain,
+ ).id
user_id = None
if parsed_args.user:
- user_id = identity_common.find_user(identity_client,
- parsed_args.user,
- parsed_args.user_domain).id
+ user_id = identity_common.find_user(
+ identity_client, parsed_args.user, parsed_args.user_domain
+ ).id
# set value of 'all_tenants' when using project option
all_projects = bool(parsed_args.project) or parsed_args.all_projects
@@ -489,14 +519,23 @@ class ListVolume(command.Lister):
limit=parsed_args.limit,
)
column_headers = utils.backward_compat_col_lister(
- column_headers, parsed_args.columns, {'Display Name': 'Name'})
+ column_headers, parsed_args.columns, {'Display Name': 'Name'}
+ )
- return (column_headers,
- (utils.get_item_properties(
- s, columns,
- formatters={'Metadata': format_columns.DictColumn,
- 'Attachments': AttachmentsColumnWithCache},
- ) for s in data))
+ return (
+ column_headers,
+ (
+ utils.get_item_properties(
+ s,
+ columns,
+ formatters={
+ 'Metadata': format_columns.DictColumn,
+ 'Attachments': AttachmentsColumnWithCache,
+ },
+ )
+ for s in data
+ ),
+ )
class MigrateVolume(command.Command):
@@ -507,35 +546,44 @@ class MigrateVolume(command.Command):
parser.add_argument(
'volume',
metavar="<volume>",
- help=_("Volume to migrate (name or ID)")
+ help=_("Volume to migrate (name or ID)"),
)
parser.add_argument(
'--host',
metavar="<host>",
required=True,
- help=_("Destination host (takes the form: host@backend-name#pool)")
+ help=_(
+ "Destination host (takes the form: host@backend-name#pool)"
+ ),
)
parser.add_argument(
'--force-host-copy',
action="store_true",
- help=_("Enable generic host-based force-migration, "
- "which bypasses driver optimizations")
+ help=_(
+ "Enable generic host-based force-migration, "
+ "which bypasses driver optimizations"
+ ),
)
parser.add_argument(
'--lock-volume',
action="store_true",
- help=_("If specified, the volume state will be locked "
- "and will not allow a migration to be aborted "
- "(possibly by another operation)")
+ help=_(
+ "If specified, the volume state will be locked "
+ "and will not allow a migration to be aborted "
+ "(possibly by another operation)"
+ ),
)
return parser
def take_action(self, parsed_args):
volume_client = self.app.client_manager.volume
volume = utils.find_resource(volume_client.volumes, parsed_args.volume)
- volume_client.volumes.migrate_volume(volume.id, parsed_args.host,
- parsed_args.force_host_copy,
- parsed_args.lock_volume,)
+ volume_client.volumes.migrate_volume(
+ volume.id,
+ parsed_args.host,
+ parsed_args.force_host_copy,
+ parsed_args.lock_volume,
+ )
class SetVolume(command.Command):
@@ -568,56 +616,76 @@ class SetVolume(command.Command):
"--no-property",
dest="no_property",
action="store_true",
- help=_("Remove all properties from <volume> "
- "(specify both --no-property and --property to "
- "remove the current properties before setting "
- "new properties.)"),
+ help=_(
+ "Remove all properties from <volume> "
+ "(specify both --no-property and --property to "
+ "remove the current properties before setting "
+ "new properties.)"
+ ),
)
parser.add_argument(
'--property',
metavar='<key=value>',
action=parseractions.KeyValueAction,
- help=_('Set a property on this volume '
- '(repeat option to set multiple properties)'),
+ help=_(
+ 'Set a property on this volume '
+ '(repeat option to set multiple properties)'
+ ),
)
parser.add_argument(
'--image-property',
metavar='<key=value>',
action=parseractions.KeyValueAction,
- help=_('Set an image property on this volume '
- '(repeat option to set multiple image properties)'),
+ help=_(
+ 'Set an image property on this volume '
+ '(repeat option to set multiple image properties)'
+ ),
)
parser.add_argument(
"--state",
metavar="<state>",
- choices=['available', 'error', 'creating', 'deleting',
- 'in-use', 'attaching', 'detaching', 'error_deleting',
- 'maintenance'],
- help=_('New volume state ("available", "error", "creating", '
- '"deleting", "in-use", "attaching", "detaching", '
- '"error_deleting" or "maintenance") (admin only) '
- '(This option simply changes the state of the volume '
- 'in the database with no regard to actual status, '
- 'exercise caution when using)'),
+ choices=[
+ 'available',
+ 'error',
+ 'creating',
+ 'deleting',
+ 'in-use',
+ 'attaching',
+ 'detaching',
+ 'error_deleting',
+ 'maintenance',
+ ],
+ help=_(
+ 'New volume state ("available", "error", "creating", '
+ '"deleting", "in-use", "attaching", "detaching", '
+ '"error_deleting" or "maintenance") (admin only) '
+ '(This option simply changes the state of the volume '
+ 'in the database with no regard to actual status, '
+ 'exercise caution when using)'
+ ),
)
attached_group = parser.add_mutually_exclusive_group()
attached_group.add_argument(
"--attached",
action="store_true",
- help=_('Set volume attachment status to "attached" '
- '(admin only) '
- '(This option simply changes the state of the volume '
- 'in the database with no regard to actual status, '
- 'exercise caution when using)'),
+ help=_(
+ 'Set volume attachment status to "attached" '
+ '(admin only) '
+ '(This option simply changes the state of the volume '
+ 'in the database with no regard to actual status, '
+ 'exercise caution when using)'
+ ),
)
attached_group.add_argument(
"--detached",
action="store_true",
- help=_('Set volume attachment status to "detached" '
- '(admin only) '
- '(This option simply changes the state of the volume '
- 'in the database with no regard to actual status, '
- 'exercise caution when using)'),
+ help=_(
+ 'Set volume attachment status to "detached" '
+ '(admin only) '
+ '(This option simply changes the state of the volume '
+ 'in the database with no regard to actual status, '
+ 'exercise caution when using)'
+ ),
)
parser.add_argument(
'--type',
@@ -628,31 +696,33 @@ class SetVolume(command.Command):
'--retype-policy',
metavar='<retype-policy>',
choices=['never', 'on-demand'],
- help=_('Migration policy while re-typing volume '
- '("never" or "on-demand", default is "never" ) '
- '(available only when --type option is specified)'),
+ help=_(
+ 'Migration policy while re-typing volume '
+ '("never" or "on-demand", default is "never" ) '
+ '(available only when --type option is specified)'
+ ),
)
bootable_group = parser.add_mutually_exclusive_group()
bootable_group.add_argument(
"--bootable",
action="store_true",
- help=_("Mark volume as bootable")
+ help=_("Mark volume as bootable"),
)
bootable_group.add_argument(
"--non-bootable",
action="store_true",
- help=_("Mark volume as non-bootable")
+ help=_("Mark volume as non-bootable"),
)
readonly_group = parser.add_mutually_exclusive_group()
readonly_group.add_argument(
"--read-only",
action="store_true",
- help=_("Set volume to read-only access mode")
+ help=_("Set volume to read-only access mode"),
)
readonly_group.add_argument(
"--read-write",
action="store_true",
- help=_("Set volume to read-write access mode")
+ help=_("Set volume to read-write access mode"),
)
return parser
@@ -664,14 +734,21 @@ class SetVolume(command.Command):
if parsed_args.size:
try:
if parsed_args.size <= volume.size:
- msg = (_("New size must be greater than %s GB")
- % volume.size)
+ msg = (
+ _("New size must be greater than %s GB") % volume.size
+ )
raise exceptions.CommandError(msg)
- if volume.status != 'available' and \
- not volume_client.api_version.matches('3.42'):
-
- msg = (_("Volume is in %s state, it must be available "
- "before size can be extended") % volume.status)
+ if (
+ volume.status != 'available'
+ and not volume_client.api_version.matches('3.42')
+ ):
+ msg = (
+ _(
+ "Volume is in %s state, it must be available "
+ "before size can be extended"
+ )
+ % volume.status
+ )
raise exceptions.CommandError(msg)
volume_client.volumes.extend(volume.id, parsed_args.size)
except Exception as e:
@@ -681,7 +758,8 @@ class SetVolume(command.Command):
if parsed_args.no_property:
try:
volume_client.volumes.delete_metadata(
- volume.id, volume.metadata.keys())
+ volume.id, volume.metadata.keys()
+ )
except Exception as e:
LOG.error(_("Failed to clean volume properties: %s"), e)
result += 1
@@ -689,55 +767,62 @@ class SetVolume(command.Command):
if parsed_args.property:
try:
volume_client.volumes.set_metadata(
- volume.id, parsed_args.property)
+ volume.id, parsed_args.property
+ )
except Exception as e:
LOG.error(_("Failed to set volume property: %s"), e)
result += 1
if parsed_args.image_property:
try:
volume_client.volumes.set_image_metadata(
- volume.id, parsed_args.image_property)
+ volume.id, parsed_args.image_property
+ )
except Exception as e:
LOG.error(_("Failed to set image property: %s"), e)
result += 1
if parsed_args.state:
try:
- volume_client.volumes.reset_state(
- volume.id, parsed_args.state)
+ volume_client.volumes.reset_state(volume.id, parsed_args.state)
except Exception as e:
LOG.error(_("Failed to set volume state: %s"), e)
result += 1
if parsed_args.attached:
try:
volume_client.volumes.reset_state(
- volume.id, state=None,
- attach_status="attached")
+ volume.id, state=None, attach_status="attached"
+ )
except Exception as e:
LOG.error(_("Failed to set volume attach-status: %s"), e)
result += 1
if parsed_args.detached:
try:
volume_client.volumes.reset_state(
- volume.id, state=None,
- attach_status="detached")
+ volume.id, state=None, attach_status="detached"
+ )
except Exception as e:
LOG.error(_("Failed to set volume attach-status: %s"), e)
result += 1
if parsed_args.bootable or parsed_args.non_bootable:
try:
volume_client.volumes.set_bootable(
- volume.id, parsed_args.bootable)
+ volume.id, parsed_args.bootable
+ )
except Exception as e:
LOG.error(_("Failed to set volume bootable property: %s"), e)
result += 1
if parsed_args.read_only or parsed_args.read_write:
try:
volume_client.volumes.update_readonly_flag(
- volume.id,
- parsed_args.read_only)
+ volume.id, parsed_args.read_only
+ )
except Exception as e:
- LOG.error(_("Failed to set volume read-only access "
- "mode flag: %s"), e)
+ LOG.error(
+ _(
+ "Failed to set volume read-only access "
+ "mode flag: %s"
+ ),
+ e,
+ )
result += 1
if parsed_args.type:
# get the migration policy
@@ -747,20 +832,23 @@ class SetVolume(command.Command):
try:
# find the volume type
volume_type = utils.find_resource(
- volume_client.volume_types,
- parsed_args.type)
+ volume_client.volume_types, parsed_args.type
+ )
# reset to the new volume type
volume_client.volumes.retype(
- volume.id,
- volume_type.id,
- migration_policy)
+ volume.id, volume_type.id, migration_policy
+ )
except Exception as e:
LOG.error(_("Failed to set volume type: %s"), e)
result += 1
elif parsed_args.retype_policy:
# If the "--retype-policy" is specified without "--type"
- LOG.warning(_("'--retype-policy' option will not work "
- "without '--type' option"))
+ LOG.warning(
+ _(
+ "'--retype-policy' option will not work "
+ "without '--type' option"
+ )
+ )
kwargs = {}
if parsed_args.name:
@@ -771,13 +859,19 @@ class SetVolume(command.Command):
try:
volume_client.volumes.update(volume.id, **kwargs)
except Exception as e:
- LOG.error(_("Failed to update volume display name "
- "or display description: %s"), e)
+ LOG.error(
+ _(
+ "Failed to update volume display name "
+ "or display description: %s"
+ ),
+ e,
+ )
result += 1
if result > 0:
- raise exceptions.CommandError(_("One or more of the "
- "set operations failed"))
+ raise exceptions.CommandError(
+ _("One or more of the " "set operations failed")
+ )
class ShowVolume(command.ShowOne):
@@ -788,7 +882,7 @@ class ShowVolume(command.ShowOne):
parser.add_argument(
'volume',
metavar="<volume>",
- help=_("Volume to display (name or ID)")
+ help=_("Volume to display (name or ID)"),
)
return parser
@@ -801,8 +895,9 @@ class ShowVolume(command.ShowOne):
# 'volume_type' --> 'type'
volume._info.update(
{
- 'properties':
- format_columns.DictColumn(volume._info.pop('metadata')),
+ 'properties': format_columns.DictColumn(
+ volume._info.pop('metadata')
+ ),
'type': volume._info.pop('volume_type'),
},
)
@@ -826,28 +921,32 @@ class UnsetVolume(command.Command):
'--property',
metavar='<key>',
action='append',
- help=_('Remove a property from volume '
- '(repeat option to remove multiple properties)'),
+ help=_(
+ 'Remove a property from volume '
+ '(repeat option to remove multiple properties)'
+ ),
)
parser.add_argument(
'--image-property',
metavar='<key>',
action='append',
- help=_('Remove an image property from volume '
- '(repeat option to remove multiple image properties)'),
+ help=_(
+ 'Remove an image property from volume '
+ '(repeat option to remove multiple image properties)'
+ ),
)
return parser
def take_action(self, parsed_args):
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)
result = 0
if parsed_args.property:
try:
volume_client.volumes.delete_metadata(
- volume.id, parsed_args.property)
+ volume.id, parsed_args.property
+ )
except Exception as e:
LOG.error(_("Failed to unset volume property: %s"), e)
result += 1
@@ -855,11 +954,13 @@ class UnsetVolume(command.Command):
if parsed_args.image_property:
try:
volume_client.volumes.delete_image_metadata(
- volume.id, parsed_args.image_property)
+ volume.id, parsed_args.image_property
+ )
except Exception as e:
LOG.error(_("Failed to unset image property: %s"), e)
result += 1
if result > 0:
- raise exceptions.CommandError(_("One or more of the "
- "unset operations failed"))
+ raise exceptions.CommandError(
+ _("One or more of the " "unset operations failed")
+ )