Cleanup of 'server migration list' command

Address some post merge nits.

Change-Id: Ie59521d81fab191194f6c1a114b007fa17f5299f
Signed-off-by: Stephen Finucane <sfinucan@redhat.com>
This commit is contained in:
Stephen Finucane
2020-10-13 14:31:11 +01:00
parent 08b0e5855b
commit 5fd399eaba
2 changed files with 211 additions and 167 deletions

View File

@@ -1866,99 +1866,99 @@ revert to release the new server and restart the old one.""")
class ListMigration(command.Command): class ListMigration(command.Command):
_description = _("""List server migrations.""") _description = _("""List server migrations""")
def get_parser(self, prog_name): def get_parser(self, prog_name):
parser = super(ListMigration, self).get_parser(prog_name) parser = super(ListMigration, self).get_parser(prog_name)
parser.add_argument( parser.add_argument(
"--server", '--server',
metavar="<server>", metavar='<server>',
dest='server', help=_(
default=None, 'Filter migrations by server (name or ID)'
help=_('Server to show migration details (name or ID).') )
) )
parser.add_argument( parser.add_argument(
"--host", '--host',
metavar="<host>", metavar='<host>',
default=None, help=_(
help=_('Fetch migrations for the given host.') 'Filter migrations by source or destination host'
),
) )
parser.add_argument( parser.add_argument(
"--status", '--status',
metavar="<status>", metavar='<status>',
default=None, help=_('Filter migrations by status')
help=_('Fetch migrations for the given status.')
) )
parser.add_argument( parser.add_argument(
"--marker", '--marker',
metavar="<marker>", metavar='<marker>',
dest='marker', help=_(
default=None, "The last migration of the previous page; displays list "
help=_("The last migration of the previous page; displays list " "of migrations after 'marker'. Note that the marker is "
"of migrations after 'marker'. Note that the marker is " "the migration UUID. "
"the migration UUID. (Supported with " "(supported with --os-compute-api-version 2.59 or above)"
"``--os-compute-api-version`` 2.59 or greater.)") ),
) )
parser.add_argument( parser.add_argument(
"--limit", '--limit',
metavar="<limit>", metavar='<limit>',
dest='limit',
type=int, type=int,
default=None, help=_(
help=_("Maximum number of migrations to display. Note that there " "Maximum number of migrations to display. Note that there "
"is a configurable max limit on the server, and the limit " "is a configurable max limit on the server, and the limit "
"that is used will be the minimum of what is requested " "that is used will be the minimum of what is requested "
"here and what is configured in the server. " "here and what is configured in the server. "
"(Supported with ``--os-compute-api-version`` 2.59 " "(supported with --os-compute-api-version 2.59 or above)"
"or greater.)") ),
) )
parser.add_argument( parser.add_argument(
'--changes-since', '--changes-since',
dest='changes_since', dest='changes_since',
metavar='<changes-since>', metavar='<changes-since>',
default=None, help=_(
help=_("List only migrations changed later or equal to a certain " "List only migrations changed later or equal to a certain "
"point of time. The provided time should be an ISO 8061 " "point of time. The provided time should be an ISO 8061 "
"formatted time, e.g. ``2016-03-04T06:27:59Z``. " "formatted time, e.g. ``2016-03-04T06:27:59Z``. "
"(Supported with ``--os-compute-api-version`` 2.59 " "(supported with --os-compute-api-version 2.59 or above)"
"or greater.)") ),
) )
parser.add_argument( parser.add_argument(
'--changes-before', '--changes-before',
dest='changes_before', dest='changes_before',
metavar='<changes-before>', metavar='<changes-before>',
default=None, help=_(
help=_("List only migrations changed earlier or equal to a " "List only migrations changed earlier or equal to a "
"certain point of time. The provided time should be an ISO " "certain point of time. The provided time should be an ISO "
"8061 formatted time, e.g. ``2016-03-04T06:27:59Z``. " "8061 formatted time, e.g. ``2016-03-04T06:27:59Z``. "
"(Supported with ``--os-compute-api-version`` 2.66 or " "(supported with --os-compute-api-version 2.66 or above)"
"greater.)") ),
) )
parser.add_argument( parser.add_argument(
'--project', '--project',
metavar='<project>', metavar='<project>',
dest='project_id', dest='project_id',
default=None, help=_(
help=_("Filter the migrations by the given project ID. " "Filter migrations by project (ID) "
"(Supported with ``--os-compute-api-version`` 2.80 " "(supported with --os-compute-api-version 2.80 or above)"
"or greater.)"), ),
) )
parser.add_argument( parser.add_argument(
'--user', '--user',
metavar='<user>', metavar='<user>',
dest='user_id', dest='user_id',
default=None, help=_(
help=_("Filter the migrations by the given user ID. " "Filter migrations by user (ID) "
"(Supported with ``--os-compute-api-version`` 2.80 " "(supported with --os-compute-api-version 2.80 or above)"
"or greater.)"), ),
) )
return parser return parser
def print_migrations(self, parsed_args, compute_client, migrations): def print_migrations(self, parsed_args, compute_client, migrations):
columns = ['Source Node', 'Dest Node', 'Source Compute', columns = [
'Dest Compute', 'Dest Host', 'Status', 'Source Node', 'Dest Node', 'Source Compute', 'Dest Compute',
'Server UUID', 'Old Flavor', 'New Flavor', 'Dest Host', 'Status', 'Server UUID', 'Old Flavor', 'New Flavor',
'Created At', 'Updated At'] 'Created At', 'Updated At',
]
# Insert migrations UUID after ID # Insert migrations UUID after ID
if compute_client.api_version >= api_versions.APIVersion("2.59"): if compute_client.api_version >= api_versions.APIVersion("2.59"):
@@ -1978,48 +1978,73 @@ class ListMigration(command.Command):
if parsed_args.user_id: if parsed_args.user_id:
columns.insert(len(columns) - 2, "User") columns.insert(len(columns) - 2, "User")
columns_header = columns return (
return (columns_header, (utils.get_item_properties( columns,
mig, columns) for mig in migrations)) (utils.get_item_properties(mig, columns) for mig in migrations),
)
def take_action(self, parsed_args): def take_action(self, parsed_args):
compute_client = self.app.client_manager.compute compute_client = self.app.client_manager.compute
search_opts = { search_opts = {
"host": parsed_args.host, 'host': parsed_args.host,
"server": parsed_args.server, 'server': parsed_args.server,
"status": parsed_args.status, 'status': parsed_args.status,
} }
if (parsed_args.marker or parsed_args.limit or if parsed_args.marker:
parsed_args.changes_since): if compute_client.api_version < api_versions.APIVersion('2.59'):
if compute_client.api_version < api_versions.APIVersion("2.59"): msg = _(
msg = _("marker, limit and/or changes_since is not supported " '--os-compute-api-version 2.59 or greater is required to '
"for --os-compute-api-version less than 2.59") 'support the --marker option'
)
raise exceptions.CommandError(msg) raise exceptions.CommandError(msg)
if parsed_args.marker: search_opts['marker'] = parsed_args.marker
search_opts['marker'] = parsed_args.marker
if parsed_args.limit: if parsed_args.limit:
search_opts['limit'] = parsed_args.limit if compute_client.api_version < api_versions.APIVersion('2.59'):
if parsed_args.changes_since: msg = _(
search_opts['changes_since'] = parsed_args.changes_since '--os-compute-api-version 2.59 or greater is required to '
'support the --limit option'
)
raise exceptions.CommandError(msg)
search_opts['limit'] = parsed_args.limit
if parsed_args.changes_since:
if compute_client.api_version < api_versions.APIVersion('2.59'):
msg = _(
'--os-compute-api-version 2.59 or greater is required to '
'support the --changes-since option'
)
raise exceptions.CommandError(msg)
search_opts['changes_since'] = parsed_args.changes_since
if parsed_args.changes_before: if parsed_args.changes_before:
if compute_client.api_version < api_versions.APIVersion("2.66"): if compute_client.api_version < api_versions.APIVersion('2.66'):
msg = _("changes_before is not supported for " msg = _(
"--os-compute-api-version less than 2.66") '--os-compute-api-version 2.66 or greater is required to '
'support the --changes-before option'
)
raise exceptions.CommandError(msg) raise exceptions.CommandError(msg)
search_opts['changes_before'] = parsed_args.changes_before search_opts['changes_before'] = parsed_args.changes_before
if parsed_args.project_id or parsed_args.user_id: if parsed_args.project_id:
if compute_client.api_version < api_versions.APIVersion("2.80"): if compute_client.api_version < api_versions.APIVersion('2.80'):
msg = _("Project and/or user is not supported for " msg = _(
"--os-compute-api-version less than 2.80") '--os-compute-api-version 2.80 or greater is required to '
'support the --project option'
)
raise exceptions.CommandError(msg) raise exceptions.CommandError(msg)
if parsed_args.project_id: search_opts['project_id'] = parsed_args.project_id
search_opts['project_id'] = parsed_args.project_id
if parsed_args.user_id: if parsed_args.user_id:
search_opts['user_id'] = parsed_args.user_id if compute_client.api_version < api_versions.APIVersion('2.80'):
msg = _(
'--os-compute-api-version 2.80 or greater is required to '
'support the --user option'
)
raise exceptions.CommandError(msg)
search_opts['user_id'] = parsed_args.user_id
migrations = compute_client.migrations.list(**search_opts) migrations = compute_client.migrations.list(**search_opts)

View File

@@ -47,10 +47,14 @@ class TestServer(compute_fakes.TestComputev2):
self.app.client_manager.compute.server_migrations self.app.client_manager.compute.server_migrations
self.server_migrations_mock.reset_mock() self.server_migrations_mock.reset_mock()
# Get a shortcut to the compute client volumeManager Mock # Get a shortcut to the compute client VolumeManager mock
self.servers_volumes_mock = self.app.client_manager.compute.volumes self.servers_volumes_mock = self.app.client_manager.compute.volumes
self.servers_volumes_mock.reset_mock() self.servers_volumes_mock.reset_mock()
# Get a shortcut to the compute client MigrationManager mock
self.migrations_mock = self.app.client_manager.compute.migrations
self.migrations_mock.reset_mock()
# Get a shortcut to the compute client FlavorManager Mock # Get a shortcut to the compute client FlavorManager Mock
self.flavors_mock = self.app.client_manager.compute.flavors self.flavors_mock = self.app.client_manager.compute.flavors
self.flavors_mock.reset_mock() self.flavors_mock.reset_mock()
@@ -3728,34 +3732,7 @@ class TestServerMigrate(TestServer):
self.assertNotCalled(self.servers_mock.live_migrate) self.assertNotCalled(self.servers_mock.live_migrate)
class TestServerMigration(TestServer): class TestListMigration(TestServer):
def setUp(self):
super(TestServerMigration, self).setUp()
# Get a shortcut to the compute client ServerManager Mock
self.servers_mock = self.app.client_manager.compute.servers
self.servers_mock.reset_mock()
self.migrations_mock = (
self.app.client_manager.compute.migrations)
self.migrations_mock.reset_mock()
self.server = self.setup_servers_mock(1)[0]
def setup_servers_mock(self, count):
servers = compute_fakes.FakeServer.create_servers(count=count)
# This is the return value for utils.find_resource()
self.servers_mock.get = compute_fakes.FakeServer.get_servers(servers)
return servers
def setup_server_migrations_mock(self, count):
return compute_fakes.FakeServerMigration.create_server_migrations(
count=count)
class TestListMigration(TestServerMigration):
"""Test fetch all migrations.""" """Test fetch all migrations."""
MIGRATION_COLUMNS = [ MIGRATION_COLUMNS = [
@@ -3767,24 +3744,48 @@ class TestListMigration(TestServerMigration):
def setUp(self): def setUp(self):
super(TestListMigration, self).setUp() super(TestListMigration, self).setUp()
self.cmd = server.ListMigration(self.app, None) self.server = compute_fakes.FakeServer.create_one_server()
self.migrations = self.setup_server_migrations_mock(3) self.servers_mock.get.return_value = self.server
self.migrations = compute_fakes.FakeServerMigration\
.create_server_migrations(count=3)
self.migrations_mock.list.return_value = self.migrations self.migrations_mock.list.return_value = self.migrations
self.setup_server_migrations_data(self.migrations)
self.app.client_manager.compute.api_version = api_versions.APIVersion(
'2.20')
def setup_server_migrations_data(self, migrations):
self.data = (common_utils.get_item_properties( self.data = (common_utils.get_item_properties(
s, self.MIGRATION_COLUMNS) for s in migrations) s, self.MIGRATION_COLUMNS) for s in self.migrations)
def test_server_migraton_list(self): # Get the command object to test
self.cmd = server.ListMigration(self.app, None)
def test_server_migration_list_no_options(self):
arglist = []
verifylist = []
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args)
# Set expected values
kwargs = {
'status': None,
'host': None,
'server': None,
}
self.migrations_mock.list.assert_called_with(**kwargs)
self.assertEqual(self.MIGRATION_COLUMNS, columns)
self.assertEqual(tuple(self.data), tuple(data))
def test_server_migration_list(self):
arglist = [ arglist = [
'--status', 'migrating' '--server', 'server1',
'--host', 'host1',
'--status', 'migrating',
] ]
verifylist = [ verifylist = [
('status', 'migrating') ('server', 'server1'),
('host', 'host1'),
('status', 'migrating'),
] ]
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args) columns, data = self.cmd.take_action(parsed_args)
@@ -3792,8 +3793,8 @@ class TestListMigration(TestServerMigration):
# Set expected values # Set expected values
kwargs = { kwargs = {
'status': 'migrating', 'status': 'migrating',
'host': None, 'host': 'host1',
'server': None, 'server': 'server1',
} }
self.migrations_mock.list.assert_called_with(**kwargs) self.migrations_mock.list.assert_called_with(**kwargs)
@@ -3813,15 +3814,11 @@ class TestListMigrationV223(TestListMigration):
def setUp(self): def setUp(self):
super(TestListMigrationV223, self).setUp() super(TestListMigrationV223, self).setUp()
self.cmd = server.ListMigration(self.app, None)
self.migrations = self.setup_server_migrations_mock(3)
self.migrations_mock.list.return_value = self.migrations
self.setup_server_migrations_data(self.migrations)
self.app.client_manager.compute.api_version = api_versions.APIVersion( self.app.client_manager.compute.api_version = api_versions.APIVersion(
'2.23') '2.23')
def test_server_migraton_list(self): def test_server_migration_list(self):
arglist = [ arglist = [
'--status', 'migrating' '--status', 'migrating'
] ]
@@ -3858,15 +3855,11 @@ class TestListMigrationV259(TestListMigration):
def setUp(self): def setUp(self):
super(TestListMigrationV259, self).setUp() super(TestListMigrationV259, self).setUp()
self.cmd = server.ListMigration(self.app, None)
self.migrations = self.setup_server_migrations_mock(3)
self.migrations_mock.list.return_value = self.migrations
self.setup_server_migrations_data(self.migrations)
self.app.client_manager.compute.api_version = api_versions.APIVersion( self.app.client_manager.compute.api_version = api_versions.APIVersion(
'2.59') '2.59')
def test_server_migraton_list(self): def test_server_migration_list(self):
arglist = [ arglist = [
'--status', 'migrating', '--status', 'migrating',
'--limit', '1', '--limit', '1',
@@ -3897,7 +3890,7 @@ class TestListMigrationV259(TestListMigration):
self.assertEqual(self.MIGRATION_COLUMNS, columns) self.assertEqual(self.MIGRATION_COLUMNS, columns)
self.assertEqual(tuple(self.data), tuple(data)) self.assertEqual(tuple(self.data), tuple(data))
def test_server_migraton_list_with_limit_pre_v259(self): def test_server_migration_list_with_limit_pre_v259(self):
self.app.client_manager.compute.api_version = api_versions.APIVersion( self.app.client_manager.compute.api_version = api_versions.APIVersion(
'2.58') '2.58')
arglist = [ arglist = [
@@ -3909,10 +3902,15 @@ class TestListMigrationV259(TestListMigration):
('limit', 1) ('limit', 1)
] ]
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
self.assertRaises(exceptions.CommandError, self.cmd.take_action, ex = self.assertRaises(
parsed_args) exceptions.CommandError,
self.cmd.take_action,
parsed_args)
self.assertIn(
'--os-compute-api-version 2.59 or greater is required',
str(ex))
def test_server_migraton_list_with_marker_pre_v259(self): def test_server_migration_list_with_marker_pre_v259(self):
self.app.client_manager.compute.api_version = api_versions.APIVersion( self.app.client_manager.compute.api_version = api_versions.APIVersion(
'2.58') '2.58')
arglist = [ arglist = [
@@ -3924,10 +3922,15 @@ class TestListMigrationV259(TestListMigration):
('marker', 'test_kp') ('marker', 'test_kp')
] ]
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
self.assertRaises(exceptions.CommandError, self.cmd.take_action, ex = self.assertRaises(
parsed_args) exceptions.CommandError,
self.cmd.take_action,
parsed_args)
self.assertIn(
'--os-compute-api-version 2.59 or greater is required',
str(ex))
def test_server_migraton_list_with_changes_since_pre_v259(self): def test_server_migration_list_with_changes_since_pre_v259(self):
self.app.client_manager.compute.api_version = api_versions.APIVersion( self.app.client_manager.compute.api_version = api_versions.APIVersion(
'2.58') '2.58')
arglist = [ arglist = [
@@ -3939,8 +3942,13 @@ class TestListMigrationV259(TestListMigration):
('changes_since', '2019-08-09T08:03:25Z') ('changes_since', '2019-08-09T08:03:25Z')
] ]
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
self.assertRaises(exceptions.CommandError, self.cmd.take_action, ex = self.assertRaises(
parsed_args) exceptions.CommandError,
self.cmd.take_action,
parsed_args)
self.assertIn(
'--os-compute-api-version 2.59 or greater is required',
str(ex))
class TestListMigrationV266(TestListMigration): class TestListMigrationV266(TestListMigration):
@@ -3954,15 +3962,11 @@ class TestListMigrationV266(TestListMigration):
def setUp(self): def setUp(self):
super(TestListMigrationV266, self).setUp() super(TestListMigrationV266, self).setUp()
self.cmd = server.ListMigration(self.app, None)
self.migrations = self.setup_server_migrations_mock(3)
self.migrations_mock.list.return_value = self.migrations
self.setup_server_migrations_data(self.migrations)
self.app.client_manager.compute.api_version = api_versions.APIVersion( self.app.client_manager.compute.api_version = api_versions.APIVersion(
'2.66') '2.66')
def test_server_migraton_list_with_changes_before(self): def test_server_migration_list_with_changes_before(self):
arglist = [ arglist = [
'--status', 'migrating', '--status', 'migrating',
'--limit', '1', '--limit', '1',
@@ -3996,7 +4000,7 @@ class TestListMigrationV266(TestListMigration):
self.assertEqual(self.MIGRATION_COLUMNS, columns) self.assertEqual(self.MIGRATION_COLUMNS, columns)
self.assertEqual(tuple(self.data), tuple(data)) self.assertEqual(tuple(self.data), tuple(data))
def test_server_migraton_list_with_changes_before_pre_v266(self): def test_server_migration_list_with_changes_before_pre_v266(self):
self.app.client_manager.compute.api_version = api_versions.APIVersion( self.app.client_manager.compute.api_version = api_versions.APIVersion(
'2.65') '2.65')
arglist = [ arglist = [
@@ -4008,8 +4012,13 @@ class TestListMigrationV266(TestListMigration):
('changes_before', '2019-08-09T08:03:25Z') ('changes_before', '2019-08-09T08:03:25Z')
] ]
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
self.assertRaises(exceptions.CommandError, self.cmd.take_action, ex = self.assertRaises(
parsed_args) exceptions.CommandError,
self.cmd.take_action,
parsed_args)
self.assertIn(
'--os-compute-api-version 2.66 or greater is required',
str(ex))
class TestListMigrationV280(TestListMigration): class TestListMigrationV280(TestListMigration):
@@ -4023,15 +4032,11 @@ class TestListMigrationV280(TestListMigration):
def setUp(self): def setUp(self):
super(TestListMigrationV280, self).setUp() super(TestListMigrationV280, self).setUp()
self.cmd = server.ListMigration(self.app, None)
self.migrations = self.setup_server_migrations_mock(3)
self.migrations_mock.list.return_value = self.migrations
self.setup_server_migrations_data(self.migrations)
self.app.client_manager.compute.api_version = api_versions.APIVersion( self.app.client_manager.compute.api_version = api_versions.APIVersion(
'2.80') '2.80')
def test_server_migraton_list_with_project(self): def test_server_migration_list_with_project(self):
arglist = [ arglist = [
'--status', 'migrating', '--status', 'migrating',
'--limit', '1', '--limit', '1',
@@ -4086,10 +4091,15 @@ class TestListMigrationV280(TestListMigration):
('project_id', '0c2accde-644a-45fa-8c10-e76debc7fbc3') ('project_id', '0c2accde-644a-45fa-8c10-e76debc7fbc3')
] ]
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
self.assertRaises(exceptions.CommandError, self.cmd.take_action, ex = self.assertRaises(
parsed_args) exceptions.CommandError,
self.cmd.take_action,
parsed_args)
self.assertIn(
'--os-compute-api-version 2.80 or greater is required',
str(ex))
def test_server_migraton_list_with_user(self): def test_server_migration_list_with_user(self):
arglist = [ arglist = [
'--status', 'migrating', '--status', 'migrating',
'--limit', '1', '--limit', '1',
@@ -4144,11 +4154,15 @@ class TestListMigrationV280(TestListMigration):
('user_id', 'dd214878-ca12-40fb-b035-fa7d2c1e86d6') ('user_id', 'dd214878-ca12-40fb-b035-fa7d2c1e86d6')
] ]
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
ex = self.assertRaises(
exceptions.CommandError,
self.cmd.take_action,
parsed_args)
self.assertIn(
'--os-compute-api-version 2.80 or greater is required',
str(ex))
self.assertRaises(exceptions.CommandError, self.cmd.take_action, def test_server_migration_list_with_project_and_user(self):
parsed_args)
def test_server_migraton_list_with_project_and_user(self):
arglist = [ arglist = [
'--status', 'migrating', '--status', 'migrating',
'--limit', '1', '--limit', '1',
@@ -4208,8 +4222,13 @@ class TestListMigrationV280(TestListMigration):
('user_id', 'dd214878-ca12-40fb-b035-fa7d2c1e86d6') ('user_id', 'dd214878-ca12-40fb-b035-fa7d2c1e86d6')
] ]
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
self.assertRaises(exceptions.CommandError, self.cmd.take_action, ex = self.assertRaises(
parsed_args) exceptions.CommandError,
self.cmd.take_action,
parsed_args)
self.assertIn(
'--os-compute-api-version 2.80 or greater is required',
str(ex))
class TestServerMigrationAbort(TestServer): class TestServerMigrationAbort(TestServer):