summaryrefslogtreecommitdiff
path: root/openstackclient/compute
diff options
context:
space:
mode:
authorStephen Finucane <sfinucan@redhat.com>2022-02-10 18:30:37 +0000
committerStephen Finucane <sfinucan@redhat.com>2022-03-09 17:31:44 +0000
commitcffec4517f8bfbe3a6d6d1610c5b3217271a9a9f (patch)
treef207cbb2616b7aa1a987e1a0cface95de29168d5 /openstackclient/compute
parent8c975ba09790f9fe57c32293fb4320bf5c56e012 (diff)
downloadpython-openstackclient-cffec4517f8bfbe3a6d6d1610c5b3217271a9a9f.tar.gz
compute: Allow retrieval of migration by UUID
The nova API doesn't allow you to retrieve migration records by UUID, only ID. This is confusing. Work around it by listing records and filtering this list. Change-Id: I932c9c70420e85056509513e005bb78168e70611 Signed-off-by: Stephen Finucane <sfinucan@redhat.com>
Diffstat (limited to 'openstackclient/compute')
-rw-r--r--openstackclient/compute/v2/server.py102
1 files changed, 97 insertions, 5 deletions
diff --git a/openstackclient/compute/v2/server.py b/openstackclient/compute/v2/server.py
index 0780c49e..5da1984d 100644
--- a/openstackclient/compute/v2/server.py
+++ b/openstackclient/compute/v2/server.py
@@ -21,6 +21,7 @@ import io
import json
import logging
import os
+import uuid
from cliff import columns as cliff_columns
import iso8601
@@ -3037,6 +3038,18 @@ class ListMigration(command.Lister):
return self.print_migrations(parsed_args, compute_client, migrations)
+def _get_migration_by_uuid(compute_client, server_id, migration_uuid):
+ for migration in compute_client.server_migrations.list(server_id):
+ if migration.uuid == migration_uuid:
+ return migration
+ break
+ else:
+ msg = _(
+ 'In-progress live migration %s is not found for server %s.'
+ )
+ raise exceptions.CommandError(msg % (migration_uuid, server_id))
+
+
class ShowMigration(command.ShowOne):
"""Show an in-progress live migration for a given server.
@@ -3069,13 +3082,38 @@ class ShowMigration(command.ShowOne):
)
raise exceptions.CommandError(msg)
+ if not parsed_args.migration.isdigit():
+ try:
+ uuid.UUID(parsed_args.migration)
+ except ValueError:
+ msg = _(
+ 'The <migration> argument must be an ID or UUID'
+ )
+ raise exceptions.CommandError(msg)
+
+ if compute_client.api_version < api_versions.APIVersion('2.59'):
+ msg = _(
+ '--os-compute-api-version 2.59 or greater is required to '
+ 'retrieve server migrations by UUID'
+ )
+ raise exceptions.CommandError(msg)
+
server = utils.find_resource(
compute_client.servers,
parsed_args.server,
)
- server_migration = compute_client.server_migrations.get(
- server.id, parsed_args.migration,
- )
+
+ # the nova API doesn't currently allow retrieval by UUID but it's a
+ # reasonably common operation so emulate this behavior by listing
+ # migrations - the responses are identical
+ if not parsed_args.migration.isdigit():
+ server_migration = _get_migration_by_uuid(
+ compute_client, server.id, parsed_args.migration,
+ )
+ else:
+ server_migration = compute_client.server_migrations.get(
+ server.id, parsed_args.migration,
+ )
columns = (
'ID',
@@ -3136,12 +3174,39 @@ class AbortMigration(command.Command):
)
raise exceptions.CommandError(msg)
+ if not parsed_args.migration.isdigit():
+ try:
+ uuid.UUID(parsed_args.migration)
+ except ValueError:
+ msg = _(
+ 'The <migration> argument must be an ID or UUID'
+ )
+ raise exceptions.CommandError(msg)
+
+ if compute_client.api_version < api_versions.APIVersion('2.59'):
+ msg = _(
+ '--os-compute-api-version 2.59 or greater is required to '
+ 'abort server migrations by UUID'
+ )
+ raise exceptions.CommandError(msg)
+
server = utils.find_resource(
compute_client.servers,
parsed_args.server,
)
+
+ # the nova API doesn't currently allow retrieval by UUID but it's a
+ # reasonably common operation so emulate this behavior by listing
+ # migrations - the responses are identical
+ migration_id = parsed_args.migration
+ if not parsed_args.migration.isdigit():
+ migration_id = _get_migration_by_uuid(
+ compute_client, server.id, parsed_args.migration,
+ ).id
+
compute_client.server_migrations.live_migration_abort(
- server.id, parsed_args.migration)
+ server.id, migration_id,
+ )
class ForceCompleteMigration(command.Command):
@@ -3174,12 +3239,39 @@ class ForceCompleteMigration(command.Command):
)
raise exceptions.CommandError(msg)
+ if not parsed_args.migration.isdigit():
+ try:
+ uuid.UUID(parsed_args.migration)
+ except ValueError:
+ msg = _(
+ 'The <migration> argument must be an ID or UUID'
+ )
+ raise exceptions.CommandError(msg)
+
+ if compute_client.api_version < api_versions.APIVersion('2.59'):
+ msg = _(
+ '--os-compute-api-version 2.59 or greater is required to '
+ 'abort server migrations by UUID'
+ )
+ raise exceptions.CommandError(msg)
+
server = utils.find_resource(
compute_client.servers,
parsed_args.server,
)
+
+ # the nova API doesn't currently allow retrieval by UUID but it's a
+ # reasonably common operation so emulate this behavior by listing
+ # migrations - the responses are identical
+ migration_id = parsed_args.migration
+ if not parsed_args.migration.isdigit():
+ migration_id = _get_migration_by_uuid(
+ compute_client, server.id, parsed_args.migration,
+ ).id
+
compute_client.server_migrations.live_migrate_force_complete(
- server.id, parsed_args.migration)
+ server.id, migration_id,
+ )
class PauseServer(command.Command):