Skip to content

Commit e5cb150

Browse files
Zuulopenstack-gerrit
authored andcommitted
Merge "Allow "server migrate" (not live) to take "--host" option"
2 parents d756f70 + 1aad943 commit e5cb150

3 files changed

Lines changed: 57 additions & 15 deletions

File tree

openstackclient/compute/v2/server.py

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1470,13 +1470,13 @@ def get_parser(self, prog_name):
14701470
'and ``--live-migration`` are used, ``--live-migration`` '
14711471
'takes priority.'),
14721472
)
1473-
# TODO(mriedem): Add support for --os-compute-api-version >= 2.56 where
1474-
# you can cold migrate to a specified target host.
14751473
host_group.add_argument(
14761474
'--host',
14771475
metavar='<hostname>',
1478-
help=_('Live migrate the server to the specified host. Requires '
1479-
'``--os-compute-api-version`` 2.30 or greater.'),
1476+
help=_('Migrate the server to the specified host. Requires '
1477+
'``--os-compute-api-version`` 2.30 or greater when used '
1478+
'with the ``--live-migration`` option, otherwise requires '
1479+
'``--os-compute-api-version`` 2.56 or greater.'),
14801480
)
14811481
migration_group = parser.add_mutually_exclusive_group()
14821482
migration_group.add_argument(
@@ -1566,16 +1566,22 @@ def _show_progress(progress):
15661566
kwargs['disk_over_commit'] = parsed_args.disk_overcommit
15671567
server.live_migrate(**kwargs)
15681568
else:
1569-
if (parsed_args.block_migration or parsed_args.disk_overcommit or
1570-
parsed_args.host):
1571-
# TODO(mriedem): Allow --host for cold migration if
1572-
# --os-compute-api-version >= 2.56.
1569+
if parsed_args.block_migration or parsed_args.disk_overcommit:
15731570
raise exceptions.CommandError(
15741571
"--live-migration must be specified if "
1575-
"--block-migration, --disk-overcommit or --host is "
1572+
"--block-migration or --disk-overcommit is "
15761573
"specified")
1574+
if parsed_args.host:
1575+
if (compute_client.api_version <
1576+
api_versions.APIVersion('2.56')):
1577+
msg = _(
1578+
'--os-compute-api-version 2.56 or greater is '
1579+
'required to use --host without --live-migration.'
1580+
)
1581+
raise exceptions.CommandError(msg)
15771582

1578-
server.migrate()
1583+
kwargs = {'host': parsed_args.host} if parsed_args.host else {}
1584+
server.migrate(**kwargs)
15791585

15801586
if parsed_args.wait:
15811587
if utils.wait_for_status(

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

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2528,6 +2528,32 @@ def test_server_migrate_no_options(self):
25282528
self.assertNotCalled(self.servers_mock.live_migrate)
25292529
self.assertIsNone(result)
25302530

2531+
def test_server_migrate_with_host_2_56(self):
2532+
# Tests that --host is allowed for a cold migration
2533+
# for microversion 2.56 and greater.
2534+
arglist = [
2535+
'--host', 'fakehost', self.server.id,
2536+
]
2537+
verifylist = [
2538+
('live', None),
2539+
('live_migration', False),
2540+
('host', 'fakehost'),
2541+
('block_migration', False),
2542+
('disk_overcommit', False),
2543+
('wait', False),
2544+
]
2545+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
2546+
2547+
self.app.client_manager.compute.api_version = \
2548+
api_versions.APIVersion('2.56')
2549+
2550+
result = self.cmd.take_action(parsed_args)
2551+
2552+
self.servers_mock.get.assert_called_with(self.server.id)
2553+
self.server.migrate.assert_called_with(host='fakehost')
2554+
self.assertNotCalled(self.servers_mock.live_migrate)
2555+
self.assertIsNone(result)
2556+
25312557
def test_server_migrate_with_block_migration(self):
25322558
arglist = [
25332559
'--block-migration', self.server.id,
@@ -2566,8 +2592,9 @@ def test_server_migrate_with_disk_overcommit(self):
25662592
self.assertNotCalled(self.servers_mock.live_migrate)
25672593
self.assertNotCalled(self.servers_mock.migrate)
25682594

2569-
def test_server_migrate_with_host(self):
2570-
# Tests that --host is not allowed for a cold migration.
2595+
def test_server_migrate_with_host_pre_2_56(self):
2596+
# Tests that --host is not allowed for a cold migration
2597+
# before microversion 2.56 (the test defaults to 2.1).
25712598
arglist = [
25722599
'--host', 'fakehost', self.server.id,
25732600
]
@@ -2585,9 +2612,10 @@ def test_server_migrate_with_host(self):
25852612
parsed_args)
25862613

25872614
# Make sure it's the error we expect.
2588-
self.assertIn("--live-migration must be specified if "
2589-
"--block-migration, --disk-overcommit or --host is "
2590-
"specified", six.text_type(ex))
2615+
self.assertIn('--os-compute-api-version 2.56 or greater is required '
2616+
'to use --host without --live-migration.',
2617+
six.text_type(ex))
2618+
25912619
self.servers_mock.get.assert_called_with(self.server.id)
25922620
self.assertNotCalled(self.servers_mock.live_migrate)
25932621
self.assertNotCalled(self.servers_mock.migrate)
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
---
2+
features:
3+
- |
4+
Added the ability to specify ``--host`` with ``server migrate``
5+
(cold migration) to specify the target host of the migration.
6+
Requires ``--os-compute-api-version`` 2.56 or greater to target a
7+
specific host for the (cold) migration.
8+
[Story `2003325 <https://storyboard.openstack.org/#!/story/2003325>`_]

0 commit comments

Comments
 (0)