Skip to content

Commit 91027a5

Browse files
Zuulopenstack-gerrit
authored andcommitted
Merge "Add 'server migration abort' command"
2 parents 247ca75 + 1c3cf11 commit 91027a5

5 files changed

Lines changed: 102 additions & 0 deletions

File tree

openstackclient/compute/v2/server.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2032,6 +2032,44 @@ def take_action(self, parsed_args):
20322032
return self.print_migrations(parsed_args, compute_client, migrations)
20332033

20342034

2035+
class AbortMigration(command.Command):
2036+
"""Cancel an ongoing live migration.
2037+
2038+
This command requires ``--os-compute-api-version`` 2.24 or greater.
2039+
"""
2040+
2041+
def get_parser(self, prog_name):
2042+
parser = super(AbortMigration, self).get_parser(prog_name)
2043+
parser.add_argument(
2044+
'server',
2045+
metavar='<server>',
2046+
help=_('Server (name or ID)'),
2047+
)
2048+
parser.add_argument(
2049+
'migration',
2050+
metavar='<migration>',
2051+
help=_("Migration (ID)"),
2052+
)
2053+
return parser
2054+
2055+
def take_action(self, parsed_args):
2056+
compute_client = self.app.client_manager.compute
2057+
2058+
if compute_client.api_version < api_versions.APIVersion('2.24'):
2059+
msg = _(
2060+
'--os-compute-api-version 2.24 or greater is required to '
2061+
'support the server migration abort command'
2062+
)
2063+
raise exceptions.CommandError(msg)
2064+
2065+
server = utils.find_resource(
2066+
compute_client.servers,
2067+
parsed_args.server,
2068+
)
2069+
compute_client.server_migrations.live_migration_abort(
2070+
server.id, parsed_args.migration)
2071+
2072+
20352073
class PauseServer(command.Command):
20362074
_description = _("Pause server(s)")
20372075

openstackclient/tests/unit/compute/v2/fakes.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,9 @@ def __init__(self, **kwargs):
196196
self.server_groups = mock.Mock()
197197
self.server_groups.resource_class = fakes.FakeResource(None, {})
198198

199+
self.server_migrations = mock.Mock()
200+
self.server_migrations.resource_class = fakes.FakeResource(None, {})
201+
199202
self.instance_action = mock.Mock()
200203
self.instance_action.resource_class = fakes.FakeResource(None, {})
201204

openstackclient/tests/unit/compute/v2/test_server.py

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,11 @@ def setUp(self):
4242
self.servers_mock = self.app.client_manager.compute.servers
4343
self.servers_mock.reset_mock()
4444

45+
# Get a shortcut to the compute client ServerMigrationsManager Mock
46+
self.server_migrations_mock = \
47+
self.app.client_manager.compute.server_migrations
48+
self.server_migrations_mock.reset_mock()
49+
4550
# Get a shortcut to the compute client volumeManager Mock
4651
self.servers_volumes_mock = self.app.client_manager.compute.volumes
4752
self.servers_volumes_mock.reset_mock()
@@ -4232,6 +4237,57 @@ def test_get_migrations_with_project_and_user_pre_v280(self):
42324237
parsed_args)
42334238

42344239

4240+
class TestServerMigrationAbort(TestServer):
4241+
4242+
def setUp(self):
4243+
super(TestServerMigrationAbort, self).setUp()
4244+
4245+
self.server = compute_fakes.FakeServer.create_one_server()
4246+
4247+
# Return value for utils.find_resource for server.
4248+
self.servers_mock.get.return_value = self.server
4249+
4250+
# Get the command object to test
4251+
self.cmd = server.AbortMigration(self.app, None)
4252+
4253+
def test_migration_abort(self):
4254+
self.app.client_manager.compute.api_version = api_versions.APIVersion(
4255+
'2.24')
4256+
4257+
arglist = [
4258+
self.server.id,
4259+
'2', # arbitrary migration ID
4260+
]
4261+
verifylist = []
4262+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
4263+
4264+
result = self.cmd.take_action(parsed_args)
4265+
4266+
self.servers_mock.get.assert_called_with(self.server.id)
4267+
self.server_migrations_mock.live_migration_abort.assert_called_with(
4268+
self.server.id, '2',)
4269+
self.assertIsNone(result)
4270+
4271+
def test_migration_abort_pre_v224(self):
4272+
self.app.client_manager.compute.api_version = api_versions.APIVersion(
4273+
'2.23')
4274+
4275+
arglist = [
4276+
self.server.id,
4277+
'2', # arbitrary migration ID
4278+
]
4279+
verifylist = []
4280+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
4281+
4282+
ex = self.assertRaises(
4283+
exceptions.CommandError,
4284+
self.cmd.take_action,
4285+
parsed_args)
4286+
self.assertIn(
4287+
'--os-compute-api-version 2.24 or greater is required',
4288+
str(ex))
4289+
4290+
42354291
class TestServerPause(TestServer):
42364292

42374293
def setUp(self):
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
---
2+
features:
3+
- |
4+
Add ``server migration abort`` command to abort ongoing live migrations.

setup.cfg

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ openstack.compute.v2 =
109109
server_migrate_confirm = openstackclient.compute.v2.server:MigrateConfirm
110110
server_migrate_revert = openstackclient.compute.v2.server:MigrateRevert
111111
server_migration_list = openstackclient.compute.v2.server:ListMigration
112+
server_migration_abort = openstackclient.compute.v2.server:AbortMigration
112113
server_pause = openstackclient.compute.v2.server:PauseServer
113114
server_reboot = openstackclient.compute.v2.server:RebootServer
114115
server_rebuild = openstackclient.compute.v2.server:RebuildServer

0 commit comments

Comments
 (0)