Allow to resize in-use volumes

Since Pike (microversion 3.42) [1] Cinder API allows to resize in-use
volumes. So no reason not to implement it in CLI.

[1] https://opendev.org/openstack/cinder/src/branch/master/cinder/api/openstack/rest_api_version_history.rst#user-content-section-39

Change-Id: I22462a56d261e0a100aac3f27af7be47223edec0
This commit is contained in:
Dmitriy Rabotyagov 2020-11-05 17:51:27 +02:00 committed by Dmitriy Rabotyagov (noonedeadpunk)
parent e2bd1530cf
commit 4c0bfb03fc
2 changed files with 15 additions and 6 deletions

View File

@ -29,6 +29,7 @@ API_VERSIONS = {
"1": "cinderclient.v1.client.Client",
"2": "cinderclient.v2.client.Client",
"3": "cinderclient.v3.client.Client",
"3.42": "cinderclient.v3.client.Client",
}
@ -47,14 +48,19 @@ def make_client(instance):
except Exception:
del API_VERSIONS['1']
if instance._api_version[API_NAME] == '1':
version = instance._api_version[API_NAME]
from cinderclient import api_versions
# convert to APIVersion object
version = api_versions.get_api_version(version)
if version.ver_major == '1':
# Monkey patch for v1 cinderclient
volumes.Volume.NAME_ATTR = 'display_name'
volume_snapshots.Snapshot.NAME_ATTR = 'display_name'
volume_client = utils.get_client_class(
API_NAME,
instance._api_version[API_NAME],
version.ver_major,
API_VERSIONS
)
LOG.debug('Instantiating volume client: %s', volume_client)
@ -76,6 +82,7 @@ def make_client(instance):
http_log_debug=http_log_debug,
region_name=instance.region_name,
endpoint_override=endpoint_override,
api_version=version,
**kwargs
)

View File

@ -605,14 +605,16 @@ class SetVolume(command.Command):
result = 0
if parsed_args.size:
try:
if volume.status != 'available':
msg = (_("Volume is in %s state, it must be available "
"before size can be extended") % volume.status)
raise exceptions.CommandError(msg)
if parsed_args.size <= 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)
raise exceptions.CommandError(msg)
volume_client.volumes.extend(volume.id, parsed_args.size)
except Exception as e:
LOG.error(_("Failed to set volume size: %s"), e)