Skip to content

Commit 1c3cf11

Browse files
hackertronstephenfin
authored andcommitted
Add 'server migration abort' command
This is equivalent to nova client's 'live-migration-abort' command. Change-Id: I0ff520ccfdf2de52c427affad7bef4554c86a06f Story: 2007489 Task: 39210
1 parent 375fe31 commit 1c3cf11

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
@@ -2026,6 +2026,44 @@ def take_action(self, parsed_args):
20262026
return self.print_migrations(parsed_args, compute_client, migrations)
20272027

20282028

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

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()
@@ -4207,6 +4212,57 @@ def test_get_migrations_with_project_and_user_pre_v280(self):
42074212
parsed_args)
42084213

42094214

4215+
class TestServerMigrationAbort(TestServer):
4216+
4217+
def setUp(self):
4218+
super(TestServerMigrationAbort, self).setUp()
4219+
4220+
self.server = compute_fakes.FakeServer.create_one_server()
4221+
4222+
# Return value for utils.find_resource for server.
4223+
self.servers_mock.get.return_value = self.server
4224+
4225+
# Get the command object to test
4226+
self.cmd = server.AbortMigration(self.app, None)
4227+
4228+
def test_migration_abort(self):
4229+
self.app.client_manager.compute.api_version = api_versions.APIVersion(
4230+
'2.24')
4231+
4232+
arglist = [
4233+
self.server.id,
4234+
'2', # arbitrary migration ID
4235+
]
4236+
verifylist = []
4237+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
4238+
4239+
result = self.cmd.take_action(parsed_args)
4240+
4241+
self.servers_mock.get.assert_called_with(self.server.id)
4242+
self.server_migrations_mock.live_migration_abort.assert_called_with(
4243+
self.server.id, '2',)
4244+
self.assertIsNone(result)
4245+
4246+
def test_migration_abort_pre_v224(self):
4247+
self.app.client_manager.compute.api_version = api_versions.APIVersion(
4248+
'2.23')
4249+
4250+
arglist = [
4251+
self.server.id,
4252+
'2', # arbitrary migration ID
4253+
]
4254+
verifylist = []
4255+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
4256+
4257+
ex = self.assertRaises(
4258+
exceptions.CommandError,
4259+
self.cmd.take_action,
4260+
parsed_args)
4261+
self.assertIn(
4262+
'--os-compute-api-version 2.24 or greater is required',
4263+
str(ex))
4264+
4265+
42104266
class TestServerPause(TestServer):
42114267

42124268
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)