summaryrefslogtreecommitdiff
path: root/openstackclient/compute/v2/server_volume.py
diff options
context:
space:
mode:
Diffstat (limited to 'openstackclient/compute/v2/server_volume.py')
-rw-r--r--openstackclient/compute/v2/server_volume.py67
1 files changed, 67 insertions, 0 deletions
diff --git a/openstackclient/compute/v2/server_volume.py b/openstackclient/compute/v2/server_volume.py
index 8a931ae5..b53c92fe 100644
--- a/openstackclient/compute/v2/server_volume.py
+++ b/openstackclient/compute/v2/server_volume.py
@@ -16,6 +16,7 @@
from novaclient import api_versions
from osc_lib.command import command
+from osc_lib import exceptions
from osc_lib import utils
from openstackclient.i18n import _
@@ -71,3 +72,69 @@ class ListServerVolume(command.Lister):
) for s in volumes
),
)
+
+
+class UpdateServerVolume(command.Command):
+ """Update a volume attachment on the server."""
+
+ def get_parser(self, prog_name):
+ parser = super(UpdateServerVolume, self).get_parser(prog_name)
+ parser.add_argument(
+ 'server',
+ help=_('Server to update volume for (name or ID)'),
+ )
+ parser.add_argument(
+ 'volume',
+ help=_('Volume (ID)'),
+ )
+ termination_group = parser.add_mutually_exclusive_group()
+ termination_group.add_argument(
+ '--delete-on-termination',
+ action='store_true',
+ dest='delete_on_termination',
+ default=None,
+ help=_(
+ 'Delete the volume when the server is destroyed '
+ '(supported by --os-compute-api-version 2.85 or above)'
+ ),
+ )
+ termination_group.add_argument(
+ '--preserve-on-termination',
+ action='store_false',
+ dest='delete_on_termination',
+ help=_(
+ 'Preserve the volume when the server is destroyed '
+ '(supported by --os-compute-api-version 2.85 or above)'
+ ),
+ )
+ return parser
+
+ def take_action(self, parsed_args):
+
+ compute_client = self.app.client_manager.compute
+
+ if parsed_args.delete_on_termination is not None:
+ if compute_client.api_version < api_versions.APIVersion('2.85'):
+ msg = _(
+ '--os-compute-api-version 2.85 or greater is required to '
+ 'support the --(no-)delete-on-termination option'
+ )
+ raise exceptions.CommandError(msg)
+
+ server = utils.find_resource(
+ compute_client.servers,
+ parsed_args.server,
+ )
+
+ # NOTE(stephenfin): This may look silly, and that's because it is.
+ # This API was originally used only for the swapping volumes, which
+ # is an internal operation that should only be done by
+ # orchestration software rather than a human. We're not going to
+ # expose that, but we are going to expose the ability to change the
+ # delete on termination behavior.
+ compute_client.volumes.update_server_volume(
+ server.id,
+ parsed_args.volume,
+ parsed_args.volume,
+ delete_on_termination=parsed_args.delete_on_termination,
+ )