Skip to content

Commit 855dc79

Browse files
Zuulopenstack-gerrit
authored andcommitted
Merge "compute: Add 'server migration show' command"
2 parents 82770fa + f80fe2d commit 855dc79

5 files changed

Lines changed: 242 additions & 1 deletion

File tree

openstackclient/compute/v2/server.py

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2603,6 +2603,70 @@ def take_action(self, parsed_args):
26032603
return self.print_migrations(parsed_args, compute_client, migrations)
26042604

26052605

2606+
class ShowMigration(command.Command):
2607+
"""Show a migration for a given server."""
2608+
2609+
def get_parser(self, prog_name):
2610+
parser = super().get_parser(prog_name)
2611+
parser.add_argument(
2612+
'server',
2613+
metavar='<server>',
2614+
help=_('Server (name or ID)'),
2615+
)
2616+
parser.add_argument(
2617+
'migration',
2618+
metavar='<migration>',
2619+
help=_("Migration (ID)"),
2620+
)
2621+
return parser
2622+
2623+
def take_action(self, parsed_args):
2624+
compute_client = self.app.client_manager.compute
2625+
2626+
if compute_client.api_version < api_versions.APIVersion('2.24'):
2627+
msg = _(
2628+
'--os-compute-api-version 2.24 or greater is required to '
2629+
'support the server migration show command'
2630+
)
2631+
raise exceptions.CommandError(msg)
2632+
2633+
server = utils.find_resource(
2634+
compute_client.servers,
2635+
parsed_args.server,
2636+
)
2637+
server_migration = compute_client.server_migrations.get(
2638+
server.id, parsed_args.migration,
2639+
)
2640+
2641+
columns = (
2642+
'ID',
2643+
'Server UUID',
2644+
'Status',
2645+
'Source Compute',
2646+
'Source Node',
2647+
'Dest Compute',
2648+
'Dest Host',
2649+
'Dest Node',
2650+
'Memory Total Bytes',
2651+
'Memory Processed Bytes',
2652+
'Memory Remaining Bytes',
2653+
'Disk Total Bytes',
2654+
'Disk Processed Bytes',
2655+
'Disk Remaining Bytes',
2656+
'Created At',
2657+
'Updated At',
2658+
)
2659+
2660+
if compute_client.api_version >= api_versions.APIVersion('2.59'):
2661+
columns += ('UUID',)
2662+
2663+
if compute_client.api_version >= api_versions.APIVersion('2.80'):
2664+
columns += ('User ID', 'Project ID')
2665+
2666+
data = utils.get_item_properties(server_migration, columns)
2667+
return columns, data
2668+
2669+
26062670
class AbortMigration(command.Command):
26072671
"""Cancel an ongoing live migration.
26082672

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

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1633,6 +1633,59 @@ def create_migrations(attrs=None, methods=None, count=2):
16331633
return migrations
16341634

16351635

1636+
class FakeServerMigration(object):
1637+
"""Fake one or more server migrations."""
1638+
1639+
@staticmethod
1640+
def create_one_server_migration(attrs=None, methods=None):
1641+
"""Create a fake server migration.
1642+
1643+
:param Dictionary attrs:
1644+
A dictionary with all attributes
1645+
:param Dictionary methods:
1646+
A dictionary with all methods
1647+
:return:
1648+
A FakeResource object, with id, type, and so on
1649+
"""
1650+
attrs = attrs or {}
1651+
methods = methods or {}
1652+
1653+
# Set default attributes.
1654+
1655+
migration_info = {
1656+
"created_at": "2016-01-29T13:42:02.000000",
1657+
"dest_compute": "compute2",
1658+
"dest_host": "1.2.3.4",
1659+
"dest_node": "node2",
1660+
"id": random.randint(1, 999),
1661+
"server_uuid": uuid.uuid4().hex,
1662+
"source_compute": "compute1",
1663+
"source_node": "node1",
1664+
"status": "running",
1665+
"memory_total_bytes": random.randint(1, 99999),
1666+
"memory_processed_bytes": random.randint(1, 99999),
1667+
"memory_remaining_bytes": random.randint(1, 99999),
1668+
"disk_total_bytes": random.randint(1, 99999),
1669+
"disk_processed_bytes": random.randint(1, 99999),
1670+
"disk_remaining_bytes": random.randint(1, 99999),
1671+
"updated_at": "2016-01-29T13:42:02.000000",
1672+
# added in 2.59
1673+
"uuid": uuid.uuid4().hex,
1674+
# added in 2.80
1675+
"user_id": uuid.uuid4().hex,
1676+
"project_id": uuid.uuid4().hex,
1677+
}
1678+
1679+
# Overwrite default attributes.
1680+
migration_info.update(attrs)
1681+
1682+
migration = fakes.FakeResource(
1683+
info=copy.deepcopy(migration_info),
1684+
methods=methods,
1685+
loaded=True)
1686+
return migration
1687+
1688+
16361689
class FakeVolumeAttachment(object):
16371690
"""Fake one or more volume attachments (BDMs)."""
16381691

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

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4888,6 +4888,124 @@ def test_get_migrations_with_project_and_user_pre_v280(self):
48884888
str(ex))
48894889

48904890

4891+
class TestServerMigrationShow(TestServer):
4892+
4893+
def setUp(self):
4894+
super().setUp()
4895+
4896+
self.server = compute_fakes.FakeServer.create_one_server()
4897+
self.servers_mock.get.return_value = self.server
4898+
4899+
self.server_migration = compute_fakes.FakeServerMigration\
4900+
.create_one_server_migration()
4901+
self.server_migrations_mock.get.return_value = self.server_migration
4902+
4903+
self.columns = (
4904+
'ID',
4905+
'Server UUID',
4906+
'Status',
4907+
'Source Compute',
4908+
'Source Node',
4909+
'Dest Compute',
4910+
'Dest Host',
4911+
'Dest Node',
4912+
'Memory Total Bytes',
4913+
'Memory Processed Bytes',
4914+
'Memory Remaining Bytes',
4915+
'Disk Total Bytes',
4916+
'Disk Processed Bytes',
4917+
'Disk Remaining Bytes',
4918+
'Created At',
4919+
'Updated At',
4920+
)
4921+
4922+
self.data = (
4923+
self.server_migration.id,
4924+
self.server_migration.server_uuid,
4925+
self.server_migration.status,
4926+
self.server_migration.source_compute,
4927+
self.server_migration.source_node,
4928+
self.server_migration.dest_compute,
4929+
self.server_migration.dest_host,
4930+
self.server_migration.dest_node,
4931+
self.server_migration.memory_total_bytes,
4932+
self.server_migration.memory_processed_bytes,
4933+
self.server_migration.memory_remaining_bytes,
4934+
self.server_migration.disk_total_bytes,
4935+
self.server_migration.disk_processed_bytes,
4936+
self.server_migration.disk_remaining_bytes,
4937+
self.server_migration.created_at,
4938+
self.server_migration.updated_at,
4939+
)
4940+
4941+
# Get the command object to test
4942+
self.cmd = server.ShowMigration(self.app, None)
4943+
4944+
def _test_server_migration_show(self):
4945+
arglist = [
4946+
self.server.id,
4947+
'2', # arbitrary migration ID
4948+
]
4949+
verifylist = []
4950+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
4951+
4952+
columns, data = self.cmd.take_action(parsed_args)
4953+
4954+
self.assertEqual(self.columns, columns)
4955+
self.assertEqual(self.data, data)
4956+
4957+
self.servers_mock.get.assert_called_with(self.server.id)
4958+
self.server_migrations_mock.get.assert_called_with(
4959+
self.server.id, '2',)
4960+
4961+
def test_server_migration_show(self):
4962+
self.app.client_manager.compute.api_version = api_versions.APIVersion(
4963+
'2.24')
4964+
4965+
self._test_server_migration_show()
4966+
4967+
def test_server_migration_show_v259(self):
4968+
self.app.client_manager.compute.api_version = api_versions.APIVersion(
4969+
'2.59')
4970+
4971+
self.columns += ('UUID',)
4972+
self.data += (self.server_migration.uuid,)
4973+
4974+
self._test_server_migration_show()
4975+
4976+
def test_server_migration_show_v280(self):
4977+
self.app.client_manager.compute.api_version = api_versions.APIVersion(
4978+
'2.80')
4979+
4980+
self.columns += ('UUID', 'User ID', 'Project ID')
4981+
self.data += (
4982+
self.server_migration.uuid,
4983+
self.server_migration.user_id,
4984+
self.server_migration.project_id,
4985+
)
4986+
4987+
self._test_server_migration_show()
4988+
4989+
def test_server_migration_show_pre_v224(self):
4990+
self.app.client_manager.compute.api_version = api_versions.APIVersion(
4991+
'2.23')
4992+
4993+
arglist = [
4994+
self.server.id,
4995+
'2', # arbitrary migration ID
4996+
]
4997+
verifylist = []
4998+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
4999+
5000+
ex = self.assertRaises(
5001+
exceptions.CommandError,
5002+
self.cmd.take_action,
5003+
parsed_args)
5004+
self.assertIn(
5005+
'--os-compute-api-version 2.24 or greater is required',
5006+
str(ex))
5007+
5008+
48915009
class TestServerMigrationAbort(TestServer):
48925010

48935011
def setUp(self):
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
features:
3+
- |
4+
Add ``server migration show`` commands. This can be used to show detailed
5+
information about an ongoing server migration.

setup.cfg

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,9 +110,10 @@ openstack.compute.v2 =
110110
server_migrate = openstackclient.compute.v2.server:MigrateServer
111111
server_migrate_confirm = openstackclient.compute.v2.server:MigrateConfirm
112112
server_migrate_revert = openstackclient.compute.v2.server:MigrateRevert
113-
server_migration_list = openstackclient.compute.v2.server:ListMigration
114113
server_migration_abort = openstackclient.compute.v2.server:AbortMigration
115114
server_migration_force_complete = openstackclient.compute.v2.server:ForceCompleteMigration
115+
server_migration_list = openstackclient.compute.v2.server:ListMigration
116+
server_migration_show = openstackclient.compute.v2.server:ShowMigration
116117
server_pause = openstackclient.compute.v2.server:PauseServer
117118
server_reboot = openstackclient.compute.v2.server:RebootServer
118119
server_rebuild = openstackclient.compute.v2.server:RebuildServer

0 commit comments

Comments
 (0)