diff --git a/openstackclient/compute/v2/server.py b/openstackclient/compute/v2/server.py index c3aec0ed70..2fa0c52403 100644 --- a/openstackclient/compute/v2/server.py +++ b/openstackclient/compute/v2/server.py @@ -1866,99 +1866,99 @@ revert to release the new server and restart the old one.""") class ListMigration(command.Command): - _description = _("""List server migrations.""") + _description = _("""List server migrations""") def get_parser(self, prog_name): parser = super(ListMigration, self).get_parser(prog_name) parser.add_argument( - "--server", - metavar="<server>", - dest='server', - default=None, - help=_('Server to show migration details (name or ID).') + '--server', + metavar='<server>', + help=_( + 'Filter migrations by server (name or ID)' + ) ) parser.add_argument( - "--host", - metavar="<host>", - default=None, - help=_('Fetch migrations for the given host.') + '--host', + metavar='<host>', + help=_( + 'Filter migrations by source or destination host' + ), ) parser.add_argument( - "--status", - metavar="<status>", - default=None, - help=_('Fetch migrations for the given status.') + '--status', + metavar='<status>', + help=_('Filter migrations by status') ) parser.add_argument( - "--marker", - metavar="<marker>", - dest='marker', - default=None, - help=_("The last migration of the previous page; displays list " - "of migrations after 'marker'. Note that the marker is " - "the migration UUID. (Supported with " - "``--os-compute-api-version`` 2.59 or greater.)") + '--marker', + metavar='<marker>', + help=_( + "The last migration of the previous page; displays list " + "of migrations after 'marker'. Note that the marker is " + "the migration UUID. " + "(supported with --os-compute-api-version 2.59 or above)" + ), ) parser.add_argument( - "--limit", - metavar="<limit>", - dest='limit', + '--limit', + metavar='<limit>', type=int, - default=None, - help=_("Maximum number of migrations to display. Note that there " - "is a configurable max limit on the server, and the limit " - "that is used will be the minimum of what is requested " - "here and what is configured in the server. " - "(Supported with ``--os-compute-api-version`` 2.59 " - "or greater.)") + help=_( + "Maximum number of migrations to display. Note that there " + "is a configurable max limit on the server, and the limit " + "that is used will be the minimum of what is requested " + "here and what is configured in the server. " + "(supported with --os-compute-api-version 2.59 or above)" + ), ) parser.add_argument( '--changes-since', dest='changes_since', metavar='<changes-since>', - default=None, - help=_("List only migrations changed later or equal to a certain " - "point of time. The provided time should be an ISO 8061 " - "formatted time, e.g. ``2016-03-04T06:27:59Z``. " - "(Supported with ``--os-compute-api-version`` 2.59 " - "or greater.)") + help=_( + "List only migrations changed later or equal to a certain " + "point of time. The provided time should be an ISO 8061 " + "formatted time, e.g. ``2016-03-04T06:27:59Z``. " + "(supported with --os-compute-api-version 2.59 or above)" + ), ) parser.add_argument( '--changes-before', dest='changes_before', metavar='<changes-before>', - default=None, - help=_("List only migrations changed earlier or equal to a " - "certain point of time. The provided time should be an ISO " - "8061 formatted time, e.g. ``2016-03-04T06:27:59Z``. " - "(Supported with ``--os-compute-api-version`` 2.66 or " - "greater.)") + help=_( + "List only migrations changed earlier or equal to a " + "certain point of time. The provided time should be an ISO " + "8061 formatted time, e.g. ``2016-03-04T06:27:59Z``. " + "(supported with --os-compute-api-version 2.66 or above)" + ), ) parser.add_argument( '--project', metavar='<project>', dest='project_id', - default=None, - help=_("Filter the migrations by the given project ID. " - "(Supported with ``--os-compute-api-version`` 2.80 " - "or greater.)"), + help=_( + "Filter migrations by project (ID) " + "(supported with --os-compute-api-version 2.80 or above)" + ), ) parser.add_argument( '--user', metavar='<user>', dest='user_id', - default=None, - help=_("Filter the migrations by the given user ID. " - "(Supported with ``--os-compute-api-version`` 2.80 " - "or greater.)"), + help=_( + "Filter migrations by user (ID) " + "(supported with --os-compute-api-version 2.80 or above)" + ), ) return parser def print_migrations(self, parsed_args, compute_client, migrations): - columns = ['Source Node', 'Dest Node', 'Source Compute', - 'Dest Compute', 'Dest Host', 'Status', - 'Server UUID', 'Old Flavor', 'New Flavor', - 'Created At', 'Updated At'] + columns = [ + 'Source Node', 'Dest Node', 'Source Compute', 'Dest Compute', + 'Dest Host', 'Status', 'Server UUID', 'Old Flavor', 'New Flavor', + 'Created At', 'Updated At', + ] # Insert migrations UUID after ID if compute_client.api_version >= api_versions.APIVersion("2.59"): @@ -1978,48 +1978,73 @@ class ListMigration(command.Command): if parsed_args.user_id: columns.insert(len(columns) - 2, "User") - columns_header = columns - return (columns_header, (utils.get_item_properties( - mig, columns) for mig in migrations)) + return ( + columns, + (utils.get_item_properties(mig, columns) for mig in migrations), + ) def take_action(self, parsed_args): compute_client = self.app.client_manager.compute search_opts = { - "host": parsed_args.host, - "server": parsed_args.server, - "status": parsed_args.status, + 'host': parsed_args.host, + 'server': parsed_args.server, + 'status': parsed_args.status, } - if (parsed_args.marker or parsed_args.limit or - parsed_args.changes_since): - if compute_client.api_version < api_versions.APIVersion("2.59"): - msg = _("marker, limit and/or changes_since is not supported " - "for --os-compute-api-version less than 2.59") + if parsed_args.marker: + if compute_client.api_version < api_versions.APIVersion('2.59'): + msg = _( + '--os-compute-api-version 2.59 or greater is required to ' + 'support the --marker option' + ) raise exceptions.CommandError(msg) - if parsed_args.marker: - search_opts['marker'] = parsed_args.marker - if parsed_args.limit: - search_opts['limit'] = parsed_args.limit - if parsed_args.changes_since: - search_opts['changes_since'] = parsed_args.changes_since + search_opts['marker'] = parsed_args.marker + + if parsed_args.limit: + if compute_client.api_version < api_versions.APIVersion('2.59'): + msg = _( + '--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 compute_client.api_version < api_versions.APIVersion("2.66"): - msg = _("changes_before is not supported for " - "--os-compute-api-version less than 2.66") + if compute_client.api_version < api_versions.APIVersion('2.66'): + msg = _( + '--os-compute-api-version 2.66 or greater is required to ' + 'support the --changes-before option' + ) raise exceptions.CommandError(msg) search_opts['changes_before'] = parsed_args.changes_before - if parsed_args.project_id or parsed_args.user_id: - if compute_client.api_version < api_versions.APIVersion("2.80"): - msg = _("Project and/or user is not supported for " - "--os-compute-api-version less than 2.80") + if parsed_args.project_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 --project option' + ) raise exceptions.CommandError(msg) - if parsed_args.project_id: - search_opts['project_id'] = parsed_args.project_id - if parsed_args.user_id: - search_opts['user_id'] = parsed_args.user_id + search_opts['project_id'] = parsed_args.project_id + + if 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) diff --git a/openstackclient/tests/unit/compute/v2/test_server.py b/openstackclient/tests/unit/compute/v2/test_server.py index 3b98c873ec..4b000180ae 100644 --- a/openstackclient/tests/unit/compute/v2/test_server.py +++ b/openstackclient/tests/unit/compute/v2/test_server.py @@ -47,10 +47,14 @@ class TestServer(compute_fakes.TestComputev2): self.app.client_manager.compute.server_migrations 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.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 self.flavors_mock = self.app.client_manager.compute.flavors self.flavors_mock.reset_mock() @@ -3728,34 +3732,7 @@ class TestServerMigrate(TestServer): self.assertNotCalled(self.servers_mock.live_migrate) -class TestServerMigration(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): +class TestListMigration(TestServer): """Test fetch all migrations.""" MIGRATION_COLUMNS = [ @@ -3767,24 +3744,48 @@ class TestListMigration(TestServerMigration): def setUp(self): super(TestListMigration, self).setUp() - self.cmd = server.ListMigration(self.app, None) - self.migrations = self.setup_server_migrations_mock(3) + self.server = compute_fakes.FakeServer.create_one_server() + 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.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( - 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 = [ - '--status', 'migrating' + '--server', 'server1', + '--host', 'host1', + '--status', 'migrating', ] verifylist = [ - ('status', 'migrating') + ('server', 'server1'), + ('host', 'host1'), + ('status', 'migrating'), ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) columns, data = self.cmd.take_action(parsed_args) @@ -3792,8 +3793,8 @@ class TestListMigration(TestServerMigration): # Set expected values kwargs = { 'status': 'migrating', - 'host': None, - 'server': None, + 'host': 'host1', + 'server': 'server1', } self.migrations_mock.list.assert_called_with(**kwargs) @@ -3813,15 +3814,11 @@ class TestListMigrationV223(TestListMigration): def setUp(self): 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( '2.23') - def test_server_migraton_list(self): + def test_server_migration_list(self): arglist = [ '--status', 'migrating' ] @@ -3858,15 +3855,11 @@ class TestListMigrationV259(TestListMigration): def setUp(self): 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( '2.59') - def test_server_migraton_list(self): + def test_server_migration_list(self): arglist = [ '--status', 'migrating', '--limit', '1', @@ -3897,7 +3890,7 @@ class TestListMigrationV259(TestListMigration): self.assertEqual(self.MIGRATION_COLUMNS, columns) 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( '2.58') arglist = [ @@ -3909,10 +3902,15 @@ class TestListMigrationV259(TestListMigration): ('limit', 1) ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - self.assertRaises(exceptions.CommandError, self.cmd.take_action, - parsed_args) + ex = self.assertRaises( + 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( '2.58') arglist = [ @@ -3924,10 +3922,15 @@ class TestListMigrationV259(TestListMigration): ('marker', 'test_kp') ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - self.assertRaises(exceptions.CommandError, self.cmd.take_action, - parsed_args) + ex = self.assertRaises( + 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( '2.58') arglist = [ @@ -3939,8 +3942,13 @@ class TestListMigrationV259(TestListMigration): ('changes_since', '2019-08-09T08:03:25Z') ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - self.assertRaises(exceptions.CommandError, self.cmd.take_action, - parsed_args) + ex = self.assertRaises( + 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): @@ -3954,15 +3962,11 @@ class TestListMigrationV266(TestListMigration): def setUp(self): 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( '2.66') - def test_server_migraton_list_with_changes_before(self): + def test_server_migration_list_with_changes_before(self): arglist = [ '--status', 'migrating', '--limit', '1', @@ -3996,7 +4000,7 @@ class TestListMigrationV266(TestListMigration): self.assertEqual(self.MIGRATION_COLUMNS, columns) 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( '2.65') arglist = [ @@ -4008,8 +4012,13 @@ class TestListMigrationV266(TestListMigration): ('changes_before', '2019-08-09T08:03:25Z') ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - self.assertRaises(exceptions.CommandError, self.cmd.take_action, - parsed_args) + ex = self.assertRaises( + 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): @@ -4023,15 +4032,11 @@ class TestListMigrationV280(TestListMigration): def setUp(self): 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( '2.80') - def test_server_migraton_list_with_project(self): + def test_server_migration_list_with_project(self): arglist = [ '--status', 'migrating', '--limit', '1', @@ -4086,10 +4091,15 @@ class TestListMigrationV280(TestListMigration): ('project_id', '0c2accde-644a-45fa-8c10-e76debc7fbc3') ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - self.assertRaises(exceptions.CommandError, self.cmd.take_action, - parsed_args) + 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)) - def test_server_migraton_list_with_user(self): + def test_server_migration_list_with_user(self): arglist = [ '--status', 'migrating', '--limit', '1', @@ -4144,11 +4154,15 @@ class TestListMigrationV280(TestListMigration): ('user_id', 'dd214878-ca12-40fb-b035-fa7d2c1e86d6') ] 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, - parsed_args) - - def test_server_migraton_list_with_project_and_user(self): + def test_server_migration_list_with_project_and_user(self): arglist = [ '--status', 'migrating', '--limit', '1', @@ -4208,8 +4222,13 @@ class TestListMigrationV280(TestListMigration): ('user_id', 'dd214878-ca12-40fb-b035-fa7d2c1e86d6') ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - self.assertRaises(exceptions.CommandError, self.cmd.take_action, - parsed_args) + 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)) class TestServerMigrationAbort(TestServer):