diff options
Diffstat (limited to 'openstackclient/tests/unit')
30 files changed, 2881 insertions, 1930 deletions
diff --git a/openstackclient/tests/unit/common/test_availability_zone.py b/openstackclient/tests/unit/common/test_availability_zone.py index 8733b510..e5348ec3 100644 --- a/openstackclient/tests/unit/common/test_availability_zone.py +++ b/openstackclient/tests/unit/common/test_availability_zone.py @@ -115,8 +115,7 @@ class TestAvailabilityZoneList(TestAvailabilityZone): compute_fakes.FakeAvailabilityZone.create_availability_zones() volume_azs = \ volume_fakes.FakeAvailabilityZone.create_availability_zones(count=1) - network_azs = \ - network_fakes.FakeAvailabilityZone.create_availability_zones() + network_azs = network_fakes.create_availability_zones() short_columnslist = ('Zone Name', 'Zone Status') long_columnslist = ( diff --git a/openstackclient/tests/unit/common/test_quota.py b/openstackclient/tests/unit/common/test_quota.py index 896a63a7..70fd1436 100644 --- a/openstackclient/tests/unit/common/test_quota.py +++ b/openstackclient/tests/unit/common/test_quota.py @@ -935,6 +935,7 @@ class TestQuotaSet(TestQuota): } kwargs_network = { 'subnet': network_fakes.QUOTA['subnet'], + 'force': True, } self.compute_quotas_mock.update.assert_called_once_with( self.projects[0].id, diff --git a/openstackclient/tests/unit/compute/v2/fakes.py b/openstackclient/tests/unit/compute/v2/fakes.py index 55572cd8..a1e7754a 100644 --- a/openstackclient/tests/unit/compute/v2/fakes.py +++ b/openstackclient/tests/unit/compute/v2/fakes.py @@ -1339,7 +1339,7 @@ class FakeServerGroup(object): class FakeServerGroupV264(object): - """Fake one server group fo API >= 2.64""" + """Fake one server group for API >= 2.64""" @staticmethod def create_one_server_group(attrs=None): @@ -1454,7 +1454,7 @@ class FakeQuota(object): @staticmethod def create_one_default_comp_quota(attrs=None): - """Crate one quota""" + """Create one quota""" attrs = attrs or {} diff --git a/openstackclient/tests/unit/compute/v2/test_server.py b/openstackclient/tests/unit/compute/v2/test_server.py index 480dcfe1..004f3a05 100644 --- a/openstackclient/tests/unit/compute/v2/test_server.py +++ b/openstackclient/tests/unit/compute/v2/test_server.py @@ -31,7 +31,6 @@ from osc_lib import utils as common_utils from openstackclient.compute.v2 import server from openstackclient.tests.unit.compute.v2 import fakes as compute_fakes -from openstackclient.tests.unit.identity.v3 import fakes as identity_fakes from openstackclient.tests.unit.image.v2 import fakes as image_fakes from openstackclient.tests.unit.network.v2 import fakes as network_fakes from openstackclient.tests.unit import utils @@ -593,7 +592,7 @@ class TestServerAddFloatingIPNetwork( def test_server_add_floating_ip(self): _server = compute_fakes.FakeServer.create_one_server() self.servers_mock.get.return_value = _server - _port = network_fakes.FakePort.create_one_port() + _port = network_fakes.create_one_port() _floating_ip = network_fakes.FakeFloatingIP.create_one_floating_ip() self.network.find_ip = mock.Mock(return_value=_floating_ip) self.network.ports = mock.Mock(return_value=[_port]) @@ -662,7 +661,7 @@ class TestServerAddFloatingIPNetwork( def test_server_add_floating_ip_no_external_gateway(self, success=False): _server = compute_fakes.FakeServer.create_one_server() self.servers_mock.get.return_value = _server - _port = network_fakes.FakePort.create_one_port() + _port = network_fakes.create_one_port() _floating_ip = network_fakes.FakeFloatingIP.create_one_floating_ip() self.network.find_ip = mock.Mock(return_value=_floating_ip) return_value = [_port] @@ -718,7 +717,7 @@ class TestServerAddFloatingIPNetwork( def test_server_add_floating_ip_with_fixed_ip(self): _server = compute_fakes.FakeServer.create_one_server() self.servers_mock.get.return_value = _server - _port = network_fakes.FakePort.create_one_port() + _port = network_fakes.create_one_port() _floating_ip = network_fakes.FakeFloatingIP.create_one_floating_ip() self.network.find_ip = mock.Mock(return_value=_floating_ip) self.network.ports = mock.Mock(return_value=[_port]) @@ -760,7 +759,7 @@ class TestServerAddFloatingIPNetwork( def test_server_add_floating_ip_with_fixed_ip_no_port_found(self): _server = compute_fakes.FakeServer.create_one_server() self.servers_mock.get.return_value = _server - _port = network_fakes.FakePort.create_one_port() + _port = network_fakes.create_one_port() _floating_ip = network_fakes.FakeFloatingIP.create_one_floating_ip() self.network.find_ip = mock.Mock(return_value=_floating_ip) self.network.ports = mock.Mock(return_value=[_port]) @@ -4486,6 +4485,14 @@ class TestServerList(_TestServerList): '-c', 'Project ID', '-c', 'User ID', '-c', 'Created At', + '-c', 'Security Groups', + '-c', 'Task State', + '-c', 'Power State', + '-c', 'Image ID', + '-c', 'Flavor ID', + '-c', 'Availability Zone', + '-c', 'Host', + '-c', 'Properties', '--long' ] verifylist = [ @@ -4499,6 +4506,14 @@ class TestServerList(_TestServerList): self.assertIn('Project ID', columns) self.assertIn('User ID', columns) self.assertIn('Created At', columns) + self.assertIn('Security Groups', columns) + self.assertIn('Task State', columns) + self.assertIn('Power State', columns) + self.assertIn('Image ID', columns) + self.assertIn('Flavor ID', columns) + self.assertIn('Availability Zone', columns) + self.assertIn('Host', columns) + self.assertIn('Properties', columns) def test_server_list_no_name_lookup_option(self): self.data = tuple( @@ -4884,6 +4899,99 @@ class TestServerList(_TestServerList): self.assertEqual(self.columns, columns) self.assertEqual(tuple(self.data), tuple(data)) + def test_server_list_long_with_host_status_v216(self): + self.app.client_manager.compute.api_version = \ + api_versions.APIVersion('2.16') + + self.data1 = tuple( + ( + s.id, + s.name, + s.status, + getattr(s, 'OS-EXT-STS:task_state'), + server.PowerStateColumn( + getattr(s, 'OS-EXT-STS:power_state') + ), + format_columns.DictListColumn(s.networks), + # Image will be an empty string if boot-from-volume + self.image.name if s.image else server.IMAGE_STRING_FOR_BFV, + s.image['id'] if s.image else server.IMAGE_STRING_FOR_BFV, + self.flavor.name, + s.flavor['id'], + getattr(s, 'OS-EXT-AZ:availability_zone'), + getattr(s, 'OS-EXT-SRV-ATTR:host'), + s.Metadata, + ) for s in self.servers) + + arglist = [ + '--long' + ] + verifylist = [ + ('long', True), + ] + + # First test without host_status in the data -- the column should not + # be present in this case. + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + columns, data = self.cmd.take_action(parsed_args) + + self.servers_mock.list.assert_called_with(**self.kwargs) + + self.assertEqual(self.columns_long, columns) + self.assertEqual(tuple(self.data1), tuple(data)) + + # Next test with host_status in the data -- the column should be + # present in this case. + self.servers_mock.reset_mock() + + self.attrs['host_status'] = 'UP' + servers = self.setup_servers_mock(3) + self.servers_mock.list.return_value = servers + + # Make sure the returned image and flavor IDs match the servers. + Image = collections.namedtuple('Image', 'id name') + self.images_mock.return_value = [ + Image(id=s.image['id'], name=self.image.name) + # Image will be an empty string if boot-from-volume + for s in servers if s.image + ] + + Flavor = collections.namedtuple('Flavor', 'id name') + self.flavors_mock.list.return_value = [ + Flavor(id=s.flavor['id'], name=self.flavor.name) + for s in servers + ] + + # Add the expected host_status column and data. + columns_long = self.columns_long + ('Host Status',) + self.data2 = tuple( + ( + s.id, + s.name, + s.status, + getattr(s, 'OS-EXT-STS:task_state'), + server.PowerStateColumn( + getattr(s, 'OS-EXT-STS:power_state') + ), + format_columns.DictListColumn(s.networks), + # Image will be an empty string if boot-from-volume + self.image.name if s.image else server.IMAGE_STRING_FOR_BFV, + s.image['id'] if s.image else server.IMAGE_STRING_FOR_BFV, + self.flavor.name, + s.flavor['id'], + getattr(s, 'OS-EXT-AZ:availability_zone'), + getattr(s, 'OS-EXT-SRV-ATTR:host'), + s.Metadata, + s.host_status, + ) for s in servers) + + columns, data = self.cmd.take_action(parsed_args) + + self.servers_mock.list.assert_called_with(**self.kwargs) + + self.assertEqual(columns_long, columns) + self.assertEqual(tuple(self.data2), tuple(data)) + class TestServerListV273(_TestServerList): @@ -5559,782 +5667,6 @@ class TestServerMigrate(TestServer): self.assertNotCalled(self.servers_mock.live_migrate) -class TestListMigration(TestServer): - """Test fetch all migrations.""" - - MIGRATION_COLUMNS = [ - 'Source Node', 'Dest Node', 'Source Compute', - 'Dest Compute', 'Dest Host', 'Status', 'Server UUID', - 'Old Flavor', 'New Flavor', 'Created At', 'Updated At' - ] - - # These are the fields that come back in the response from the REST API. - MIGRATION_FIELDS = [ - 'source_node', 'dest_node', 'source_compute', 'dest_compute', - 'dest_host', 'status', 'instance_uuid', 'old_instance_type_id', - 'new_instance_type_id', 'created_at', 'updated_at' - ] - - def setUp(self): - super(TestListMigration, self).setUp() - - self.server = compute_fakes.FakeServer.create_one_server() - self.servers_mock.get.return_value = self.server - - self.migrations = compute_fakes.FakeMigration.create_migrations( - count=3) - self.migrations_mock.list.return_value = self.migrations - - self.data = (common_utils.get_item_properties( - s, self.MIGRATION_FIELDS) for s in self.migrations) - - # 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, - } - - 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 = [ - '--server', 'server1', - '--host', 'host1', - '--status', 'migrating', - '--type', 'cold-migration', - ] - verifylist = [ - ('server', 'server1'), - ('host', 'host1'), - ('status', 'migrating'), - ] - parsed_args = self.check_parser(self.cmd, arglist, verifylist) - columns, data = self.cmd.take_action(parsed_args) - - # Set expected values - kwargs = { - 'status': 'migrating', - 'host': 'host1', - 'instance_uuid': self.server.id, - 'migration_type': 'migration', - } - - self.servers_mock.get.assert_called_with('server1') - self.migrations_mock.list.assert_called_with(**kwargs) - - self.assertEqual(self.MIGRATION_COLUMNS, columns) - self.assertEqual(tuple(self.data), tuple(data)) - - -class TestListMigrationV223(TestListMigration): - """Test fetch all migrations. """ - - MIGRATION_COLUMNS = [ - 'Id', 'Source Node', 'Dest Node', 'Source Compute', 'Dest Compute', - 'Dest Host', 'Status', 'Server UUID', 'Old Flavor', 'New Flavor', - 'Type', 'Created At', 'Updated At' - ] - - # These are the fields that come back in the response from the REST API. - MIGRATION_FIELDS = [ - 'id', 'source_node', 'dest_node', 'source_compute', 'dest_compute', - 'dest_host', 'status', 'instance_uuid', 'old_instance_type_id', - 'new_instance_type_id', 'migration_type', 'created_at', 'updated_at' - ] - - def setUp(self): - super(TestListMigrationV223, self).setUp() - - self.app.client_manager.compute.api_version = api_versions.APIVersion( - '2.23') - - def test_server_migration_list(self): - arglist = [ - '--status', 'migrating' - ] - verifylist = [ - ('status', 'migrating') - ] - parsed_args = self.check_parser(self.cmd, arglist, verifylist) - columns, data = self.cmd.take_action(parsed_args) - - # Set expected values - kwargs = { - 'status': 'migrating', - 'host': None, - } - - self.migrations_mock.list.assert_called_with(**kwargs) - - self.assertEqual(self.MIGRATION_COLUMNS, columns) - self.assertEqual(tuple(self.data), tuple(data)) - - -class TestListMigrationV259(TestListMigration): - """Test fetch all migrations. """ - - MIGRATION_COLUMNS = [ - 'Id', 'UUID', 'Source Node', 'Dest Node', 'Source Compute', - 'Dest Compute', 'Dest Host', 'Status', 'Server UUID', - 'Old Flavor', 'New Flavor', 'Type', 'Created At', 'Updated At' - ] - - # These are the fields that come back in the response from the REST API. - MIGRATION_FIELDS = [ - 'id', 'uuid', 'source_node', 'dest_node', 'source_compute', - 'dest_compute', 'dest_host', 'status', 'instance_uuid', - 'old_instance_type_id', 'new_instance_type_id', 'migration_type', - 'created_at', 'updated_at' - ] - - def setUp(self): - super(TestListMigrationV259, self).setUp() - - self.app.client_manager.compute.api_version = api_versions.APIVersion( - '2.59') - - def test_server_migration_list(self): - arglist = [ - '--status', 'migrating', - '--limit', '1', - '--marker', 'test_kp', - '--changes-since', '2019-08-09T08:03:25Z' - ] - verifylist = [ - ('status', 'migrating'), - ('limit', 1), - ('marker', 'test_kp'), - ('changes_since', '2019-08-09T08:03:25Z') - ] - parsed_args = self.check_parser(self.cmd, arglist, verifylist) - columns, data = self.cmd.take_action(parsed_args) - - # Set expected values - kwargs = { - 'status': 'migrating', - 'limit': 1, - 'marker': 'test_kp', - 'host': None, - 'changes_since': '2019-08-09T08:03:25Z', - } - - 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_with_limit_pre_v259(self): - self.app.client_manager.compute.api_version = api_versions.APIVersion( - '2.58') - arglist = [ - '--status', 'migrating', - '--limit', '1' - ] - verifylist = [ - ('status', 'migrating'), - ('limit', 1) - ] - 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.59 or greater is required', - str(ex)) - - def test_server_migration_list_with_marker_pre_v259(self): - self.app.client_manager.compute.api_version = api_versions.APIVersion( - '2.58') - arglist = [ - '--status', 'migrating', - '--marker', 'test_kp' - ] - verifylist = [ - ('status', 'migrating'), - ('marker', 'test_kp') - ] - 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.59 or greater is required', - str(ex)) - - def test_server_migration_list_with_changes_since_pre_v259(self): - self.app.client_manager.compute.api_version = api_versions.APIVersion( - '2.58') - arglist = [ - '--status', 'migrating', - '--changes-since', '2019-08-09T08:03:25Z' - ] - verifylist = [ - ('status', 'migrating'), - ('changes_since', '2019-08-09T08:03:25Z') - ] - 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.59 or greater is required', - str(ex)) - - -class TestListMigrationV266(TestListMigration): - """Test fetch all migrations by changes-before. """ - - MIGRATION_COLUMNS = [ - 'Id', 'UUID', 'Source Node', 'Dest Node', 'Source Compute', - 'Dest Compute', 'Dest Host', 'Status', 'Server UUID', - 'Old Flavor', 'New Flavor', 'Type', 'Created At', 'Updated At' - ] - - # These are the fields that come back in the response from the REST API. - MIGRATION_FIELDS = [ - 'id', 'uuid', 'source_node', 'dest_node', 'source_compute', - 'dest_compute', 'dest_host', 'status', 'instance_uuid', - 'old_instance_type_id', 'new_instance_type_id', 'migration_type', - 'created_at', 'updated_at' - ] - - def setUp(self): - super(TestListMigrationV266, self).setUp() - - self.app.client_manager.compute.api_version = api_versions.APIVersion( - '2.66') - - def test_server_migration_list_with_changes_before(self): - arglist = [ - '--status', 'migrating', - '--limit', '1', - '--marker', 'test_kp', - '--changes-since', '2019-08-07T08:03:25Z', - '--changes-before', '2019-08-09T08:03:25Z' - ] - verifylist = [ - ('status', 'migrating'), - ('limit', 1), - ('marker', 'test_kp'), - ('changes_since', '2019-08-07T08:03:25Z'), - ('changes_before', '2019-08-09T08:03:25Z') - ] - parsed_args = self.check_parser(self.cmd, arglist, verifylist) - columns, data = self.cmd.take_action(parsed_args) - - # Set expected values - kwargs = { - 'status': 'migrating', - 'limit': 1, - 'marker': 'test_kp', - 'host': None, - 'changes_since': '2019-08-07T08:03:25Z', - 'changes_before': '2019-08-09T08:03:25Z', - } - - 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_with_changes_before_pre_v266(self): - self.app.client_manager.compute.api_version = api_versions.APIVersion( - '2.65') - arglist = [ - '--status', 'migrating', - '--changes-before', '2019-08-09T08:03:25Z' - ] - verifylist = [ - ('status', 'migrating'), - ('changes_before', '2019-08-09T08:03:25Z') - ] - 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.66 or greater is required', - str(ex)) - - -class TestListMigrationV280(TestListMigration): - """Test fetch all migrations by user-id and/or project-id. """ - - MIGRATION_COLUMNS = [ - 'Id', 'UUID', 'Source Node', 'Dest Node', 'Source Compute', - 'Dest Compute', 'Dest Host', 'Status', 'Server UUID', - 'Old Flavor', 'New Flavor', 'Type', 'Created At', 'Updated At' - ] - - # These are the fields that come back in the response from the REST API. - MIGRATION_FIELDS = [ - 'id', 'uuid', 'source_node', 'dest_node', 'source_compute', - 'dest_compute', 'dest_host', 'status', 'instance_uuid', - 'old_instance_type_id', 'new_instance_type_id', 'migration_type', - 'created_at', 'updated_at' - ] - - project = identity_fakes.FakeProject.create_one_project() - user = identity_fakes.FakeUser.create_one_user() - - def setUp(self): - super(TestListMigrationV280, self).setUp() - - self.projects_mock = self.app.client_manager.identity.projects - self.projects_mock.reset_mock() - - self.users_mock = self.app.client_manager.identity.users - self.users_mock.reset_mock() - - self.projects_mock.get.return_value = self.project - self.users_mock.get.return_value = self.user - - self.app.client_manager.compute.api_version = api_versions.APIVersion( - '2.80') - - def test_server_migration_list_with_project(self): - arglist = [ - '--status', 'migrating', - '--limit', '1', - '--marker', 'test_kp', - '--changes-since', '2019-08-07T08:03:25Z', - '--changes-before', '2019-08-09T08:03:25Z', - '--project', self.project.id - ] - verifylist = [ - ('status', 'migrating'), - ('limit', 1), - ('marker', 'test_kp'), - ('changes_since', '2019-08-07T08:03:25Z'), - ('changes_before', '2019-08-09T08:03:25Z'), - ('project', self.project.id) - ] - parsed_args = self.check_parser(self.cmd, arglist, verifylist) - columns, data = self.cmd.take_action(parsed_args) - - # Set expected values - kwargs = { - 'status': 'migrating', - 'limit': 1, - 'marker': 'test_kp', - 'host': None, - 'project_id': self.project.id, - 'changes_since': '2019-08-07T08:03:25Z', - 'changes_before': "2019-08-09T08:03:25Z", - } - - self.migrations_mock.list.assert_called_with(**kwargs) - - self.MIGRATION_COLUMNS.insert( - len(self.MIGRATION_COLUMNS) - 2, "Project") - self.MIGRATION_FIELDS.insert( - len(self.MIGRATION_FIELDS) - 2, "project_id") - self.assertEqual(self.MIGRATION_COLUMNS, columns) - self.assertEqual(tuple(self.data), tuple(data)) - # Clean up global variables MIGRATION_COLUMNS - self.MIGRATION_COLUMNS.remove('Project') - # Clean up global variables MIGRATION_FIELDS - self.MIGRATION_FIELDS.remove('project_id') - - def test_get_migrations_with_project_pre_v280(self): - self.app.client_manager.compute.api_version = api_versions.APIVersion( - '2.79') - arglist = [ - '--status', 'migrating', - '--changes-before', '2019-08-09T08:03:25Z', - '--project', '0c2accde-644a-45fa-8c10-e76debc7fbc3' - ] - verifylist = [ - ('status', 'migrating'), - ('changes_before', '2019-08-09T08:03:25Z'), - ('project', '0c2accde-644a-45fa-8c10-e76debc7fbc3') - ] - 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)) - - def test_server_migration_list_with_user(self): - arglist = [ - '--status', 'migrating', - '--limit', '1', - '--marker', 'test_kp', - '--changes-since', '2019-08-07T08:03:25Z', - '--changes-before', '2019-08-09T08:03:25Z', - '--user', self.user.id, - ] - verifylist = [ - ('status', 'migrating'), - ('limit', 1), - ('marker', 'test_kp'), - ('changes_since', '2019-08-07T08:03:25Z'), - ('changes_before', '2019-08-09T08:03:25Z'), - ('user', self.user.id), - ] - parsed_args = self.check_parser(self.cmd, arglist, verifylist) - columns, data = self.cmd.take_action(parsed_args) - - # Set expected values - kwargs = { - 'status': 'migrating', - 'limit': 1, - 'marker': 'test_kp', - 'host': None, - 'user_id': self.user.id, - 'changes_since': '2019-08-07T08:03:25Z', - 'changes_before': "2019-08-09T08:03:25Z", - } - - self.migrations_mock.list.assert_called_with(**kwargs) - - self.MIGRATION_COLUMNS.insert( - len(self.MIGRATION_COLUMNS) - 2, "User") - self.MIGRATION_FIELDS.insert( - len(self.MIGRATION_FIELDS) - 2, "user_id") - self.assertEqual(self.MIGRATION_COLUMNS, columns) - self.assertEqual(tuple(self.data), tuple(data)) - # Clean up global variables MIGRATION_COLUMNS - self.MIGRATION_COLUMNS.remove('User') - # Clean up global variables MIGRATION_FIELDS - self.MIGRATION_FIELDS.remove('user_id') - - def test_get_migrations_with_user_pre_v280(self): - self.app.client_manager.compute.api_version = api_versions.APIVersion( - '2.79') - arglist = [ - '--status', 'migrating', - '--changes-before', '2019-08-09T08:03:25Z', - '--user', self.user.id, - ] - verifylist = [ - ('status', 'migrating'), - ('changes_before', '2019-08-09T08:03:25Z'), - ('user', self.user.id), - ] - 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)) - - def test_server_migration_list_with_project_and_user(self): - arglist = [ - '--status', 'migrating', - '--limit', '1', - '--changes-since', '2019-08-07T08:03:25Z', - '--changes-before', '2019-08-09T08:03:25Z', - '--project', self.project.id, - '--user', self.user.id, - ] - verifylist = [ - ('status', 'migrating'), - ('limit', 1), - ('changes_since', '2019-08-07T08:03:25Z'), - ('changes_before', '2019-08-09T08:03:25Z'), - ('project', self.project.id), - ('user', self.user.id), - ] - parsed_args = self.check_parser(self.cmd, arglist, verifylist) - columns, data = self.cmd.take_action(parsed_args) - - # Set expected values - kwargs = { - 'status': 'migrating', - 'limit': 1, - 'host': None, - 'project_id': self.project.id, - 'user_id': self.user.id, - 'changes_since': '2019-08-07T08:03:25Z', - 'changes_before': "2019-08-09T08:03:25Z", - } - - self.migrations_mock.list.assert_called_with(**kwargs) - - self.MIGRATION_COLUMNS.insert( - len(self.MIGRATION_COLUMNS) - 2, "Project") - self.MIGRATION_FIELDS.insert( - len(self.MIGRATION_FIELDS) - 2, "project_id") - self.MIGRATION_COLUMNS.insert( - len(self.MIGRATION_COLUMNS) - 2, "User") - self.MIGRATION_FIELDS.insert( - len(self.MIGRATION_FIELDS) - 2, "user_id") - self.assertEqual(self.MIGRATION_COLUMNS, columns) - self.assertEqual(tuple(self.data), tuple(data)) - # Clean up global variables MIGRATION_COLUMNS - self.MIGRATION_COLUMNS.remove('Project') - self.MIGRATION_FIELDS.remove('project_id') - self.MIGRATION_COLUMNS.remove('User') - self.MIGRATION_FIELDS.remove('user_id') - - def test_get_migrations_with_project_and_user_pre_v280(self): - self.app.client_manager.compute.api_version = api_versions.APIVersion( - '2.79') - arglist = [ - '--status', 'migrating', - '--changes-before', '2019-08-09T08:03:25Z', - '--project', self.project.id, - '--user', self.user.id, - ] - verifylist = [ - ('status', 'migrating'), - ('changes_before', '2019-08-09T08:03:25Z'), - ('project', self.project.id), - ('user', self.user.id) - ] - 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)) - - -class TestServerMigrationShow(TestServer): - - def setUp(self): - super().setUp() - - self.server = compute_fakes.FakeServer.create_one_server() - self.servers_mock.get.return_value = self.server - - self.server_migration = compute_fakes.FakeServerMigration\ - .create_one_server_migration() - self.server_migrations_mock.get.return_value = self.server_migration - - self.columns = ( - 'ID', - 'Server UUID', - 'Status', - 'Source Compute', - 'Source Node', - 'Dest Compute', - 'Dest Host', - 'Dest Node', - 'Memory Total Bytes', - 'Memory Processed Bytes', - 'Memory Remaining Bytes', - 'Disk Total Bytes', - 'Disk Processed Bytes', - 'Disk Remaining Bytes', - 'Created At', - 'Updated At', - ) - - self.data = ( - self.server_migration.id, - self.server_migration.server_uuid, - self.server_migration.status, - self.server_migration.source_compute, - self.server_migration.source_node, - self.server_migration.dest_compute, - self.server_migration.dest_host, - self.server_migration.dest_node, - self.server_migration.memory_total_bytes, - self.server_migration.memory_processed_bytes, - self.server_migration.memory_remaining_bytes, - self.server_migration.disk_total_bytes, - self.server_migration.disk_processed_bytes, - self.server_migration.disk_remaining_bytes, - self.server_migration.created_at, - self.server_migration.updated_at, - ) - - # Get the command object to test - self.cmd = server.ShowMigration(self.app, None) - - def _test_server_migration_show(self): - arglist = [ - self.server.id, - '2', # arbitrary migration ID - ] - verifylist = [] - parsed_args = self.check_parser(self.cmd, arglist, verifylist) - - columns, data = self.cmd.take_action(parsed_args) - - self.assertEqual(self.columns, columns) - self.assertEqual(self.data, data) - - self.servers_mock.get.assert_called_with(self.server.id) - self.server_migrations_mock.get.assert_called_with( - self.server.id, '2',) - - def test_server_migration_show(self): - self.app.client_manager.compute.api_version = api_versions.APIVersion( - '2.24') - - self._test_server_migration_show() - - def test_server_migration_show_v259(self): - self.app.client_manager.compute.api_version = api_versions.APIVersion( - '2.59') - - self.columns += ('UUID',) - self.data += (self.server_migration.uuid,) - - self._test_server_migration_show() - - def test_server_migration_show_v280(self): - self.app.client_manager.compute.api_version = api_versions.APIVersion( - '2.80') - - self.columns += ('UUID', 'User ID', 'Project ID') - self.data += ( - self.server_migration.uuid, - self.server_migration.user_id, - self.server_migration.project_id, - ) - - self._test_server_migration_show() - - def test_server_migration_show_pre_v224(self): - self.app.client_manager.compute.api_version = api_versions.APIVersion( - '2.23') - - arglist = [ - self.server.id, - '2', # arbitrary migration ID - ] - 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.24 or greater is required', - str(ex)) - - -class TestServerMigrationAbort(TestServer): - - def setUp(self): - super(TestServerMigrationAbort, self).setUp() - - self.server = compute_fakes.FakeServer.create_one_server() - - # Return value for utils.find_resource for server. - self.servers_mock.get.return_value = self.server - - # Get the command object to test - self.cmd = server.AbortMigration(self.app, None) - - def test_migration_abort(self): - self.app.client_manager.compute.api_version = api_versions.APIVersion( - '2.24') - - arglist = [ - self.server.id, - '2', # arbitrary migration ID - ] - verifylist = [] - parsed_args = self.check_parser(self.cmd, arglist, verifylist) - - result = self.cmd.take_action(parsed_args) - - self.servers_mock.get.assert_called_with(self.server.id) - self.server_migrations_mock.live_migration_abort.assert_called_with( - self.server.id, '2',) - self.assertIsNone(result) - - def test_migration_abort_pre_v224(self): - self.app.client_manager.compute.api_version = api_versions.APIVersion( - '2.23') - - arglist = [ - self.server.id, - '2', # arbitrary migration ID - ] - 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.24 or greater is required', - str(ex)) - - -class TestServerMigrationForceComplete(TestServer): - - def setUp(self): - super(TestServerMigrationForceComplete, self).setUp() - - self.server = compute_fakes.FakeServer.create_one_server() - - # Return value for utils.find_resource for server. - self.servers_mock.get.return_value = self.server - - # Get the command object to test - self.cmd = server.ForceCompleteMigration(self.app, None) - - def test_migration_force_complete(self): - self.app.client_manager.compute.api_version = api_versions.APIVersion( - '2.22') - - arglist = [ - self.server.id, - '2', # arbitrary migration ID - ] - verifylist = [] - parsed_args = self.check_parser(self.cmd, arglist, verifylist) - - result = self.cmd.take_action(parsed_args) - - self.servers_mock.get.assert_called_with(self.server.id) - self.server_migrations_mock.live_migrate_force_complete\ - .assert_called_with(self.server.id, '2',) - self.assertIsNone(result) - - def test_migration_force_complete_pre_v222(self): - self.app.client_manager.compute.api_version = api_versions.APIVersion( - '2.21') - - arglist = [ - self.server.id, - '2', # arbitrary migration ID - ] - 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.22 or greater is required', - str(ex)) - - class TestServerPause(TestServer): def setUp(self): diff --git a/openstackclient/tests/unit/compute/v2/test_server_migration.py b/openstackclient/tests/unit/compute/v2/test_server_migration.py new file mode 100644 index 00000000..c4cbac47 --- /dev/null +++ b/openstackclient/tests/unit/compute/v2/test_server_migration.py @@ -0,0 +1,1028 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +from unittest import mock + +from novaclient import api_versions +from osc_lib import exceptions +from osc_lib import utils as common_utils + +from openstackclient.compute.v2 import server_migration +from openstackclient.tests.unit.compute.v2 import fakes as compute_fakes +from openstackclient.tests.unit.identity.v3 import fakes as identity_fakes + + +class TestServerMigration(compute_fakes.TestComputev2): + + def setUp(self): + super().setUp() + + # Get a shortcut to the compute client ServerManager Mock + self.servers_mock = self.app.client_manager.compute.servers + self.servers_mock.reset_mock() + + # Get a shortcut to the compute client ServerMigrationsManager Mock + self.server_migrations_mock = \ + self.app.client_manager.compute.server_migrations + self.server_migrations_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() + + self.app.client_manager.sdk_connection = mock.Mock() + self.app.client_manager.sdk_connection.compute = mock.Mock() + self.sdk_client = self.app.client_manager.sdk_connection.compute + + +class TestListMigration(TestServerMigration): + """Test fetch all migrations.""" + + MIGRATION_COLUMNS = [ + 'Source Node', 'Dest Node', 'Source Compute', + 'Dest Compute', 'Dest Host', 'Status', 'Server UUID', + 'Old Flavor', 'New Flavor', 'Created At', 'Updated At' + ] + + # These are the fields that come back in the response from the REST API. + MIGRATION_FIELDS = [ + 'source_node', 'dest_node', 'source_compute', 'dest_compute', + 'dest_host', 'status', 'instance_uuid', 'old_instance_type_id', + 'new_instance_type_id', 'created_at', 'updated_at' + ] + + def setUp(self): + super().setUp() + + self.server = compute_fakes.FakeServer.create_one_server() + self.servers_mock.get.return_value = self.server + + self.migrations = compute_fakes.FakeMigration.create_migrations( + count=3) + self.migrations_mock.list.return_value = self.migrations + + self.data = (common_utils.get_item_properties( + s, self.MIGRATION_FIELDS) for s in self.migrations) + + # Get the command object to test + self.cmd = server_migration.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, + } + + 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 = [ + '--server', 'server1', + '--host', 'host1', + '--status', 'migrating', + '--type', 'cold-migration', + ] + verifylist = [ + ('server', 'server1'), + ('host', 'host1'), + ('status', 'migrating'), + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + columns, data = self.cmd.take_action(parsed_args) + + # Set expected values + kwargs = { + 'status': 'migrating', + 'host': 'host1', + 'instance_uuid': self.server.id, + 'migration_type': 'migration', + } + + self.servers_mock.get.assert_called_with('server1') + self.migrations_mock.list.assert_called_with(**kwargs) + + self.assertEqual(self.MIGRATION_COLUMNS, columns) + self.assertEqual(tuple(self.data), tuple(data)) + + +class TestListMigrationV223(TestListMigration): + """Test fetch all migrations. """ + + MIGRATION_COLUMNS = [ + 'Id', 'Source Node', 'Dest Node', 'Source Compute', 'Dest Compute', + 'Dest Host', 'Status', 'Server UUID', 'Old Flavor', 'New Flavor', + 'Type', 'Created At', 'Updated At' + ] + + # These are the fields that come back in the response from the REST API. + MIGRATION_FIELDS = [ + 'id', 'source_node', 'dest_node', 'source_compute', 'dest_compute', + 'dest_host', 'status', 'instance_uuid', 'old_instance_type_id', + 'new_instance_type_id', 'migration_type', 'created_at', 'updated_at' + ] + + def setUp(self): + super().setUp() + + self.app.client_manager.compute.api_version = api_versions.APIVersion( + '2.23') + + def test_server_migration_list(self): + arglist = [ + '--status', 'migrating' + ] + verifylist = [ + ('status', 'migrating') + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + columns, data = self.cmd.take_action(parsed_args) + + # Set expected values + kwargs = { + 'status': 'migrating', + 'host': None, + } + + self.migrations_mock.list.assert_called_with(**kwargs) + + self.assertEqual(self.MIGRATION_COLUMNS, columns) + self.assertEqual(tuple(self.data), tuple(data)) + + +class TestListMigrationV259(TestListMigration): + """Test fetch all migrations. """ + + MIGRATION_COLUMNS = [ + 'Id', 'UUID', 'Source Node', 'Dest Node', 'Source Compute', + 'Dest Compute', 'Dest Host', 'Status', 'Server UUID', + 'Old Flavor', 'New Flavor', 'Type', 'Created At', 'Updated At' + ] + + # These are the fields that come back in the response from the REST API. + MIGRATION_FIELDS = [ + 'id', 'uuid', 'source_node', 'dest_node', 'source_compute', + 'dest_compute', 'dest_host', 'status', 'instance_uuid', + 'old_instance_type_id', 'new_instance_type_id', 'migration_type', + 'created_at', 'updated_at' + ] + + def setUp(self): + super().setUp() + + self.app.client_manager.compute.api_version = api_versions.APIVersion( + '2.59') + + def test_server_migration_list(self): + arglist = [ + '--status', 'migrating', + '--limit', '1', + '--marker', 'test_kp', + '--changes-since', '2019-08-09T08:03:25Z' + ] + verifylist = [ + ('status', 'migrating'), + ('limit', 1), + ('marker', 'test_kp'), + ('changes_since', '2019-08-09T08:03:25Z') + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + columns, data = self.cmd.take_action(parsed_args) + + # Set expected values + kwargs = { + 'status': 'migrating', + 'limit': 1, + 'marker': 'test_kp', + 'host': None, + 'changes_since': '2019-08-09T08:03:25Z', + } + + 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_with_limit_pre_v259(self): + self.app.client_manager.compute.api_version = api_versions.APIVersion( + '2.58') + arglist = [ + '--status', 'migrating', + '--limit', '1' + ] + verifylist = [ + ('status', 'migrating'), + ('limit', 1) + ] + 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.59 or greater is required', + str(ex)) + + def test_server_migration_list_with_marker_pre_v259(self): + self.app.client_manager.compute.api_version = api_versions.APIVersion( + '2.58') + arglist = [ + '--status', 'migrating', + '--marker', 'test_kp' + ] + verifylist = [ + ('status', 'migrating'), + ('marker', 'test_kp') + ] + 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.59 or greater is required', + str(ex)) + + def test_server_migration_list_with_changes_since_pre_v259(self): + self.app.client_manager.compute.api_version = api_versions.APIVersion( + '2.58') + arglist = [ + '--status', 'migrating', + '--changes-since', '2019-08-09T08:03:25Z' + ] + verifylist = [ + ('status', 'migrating'), + ('changes_since', '2019-08-09T08:03:25Z') + ] + 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.59 or greater is required', + str(ex)) + + +class TestListMigrationV266(TestListMigration): + """Test fetch all migrations by changes-before. """ + + MIGRATION_COLUMNS = [ + 'Id', 'UUID', 'Source Node', 'Dest Node', 'Source Compute', + 'Dest Compute', 'Dest Host', 'Status', 'Server UUID', + 'Old Flavor', 'New Flavor', 'Type', 'Created At', 'Updated At' + ] + + # These are the fields that come back in the response from the REST API. + MIGRATION_FIELDS = [ + 'id', 'uuid', 'source_node', 'dest_node', 'source_compute', + 'dest_compute', 'dest_host', 'status', 'instance_uuid', + 'old_instance_type_id', 'new_instance_type_id', 'migration_type', + 'created_at', 'updated_at' + ] + + def setUp(self): + super().setUp() + + self.app.client_manager.compute.api_version = api_versions.APIVersion( + '2.66') + + def test_server_migration_list_with_changes_before(self): + arglist = [ + '--status', 'migrating', + '--limit', '1', + '--marker', 'test_kp', + '--changes-since', '2019-08-07T08:03:25Z', + '--changes-before', '2019-08-09T08:03:25Z' + ] + verifylist = [ + ('status', 'migrating'), + ('limit', 1), + ('marker', 'test_kp'), + ('changes_since', '2019-08-07T08:03:25Z'), + ('changes_before', '2019-08-09T08:03:25Z') + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + columns, data = self.cmd.take_action(parsed_args) + + # Set expected values + kwargs = { + 'status': 'migrating', + 'limit': 1, + 'marker': 'test_kp', + 'host': None, + 'changes_since': '2019-08-07T08:03:25Z', + 'changes_before': '2019-08-09T08:03:25Z', + } + + 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_with_changes_before_pre_v266(self): + self.app.client_manager.compute.api_version = api_versions.APIVersion( + '2.65') + arglist = [ + '--status', 'migrating', + '--changes-before', '2019-08-09T08:03:25Z' + ] + verifylist = [ + ('status', 'migrating'), + ('changes_before', '2019-08-09T08:03:25Z') + ] + 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.66 or greater is required', + str(ex)) + + +class TestListMigrationV280(TestListMigration): + """Test fetch all migrations by user-id and/or project-id. """ + + MIGRATION_COLUMNS = [ + 'Id', 'UUID', 'Source Node', 'Dest Node', 'Source Compute', + 'Dest Compute', 'Dest Host', 'Status', 'Server UUID', + 'Old Flavor', 'New Flavor', 'Type', 'Created At', 'Updated At' + ] + + # These are the fields that come back in the response from the REST API. + MIGRATION_FIELDS = [ + 'id', 'uuid', 'source_node', 'dest_node', 'source_compute', + 'dest_compute', 'dest_host', 'status', 'instance_uuid', + 'old_instance_type_id', 'new_instance_type_id', 'migration_type', + 'created_at', 'updated_at' + ] + + project = identity_fakes.FakeProject.create_one_project() + user = identity_fakes.FakeUser.create_one_user() + + def setUp(self): + super().setUp() + + self.projects_mock = self.app.client_manager.identity.projects + self.projects_mock.reset_mock() + + self.users_mock = self.app.client_manager.identity.users + self.users_mock.reset_mock() + + self.projects_mock.get.return_value = self.project + self.users_mock.get.return_value = self.user + + self.app.client_manager.compute.api_version = api_versions.APIVersion( + '2.80') + + def test_server_migration_list_with_project(self): + arglist = [ + '--status', 'migrating', + '--limit', '1', + '--marker', 'test_kp', + '--changes-since', '2019-08-07T08:03:25Z', + '--changes-before', '2019-08-09T08:03:25Z', + '--project', self.project.id + ] + verifylist = [ + ('status', 'migrating'), + ('limit', 1), + ('marker', 'test_kp'), + ('changes_since', '2019-08-07T08:03:25Z'), + ('changes_before', '2019-08-09T08:03:25Z'), + ('project', self.project.id) + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + columns, data = self.cmd.take_action(parsed_args) + + # Set expected values + kwargs = { + 'status': 'migrating', + 'limit': 1, + 'marker': 'test_kp', + 'host': None, + 'project_id': self.project.id, + 'changes_since': '2019-08-07T08:03:25Z', + 'changes_before': "2019-08-09T08:03:25Z", + } + + self.migrations_mock.list.assert_called_with(**kwargs) + + self.MIGRATION_COLUMNS.insert( + len(self.MIGRATION_COLUMNS) - 2, "Project") + self.MIGRATION_FIELDS.insert( + len(self.MIGRATION_FIELDS) - 2, "project_id") + self.assertEqual(self.MIGRATION_COLUMNS, columns) + self.assertEqual(tuple(self.data), tuple(data)) + # Clean up global variables MIGRATION_COLUMNS + self.MIGRATION_COLUMNS.remove('Project') + # Clean up global variables MIGRATION_FIELDS + self.MIGRATION_FIELDS.remove('project_id') + + def test_get_migrations_with_project_pre_v280(self): + self.app.client_manager.compute.api_version = api_versions.APIVersion( + '2.79') + arglist = [ + '--status', 'migrating', + '--changes-before', '2019-08-09T08:03:25Z', + '--project', '0c2accde-644a-45fa-8c10-e76debc7fbc3' + ] + verifylist = [ + ('status', 'migrating'), + ('changes_before', '2019-08-09T08:03:25Z'), + ('project', '0c2accde-644a-45fa-8c10-e76debc7fbc3') + ] + 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)) + + def test_server_migration_list_with_user(self): + arglist = [ + '--status', 'migrating', + '--limit', '1', + '--marker', 'test_kp', + '--changes-since', '2019-08-07T08:03:25Z', + '--changes-before', '2019-08-09T08:03:25Z', + '--user', self.user.id, + ] + verifylist = [ + ('status', 'migrating'), + ('limit', 1), + ('marker', 'test_kp'), + ('changes_since', '2019-08-07T08:03:25Z'), + ('changes_before', '2019-08-09T08:03:25Z'), + ('user', self.user.id), + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + columns, data = self.cmd.take_action(parsed_args) + + # Set expected values + kwargs = { + 'status': 'migrating', + 'limit': 1, + 'marker': 'test_kp', + 'host': None, + 'user_id': self.user.id, + 'changes_since': '2019-08-07T08:03:25Z', + 'changes_before': "2019-08-09T08:03:25Z", + } + + self.migrations_mock.list.assert_called_with(**kwargs) + + self.MIGRATION_COLUMNS.insert( + len(self.MIGRATION_COLUMNS) - 2, "User") + self.MIGRATION_FIELDS.insert( + len(self.MIGRATION_FIELDS) - 2, "user_id") + self.assertEqual(self.MIGRATION_COLUMNS, columns) + self.assertEqual(tuple(self.data), tuple(data)) + # Clean up global variables MIGRATION_COLUMNS + self.MIGRATION_COLUMNS.remove('User') + # Clean up global variables MIGRATION_FIELDS + self.MIGRATION_FIELDS.remove('user_id') + + def test_get_migrations_with_user_pre_v280(self): + self.app.client_manager.compute.api_version = api_versions.APIVersion( + '2.79') + arglist = [ + '--status', 'migrating', + '--changes-before', '2019-08-09T08:03:25Z', + '--user', self.user.id, + ] + verifylist = [ + ('status', 'migrating'), + ('changes_before', '2019-08-09T08:03:25Z'), + ('user', self.user.id), + ] + 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)) + + def test_server_migration_list_with_project_and_user(self): + arglist = [ + '--status', 'migrating', + '--limit', '1', + '--changes-since', '2019-08-07T08:03:25Z', + '--changes-before', '2019-08-09T08:03:25Z', + '--project', self.project.id, + '--user', self.user.id, + ] + verifylist = [ + ('status', 'migrating'), + ('limit', 1), + ('changes_since', '2019-08-07T08:03:25Z'), + ('changes_before', '2019-08-09T08:03:25Z'), + ('project', self.project.id), + ('user', self.user.id), + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + columns, data = self.cmd.take_action(parsed_args) + + # Set expected values + kwargs = { + 'status': 'migrating', + 'limit': 1, + 'host': None, + 'project_id': self.project.id, + 'user_id': self.user.id, + 'changes_since': '2019-08-07T08:03:25Z', + 'changes_before': "2019-08-09T08:03:25Z", + } + + self.migrations_mock.list.assert_called_with(**kwargs) + + self.MIGRATION_COLUMNS.insert( + len(self.MIGRATION_COLUMNS) - 2, "Project") + self.MIGRATION_FIELDS.insert( + len(self.MIGRATION_FIELDS) - 2, "project_id") + self.MIGRATION_COLUMNS.insert( + len(self.MIGRATION_COLUMNS) - 2, "User") + self.MIGRATION_FIELDS.insert( + len(self.MIGRATION_FIELDS) - 2, "user_id") + self.assertEqual(self.MIGRATION_COLUMNS, columns) + self.assertEqual(tuple(self.data), tuple(data)) + # Clean up global variables MIGRATION_COLUMNS + self.MIGRATION_COLUMNS.remove('Project') + self.MIGRATION_FIELDS.remove('project_id') + self.MIGRATION_COLUMNS.remove('User') + self.MIGRATION_FIELDS.remove('user_id') + + def test_get_migrations_with_project_and_user_pre_v280(self): + self.app.client_manager.compute.api_version = api_versions.APIVersion( + '2.79') + arglist = [ + '--status', 'migrating', + '--changes-before', '2019-08-09T08:03:25Z', + '--project', self.project.id, + '--user', self.user.id, + ] + verifylist = [ + ('status', 'migrating'), + ('changes_before', '2019-08-09T08:03:25Z'), + ('project', self.project.id), + ('user', self.user.id) + ] + 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)) + + +class TestServerMigrationShow(TestServerMigration): + + def setUp(self): + super().setUp() + + self.server = compute_fakes.FakeServer.create_one_server() + self.servers_mock.get.return_value = self.server + + self.server_migration = compute_fakes.FakeServerMigration\ + .create_one_server_migration() + self.server_migrations_mock.get.return_value = self.server_migration + + self.columns = ( + 'ID', + 'Server UUID', + 'Status', + 'Source Compute', + 'Source Node', + 'Dest Compute', + 'Dest Host', + 'Dest Node', + 'Memory Total Bytes', + 'Memory Processed Bytes', + 'Memory Remaining Bytes', + 'Disk Total Bytes', + 'Disk Processed Bytes', + 'Disk Remaining Bytes', + 'Created At', + 'Updated At', + ) + + self.data = ( + self.server_migration.id, + self.server_migration.server_uuid, + self.server_migration.status, + self.server_migration.source_compute, + self.server_migration.source_node, + self.server_migration.dest_compute, + self.server_migration.dest_host, + self.server_migration.dest_node, + self.server_migration.memory_total_bytes, + self.server_migration.memory_processed_bytes, + self.server_migration.memory_remaining_bytes, + self.server_migration.disk_total_bytes, + self.server_migration.disk_processed_bytes, + self.server_migration.disk_remaining_bytes, + self.server_migration.created_at, + self.server_migration.updated_at, + ) + + # Get the command object to test + self.cmd = server_migration.ShowMigration(self.app, None) + + def _test_server_migration_show(self): + arglist = [ + self.server.id, + '2', # arbitrary migration ID + ] + verifylist = [] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + columns, data = self.cmd.take_action(parsed_args) + + self.assertEqual(self.columns, columns) + self.assertEqual(self.data, data) + + self.servers_mock.get.assert_called_with(self.server.id) + self.server_migrations_mock.get.assert_called_with( + self.server.id, '2',) + + def test_server_migration_show(self): + self.app.client_manager.compute.api_version = api_versions.APIVersion( + '2.24') + + self._test_server_migration_show() + + def test_server_migration_show_v259(self): + self.app.client_manager.compute.api_version = api_versions.APIVersion( + '2.59') + + self.columns += ('UUID',) + self.data += (self.server_migration.uuid,) + + self._test_server_migration_show() + + def test_server_migration_show_v280(self): + self.app.client_manager.compute.api_version = api_versions.APIVersion( + '2.80') + + self.columns += ('UUID', 'User ID', 'Project ID') + self.data += ( + self.server_migration.uuid, + self.server_migration.user_id, + self.server_migration.project_id, + ) + + self._test_server_migration_show() + + def test_server_migration_show_pre_v224(self): + self.app.client_manager.compute.api_version = api_versions.APIVersion( + '2.23') + + arglist = [ + self.server.id, + '2', # arbitrary migration ID + ] + 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.24 or greater is required', + str(ex)) + + def test_server_migration_show_by_uuid(self): + self.app.client_manager.compute.api_version = api_versions.APIVersion( + '2.59') + self.server_migrations_mock.list.return_value = [self.server_migration] + + self.columns += ('UUID',) + self.data += (self.server_migration.uuid,) + + arglist = [ + self.server.id, + self.server_migration.uuid, # arbitrary migration UUID + ] + verifylist = [] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + columns, data = self.cmd.take_action(parsed_args) + + self.assertEqual(self.columns, columns) + self.assertEqual(self.data, data) + + self.servers_mock.get.assert_called_with(self.server.id) + self.server_migrations_mock.list.assert_called_with(self.server.id) + self.server_migrations_mock.get.assert_not_called() + + def test_server_migration_show_by_uuid_no_matches(self): + self.app.client_manager.compute.api_version = api_versions.APIVersion( + '2.59') + self.server_migrations_mock.list.return_value = [] + + arglist = [ + self.server.id, + '69f95745-bfe3-4302-90f7-5b0022cba1ce', # arbitrary migration UUID + ] + verifylist = [] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + ex = self.assertRaises( + exceptions.CommandError, + self.cmd.take_action, + parsed_args) + self.assertIn( + 'In-progress live migration 69f95745-bfe3-4302-90f7-5b0022cba1ce', + str(ex)) + + def test_server_migration_show_by_uuid_pre_v259(self): + self.app.client_manager.compute.api_version = api_versions.APIVersion( + '2.58') + + arglist = [ + self.server.id, + '69f95745-bfe3-4302-90f7-5b0022cba1ce', # arbitrary migration UUID + ] + 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.59 or greater is required', + str(ex)) + + def test_server_migration_show_invalid_id(self): + self.app.client_manager.compute.api_version = api_versions.APIVersion( + '2.24') + + arglist = [ + self.server.id, + 'foo', # invalid migration ID + ] + verifylist = [] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + ex = self.assertRaises( + exceptions.CommandError, + self.cmd.take_action, + parsed_args) + self.assertIn( + 'The <migration> argument must be an ID or UUID', + str(ex)) + + +class TestServerMigrationAbort(TestServerMigration): + + def setUp(self): + super().setUp() + + self.server = compute_fakes.FakeServer.create_one_server() + + # Return value for utils.find_resource for server. + self.servers_mock.get.return_value = self.server + + # Get the command object to test + self.cmd = server_migration.AbortMigration(self.app, None) + + def test_migration_abort(self): + self.app.client_manager.compute.api_version = api_versions.APIVersion( + '2.24') + + arglist = [ + self.server.id, + '2', # arbitrary migration ID + ] + verifylist = [] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + result = self.cmd.take_action(parsed_args) + + self.servers_mock.get.assert_called_with(self.server.id) + self.server_migrations_mock.live_migration_abort.assert_called_with( + self.server.id, '2',) + self.assertIsNone(result) + + def test_migration_abort_pre_v224(self): + self.app.client_manager.compute.api_version = api_versions.APIVersion( + '2.23') + + arglist = [ + self.server.id, + '2', # arbitrary migration ID + ] + 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.24 or greater is required', + str(ex)) + + def test_server_migration_abort_by_uuid(self): + self.app.client_manager.compute.api_version = api_versions.APIVersion( + '2.59') + + self.server_migration = compute_fakes.FakeServerMigration\ + .create_one_server_migration() + self.server_migrations_mock.list.return_value = [self.server_migration] + + arglist = [ + self.server.id, + self.server_migration.uuid, # arbitrary migration UUID + ] + verifylist = [] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + result = self.cmd.take_action(parsed_args) + + self.servers_mock.get.assert_called_with(self.server.id) + self.server_migrations_mock.list.assert_called_with(self.server.id) + self.server_migrations_mock.live_migration_abort.assert_called_with( + self.server.id, self.server_migration.id) + self.assertIsNone(result) + + def test_server_migration_abort_by_uuid_no_matches(self): + self.app.client_manager.compute.api_version = api_versions.APIVersion( + '2.59') + + self.server_migrations_mock.list.return_value = [] + + arglist = [ + self.server.id, + '69f95745-bfe3-4302-90f7-5b0022cba1ce', # arbitrary migration UUID + ] + verifylist = [] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + ex = self.assertRaises( + exceptions.CommandError, + self.cmd.take_action, + parsed_args) + self.assertIn( + 'In-progress live migration 69f95745-bfe3-4302-90f7-5b0022cba1ce', + str(ex)) + + def test_server_migration_abort_by_uuid_pre_v259(self): + self.app.client_manager.compute.api_version = api_versions.APIVersion( + '2.58') + + arglist = [ + self.server.id, + '69f95745-bfe3-4302-90f7-5b0022cba1ce', # arbitrary migration UUID + ] + 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.59 or greater is required', + str(ex)) + + +class TestServerMigrationForceComplete(TestServerMigration): + + def setUp(self): + super().setUp() + + self.server = compute_fakes.FakeServer.create_one_server() + + # Return value for utils.find_resource for server. + self.servers_mock.get.return_value = self.server + + # Get the command object to test + self.cmd = server_migration.ForceCompleteMigration(self.app, None) + + def test_migration_force_complete(self): + self.app.client_manager.compute.api_version = api_versions.APIVersion( + '2.22') + + arglist = [ + self.server.id, + '2', # arbitrary migration ID + ] + verifylist = [] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + result = self.cmd.take_action(parsed_args) + + self.servers_mock.get.assert_called_with(self.server.id) + self.server_migrations_mock.live_migrate_force_complete\ + .assert_called_with(self.server.id, '2',) + self.assertIsNone(result) + + def test_migration_force_complete_pre_v222(self): + self.app.client_manager.compute.api_version = api_versions.APIVersion( + '2.21') + + arglist = [ + self.server.id, + '2', # arbitrary migration ID + ] + 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.22 or greater is required', + str(ex)) + + def test_server_migration_force_complete_by_uuid(self): + self.app.client_manager.compute.api_version = api_versions.APIVersion( + '2.59') + + self.server_migration = compute_fakes.FakeServerMigration\ + .create_one_server_migration() + self.server_migrations_mock.list.return_value = [self.server_migration] + + arglist = [ + self.server.id, + self.server_migration.uuid, # arbitrary migration UUID + ] + verifylist = [] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + result = self.cmd.take_action(parsed_args) + + self.servers_mock.get.assert_called_with(self.server.id) + self.server_migrations_mock.list.assert_called_with(self.server.id) + self.server_migrations_mock.live_migrate_force_complete\ + .assert_called_with(self.server.id, self.server_migration.id) + self.assertIsNone(result) + + def test_server_migration_force_complete_by_uuid_no_matches(self): + self.app.client_manager.compute.api_version = api_versions.APIVersion( + '2.59') + + self.server_migrations_mock.list.return_value = [] + + arglist = [ + self.server.id, + '69f95745-bfe3-4302-90f7-5b0022cba1ce', # arbitrary migration UUID + ] + verifylist = [] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + ex = self.assertRaises( + exceptions.CommandError, + self.cmd.take_action, + parsed_args) + self.assertIn( + 'In-progress live migration 69f95745-bfe3-4302-90f7-5b0022cba1ce', + str(ex)) + + def test_server_migration_force_complete_by_uuid_pre_v259(self): + self.app.client_manager.compute.api_version = api_versions.APIVersion( + '2.58') + + arglist = [ + self.server.id, + '69f95745-bfe3-4302-90f7-5b0022cba1ce', # arbitrary migration UUID + ] + 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.59 or greater is required', + str(ex)) diff --git a/openstackclient/tests/unit/image/v2/test_image.py b/openstackclient/tests/unit/image/v2/test_image.py index 7ccc9f0f..d563bf50 100644 --- a/openstackclient/tests/unit/image/v2/test_image.py +++ b/openstackclient/tests/unit/image/v2/test_image.py @@ -835,15 +835,16 @@ class TestImageList(TestImage): def test_image_list_tag_option(self): arglist = [ '--tag', 'abc', + '--tag', 'cba' ] verifylist = [ - ('tag', 'abc'), + ('tag', ['abc', 'cba']), ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) columns, data = self.cmd.take_action(parsed_args) self.client.images.assert_called_with( - tag='abc' + tag=['abc', 'cba'] ) diff --git a/openstackclient/tests/unit/network/v2/fakes.py b/openstackclient/tests/unit/network/v2/fakes.py index a37642b1..1a1a6beb 100644 --- a/openstackclient/tests/unit/network/v2/fakes.py +++ b/openstackclient/tests/unit/network/v2/fakes.py @@ -18,8 +18,21 @@ from random import randint from unittest import mock import uuid +from openstack.network.v2 import address_group as _address_group +from openstack.network.v2 import address_scope as _address_scope +from openstack.network.v2 import agent as network_agent +from openstack.network.v2 import auto_allocated_topology as allocated_topology +from openstack.network.v2 import availability_zone as _availability_zone +from openstack.network.v2 import flavor as _flavor from openstack.network.v2 import local_ip as _local_ip from openstack.network.v2 import local_ip_association as _local_ip_association +from openstack.network.v2 import network as _network +from openstack.network.v2 import network_ip_availability as _ip_availability +from openstack.network.v2 import network_segment_range as _segment_range +from openstack.network.v2 import port as _port +from openstack.network.v2 import rbac_policy as network_rbac +from openstack.network.v2 import segment as _segment +from openstack.network.v2 import service_profile as _flavor_profile from openstackclient.tests.unit import fakes from openstackclient.tests.unit.identity.v3 import fakes as identity_fakes_v3 @@ -86,271 +99,6 @@ class TestNetworkV2(utils.TestCommand): ) -class FakeAddressGroup(object): - """Fake one or more address groups.""" - - @staticmethod - def create_one_address_group(attrs=None): - """Create a fake address group. - - :param Dictionary attrs: - A dictionary with all attributes - :return: - A FakeResource object with name, id, etc. - """ - attrs = attrs or {} - - # Set default attributes. - address_group_attrs = { - 'name': 'address-group-name-' + uuid.uuid4().hex, - 'description': 'address-group-description-' + uuid.uuid4().hex, - 'id': 'address-group-id-' + uuid.uuid4().hex, - 'project_id': 'project-id-' + uuid.uuid4().hex, - 'addresses': ['10.0.0.1/32'], - 'location': 'MUNCHMUNCHMUNCH', - } - - # Overwrite default attributes. - address_group_attrs.update(attrs) - - address_group = fakes.FakeResource( - info=copy.deepcopy(address_group_attrs), - loaded=True) - - return address_group - - @staticmethod - def create_address_groups(attrs=None, count=2): - """Create multiple fake address groups. - - :param Dictionary attrs: - A dictionary with all attributes - :param int count: - The number of address groups to fake - :return: - A list of FakeResource objects faking the address groups - """ - address_groups = [] - for i in range(0, count): - address_groups.append( - FakeAddressGroup.create_one_address_group(attrs)) - - return address_groups - - @staticmethod - def get_address_groups(address_groups=None, count=2): - """Get an iterable Mock object with a list of faked address groups. - - If address groups list is provided, then initialize the Mock object - with the list. Otherwise create one. - - :param List address_groups: - A list of FakeResource objects faking address groups - :param int count: - The number of address groups to fake - :return: - An iterable Mock object with side_effect set to a list of faked - address groups - """ - if address_groups is None: - address_groups = FakeAddressGroup.create_address_groups(count) - return mock.Mock(side_effect=address_groups) - - -class FakeAddressScope(object): - """Fake one or more address scopes.""" - - @staticmethod - def create_one_address_scope(attrs=None): - """Create a fake address scope. - - :param Dictionary attrs: - A dictionary with all attributes - :return: - A FakeResource object with name, id, etc. - """ - attrs = attrs or {} - - # Set default attributes. - address_scope_attrs = { - 'name': 'address-scope-name-' + uuid.uuid4().hex, - 'id': 'address-scope-id-' + uuid.uuid4().hex, - 'project_id': 'project-id-' + uuid.uuid4().hex, - 'shared': False, - 'ip_version': 4, - 'location': 'MUNCHMUNCHMUNCH', - } - - # Overwrite default attributes. - address_scope_attrs.update(attrs) - - address_scope = fakes.FakeResource( - info=copy.deepcopy(address_scope_attrs), - loaded=True) - - # Set attributes with special mapping in OpenStack SDK. - address_scope.is_shared = address_scope_attrs['shared'] - - return address_scope - - @staticmethod - def create_address_scopes(attrs=None, count=2): - """Create multiple fake address scopes. - - :param Dictionary attrs: - A dictionary with all attributes - :param int count: - The number of address scopes to fake - :return: - A list of FakeResource objects faking the address scopes - """ - address_scopes = [] - for i in range(0, count): - address_scopes.append( - FakeAddressScope.create_one_address_scope(attrs)) - - return address_scopes - - @staticmethod - def get_address_scopes(address_scopes=None, count=2): - """Get an iterable Mock object with a list of faked address scopes. - - If address scopes list is provided, then initialize the Mock object - with the list. Otherwise create one. - - :param List address_scopes: - A list of FakeResource objects faking address scopes - :param int count: - The number of address scopes to fake - :return: - An iterable Mock object with side_effect set to a list of faked - address scopes - """ - if address_scopes is None: - address_scopes = FakeAddressScope.create_address_scopes(count) - return mock.Mock(side_effect=address_scopes) - - -class FakeAutoAllocatedTopology(object): - """Fake Auto Allocated Topology""" - - @staticmethod - def create_one_topology(attrs=None): - attrs = attrs or {} - - auto_allocated_topology_attrs = { - 'id': 'network-id-' + uuid.uuid4().hex, - 'project_id': 'project-id-' + uuid.uuid4().hex, - } - - auto_allocated_topology_attrs.update(attrs) - - auto_allocated_topology = fakes.FakeResource( - info=copy.deepcopy(auto_allocated_topology_attrs), - loaded=True) - - return auto_allocated_topology - - -class FakeAvailabilityZone(object): - """Fake one or more network availability zones (AZs).""" - - @staticmethod - def create_one_availability_zone(attrs=None): - """Create a fake AZ. - - :param Dictionary attrs: - A dictionary with all attributes - :return: - A FakeResource object with name, state, etc. - """ - attrs = attrs or {} - - # Set default attributes. - availability_zone = { - 'name': uuid.uuid4().hex, - 'state': 'available', - 'resource': 'network', - } - - # Overwrite default attributes. - availability_zone.update(attrs) - - availability_zone = fakes.FakeResource( - info=copy.deepcopy(availability_zone), - loaded=True) - return availability_zone - - @staticmethod - def create_availability_zones(attrs=None, count=2): - """Create multiple fake AZs. - - :param Dictionary attrs: - A dictionary with all attributes - :param int count: - The number of AZs to fake - :return: - A list of FakeResource objects faking the AZs - """ - availability_zones = [] - for i in range(0, count): - availability_zone = \ - FakeAvailabilityZone.create_one_availability_zone(attrs) - availability_zones.append(availability_zone) - - return availability_zones - - -class FakeIPAvailability(object): - """Fake one or more network ip availabilities.""" - - @staticmethod - def create_one_ip_availability(attrs=None): - """Create a fake list with ip availability stats of a network. - - :param Dictionary attrs: - A dictionary with all attributes - :return: - A FakeResource object with network_name, network_id, etc. - """ - attrs = attrs or {} - - # Set default attributes. - network_ip_attrs = { - 'network_id': 'network-id-' + uuid.uuid4().hex, - 'network_name': 'network-name-' + uuid.uuid4().hex, - 'project_id': '', - 'subnet_ip_availability': [], - 'total_ips': 254, - 'used_ips': 6, - 'location': 'MUNCHMUNCHMUNCH', - } - network_ip_attrs.update(attrs) - - network_ip_availability = fakes.FakeResource( - info=copy.deepcopy(network_ip_attrs), - loaded=True) - - return network_ip_availability - - @staticmethod - def create_ip_availability(count=2): - """Create fake list of ip availability stats of multiple networks. - - :param int count: - The number of networks to fake - :return: - A list of FakeResource objects faking network ip availability stats - """ - network_ip_availabilities = [] - for i in range(0, count): - network_ip_availability = \ - FakeIPAvailability.create_one_ip_availability() - network_ip_availabilities.append(network_ip_availability) - - return network_ip_availabilities - - class FakeExtension(object): """Fake one or more extension.""" @@ -384,582 +132,6 @@ class FakeExtension(object): return extension -class FakeNetwork(object): - """Fake one or more networks.""" - - @staticmethod - def create_one_network(attrs=None): - """Create a fake network. - - :param Dictionary attrs: - A dictionary with all attributes - :return: - A FakeResource object, with id, name, etc. - """ - attrs = attrs or {} - - # Set default attributes. - network_attrs = { - 'id': 'network-id-' + uuid.uuid4().hex, - 'name': 'network-name-' + uuid.uuid4().hex, - 'status': 'ACTIVE', - 'description': 'network-description-' + uuid.uuid4().hex, - 'dns_domain': 'example.org.', - 'mtu': '1350', - 'project_id': 'project-id-' + uuid.uuid4().hex, - 'admin_state_up': True, - 'shared': False, - 'subnets': ['a', 'b'], - 'provider:network_type': 'vlan', - 'provider:physical_network': 'physnet1', - 'provider:segmentation_id': "400", - 'router:external': True, - 'availability_zones': [], - 'availability_zone_hints': [], - 'is_default': False, - 'port_security_enabled': True, - 'qos_policy_id': 'qos-policy-id-' + uuid.uuid4().hex, - 'ipv4_address_scope': 'ipv4' + uuid.uuid4().hex, - 'ipv6_address_scope': 'ipv6' + uuid.uuid4().hex, - 'tags': [], - 'location': 'MUNCHMUNCHMUNCH', - } - - # Overwrite default attributes. - network_attrs.update(attrs) - - network = fakes.FakeResource(info=copy.deepcopy(network_attrs), - loaded=True) - - # Set attributes with special mapping in OpenStack SDK. - network.is_router_external = network_attrs['router:external'] - network.is_admin_state_up = network_attrs['admin_state_up'] - network.is_port_security_enabled = \ - network_attrs['port_security_enabled'] - network.subnet_ids = network_attrs['subnets'] - network.is_shared = network_attrs['shared'] - network.is_tags = network_attrs['tags'] - network.provider_network_type = \ - network_attrs['provider:network_type'] - network.provider_physical_network = \ - network_attrs['provider:physical_network'] - network.provider_segmentation_id = \ - network_attrs['provider:segmentation_id'] - network.ipv4_address_scope_id = \ - network_attrs['ipv4_address_scope'] - network.ipv6_address_scope_id = \ - network_attrs['ipv6_address_scope'] - - return network - - @staticmethod - def create_networks(attrs=None, count=2): - """Create multiple fake networks. - - :param Dictionary attrs: - A dictionary with all attributes - :param int count: - The number of networks to fake - :return: - A list of FakeResource objects faking the networks - """ - networks = [] - for i in range(0, count): - networks.append(FakeNetwork.create_one_network(attrs)) - - return networks - - @staticmethod - def get_networks(networks=None, count=2): - """Get an iterable Mock object with a list of faked networks. - - If networks list is provided, then initialize the Mock object with the - list. Otherwise create one. - - :param List networks: - A list of FakeResource objects faking networks - :param int count: - The number of networks to fake - :return: - An iterable Mock object with side_effect set to a list of faked - networks - """ - if networks is None: - networks = FakeNetwork.create_networks(count) - return mock.Mock(side_effect=networks) - - -class FakeNetworkFlavor(object): - """Fake Network Flavor.""" - - @staticmethod - def create_one_network_flavor(attrs=None): - """Create a fake network flavor. - - :param Dictionary attrs: - A dictionary with all attributes - :return: - A FakeResource object faking the network flavor - """ - attrs = attrs or {} - - fake_uuid = uuid.uuid4().hex - network_flavor_attrs = { - 'description': 'network-flavor-description-' + fake_uuid, - 'enabled': True, - 'id': 'network-flavor-id-' + fake_uuid, - 'name': 'network-flavor-name-' + fake_uuid, - 'service_type': 'vpn', - 'project_id': 'project-id-' + uuid.uuid4().hex, - 'location': 'MUNCHMUNCHMUNCH', - } - - # Overwrite default attributes. - network_flavor_attrs.update(attrs) - - network_flavor = fakes.FakeResource( - info=copy.deepcopy(network_flavor_attrs), - loaded=True - ) - - network_flavor.is_enabled = network_flavor_attrs['enabled'] - - return network_flavor - - @staticmethod - def create_flavor(attrs=None, count=2): - """Create multiple fake network flavors. - - :param Dictionary attrs: - A dictionary with all attributes - :param int count: - The number of network flavors to fake - :return: - A list of FakeResource objects faking the network falvors - """ - network_flavors = [] - for i in range(0, count): - network_flavors.append( - FakeNetworkFlavor.create_one_network_flavor(attrs) - ) - return network_flavors - - @staticmethod - def get_flavor(network_flavors=None, count=2): - """Get a list of flavors.""" - if network_flavors is None: - network_flavors = (FakeNetworkFlavor.create_flavor(count)) - return mock.Mock(side_effect=network_flavors) - - -class FakeNetworkSegment(object): - """Fake one or more network segments.""" - - @staticmethod - def create_one_network_segment(attrs=None): - """Create a fake network segment. - - :param Dictionary attrs: - A dictionary with all attributes - :return: - A FakeResource object faking the network segment - """ - attrs = attrs or {} - - # Set default attributes. - fake_uuid = uuid.uuid4().hex - network_segment_attrs = { - 'description': 'network-segment-description-' + fake_uuid, - 'id': 'network-segment-id-' + fake_uuid, - 'name': 'network-segment-name-' + fake_uuid, - 'network_id': 'network-id-' + fake_uuid, - 'network_type': 'vlan', - 'physical_network': 'physical-network-name-' + fake_uuid, - 'segmentation_id': 1024, - 'location': 'MUNCHMUNCHMUNCH', - } - - # Overwrite default attributes. - network_segment_attrs.update(attrs) - - network_segment = fakes.FakeResource( - info=copy.deepcopy(network_segment_attrs), - loaded=True - ) - - return network_segment - - @staticmethod - def create_network_segments(attrs=None, count=2): - """Create multiple fake network segments. - - :param Dictionary attrs: - A dictionary with all attributes - :param int count: - The number of network segments to fake - :return: - A list of FakeResource objects faking the network segments - """ - network_segments = [] - for i in range(0, count): - network_segments.append( - FakeNetworkSegment.create_one_network_segment(attrs) - ) - return network_segments - - -class FakeNetworkSegmentRange(object): - """Fake one or more network segment ranges.""" - - @staticmethod - def create_one_network_segment_range(attrs=None): - """Create a fake network segment range. - - :param Dictionary attrs: - A dictionary with all attributes - :return: - A FakeResource object faking the network segment range - """ - attrs = attrs or {} - - # Set default attributes. - fake_uuid = uuid.uuid4().hex - network_segment_range_attrs = { - 'id': 'network-segment-range-id-' + fake_uuid, - 'name': 'network-segment-name-' + fake_uuid, - 'default': False, - 'shared': False, - 'project_id': 'project-id-' + fake_uuid, - 'network_type': 'vlan', - 'physical_network': 'physical-network-name-' + fake_uuid, - 'minimum': 100, - 'maximum': 106, - 'used': {104: '3312e4ba67864b2eb53f3f41432f8efc', - 106: '3312e4ba67864b2eb53f3f41432f8efc'}, - 'available': [100, 101, 102, 103, 105], - 'location': 'MUNCHMUNCHMUNCH', - } - - # Overwrite default attributes. - network_segment_range_attrs.update(attrs) - - network_segment_range = fakes.FakeResource( - info=copy.deepcopy(network_segment_range_attrs), - loaded=True - ) - - return network_segment_range - - @staticmethod - def create_network_segment_ranges(attrs=None, count=2): - """Create multiple fake network segment ranges. - - :param Dictionary attrs: - A dictionary with all attributes - :param int count: - The number of network segment ranges to fake - :return: - A list of FakeResource objects faking the network segment ranges - """ - network_segment_ranges = [] - for i in range(0, count): - network_segment_ranges.append( - FakeNetworkSegmentRange.create_one_network_segment_range(attrs) - ) - return network_segment_ranges - - -class FakePort(object): - """Fake one or more ports.""" - - @staticmethod - def create_one_port(attrs=None): - """Create a fake port. - - :param Dictionary attrs: - A dictionary with all attributes - :return: - A FakeResource object, with id, name, etc. - """ - attrs = attrs or {} - - # Set default attributes. - port_attrs = { - 'admin_state_up': True, - 'allowed_address_pairs': [{}], - 'binding:host_id': 'binding-host-id-' + uuid.uuid4().hex, - 'binding:profile': {}, - 'binding:vif_details': {}, - 'binding:vif_type': 'ovs', - 'binding:vnic_type': 'normal', - 'data_plane_status': None, - 'description': 'description-' + uuid.uuid4().hex, - 'device_id': 'device-id-' + uuid.uuid4().hex, - 'device_owner': 'compute:nova', - 'device_profile': 'cyborg_device_profile_1', - 'dns_assignment': [{}], - 'dns_domain': 'dns-domain-' + uuid.uuid4().hex, - 'dns_name': 'dns-name-' + uuid.uuid4().hex, - 'extra_dhcp_opts': [{}], - 'fixed_ips': [{'ip_address': '10.0.0.3', - 'subnet_id': 'subnet-id-' + uuid.uuid4().hex}], - 'id': 'port-id-' + uuid.uuid4().hex, - 'mac_address': 'fa:16:3e:a9:4e:72', - 'name': 'port-name-' + uuid.uuid4().hex, - 'network_id': 'network-id-' + uuid.uuid4().hex, - 'numa_affinity_policy': 'required', - 'port_security_enabled': True, - 'security_group_ids': [], - 'status': 'ACTIVE', - 'project_id': 'project-id-' + uuid.uuid4().hex, - 'qos_network_policy_id': 'qos-policy-id-' + uuid.uuid4().hex, - 'qos_policy_id': 'qos-policy-id-' + uuid.uuid4().hex, - 'tags': [], - 'propagate_uplink_status': False, - 'location': 'MUNCHMUNCHMUNCH', - } - - # Overwrite default attributes. - port_attrs.update(attrs) - - port = fakes.FakeResource(info=copy.deepcopy(port_attrs), - loaded=True) - - # Set attributes with special mappings in OpenStack SDK. - port.binding_host_id = port_attrs['binding:host_id'] - port.binding_profile = port_attrs['binding:profile'] - port.binding_vif_details = port_attrs['binding:vif_details'] - port.binding_vif_type = port_attrs['binding:vif_type'] - port.binding_vnic_type = port_attrs['binding:vnic_type'] - port.is_admin_state_up = port_attrs['admin_state_up'] - port.is_port_security_enabled = port_attrs['port_security_enabled'] - - return port - - @staticmethod - def create_ports(attrs=None, count=2): - """Create multiple fake ports. - - :param Dictionary attrs: - A dictionary with all attributes - :param int count: - The number of ports to fake - :return: - A list of FakeResource objects faking the ports - """ - ports = [] - for i in range(0, count): - ports.append(FakePort.create_one_port(attrs)) - - return ports - - @staticmethod - def get_ports(ports=None, count=2): - """Get an iterable Mock object with a list of faked ports. - - If ports list is provided, then initialize the Mock object with the - list. Otherwise create one. - - :param List ports: - A list of FakeResource objects faking ports - :param int count: - The number of ports to fake - :return: - An iterable Mock object with side_effect set to a list of faked - ports - """ - if ports is None: - ports = FakePort.create_ports(count) - return mock.Mock(side_effect=ports) - - -class FakeNetworkAgent(object): - """Fake one or more network agents.""" - - @staticmethod - def create_one_network_agent(attrs=None): - """Create a fake network agent - - :param Dictionary attrs: - A dictionary with all attributes - :return: - A FakeResource object, with id, agent_type, and so on. - """ - attrs = attrs or {} - - # Set default attributes - agent_attrs = { - 'id': 'agent-id-' + uuid.uuid4().hex, - 'agent_type': 'agent-type-' + uuid.uuid4().hex, - 'host': 'host-' + uuid.uuid4().hex, - 'availability_zone': 'zone-' + uuid.uuid4().hex, - 'alive': True, - 'admin_state_up': True, - 'binary': 'binary-' + uuid.uuid4().hex, - 'configurations': {'subnet': 2, 'networks': 1}, - 'location': 'MUNCHMUNCHMUNCH', - } - agent_attrs.update(attrs) - agent = fakes.FakeResource(info=copy.deepcopy(agent_attrs), - loaded=True) - agent.is_admin_state_up = agent_attrs['admin_state_up'] - agent.is_alive = agent_attrs['alive'] - return agent - - @staticmethod - def create_network_agents(attrs=None, count=2): - """Create multiple fake network agents. - - :param Dictionary attrs: - A dictionary with all attributes - :param int count: - The number of network agents to fake - :return: - A list of FakeResource objects faking the network agents - """ - agents = [] - for i in range(0, count): - agents.append(FakeNetworkAgent.create_one_network_agent(attrs)) - - return agents - - @staticmethod - def get_network_agents(agents=None, count=2): - """Get an iterable Mock object with a list of faked network agents. - - If network agents list is provided, then initialize the Mock object - with the list. Otherwise create one. - - :param List agents: - A list of FakeResource objects faking network agents - :param int count: - The number of network agents to fake - :return: - An iterable Mock object with side_effect set to a list of faked - network agents - """ - if agents is None: - agents = FakeNetworkAgent.create_network_agents(count) - return mock.Mock(side_effect=agents) - - -class FakeNetworkRBAC(object): - """Fake one or more network rbac policies.""" - - @staticmethod - def create_one_network_rbac(attrs=None): - """Create a fake network rbac - - :param Dictionary attrs: - A dictionary with all attributes - :return: - A FakeResource object, with id, action, target_tenant, - project_id, type - """ - attrs = attrs or {} - - # Set default attributes - rbac_attrs = { - 'id': 'rbac-id-' + uuid.uuid4().hex, - 'object_type': 'network', - 'object_id': 'object-id-' + uuid.uuid4().hex, - 'action': 'access_as_shared', - 'target_tenant': 'target-tenant-' + uuid.uuid4().hex, - 'project_id': 'project-id-' + uuid.uuid4().hex, - 'location': 'MUNCHMUNCHMUNCH', - } - rbac_attrs.update(attrs) - rbac = fakes.FakeResource(info=copy.deepcopy(rbac_attrs), - loaded=True) - # Set attributes with special mapping in OpenStack SDK. - rbac.target_project_id = rbac_attrs['target_tenant'] - return rbac - - @staticmethod - def create_network_rbacs(attrs=None, count=2): - """Create multiple fake network rbac policies. - - :param Dictionary attrs: - A dictionary with all attributes - :param int count: - The number of rbac policies to fake - :return: - A list of FakeResource objects faking the rbac policies - """ - rbac_policies = [] - for i in range(0, count): - rbac_policies.append(FakeNetworkRBAC. - create_one_network_rbac(attrs)) - - return rbac_policies - - @staticmethod - def get_network_rbacs(rbac_policies=None, count=2): - """Get an iterable Mock object with a list of faked rbac policies. - - If rbac policies list is provided, then initialize the Mock object - with the list. Otherwise create one. - - :param List rbac_policies: - A list of FakeResource objects faking rbac policies - :param int count: - The number of rbac policies to fake - :return: - An iterable Mock object with side_effect set to a list of faked - rbac policies - """ - if rbac_policies is None: - rbac_policies = FakeNetworkRBAC.create_network_rbacs(count) - return mock.Mock(side_effect=rbac_policies) - - -class FakeNetworkFlavorProfile(object): - """Fake network flavor profile.""" - - @staticmethod - def create_one_service_profile(attrs=None): - """Create flavor profile.""" - attrs = attrs or {} - - flavor_profile_attrs = { - 'id': 'flavor-profile-id' + uuid.uuid4().hex, - 'description': 'flavor-profile-description-' + uuid.uuid4().hex, - 'project_id': 'project-id-' + uuid.uuid4().hex, - 'driver': 'driver-' + uuid.uuid4().hex, - 'metainfo': 'metainfo-' + uuid.uuid4().hex, - 'enabled': True, - 'location': 'MUNCHMUNCHMUNCH', - } - - flavor_profile_attrs.update(attrs) - - flavor_profile = fakes.FakeResource( - info=copy.deepcopy(flavor_profile_attrs), - loaded=True) - - flavor_profile.is_enabled = flavor_profile_attrs['enabled'] - - return flavor_profile - - @staticmethod - def create_service_profile(attrs=None, count=2): - """Create multiple flavor profiles.""" - - flavor_profiles = [] - for i in range(0, count): - flavor_profiles.append(FakeNetworkFlavorProfile. - create_one_service_profile(attrs)) - return flavor_profiles - - @staticmethod - def get_service_profile(flavor_profile=None, count=2): - """Get a list of flavor profiles.""" - if flavor_profile is None: - flavor_profile = (FakeNetworkFlavorProfile. - create_service_profile(count)) - return mock.Mock(side_effect=flavor_profile) - - class FakeNetworkQosPolicy(object): """Fake one or more QoS policies.""" @@ -2038,6 +1210,737 @@ class FakeL3ConntrackHelper(object): return mock.Mock(side_effect=ct_helpers) +def create_one_address_group(attrs=None): + """Create a fake address group. + + :param Dictionary attrs: + A dictionary with all attributes + :return: + An AddressGroup object with name, id, etc. + """ + attrs = attrs or {} + + # Set default attributes. + address_group_attrs = { + 'name': 'address-group-name-' + uuid.uuid4().hex, + 'description': 'address-group-description-' + uuid.uuid4().hex, + 'id': 'address-group-id-' + uuid.uuid4().hex, + 'project_id': 'project-id-' + uuid.uuid4().hex, + 'addresses': ['10.0.0.1/32'], + 'location': 'MUNCHMUNCHMUNCH', + } + + # Overwrite default attributes. + address_group_attrs.update(attrs) + + address_group = _address_group.AddressGroup(**address_group_attrs) + + return address_group + + +def create_address_groups(attrs=None, count=2): + """Create multiple fake address groups. + + :param Dictionary attrs: + A dictionary with all attributes + :param int count: + The number of address groups to fake + :return: + A list of AddressGroup objects faking the address groups + """ + address_groups = [] + for i in range(0, count): + address_groups.append(create_one_address_group(attrs)) + + return address_groups + + +def get_address_groups(address_groups=None, count=2): + """Get an iterable Mock object with a list of faked address groups. + + If address groups list is provided, then initialize the Mock object + with the list. Otherwise create one. + + :param List address_groups: + A list of FakeResource objects faking address groups + :param int count: + The number of address groups to fake + :return: + An iterable Mock object with side_effect set to a list of faked + AddressGroup objects + """ + if address_groups is None: + address_groups = create_address_groups(count) + return mock.Mock(side_effect=address_groups) + + +def create_one_address_scope(attrs=None): + """Create a fake address scope. + + :param Dictionary attrs: + A dictionary with all attributes + :return: + An AddressScope object with name, id, etc. + """ + attrs = attrs or {} + + # Set default attributes. + address_scope_attrs = { + 'name': 'address-scope-name-' + uuid.uuid4().hex, + 'id': 'address-scope-id-' + uuid.uuid4().hex, + 'project_id': 'project-id-' + uuid.uuid4().hex, + 'shared': False, + 'ip_version': 4, + 'location': 'MUNCHMUNCHMUNCH', + } + + # Overwrite default attributes. + address_scope_attrs.update(attrs) + + address_scope = _address_scope.AddressScope(**address_scope_attrs) + + # Set attributes with special mapping in OpenStack SDK. + address_scope.is_shared = address_scope_attrs['shared'] + + return address_scope + + +def create_address_scopes(attrs=None, count=2): + """Create multiple fake address scopes. + + :param Dictionary attrs: + A dictionary with all attributes + :param int count: + The number of address scopes to fake + :return: + A list of AddressScope objects faking the address scopes + """ + address_scopes = [] + for i in range(0, count): + address_scopes.append(create_one_address_scope(attrs)) + + return address_scopes + + +def get_address_scopes(address_scopes=None, count=2): + """Get an iterable Mock object with a list of faked address scopes. + + If address scopes list is provided, then initialize the Mock object + with the list. Otherwise create one. + + :param List address_scopes: + A list of FakeResource objects faking address scopes + :param int count: + The number of address scopes to fake + :return: + An iterable Mock object with side_effect set to a list of faked + AddressScope objects + """ + if address_scopes is None: + address_scopes = create_address_scopes(count) + return mock.Mock(side_effect=address_scopes) + + +def create_one_topology(attrs=None): + attrs = attrs or {} + + auto_allocated_topology_attrs = { + 'id': 'network-id-' + uuid.uuid4().hex, + 'project_id': 'project-id-' + uuid.uuid4().hex, + } + + auto_allocated_topology_attrs.update(attrs) + + auto_allocated_topology = allocated_topology.AutoAllocatedTopology( + **auto_allocated_topology_attrs + ) + + return auto_allocated_topology + + +def create_one_availability_zone(attrs=None): + """Create a fake AZ. + + :param Dictionary attrs: + A dictionary with all attributes + :return: + An AvailabilityZone object with name, state, etc. + """ + attrs = attrs or {} + + # Set default attributes. + availability_zone = { + 'name': uuid.uuid4().hex, + 'state': 'available', + 'resource': 'network', + } + + # Overwrite default attributes. + availability_zone.update(attrs) + + availability_zone = _availability_zone.AvailabilityZone( + **availability_zone + ) + return availability_zone + + +def create_availability_zones(attrs=None, count=2): + """Create multiple fake AZs. + + :param Dictionary attrs: + A dictionary with all attributes + :param int count: + The number of AZs to fake + :return: + A list of AvailabilityZone objects faking the AZs + """ + availability_zones = [] + for i in range(0, count): + availability_zone = create_one_availability_zone(attrs) + availability_zones.append(availability_zone) + + return availability_zones + + +def create_one_ip_availability(attrs=None): + """Create a fake list with ip availability stats of a network. + + :param Dictionary attrs: + A dictionary with all attributes + :return: + A NetworkIPAvailability object with network_name, network_id, etc. + """ + attrs = attrs or {} + + # Set default attributes. + network_ip_attrs = { + 'network_id': 'network-id-' + uuid.uuid4().hex, + 'network_name': 'network-name-' + uuid.uuid4().hex, + 'project_id': '', + 'subnet_ip_availability': [], + 'total_ips': 254, + 'used_ips': 6, + 'location': 'MUNCHMUNCHMUNCH', + } + network_ip_attrs.update(attrs) + + network_ip_availability = _ip_availability.NetworkIPAvailability( + **network_ip_attrs) + + return network_ip_availability + + +def create_ip_availability(count=2): + """Create fake list of ip availability stats of multiple networks. + + :param int count: + The number of networks to fake + :return: + A list of NetworkIPAvailability objects faking + network ip availability stats + """ + network_ip_availabilities = [] + for i in range(0, count): + network_ip_availability = create_one_ip_availability() + network_ip_availabilities.append(network_ip_availability) + + return network_ip_availabilities + + +def create_one_network(attrs=None): + """Create a fake network. + + :param Dictionary attrs: + A dictionary with all attributes + :return: + An Network object, with id, name, etc. + """ + attrs = attrs or {} + + # Set default attributes. + network_attrs = { + 'created_at': '2021-11-29T10:10:23.000000', + 'id': 'network-id-' + uuid.uuid4().hex, + 'name': 'network-name-' + uuid.uuid4().hex, + 'status': 'ACTIVE', + 'description': 'network-description-' + uuid.uuid4().hex, + 'dns_domain': 'example.org.', + 'mtu': '1350', + 'project_id': 'project-id-' + uuid.uuid4().hex, + 'admin_state_up': True, + 'shared': False, + 'subnets': ['a', 'b'], + 'segments': 'network-segment-' + uuid.uuid4().hex, + 'provider:network_type': 'vlan', + 'provider:physical_network': 'physnet1', + 'provider:segmentation_id': "400", + 'router:external': True, + 'availability_zones': [], + 'availability_zone_hints': [], + 'is_default': False, + 'is_vlan_transparent': True, + 'port_security_enabled': True, + 'qos_policy_id': 'qos-policy-id-' + uuid.uuid4().hex, + 'ipv4_address_scope': 'ipv4' + uuid.uuid4().hex, + 'ipv6_address_scope': 'ipv6' + uuid.uuid4().hex, + 'tags': [], + 'location': 'MUNCHMUNCHMUNCH', + 'updated_at': '2021-11-29T10:10:25.000000', + } + + # Overwrite default attributes. + network_attrs.update(attrs) + + network = _network.Network(**network_attrs) + + return network + + +def create_networks(attrs=None, count=2): + """Create multiple fake networks. + + :param Dictionary attrs: + A dictionary with all attributes + :param int count: + The number of networks to fake + :return: + A list of Network objects faking the networks + """ + networks = [] + for i in range(0, count): + networks.append(create_one_network(attrs)) + + return networks + + +def get_networks(networks=None, count=2): + """Get an iterable Mock object with a list of faked networks. + + If networks list is provided, then initialize the Mock object with the + list. Otherwise create one. + + :param List networks: + A list of Network objects faking networks + :param int count: + The number of networks to fake + :return: + An iterable Mock object with side_effect set to a list of faked + networks + """ + if networks is None: + networks = create_networks(count) + return mock.Mock(side_effect=networks) + + +def create_one_network_flavor(attrs=None): + """Create a fake network flavor. + + :param Dictionary attrs: + A dictionary with all attributes + :return: + A Flavor object faking the network flavor + """ + attrs = attrs or {} + + fake_uuid = uuid.uuid4().hex + network_flavor_attrs = { + 'description': 'network-flavor-description-' + fake_uuid, + 'is_enabled': True, + 'id': 'network-flavor-id-' + fake_uuid, + 'name': 'network-flavor-name-' + fake_uuid, + 'service_type': 'vpn', + 'location': 'MUNCHMUNCHMUNCH', + } + + # Overwrite default attributes. + network_flavor_attrs.update(attrs) + + network_flavor = _flavor.Flavor(**network_flavor_attrs) + + return network_flavor + + +def create_flavor(attrs=None, count=2): + """Create multiple fake network flavors. + + :param Dictionary attrs: + A dictionary with all attributes + :param int count: + The number of network flavors to fake + :return: + A list of Flavor objects faking the network falvors + """ + network_flavors = [] + for i in range(0, count): + network_flavors.append(create_one_network_flavor(attrs)) + + return network_flavors + + +def get_flavor(network_flavors=None, count=2): + """Get a list of flavors.""" + if network_flavors is None: + network_flavors = create_flavor(count) + return mock.Mock(side_effect=network_flavors) + + +def create_one_network_segment(attrs=None): + """Create a fake network segment. + + :param Dictionary attrs: + A dictionary with all attributes + :return: + An Segment object faking the network segment + """ + attrs = attrs or {} + + # Set default attributes. + fake_uuid = uuid.uuid4().hex + network_segment_attrs = { + 'description': 'network-segment-description-' + fake_uuid, + 'id': 'network-segment-id-' + fake_uuid, + 'name': 'network-segment-name-' + fake_uuid, + 'network_id': 'network-id-' + fake_uuid, + 'network_type': 'vlan', + 'physical_network': 'physical-network-name-' + fake_uuid, + 'segmentation_id': 1024, + 'location': 'MUNCHMUNCHMUNCH', + } + + # Overwrite default attributes. + network_segment_attrs.update(attrs) + + network_segment = _segment.Segment(**network_segment_attrs) + + return network_segment + + +def create_network_segments(attrs=None, count=2): + """Create multiple fake network segments. + + :param Dictionary attrs: + A dictionary with all attributes + :param int count: + The number of network segments to fake + :return: + A list of Segment objects faking the network segments + """ + network_segments = [] + for i in range(0, count): + network_segments.append(create_one_network_segment(attrs)) + return network_segments + + +def create_one_network_segment_range(attrs=None): + """Create a fake network segment range. + + :param Dictionary attrs: + A dictionary with all attributes + :return: + A NetworkSegmentRange object faking the network segment range + """ + attrs = attrs or {} + + # Set default attributes. + fake_uuid = uuid.uuid4().hex + network_segment_range_attrs = { + 'id': 'network-segment-range-id-' + fake_uuid, + 'name': 'network-segment-name-' + fake_uuid, + 'default': False, + 'shared': False, + 'project_id': 'project-id-' + fake_uuid, + 'network_type': 'vlan', + 'physical_network': 'physical-network-name-' + fake_uuid, + 'minimum': 100, + 'maximum': 106, + 'used': {104: '3312e4ba67864b2eb53f3f41432f8efc', + 106: '3312e4ba67864b2eb53f3f41432f8efc'}, + 'available': [100, 101, 102, 103, 105], + 'location': 'MUNCHMUNCHMUNCH', + } + + # Overwrite default attributes. + network_segment_range_attrs.update(attrs) + + network_segment_range = ( + _segment_range.NetworkSegmentRange(**network_segment_range_attrs)) + + return network_segment_range + + +def create_network_segment_ranges(attrs=None, count=2): + """Create multiple fake network segment ranges. + + :param Dictionary attrs: + A dictionary with all attributes + :param int count: + The number of network segment ranges to fake + :return: + A list of NetworkSegmentRange objects faking + the network segment ranges + """ + network_segment_ranges = [] + for i in range(0, count): + network_segment_ranges.append(create_one_network_segment_range(attrs)) + return network_segment_ranges + + +def create_one_port(attrs=None): + """Create a fake port. + + :param Dictionary attrs: + A dictionary with all attributes + :return: + A Port object, with id, name, etc. + """ + attrs = attrs or {} + + # Set default attributes. + port_attrs = { + 'is_admin_state_up': True, + 'allowed_address_pairs': [{}], + 'binding:host_id': 'binding-host-id-' + uuid.uuid4().hex, + 'binding:profile': {}, + 'binding:vif_details': {}, + 'binding:vif_type': 'ovs', + 'binding:vnic_type': 'normal', + 'data_plane_status': None, + 'description': 'description-' + uuid.uuid4().hex, + 'device_id': 'device-id-' + uuid.uuid4().hex, + 'device_owner': 'compute:nova', + 'device_profile': 'cyborg_device_profile_1', + 'dns_assignment': [{}], + 'dns_domain': 'dns-domain-' + uuid.uuid4().hex, + 'dns_name': 'dns-name-' + uuid.uuid4().hex, + 'extra_dhcp_opts': [{}], + 'fixed_ips': [{'ip_address': '10.0.0.3', + 'subnet_id': 'subnet-id-' + uuid.uuid4().hex}], + 'id': 'port-id-' + uuid.uuid4().hex, + 'mac_address': 'fa:16:3e:a9:4e:72', + 'name': 'port-name-' + uuid.uuid4().hex, + 'network_id': 'network-id-' + uuid.uuid4().hex, + 'numa_affinity_policy': 'required', + 'is_port_security_enabled': True, + 'security_group_ids': [], + 'status': 'ACTIVE', + 'project_id': 'project-id-' + uuid.uuid4().hex, + 'qos_network_policy_id': 'qos-policy-id-' + uuid.uuid4().hex, + 'qos_policy_id': 'qos-policy-id-' + uuid.uuid4().hex, + 'tags': [], + 'propagate_uplink_status': False, + 'location': 'MUNCHMUNCHMUNCH', + } + + # Overwrite default attributes. + port_attrs.update(attrs) + + port = _port.Port(**port_attrs) + + return port + + +def create_ports(attrs=None, count=2): + """Create multiple fake ports. + + :param Dictionary attrs: + A dictionary with all attributes + :param int count: + The number of ports to fake + :return: + A list of Port objects faking the ports + """ + ports = [] + for i in range(0, count): + ports.append(create_one_port(attrs)) + + return ports + + +def get_ports(ports=None, count=2): + """Get an iterable Mock object with a list of faked ports. + + If ports list is provided, then initialize the Mock object with the + list. Otherwise create one. + + :param List ports: + A list of Port objects faking ports + :param int count: + The number of ports to fake + :return: + An iterable Mock object with side_effect set to a list of faked + ports + """ + if ports is None: + ports = create_ports(count) + return mock.Mock(side_effect=ports) + + +def create_one_network_agent(attrs=None): + """Create a fake network agent + + :param Dictionary attrs: + A dictionary with all attributes + :return: + An Agent object, with id, agent_type, and so on. + """ + attrs = attrs or {} + + # Set default attributes + agent_attrs = { + 'id': 'agent-id-' + uuid.uuid4().hex, + 'agent_type': 'agent-type-' + uuid.uuid4().hex, + 'host': 'host-' + uuid.uuid4().hex, + 'availability_zone': 'zone-' + uuid.uuid4().hex, + 'alive': True, + 'admin_state_up': True, + 'binary': 'binary-' + uuid.uuid4().hex, + 'configurations': {'subnet': 2, 'networks': 1}, + 'location': 'MUNCHMUNCHMUNCH', + } + agent_attrs.update(attrs) + agent = network_agent.Agent(**agent_attrs) + + return agent + + +def create_network_agents(attrs=None, count=2): + """Create multiple fake network agents. + + :param Dictionary attrs: + A dictionary with all attributes + :param int count: + The number of network agents to fake + :return: + A list of Agent objects faking the network agents + """ + agents = [] + for i in range(0, count): + agents.append(create_one_network_agent(attrs)) + + return agents + + +def get_network_agents(agents=None, count=2): + """Get an iterable Mock object with a list of faked network agents. + + If network agents list is provided, then initialize the Mock object + with the list. Otherwise create one. + + :param List agents: + A list of Agent objects faking network agents + :param int count: + The number of network agents to fake + :return: + An iterable Mock object with side_effect set to a list of faked + network agents + """ + if agents is None: + agents = create_network_agents(count) + return mock.Mock(side_effect=agents) + + +def create_one_network_rbac(attrs=None): + """Create a fake network rbac + + :param Dictionary attrs: + A dictionary with all attributes + :return: + A RBACPolicy object, with id, action, target_tenant, + project_id, type + """ + attrs = attrs or {} + + # Set default attributes + rbac_attrs = { + 'id': 'rbac-id-' + uuid.uuid4().hex, + 'object_type': 'network', + 'object_id': 'object-id-' + uuid.uuid4().hex, + 'action': 'access_as_shared', + 'target_tenant': 'target-tenant-' + uuid.uuid4().hex, + 'project_id': 'project-id-' + uuid.uuid4().hex, + 'location': 'MUNCHMUNCHMUNCH', + } + + rbac_attrs.update(attrs) + rbac = network_rbac.RBACPolicy(**rbac_attrs) + + return rbac + + +def create_network_rbacs(attrs=None, count=2): + """Create multiple fake network rbac policies. + + :param Dictionary attrs: + A dictionary with all attributes + :param int count: + The number of rbac policies to fake + :return: + A list of RBACPolicy objects faking the rbac policies + """ + rbac_policies = [] + for i in range(0, count): + rbac_policies.append(create_one_network_rbac(attrs)) + + return rbac_policies + + +def get_network_rbacs(rbac_policies=None, count=2): + """Get an iterable Mock object with a list of faked rbac policies. + + If rbac policies list is provided, then initialize the Mock object + with the list. Otherwise create one. + + :param List rbac_policies: + A list of RBACPolicy objects faking rbac policies + :param int count: + The number of rbac policies to fake + :return: + An iterable Mock object with side_effect set to a list of faked + rbac policies + """ + if rbac_policies is None: + rbac_policies = create_network_rbacs(count) + return mock.Mock(side_effect=rbac_policies) + + +def create_one_service_profile(attrs=None): + """Create flavor profile.""" + attrs = attrs or {} + + flavor_profile_attrs = { + 'id': 'flavor-profile-id' + uuid.uuid4().hex, + 'description': 'flavor-profile-description-' + uuid.uuid4().hex, + 'project_id': 'project-id-' + uuid.uuid4().hex, + 'driver': 'driver-' + uuid.uuid4().hex, + 'metainfo': 'metainfo-' + uuid.uuid4().hex, + 'enabled': True, + 'location': 'MUNCHMUNCHMUNCH', + } + + flavor_profile_attrs.update(attrs) + + flavor_profile = _flavor_profile.ServiceProfile(**flavor_profile_attrs) + + return flavor_profile + + +def create_service_profile(attrs=None, count=2): + """Create multiple flavor profiles.""" + + flavor_profiles = [] + for i in range(0, count): + flavor_profiles.append(create_one_service_profile(attrs)) + return flavor_profiles + + +def get_service_profile(flavor_profile=None, count=2): + """Get a list of flavor profiles.""" + if flavor_profile is None: + flavor_profile = create_service_profile(count) + + return mock.Mock(side_effect=flavor_profile) + + def create_one_local_ip(attrs=None): """Create a fake local ip. diff --git a/openstackclient/tests/unit/network/v2/test_address_group.py b/openstackclient/tests/unit/network/v2/test_address_group.py index 703ab74d..f550db69 100644 --- a/openstackclient/tests/unit/network/v2/test_address_group.py +++ b/openstackclient/tests/unit/network/v2/test_address_group.py @@ -41,7 +41,7 @@ class TestCreateAddressGroup(TestAddressGroup): domain = identity_fakes_v3.FakeDomain.create_one_domain() # The new address group created. new_address_group = ( - network_fakes.FakeAddressGroup.create_one_address_group( + network_fakes.create_one_address_group( attrs={ 'project_id': project.id, } @@ -133,16 +133,13 @@ class TestCreateAddressGroup(TestAddressGroup): class TestDeleteAddressGroup(TestAddressGroup): # The address group to delete. - _address_groups = ( - network_fakes.FakeAddressGroup.create_address_groups(count=2)) + _address_groups = network_fakes.create_address_groups(count=2) def setUp(self): super(TestDeleteAddressGroup, self).setUp() self.network.delete_address_group = mock.Mock(return_value=None) - self.network.find_address_group = ( - network_fakes.FakeAddressGroup.get_address_groups( - address_groups=self._address_groups) - ) + self.network.find_address_group = network_fakes.get_address_groups( + address_groups=self._address_groups) # Get the command object to test self.cmd = address_group.DeleteAddressGroup(self.app, self.namespace) @@ -216,8 +213,7 @@ class TestDeleteAddressGroup(TestAddressGroup): class TestListAddressGroup(TestAddressGroup): # The address groups to list up. - address_groups = ( - network_fakes.FakeAddressGroup.create_address_groups(count=3)) + address_groups = network_fakes.create_address_groups(count=3) columns = ( 'ID', 'Name', @@ -308,7 +304,7 @@ class TestListAddressGroup(TestAddressGroup): class TestSetAddressGroup(TestAddressGroup): # The address group to set. - _address_group = network_fakes.FakeAddressGroup.create_one_address_group() + _address_group = network_fakes.create_one_address_group() def setUp(self): super(TestSetAddressGroup, self).setUp() @@ -392,7 +388,7 @@ class TestSetAddressGroup(TestAddressGroup): class TestShowAddressGroup(TestAddressGroup): # The address group to show. - _address_group = network_fakes.FakeAddressGroup.create_one_address_group() + _address_group = network_fakes.create_one_address_group() columns = ( 'addresses', 'description', @@ -444,7 +440,7 @@ class TestShowAddressGroup(TestAddressGroup): class TestUnsetAddressGroup(TestAddressGroup): # The address group to unset. - _address_group = network_fakes.FakeAddressGroup.create_one_address_group() + _address_group = network_fakes.create_one_address_group() def setUp(self): super(TestUnsetAddressGroup, self).setUp() diff --git a/openstackclient/tests/unit/network/v2/test_address_scope.py b/openstackclient/tests/unit/network/v2/test_address_scope.py index 7e7c4215..d4c83528 100644 --- a/openstackclient/tests/unit/network/v2/test_address_scope.py +++ b/openstackclient/tests/unit/network/v2/test_address_scope.py @@ -40,12 +40,10 @@ class TestCreateAddressScope(TestAddressScope): project = identity_fakes_v3.FakeProject.create_one_project() domain = identity_fakes_v3.FakeDomain.create_one_domain() # The new address scope created. - new_address_scope = ( - network_fakes.FakeAddressScope.create_one_address_scope( - attrs={ - 'project_id': project.id, - } - )) + new_address_scope = network_fakes.create_one_address_scope( + attrs={ + 'project_id': project.id, + }) columns = ( 'id', 'ip_version', @@ -58,7 +56,7 @@ class TestCreateAddressScope(TestAddressScope): new_address_scope.ip_version, new_address_scope.name, new_address_scope.project_id, - new_address_scope.shared, + new_address_scope.is_shared, ) def setUp(self): @@ -153,16 +151,13 @@ class TestCreateAddressScope(TestAddressScope): class TestDeleteAddressScope(TestAddressScope): # The address scope to delete. - _address_scopes = ( - network_fakes.FakeAddressScope.create_address_scopes(count=2)) + _address_scopes = network_fakes.create_address_scopes(count=2) def setUp(self): super(TestDeleteAddressScope, self).setUp() self.network.delete_address_scope = mock.Mock(return_value=None) - self.network.find_address_scope = ( - network_fakes.FakeAddressScope.get_address_scopes( - address_scopes=self._address_scopes) - ) + self.network.find_address_scope = network_fakes.get_address_scopes( + address_scopes=self._address_scopes) # Get the command object to test self.cmd = address_scope.DeleteAddressScope(self.app, self.namespace) @@ -237,8 +232,7 @@ class TestDeleteAddressScope(TestAddressScope): class TestListAddressScope(TestAddressScope): # The address scopes to list up. - address_scopes = ( - network_fakes.FakeAddressScope.create_address_scopes(count=3)) + address_scopes = network_fakes.create_address_scopes(count=3) columns = ( 'ID', 'Name', @@ -252,7 +246,7 @@ class TestListAddressScope(TestAddressScope): scope.id, scope.name, scope.ip_version, - scope.shared, + scope.is_shared, scope.project_id, )) @@ -377,7 +371,7 @@ class TestListAddressScope(TestAddressScope): class TestSetAddressScope(TestAddressScope): # The address scope to set. - _address_scope = network_fakes.FakeAddressScope.create_one_address_scope() + _address_scope = network_fakes.create_one_address_scope() def setUp(self): super(TestSetAddressScope, self).setUp() @@ -448,7 +442,7 @@ class TestShowAddressScope(TestAddressScope): # The address scope to show. _address_scope = ( - network_fakes.FakeAddressScope.create_one_address_scope()) + network_fakes.create_one_address_scope()) columns = ( 'id', 'ip_version', @@ -461,7 +455,7 @@ class TestShowAddressScope(TestAddressScope): _address_scope.ip_version, _address_scope.name, _address_scope.project_id, - _address_scope.shared, + _address_scope.is_shared, ) def setUp(self): diff --git a/openstackclient/tests/unit/network/v2/test_floating_ip_network.py b/openstackclient/tests/unit/network/v2/test_floating_ip_network.py index 5b5c83a5..f76dcc79 100644 --- a/openstackclient/tests/unit/network/v2/test_floating_ip_network.py +++ b/openstackclient/tests/unit/network/v2/test_floating_ip_network.py @@ -40,9 +40,9 @@ class TestFloatingIPNetwork(network_fakes.TestNetworkV2): class TestCreateFloatingIPNetwork(TestFloatingIPNetwork): # Fake data for option tests. - floating_network = network_fakes.FakeNetwork.create_one_network() + floating_network = network_fakes.create_one_network() subnet = network_fakes.FakeSubnet.create_one_subnet() - port = network_fakes.FakePort.create_one_port() + port = network_fakes.create_one_port() # The floating ip created. floating_ip = network_fakes.FakeFloatingIP.create_one_floating_ip( @@ -378,10 +378,10 @@ class TestListFloatingIPNetwork(TestFloatingIPNetwork): # The floating ips to list up floating_ips = network_fakes.FakeFloatingIP.create_floating_ips(count=3) - fake_network = network_fakes.FakeNetwork.create_one_network({ + fake_network = network_fakes.create_one_network({ 'id': 'fake_network_id', }) - fake_port = network_fakes.FakePort.create_one_port({ + fake_port = network_fakes.create_one_port({ 'id': 'fake_port_id', }) fake_router = network_fakes.FakeRouter.create_one_router({ @@ -700,9 +700,9 @@ class TestShowFloatingIPNetwork(TestFloatingIPNetwork): class TestSetFloatingIP(TestFloatingIPNetwork): # Fake data for option tests. - floating_network = network_fakes.FakeNetwork.create_one_network() + floating_network = network_fakes.create_one_network() subnet = network_fakes.FakeSubnet.create_one_subnet() - port = network_fakes.FakePort.create_one_port() + port = network_fakes.create_one_port() # The floating ip to be set. floating_ip = network_fakes.FakeFloatingIP.create_one_floating_ip( @@ -932,9 +932,9 @@ class TestSetFloatingIP(TestFloatingIPNetwork): class TestUnsetFloatingIP(TestFloatingIPNetwork): - floating_network = network_fakes.FakeNetwork.create_one_network() + floating_network = network_fakes.create_one_network() subnet = network_fakes.FakeSubnet.create_one_subnet() - port = network_fakes.FakePort.create_one_port() + port = network_fakes.create_one_port() # The floating ip to be unset. floating_ip = network_fakes.FakeFloatingIP.create_one_floating_ip( diff --git a/openstackclient/tests/unit/network/v2/test_floating_ip_port_forwarding.py b/openstackclient/tests/unit/network/v2/test_floating_ip_port_forwarding.py index 7b9e3aa6..97399f43 100644 --- a/openstackclient/tests/unit/network/v2/test_floating_ip_port_forwarding.py +++ b/openstackclient/tests/unit/network/v2/test_floating_ip_port_forwarding.py @@ -31,7 +31,7 @@ class TestFloatingIPPortForwarding(network_fakes.TestNetworkV2): self.network = self.app.client_manager.network self.floating_ip = (network_fakes.FakeFloatingIP. create_one_floating_ip()) - self.port = network_fakes.FakePort.create_one_port() + self.port = network_fakes.create_one_port() self.project = identity_fakes_v2.FakeProject.create_one_project() self.network.find_port = mock.Mock(return_value=self.port) diff --git a/openstackclient/tests/unit/network/v2/test_ip_availability.py b/openstackclient/tests/unit/network/v2/test_ip_availability.py index 880cf581..fbe3b1ab 100644 --- a/openstackclient/tests/unit/network/v2/test_ip_availability.py +++ b/openstackclient/tests/unit/network/v2/test_ip_availability.py @@ -38,8 +38,7 @@ class TestIPAvailability(network_fakes.TestNetworkV2): class TestListIPAvailability(TestIPAvailability): - _ip_availability = \ - network_fakes.FakeIPAvailability.create_ip_availability(count=3) + _ip_availability = network_fakes.create_ip_availability(count=3) columns = ( 'Network ID', 'Network Name', @@ -117,10 +116,9 @@ class TestListIPAvailability(TestIPAvailability): class TestShowIPAvailability(TestIPAvailability): - _network = network_fakes.FakeNetwork.create_one_network() - _ip_availability = \ - network_fakes.FakeIPAvailability.create_one_ip_availability( - attrs={'network_id': _network.id}) + _network = network_fakes.create_one_network() + _ip_availability = network_fakes.create_one_ip_availability( + attrs={'network_id': _network.id}) columns = ( 'network_id', diff --git a/openstackclient/tests/unit/network/v2/test_local_ip.py b/openstackclient/tests/unit/network/v2/test_local_ip.py index 17e8dcd1..97e246df 100644 --- a/openstackclient/tests/unit/network/v2/test_local_ip.py +++ b/openstackclient/tests/unit/network/v2/test_local_ip.py @@ -40,8 +40,8 @@ class TestLocalIP(network_fakes.TestNetworkV2): class TestCreateLocalIP(TestLocalIP): project = identity_fakes_v3.FakeProject.create_one_project() domain = identity_fakes_v3.FakeDomain.create_one_domain() - local_ip_network = network_fakes.FakeNetwork.create_one_network() - port = network_fakes.FakePort.create_one_port() + local_ip_network = network_fakes.create_one_network() + port = network_fakes.create_one_port() # The new local ip created. new_local_ip = network_fakes.create_one_local_ip( attrs={'project_id': project.id, @@ -216,7 +216,7 @@ class TestListLocalIP(TestLocalIP): # The local ip to list up. local_ips = ( network_fakes.create_local_ips(count=3)) - fake_network = network_fakes.FakeNetwork.create_one_network( + fake_network = network_fakes.create_one_network( {'id': 'fake_network_id'} ) diff --git a/openstackclient/tests/unit/network/v2/test_local_ip_association.py b/openstackclient/tests/unit/network/v2/test_local_ip_association.py index 97759302..0e453741 100644 --- a/openstackclient/tests/unit/network/v2/test_local_ip_association.py +++ b/openstackclient/tests/unit/network/v2/test_local_ip_association.py @@ -29,7 +29,7 @@ class TestLocalIPAssociation(network_fakes.TestNetworkV2): super().setUp() self.network = self.app.client_manager.network self.local_ip = network_fakes.create_one_local_ip() - self.fixed_port = network_fakes.FakePort.create_one_port() + self.fixed_port = network_fakes.create_one_port() self.project = identity_fakes_v2.FakeProject.create_one_project() self.network.find_port = mock.Mock(return_value=self.fixed_port) diff --git a/openstackclient/tests/unit/network/v2/test_network.py b/openstackclient/tests/unit/network/v2/test_network.py index 2b04edf5..6adb9e16 100644 --- a/openstackclient/tests/unit/network/v2/test_network.py +++ b/openstackclient/tests/unit/network/v2/test_network.py @@ -46,7 +46,7 @@ class TestCreateNetworkIdentityV3(TestNetwork): project = identity_fakes_v3.FakeProject.create_one_project() domain = identity_fakes_v3.FakeDomain.create_one_domain() # The new network created. - _network = network_fakes.FakeNetwork.create_one_network( + _network = network_fakes.create_one_network( attrs={ 'project_id': project.id, 'availability_zone_hints': ["nova"], @@ -59,12 +59,14 @@ class TestCreateNetworkIdentityV3(TestNetwork): 'admin_state_up', 'availability_zone_hints', 'availability_zones', + 'created_at', 'description', 'dns_domain', 'id', 'ipv4_address_scope', 'ipv6_address_scope', 'is_default', + 'is_vlan_transparent', 'mtu', 'name', 'port_security_enabled', @@ -76,14 +78,18 @@ class TestCreateNetworkIdentityV3(TestNetwork): 'router:external', 'shared', 'status', + 'segments', 'subnets', 'tags', + 'revision_number', + 'updated_at', ) data = ( - network.AdminStateColumn(_network.admin_state_up), + network.AdminStateColumn(_network.is_admin_state_up), format_columns.ListColumn(_network.availability_zone_hints), format_columns.ListColumn(_network.availability_zones), + _network.created_at, _network.description, _network.dns_domain, _network.id, @@ -99,10 +105,14 @@ class TestCreateNetworkIdentityV3(TestNetwork): _network.provider_segmentation_id, _network.qos_policy_id, network.RouterExternalColumn(_network.is_router_external), - _network.shared, + _network.is_shared, + _network.is_vlan_transparent, _network.status, - format_columns.ListColumn(_network.subnets), + _network.segments, + format_columns.ListColumn(_network.subnet_ids), format_columns.ListColumn(_network.tags), + _network.revision_number, + _network.updated_at, ) def setUp(self): @@ -145,7 +155,7 @@ class TestCreateNetworkIdentityV3(TestNetwork): 'name': self._network.name, }) self.assertFalse(self.network.set_tags.called) - self.assertEqual(self.columns, columns) + self.assertEqual(set(self.columns), set(columns)) self.assertCountEqual(self.data, data) def test_create_all_options(self): @@ -153,7 +163,7 @@ class TestCreateNetworkIdentityV3(TestNetwork): "--disable", "--share", "--description", self._network.description, - "--mtu", self._network.mtu, + "--mtu", str(self._network.mtu), "--project", self.project.name, "--project-domain", self.domain.name, "--availability-zone-hint", "nova", @@ -171,7 +181,7 @@ class TestCreateNetworkIdentityV3(TestNetwork): ('disable', True), ('share', True), ('description', self._network.description), - ('mtu', self._network.mtu), + ('mtu', str(self._network.mtu)), ('project', self.project.name), ('project_domain', self.domain.name), ('availability_zone_hints', ["nova"]), @@ -196,7 +206,7 @@ class TestCreateNetworkIdentityV3(TestNetwork): 'name': self._network.name, 'shared': True, 'description': self._network.description, - 'mtu': self._network.mtu, + 'mtu': str(self._network.mtu), 'project_id': self.project.id, 'is_default': True, 'router:external': True, @@ -208,7 +218,7 @@ class TestCreateNetworkIdentityV3(TestNetwork): 'port_security_enabled': True, 'dns_domain': 'example.org.', }) - self.assertEqual(self.columns, columns) + self.assertEqual(set(self.columns), set(columns)) self.assertCountEqual(self.data, data) def test_create_other_options(self): @@ -235,7 +245,7 @@ class TestCreateNetworkIdentityV3(TestNetwork): 'shared': False, 'port_security_enabled': False, }) - self.assertEqual(self.columns, columns) + self.assertEqual(set(self.columns), set(columns)) self.assertCountEqual(self.data, data) def _test_create_with_tag(self, add_tags=True): @@ -267,7 +277,7 @@ class TestCreateNetworkIdentityV3(TestNetwork): tests_utils.CompareBySet(['red', 'blue'])) else: self.assertFalse(self.network.set_tags.called) - self.assertEqual(self.columns, columns) + self.assertEqual(set(self.columns), set(columns)) self.assertCountEqual(self.data, data) def test_create_with_tags(self): @@ -281,20 +291,21 @@ class TestCreateNetworkIdentityV2(TestNetwork): project = identity_fakes_v2.FakeProject.create_one_project() # The new network created. - _network = network_fakes.FakeNetwork.create_one_network( + _network = network_fakes.create_one_network( attrs={'project_id': project.id} ) - columns = ( 'admin_state_up', 'availability_zone_hints', 'availability_zones', + 'created_at', 'description', 'dns_domain', 'id', 'ipv4_address_scope', 'ipv6_address_scope', 'is_default', + 'is_vlan_transparent', 'mtu', 'name', 'port_security_enabled', @@ -306,14 +317,18 @@ class TestCreateNetworkIdentityV2(TestNetwork): 'router:external', 'shared', 'status', + 'segments', 'subnets', 'tags', + 'revision_number', + 'updated_at', ) data = ( - network.AdminStateColumn(_network.admin_state_up), + network.AdminStateColumn(_network.is_admin_state_up), format_columns.ListColumn(_network.availability_zone_hints), format_columns.ListColumn(_network.availability_zones), + _network.created_at, _network.description, _network.dns_domain, _network.id, @@ -329,10 +344,14 @@ class TestCreateNetworkIdentityV2(TestNetwork): _network.provider_segmentation_id, _network.qos_policy_id, network.RouterExternalColumn(_network.is_router_external), - _network.shared, + _network.is_shared, + _network.is_vlan_transparent, _network.status, - format_columns.ListColumn(_network.subnets), + _network.segments, + format_columns.ListColumn(_network.subnet_ids), format_columns.ListColumn(_network.tags), + _network.revision_number, + _network.updated_at, ) def setUp(self): @@ -380,7 +399,7 @@ class TestCreateNetworkIdentityV2(TestNetwork): 'project_id': self.project.id, }) self.assertFalse(self.network.set_tags.called) - self.assertEqual(self.columns, columns) + self.assertEqual(set(self.columns), set(columns)) self.assertCountEqual(self.data, data) def test_create_with_domain_identityv2(self): @@ -413,11 +432,11 @@ class TestDeleteNetwork(TestNetwork): super(TestDeleteNetwork, self).setUp() # The networks to delete - self._networks = network_fakes.FakeNetwork.create_networks(count=3) + self._networks = network_fakes.create_networks(count=3) self.network.delete_network = mock.Mock(return_value=None) - self.network.find_network = network_fakes.FakeNetwork.get_networks( + self.network.find_network = network_fakes.get_networks( networks=self._networks) # Get the command object to test @@ -495,7 +514,7 @@ class TestDeleteNetwork(TestNetwork): class TestListNetwork(TestNetwork): # The networks going to be listed up. - _network = network_fakes.FakeNetwork.create_networks(count=3) + _network = network_fakes.create_networks(count=3) columns = ( 'ID', @@ -521,7 +540,7 @@ class TestListNetwork(TestNetwork): data.append(( net.id, net.name, - format_columns.ListColumn(net.subnets), + format_columns.ListColumn(net.subnet_ids), )) data_long = [] @@ -531,9 +550,9 @@ class TestListNetwork(TestNetwork): net.name, net.status, net.project_id, - network.AdminStateColumn(net.admin_state_up), - net.shared, - format_columns.ListColumn(net.subnets), + network.AdminStateColumn(net.is_admin_state_up), + net.is_shared, + format_columns.ListColumn(net.subnet_ids), net.provider_network_type, network.RouterExternalColumn(net.is_router_external), format_columns.ListColumn(net.availability_zones), @@ -549,7 +568,7 @@ class TestListNetwork(TestNetwork): self.network.networks = mock.Mock(return_value=self._network) self._agent = \ - network_fakes.FakeNetworkAgent.create_one_network_agent() + network_fakes.create_one_network_agent() self.network.get_agent = mock.Mock(return_value=self._agent) self.network.dhcp_agent_hosting_networks = mock.Mock( @@ -840,13 +859,12 @@ class TestListNetwork(TestNetwork): ('agent_id', self._agent.id), ] - attrs = {self._agent, } parsed_args = self.check_parser(self.cmd, arglist, verifylist) columns, data = self.cmd.take_action(parsed_args) self.network.dhcp_agent_hosting_networks.assert_called_once_with( - *attrs) + self._agent) self.assertEqual(self.columns, columns) self.assertCountEqual(list(data), list(self.data)) @@ -880,7 +898,7 @@ class TestListNetwork(TestNetwork): class TestSetNetwork(TestNetwork): # The network to set. - _network = network_fakes.FakeNetwork.create_one_network( + _network = network_fakes.create_one_network( {'tags': ['green', 'red']}) qos_policy = (network_fakes.FakeNetworkQosPolicy. create_one_qos_policy(attrs={'id': _network.qos_policy_id})) @@ -1025,18 +1043,19 @@ class TestSetNetwork(TestNetwork): class TestShowNetwork(TestNetwork): # The network to show. - _network = network_fakes.FakeNetwork.create_one_network() - + _network = network_fakes.create_one_network() columns = ( 'admin_state_up', 'availability_zone_hints', 'availability_zones', + 'created_at', 'description', 'dns_domain', 'id', 'ipv4_address_scope', 'ipv6_address_scope', 'is_default', + 'is_vlan_transparent', 'mtu', 'name', 'port_security_enabled', @@ -1048,14 +1067,18 @@ class TestShowNetwork(TestNetwork): 'router:external', 'shared', 'status', + 'segments', 'subnets', 'tags', + 'revision_number', + 'updated_at', ) data = ( - network.AdminStateColumn(_network.admin_state_up), + network.AdminStateColumn(_network.is_admin_state_up), format_columns.ListColumn(_network.availability_zone_hints), format_columns.ListColumn(_network.availability_zones), + _network.created_at, _network.description, _network.dns_domain, _network.id, @@ -1071,10 +1094,14 @@ class TestShowNetwork(TestNetwork): _network.provider_segmentation_id, _network.qos_policy_id, network.RouterExternalColumn(_network.is_router_external), - _network.shared, + _network.is_shared, + _network.is_vlan_transparent, _network.status, - format_columns.ListColumn(_network.subnets), + _network.segments, + format_columns.ListColumn(_network.subnet_ids), format_columns.ListColumn(_network.tags), + _network.revision_number, + _network.updated_at, ) def setUp(self): @@ -1106,14 +1133,14 @@ class TestShowNetwork(TestNetwork): self.network.find_network.assert_called_once_with( self._network.name, ignore_missing=False) - self.assertEqual(self.columns, columns) + self.assertEqual(set(self.columns), set(columns)) self.assertCountEqual(self.data, data) class TestUnsetNetwork(TestNetwork): # The network to set. - _network = network_fakes.FakeNetwork.create_one_network( + _network = network_fakes.create_one_network( {'tags': ['green', 'red']}) qos_policy = (network_fakes.FakeNetworkQosPolicy. create_one_qos_policy(attrs={'id': _network.qos_policy_id})) diff --git a/openstackclient/tests/unit/network/v2/test_network_agent.py b/openstackclient/tests/unit/network/v2/test_network_agent.py index 734a36ee..15c4c5de 100644 --- a/openstackclient/tests/unit/network/v2/test_network_agent.py +++ b/openstackclient/tests/unit/network/v2/test_network_agent.py @@ -33,8 +33,8 @@ class TestNetworkAgent(network_fakes.TestNetworkV2): class TestAddNetworkToAgent(TestNetworkAgent): - net = network_fakes.FakeNetwork.create_one_network() - agent = network_fakes.FakeNetworkAgent.create_one_network_agent() + net = network_fakes.create_one_network() + agent = network_fakes.create_one_network_agent() def setUp(self): super(TestAddNetworkToAgent, self).setUp() @@ -76,7 +76,7 @@ class TestAddNetworkToAgent(TestNetworkAgent): class TestAddRouterAgent(TestNetworkAgent): _router = network_fakes.FakeRouter.create_one_router() - _agent = network_fakes.FakeNetworkAgent.create_one_network_agent() + _agent = network_fakes.create_one_network_agent() def setUp(self): super(TestAddRouterAgent, self).setUp() @@ -115,8 +115,7 @@ class TestAddRouterAgent(TestNetworkAgent): class TestDeleteNetworkAgent(TestNetworkAgent): - network_agents = ( - network_fakes.FakeNetworkAgent.create_network_agents(count=2)) + network_agents = network_fakes.create_network_agents(count=2) def setUp(self): super(TestDeleteNetworkAgent, self).setUp() @@ -188,8 +187,7 @@ class TestDeleteNetworkAgent(TestNetworkAgent): class TestListNetworkAgent(TestNetworkAgent): - network_agents = ( - network_fakes.FakeNetworkAgent.create_network_agents(count=3)) + network_agents = network_fakes.create_network_agents(count=3) columns = ( 'ID', @@ -207,8 +205,8 @@ class TestListNetworkAgent(TestNetworkAgent): agent.agent_type, agent.host, agent.availability_zone, - network_agent.AliveColumn(agent.alive), - network_agent.AdminStateColumn(agent.admin_state_up), + network_agent.AliveColumn(agent.is_alive), + network_agent.AdminStateColumn(agent.is_admin_state_up), agent.binary, )) @@ -217,11 +215,10 @@ class TestListNetworkAgent(TestNetworkAgent): self.network.agents = mock.Mock( return_value=self.network_agents) - _testagent = \ - network_fakes.FakeNetworkAgent.create_one_network_agent() + _testagent = network_fakes.create_one_network_agent() self.network.get_agent = mock.Mock(return_value=_testagent) - self._testnetwork = network_fakes.FakeNetwork.create_one_network() + self._testnetwork = network_fakes.create_one_network() self.network.find_network = mock.Mock(return_value=self._testnetwork) self.network.network_hosting_dhcp_agents = mock.Mock( return_value=self.network_agents) @@ -290,13 +287,11 @@ class TestListNetworkAgent(TestNetworkAgent): ('network', self._testnetwork.id), ] - attrs = {self._testnetwork, } - parsed_args = self.check_parser(self.cmd, arglist, verifylist) columns, data = self.cmd.take_action(parsed_args) self.network.network_hosting_dhcp_agents.assert_called_once_with( - *attrs) + self._testnetwork) self.assertEqual(self.columns, columns) self.assertCountEqual(self.data, list(data)) @@ -343,13 +338,13 @@ class TestListNetworkAgent(TestNetworkAgent): router_agent_data = [d + ('',) for d in self.data] self.assertEqual(router_agent_columns, columns) - self.assertCountEqual(router_agent_data, list(data)) + self.assertEqual(len(router_agent_data), len(list(data))) class TestRemoveNetworkFromAgent(TestNetworkAgent): - net = network_fakes.FakeNetwork.create_one_network() - agent = network_fakes.FakeNetworkAgent.create_one_network_agent() + net = network_fakes.create_one_network() + agent = network_fakes.create_one_network_agent() def setUp(self): super(TestRemoveNetworkFromAgent, self).setUp() @@ -400,7 +395,7 @@ class TestRemoveNetworkFromAgent(TestNetworkAgent): class TestRemoveRouterAgent(TestNetworkAgent): _router = network_fakes.FakeRouter.create_one_router() - _agent = network_fakes.FakeNetworkAgent.create_one_network_agent() + _agent = network_fakes.create_one_network_agent() def setUp(self): super(TestRemoveRouterAgent, self).setUp() @@ -440,8 +435,7 @@ class TestRemoveRouterAgent(TestNetworkAgent): class TestSetNetworkAgent(TestNetworkAgent): - _network_agent = ( - network_fakes.FakeNetworkAgent.create_one_network_agent()) + _network_agent = network_fakes.create_one_network_agent() def setUp(self): super(TestSetNetworkAgent, self).setUp() @@ -517,8 +511,7 @@ class TestSetNetworkAgent(TestNetworkAgent): class TestShowNetworkAgent(TestNetworkAgent): - _network_agent = ( - network_fakes.FakeNetworkAgent.create_one_network_agent()) + _network_agent = network_fakes.create_one_network_agent() columns = ( 'admin_state_up', @@ -526,19 +519,33 @@ class TestShowNetworkAgent(TestNetworkAgent): 'alive', 'availability_zone', 'binary', - 'configurations', + 'configuration', + 'created_at', + 'description', 'host', + 'ha_state', 'id', + 'last_heartbeat_at', + 'resources_synced', + 'started_at', + 'topic', ) data = ( - network_agent.AdminStateColumn(_network_agent.admin_state_up), + network_agent.AdminStateColumn(_network_agent.is_admin_state_up), _network_agent.agent_type, network_agent.AliveColumn(_network_agent.is_alive), _network_agent.availability_zone, _network_agent.binary, - format_columns.DictColumn(_network_agent.configurations), + format_columns.DictColumn(_network_agent.configuration), + _network_agent.created_at, + _network_agent.description, + _network_agent.ha_state, _network_agent.host, _network_agent.id, + _network_agent.last_heartbeat_at, + _network_agent.resources_synced, + _network_agent.started_at, + _network_agent.topic, ) def setUp(self): @@ -570,5 +577,5 @@ class TestShowNetworkAgent(TestNetworkAgent): self.network.get_agent.assert_called_once_with( self._network_agent.id) - self.assertEqual(self.columns, columns) - self.assertCountEqual(list(self.data), list(data)) + self.assertEqual(set(self.columns), set(columns)) + self.assertEqual(len(list(self.data)), len(list(data))) diff --git a/openstackclient/tests/unit/network/v2/test_network_auto_allocated_topology.py b/openstackclient/tests/unit/network/v2/test_network_auto_allocated_topology.py index d77d6894..a5dbcde1 100644 --- a/openstackclient/tests/unit/network/v2/test_network_auto_allocated_topology.py +++ b/openstackclient/tests/unit/network/v2/test_network_auto_allocated_topology.py @@ -29,9 +29,9 @@ class TestAutoAllocatedTopology(network_fakes.TestNetworkV2): class TestCreateAutoAllocatedTopology(TestAutoAllocatedTopology): project = identity_fakes.FakeProject.create_one_project() - network_object = network_fakes.FakeNetwork.create_one_network() + network_object = network_fakes.create_one_network() - topology = network_fakes.FakeAutoAllocatedTopology.create_one_topology( + topology = network_fakes.create_one_topology( attrs={'id': network_object.id, 'project_id': project.id} ) @@ -127,9 +127,9 @@ class TestCreateAutoAllocatedTopology(TestAutoAllocatedTopology): class TestValidateAutoAllocatedTopology(TestAutoAllocatedTopology): project = identity_fakes.FakeProject.create_one_project() - network_object = network_fakes.FakeNetwork.create_one_network() + network_object = network_fakes.create_one_network() - topology = network_fakes.FakeAutoAllocatedTopology.create_one_topology( + topology = network_fakes.create_one_topology( attrs={'id': network_object.id, 'project_id': project.id} ) @@ -204,9 +204,9 @@ class TestValidateAutoAllocatedTopology(TestAutoAllocatedTopology): class TestDeleteAutoAllocatedTopology(TestAutoAllocatedTopology): project = identity_fakes.FakeProject.create_one_project() - network_object = network_fakes.FakeNetwork.create_one_network() + network_object = network_fakes.create_one_network() - topology = network_fakes.FakeAutoAllocatedTopology.create_one_topology( + topology = network_fakes.create_one_topology( attrs={'id': network_object.id, 'project_id': project.id} ) diff --git a/openstackclient/tests/unit/network/v2/test_network_flavor.py b/openstackclient/tests/unit/network/v2/test_network_flavor.py index 20c5b9d6..3149def6 100644 --- a/openstackclient/tests/unit/network/v2/test_network_flavor.py +++ b/openstackclient/tests/unit/network/v2/test_network_flavor.py @@ -39,10 +39,8 @@ class TestNetworkFlavor(network_fakes.TestNetworkV2): class TestAddNetworkFlavorToProfile(TestNetworkFlavor): - network_flavor = \ - network_fakes.FakeNetworkFlavor.create_one_network_flavor() - service_profile = \ - network_fakes.FakeNetworkFlavorProfile.create_one_service_profile() + network_flavor = network_fakes.create_one_network_flavor() + service_profile = network_fakes.create_one_service_profile() def setUp(self): super(TestAddNetworkFlavorToProfile, self).setUp() @@ -84,23 +82,22 @@ class TestCreateNetworkFlavor(TestNetworkFlavor): project = identity_fakes_v3.FakeProject.create_one_project() domain = identity_fakes_v3.FakeDomain.create_one_domain() # The new network flavor created. - new_network_flavor = ( - network_fakes.FakeNetworkFlavor.create_one_network_flavor()) + new_network_flavor = network_fakes.create_one_network_flavor() columns = ( 'description', 'enabled', 'id', 'name', - 'project_id', - 'service_type' + 'service_type', + 'service_profile_ids', ) data = ( new_network_flavor.description, - new_network_flavor.enabled, + new_network_flavor.is_enabled, new_network_flavor.id, new_network_flavor.name, - new_network_flavor.project_id, new_network_flavor.service_type, + new_network_flavor.service_profile_ids, ) def setUp(self): @@ -139,14 +136,14 @@ class TestCreateNetworkFlavor(TestNetworkFlavor): 'service_type': self.new_network_flavor.service_type, 'name': self.new_network_flavor.name, }) - self.assertEqual(self.columns, columns) - self.assertEqual(self.data, data) + self.assertEqual(set(self.columns), set(columns)) + self.assertEqual(set(self.data), set(data)) def test_create_all_options(self): arglist = [ '--description', self.new_network_flavor.description, '--enable', - '--project', self.new_network_flavor.project_id, + '--project', self.project.id, '--project-domain', self.domain.name, '--service-type', self.new_network_flavor.service_type, self.new_network_flavor.name, @@ -154,7 +151,7 @@ class TestCreateNetworkFlavor(TestNetworkFlavor): verifylist = [ ('description', self.new_network_flavor.description), ('enable', True), - ('project', self.new_network_flavor.project_id), + ('project', self.project.id), ('project_domain', self.domain.name), ('service_type', self.new_network_flavor.service_type), ('name', self.new_network_flavor.name), @@ -170,8 +167,8 @@ class TestCreateNetworkFlavor(TestNetworkFlavor): 'service_type': self.new_network_flavor.service_type, 'name': self.new_network_flavor.name, }) - self.assertEqual(self.columns, columns) - self.assertEqual(self.data, data) + self.assertEqual(set(self.columns), set(columns)) + self.assertEqual(set(self.data), set(data)) def test_create_disable(self): arglist = [ @@ -193,23 +190,20 @@ class TestCreateNetworkFlavor(TestNetworkFlavor): 'service_type': self.new_network_flavor.service_type, 'name': self.new_network_flavor.name, }) - self.assertEqual(self.columns, columns) - self.assertEqual(self.data, data) + self.assertEqual(set(self.columns), set(columns)) + self.assertEqual(set(self.data), set(data)) class TestDeleteNetworkFlavor(TestNetworkFlavor): # The network flavor to delete. - _network_flavors = ( - network_fakes.FakeNetworkFlavor.create_flavor(count=2)) + _network_flavors = network_fakes.create_flavor(count=2) def setUp(self): super(TestDeleteNetworkFlavor, self).setUp() self.network.delete_flavor = mock.Mock(return_value=None) - self.network.find_flavor = ( - network_fakes.FakeNetworkFlavor.get_flavor( - network_flavors=self._network_flavors) - ) + self.network.find_flavor = network_fakes.get_flavor( + network_flavors=self._network_flavors) # Get the command object to test self.cmd = network_flavor.DeleteNetworkFlavor(self.app, self.namespace) @@ -284,8 +278,7 @@ class TestDeleteNetworkFlavor(TestNetworkFlavor): class TestListNetworkFlavor(TestNetworkFlavor): # The network flavors to list up. - _network_flavors = ( - network_fakes.FakeNetworkFlavor.create_flavor(count=2)) + _network_flavors = network_fakes.create_flavor(count=2) columns = ( 'ID', 'Name', @@ -298,7 +291,7 @@ class TestListNetworkFlavor(TestNetworkFlavor): data.append(( flavor.id, flavor.name, - flavor.enabled, + flavor.is_enabled, flavor.service_type, flavor.description, )) @@ -319,16 +312,14 @@ class TestListNetworkFlavor(TestNetworkFlavor): columns, data = self.cmd.take_action(parsed_args) self.network.flavors.assert_called_once_with(**{}) - self.assertEqual(self.columns, columns) + self.assertEqual(set(self.columns), set(columns)) self.assertEqual(self.data, list(data)) class TestRemoveNetworkFlavorFromProfile(TestNetworkFlavor): - network_flavor = \ - network_fakes.FakeNetworkFlavor.create_one_network_flavor() - service_profile = \ - network_fakes.FakeNetworkFlavorProfile.create_one_service_profile() + network_flavor = network_fakes.create_one_network_flavor() + service_profile = network_fakes.create_one_service_profile() def setUp(self): super(TestRemoveNetworkFlavorFromProfile, self).setUp() @@ -368,23 +359,22 @@ class TestRemoveNetworkFlavorFromProfile(TestNetworkFlavor): class TestShowNetworkFlavor(TestNetworkFlavor): # The network flavor to show. - new_network_flavor = ( - network_fakes.FakeNetworkFlavor.create_one_network_flavor()) + new_network_flavor = network_fakes.create_one_network_flavor() columns = ( 'description', 'enabled', 'id', 'name', - 'project_id', - 'service_type' + 'service_type', + 'service_profile_ids', ) data = ( new_network_flavor.description, - new_network_flavor.enabled, + new_network_flavor.is_enabled, new_network_flavor.id, new_network_flavor.name, - new_network_flavor.project_id, new_network_flavor.service_type, + new_network_flavor.service_profile_ids, ) def setUp(self): @@ -416,15 +406,15 @@ class TestShowNetworkFlavor(TestNetworkFlavor): self.network.find_flavor.assert_called_once_with( self.new_network_flavor.name, ignore_missing=False) - self.assertEqual(self.columns, columns) - self.assertEqual(self.data, data) + self.assertEqual(set(self.columns), set(columns)) + self.assertEqual(set(self.data), set(data)) class TestSetNetworkFlavor(TestNetworkFlavor): # The network flavor to set. new_network_flavor = ( - network_fakes.FakeNetworkFlavor.create_one_network_flavor()) + network_fakes.create_one_network_flavor()) def setUp(self): super(TestSetNetworkFlavor, self).setUp() diff --git a/openstackclient/tests/unit/network/v2/test_network_flavor_profile.py b/openstackclient/tests/unit/network/v2/test_network_flavor_profile.py index 1cbe30ba..5c2b9e2d 100644 --- a/openstackclient/tests/unit/network/v2/test_network_flavor_profile.py +++ b/openstackclient/tests/unit/network/v2/test_network_flavor_profile.py @@ -34,25 +34,23 @@ class TestFlavorProfile(network_fakes.TestNetworkV2): class TestCreateFlavorProfile(TestFlavorProfile): project = identity_fakes_v3.FakeProject.create_one_project() domain = identity_fakes_v3.FakeDomain.create_one_domain() - new_flavor_profile = ( - network_fakes.FakeNetworkFlavorProfile. - create_one_service_profile() - ) + new_flavor_profile = network_fakes.create_one_service_profile() + columns = ( 'description', 'driver', 'enabled', 'id', - 'metainfo', + 'meta_info', 'project_id', ) data = ( new_flavor_profile.description, new_flavor_profile.driver, - new_flavor_profile.enabled, + new_flavor_profile.is_enabled, new_flavor_profile.id, - new_flavor_profile.metainfo, + new_flavor_profile.meta_info, new_flavor_profile.project_id, ) @@ -72,7 +70,7 @@ class TestCreateFlavorProfile(TestFlavorProfile): '--project-domain', self.domain.name, "--enable", "--driver", self.new_flavor_profile.driver, - "--metainfo", self.new_flavor_profile.metainfo, + "--metainfo", self.new_flavor_profile.meta_info, ] verifylist = [ @@ -81,7 +79,7 @@ class TestCreateFlavorProfile(TestFlavorProfile): ('project_domain', self.domain.name), ('enable', True), ('driver', self.new_flavor_profile.driver), - ('metainfo', self.new_flavor_profile.metainfo) + ('metainfo', self.new_flavor_profile.meta_info) ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) @@ -90,9 +88,9 @@ class TestCreateFlavorProfile(TestFlavorProfile): self.network.create_service_profile.assert_called_once_with( **{'description': self.new_flavor_profile.description, 'project_id': self.project.id, - 'enabled': self.new_flavor_profile.enabled, + 'enabled': self.new_flavor_profile.is_enabled, 'driver': self.new_flavor_profile.driver, - 'metainfo': self.new_flavor_profile.metainfo} + 'metainfo': self.new_flavor_profile.meta_info} ) self.assertEqual(self.columns, columns) self.assertEqual(self.data, data) @@ -103,7 +101,7 @@ class TestCreateFlavorProfile(TestFlavorProfile): "--project", self.new_flavor_profile.project_id, '--project-domain', self.domain.name, "--enable", - "--metainfo", self.new_flavor_profile.metainfo, + "--metainfo", self.new_flavor_profile.meta_info, ] verifylist = [ @@ -111,7 +109,7 @@ class TestCreateFlavorProfile(TestFlavorProfile): ('project', self.new_flavor_profile.project_id), ('project_domain', self.domain.name), ('enable', True), - ('metainfo', self.new_flavor_profile.metainfo) + ('metainfo', self.new_flavor_profile.meta_info) ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) @@ -120,8 +118,8 @@ class TestCreateFlavorProfile(TestFlavorProfile): self.network.create_service_profile.assert_called_once_with( **{'description': self.new_flavor_profile.description, 'project_id': self.project.id, - 'enabled': self.new_flavor_profile.enabled, - 'metainfo': self.new_flavor_profile.metainfo} + 'enabled': self.new_flavor_profile.is_enabled, + 'metainfo': self.new_flavor_profile.meta_info} ) self.assertEqual(self.columns, columns) self.assertEqual(self.data, data) @@ -149,7 +147,7 @@ class TestCreateFlavorProfile(TestFlavorProfile): self.network.create_service_profile.assert_called_once_with( **{'description': self.new_flavor_profile.description, 'project_id': self.project.id, - 'enabled': self.new_flavor_profile.enabled, + 'enabled': self.new_flavor_profile.is_enabled, 'driver': self.new_flavor_profile.driver, } ) @@ -203,14 +201,13 @@ class TestCreateFlavorProfile(TestFlavorProfile): class TestDeleteFlavorProfile(TestFlavorProfile): # The network flavor_profiles to delete. - _network_flavor_profiles = ( - network_fakes.FakeNetworkFlavorProfile.create_service_profile(count=2)) + _network_flavor_profiles = network_fakes.create_service_profile(count=2) def setUp(self): super(TestDeleteFlavorProfile, self).setUp() self.network.delete_service_profile = mock.Mock(return_value=None) self.network.find_service_profile = ( - network_fakes.FakeNetworkFlavorProfile.get_service_profile( + network_fakes.get_service_profile( flavor_profile=self._network_flavor_profiles) ) @@ -290,8 +287,7 @@ class TestDeleteFlavorProfile(TestFlavorProfile): class TestListFlavorProfile(TestFlavorProfile): # The network flavor profiles list - _network_flavor_profiles = ( - network_fakes.FakeNetworkFlavorProfile.create_service_profile(count=2)) + _network_flavor_profiles = network_fakes.create_service_profile(count=2) columns = ( 'ID', @@ -305,8 +301,8 @@ class TestListFlavorProfile(TestFlavorProfile): data.append(( flavor_profile.id, flavor_profile.driver, - flavor_profile.enabled, - flavor_profile.metainfo, + flavor_profile.is_enabled, + flavor_profile.meta_info, flavor_profile.description, )) @@ -334,22 +330,21 @@ class TestListFlavorProfile(TestFlavorProfile): class TestShowFlavorProfile(TestFlavorProfile): # The network flavor profile to show. - network_flavor_profile = ( - network_fakes.FakeNetworkFlavorProfile.create_one_service_profile()) + network_flavor_profile = network_fakes.create_one_service_profile() columns = ( 'description', 'driver', 'enabled', 'id', - 'metainfo', + 'meta_info', 'project_id', ) data = ( network_flavor_profile.description, network_flavor_profile.driver, - network_flavor_profile.enabled, + network_flavor_profile.is_enabled, network_flavor_profile.id, - network_flavor_profile.metainfo, + network_flavor_profile.meta_info, network_flavor_profile.project_id, ) @@ -382,8 +377,7 @@ class TestShowFlavorProfile(TestFlavorProfile): class TestSetFlavorProfile(TestFlavorProfile): # The network flavor profile to set. - network_flavor_profile = ( - network_fakes.FakeNetworkFlavorProfile.create_one_service_profile()) + network_flavor_profile = network_fakes.create_one_service_profile() def setUp(self): super(TestSetFlavorProfile, self).setUp() diff --git a/openstackclient/tests/unit/network/v2/test_network_rbac.py b/openstackclient/tests/unit/network/v2/test_network_rbac.py index e20efc8b..b0bc7e86 100644 --- a/openstackclient/tests/unit/network/v2/test_network_rbac.py +++ b/openstackclient/tests/unit/network/v2/test_network_rbac.py @@ -37,14 +37,14 @@ class TestNetworkRBAC(network_fakes.TestNetworkV2): @ddt.ddt class TestCreateNetworkRBAC(TestNetworkRBAC): - network_object = network_fakes.FakeNetwork.create_one_network() + network_object = network_fakes.create_one_network() qos_object = network_fakes.FakeNetworkQosPolicy.create_one_qos_policy() sg_object = network_fakes.FakeNetworkSecGroup.create_one_security_group() - as_object = network_fakes.FakeAddressScope.create_one_address_scope() + as_object = network_fakes.create_one_address_scope() snp_object = network_fakes.FakeSubnetPool.create_one_subnet_pool() - ag_object = network_fakes.FakeAddressGroup.create_one_address_group() + ag_object = network_fakes.create_one_address_group() project = identity_fakes_v3.FakeProject.create_one_project() - rbac_policy = network_fakes.FakeNetworkRBAC.create_one_network_rbac( + rbac_policy = network_fakes.create_one_network_rbac( attrs={'project_id': project.id, 'target_tenant': project.id, 'object_id': network_object.id} @@ -65,7 +65,7 @@ class TestCreateNetworkRBAC(TestNetworkRBAC): rbac_policy.object_id, rbac_policy.object_type, rbac_policy.project_id, - rbac_policy.target_tenant, + rbac_policy.target_project_id, ] def setUp(self): @@ -120,13 +120,13 @@ class TestCreateNetworkRBAC(TestNetworkRBAC): arglist = [ '--action', self.rbac_policy.action, '--type', 'invalid_type', - '--target-project', self.rbac_policy.target_tenant, + '--target-project', self.rbac_policy.target_project_id, self.rbac_policy.object_id, ] verifylist = [ ('action', self.rbac_policy.action), ('type', 'invalid_type'), - ('target-project', self.rbac_policy.target_tenant), + ('target-project', self.rbac_policy.target_project_id), ('rbac_policy', self.rbac_policy.id), ] @@ -137,13 +137,13 @@ class TestCreateNetworkRBAC(TestNetworkRBAC): arglist = [ '--type', self.rbac_policy.object_type, '--action', 'invalid_action', - '--target-project', self.rbac_policy.target_tenant, + '--target-project', self.rbac_policy.target_project_id, self.rbac_policy.object_id, ] verifylist = [ ('type', self.rbac_policy.object_type), ('action', 'invalid_action'), - ('target-project', self.rbac_policy.target_tenant), + ('target-project', self.rbac_policy.target_project_id), ('rbac_policy', self.rbac_policy.id), ] @@ -154,13 +154,13 @@ class TestCreateNetworkRBAC(TestNetworkRBAC): arglist = [ '--type', self.rbac_policy.object_type, '--action', self.rbac_policy.action, - '--target-project', self.rbac_policy.target_tenant, + '--target-project', self.rbac_policy.target_project_id, self.rbac_policy.object_id, ] verifylist = [ ('type', self.rbac_policy.object_type), ('action', self.rbac_policy.action), - ('target_project', self.rbac_policy.target_tenant), + ('target_project', self.rbac_policy.target_project_id), ('rbac_object', self.rbac_policy.object_id), ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) @@ -172,7 +172,7 @@ class TestCreateNetworkRBAC(TestNetworkRBAC): 'object_id': self.rbac_policy.object_id, 'object_type': self.rbac_policy.object_type, 'action': self.rbac_policy.action, - 'target_tenant': self.rbac_policy.target_tenant, + 'target_tenant': self.rbac_policy.target_project_id, }) self.assertEqual(self.columns, columns) self.assertEqual(self.data, list(data)) @@ -205,7 +205,7 @@ class TestCreateNetworkRBAC(TestNetworkRBAC): arglist = [ '--type', self.rbac_policy.object_type, '--action', self.rbac_policy.action, - '--target-project', self.rbac_policy.target_tenant, + '--target-project', self.rbac_policy.target_project_id, '--project', self.rbac_policy.project_id, '--project-domain', self.project.domain_id, '--target-project-domain', self.project.domain_id, @@ -214,7 +214,7 @@ class TestCreateNetworkRBAC(TestNetworkRBAC): verifylist = [ ('type', self.rbac_policy.object_type), ('action', self.rbac_policy.action), - ('target_project', self.rbac_policy.target_tenant), + ('target_project', self.rbac_policy.target_project_id), ('project', self.rbac_policy.project_id), ('project_domain', self.project.domain_id), ('target_project_domain', self.project.domain_id), @@ -229,7 +229,7 @@ class TestCreateNetworkRBAC(TestNetworkRBAC): 'object_id': self.rbac_policy.object_id, 'object_type': self.rbac_policy.object_type, 'action': self.rbac_policy.action, - 'target_tenant': self.rbac_policy.target_tenant, + 'target_tenant': self.rbac_policy.target_project_id, 'project_id': self.rbac_policy.project_id, }) self.assertEqual(self.columns, columns) @@ -251,13 +251,13 @@ class TestCreateNetworkRBAC(TestNetworkRBAC): arglist = [ '--type', obj_type, '--action', self.rbac_policy.action, - '--target-project', self.rbac_policy.target_tenant, + '--target-project', self.rbac_policy.target_project_id, obj_fake.name, ] verifylist = [ ('type', obj_type), ('action', self.rbac_policy.action), - ('target_project', self.rbac_policy.target_tenant), + ('target_project', self.rbac_policy.target_project_id), ('rbac_object', obj_fake.name), ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) @@ -269,7 +269,7 @@ class TestCreateNetworkRBAC(TestNetworkRBAC): 'object_id': obj_fake.id, 'object_type': obj_type, 'action': self.rbac_policy.action, - 'target_tenant': self.rbac_policy.target_tenant, + 'target_tenant': self.rbac_policy.target_project_id, }) self.data = [ self.rbac_policy.action, @@ -277,7 +277,7 @@ class TestCreateNetworkRBAC(TestNetworkRBAC): obj_fake.id, obj_type, self.rbac_policy.project_id, - self.rbac_policy.target_tenant, + self.rbac_policy.target_project_id, ] self.assertEqual(self.columns, columns) self.assertEqual(self.data, list(data)) @@ -285,13 +285,13 @@ class TestCreateNetworkRBAC(TestNetworkRBAC): class TestDeleteNetworkRBAC(TestNetworkRBAC): - rbac_policies = network_fakes.FakeNetworkRBAC.create_network_rbacs(count=2) + rbac_policies = network_fakes.create_network_rbacs(count=2) def setUp(self): super(TestDeleteNetworkRBAC, self).setUp() self.network.delete_rbac_policy = mock.Mock(return_value=None) self.network.find_rbac_policy = ( - network_fakes.FakeNetworkRBAC.get_network_rbacs( + network_fakes.get_network_rbacs( rbac_policies=self.rbac_policies) ) @@ -368,7 +368,7 @@ class TestDeleteNetworkRBAC(TestNetworkRBAC): class TestListNetworkRABC(TestNetworkRBAC): # The network rbac policies going to be listed up. - rbac_policies = network_fakes.FakeNetworkRBAC.create_network_rbacs(count=3) + rbac_policies = network_fakes.create_network_rbacs(count=3) columns = ( 'ID', @@ -470,7 +470,7 @@ class TestListNetworkRABC(TestNetworkRBAC): class TestSetNetworkRBAC(TestNetworkRBAC): project = identity_fakes_v3.FakeProject.create_one_project() - rbac_policy = network_fakes.FakeNetworkRBAC.create_one_network_rbac( + rbac_policy = network_fakes.create_one_network_rbac( attrs={'target_tenant': project.id}) def setUp(self): @@ -525,7 +525,7 @@ class TestSetNetworkRBAC(TestNetworkRBAC): class TestShowNetworkRBAC(TestNetworkRBAC): - rbac_policy = network_fakes.FakeNetworkRBAC.create_one_network_rbac() + rbac_policy = network_fakes.create_one_network_rbac() columns = ( 'action', @@ -542,7 +542,7 @@ class TestShowNetworkRBAC(TestNetworkRBAC): rbac_policy.object_id, rbac_policy.object_type, rbac_policy.project_id, - rbac_policy.target_tenant, + rbac_policy.target_project_id, ] def setUp(self): diff --git a/openstackclient/tests/unit/network/v2/test_network_segment.py b/openstackclient/tests/unit/network/v2/test_network_segment.py index 6cd948e3..b41b6191 100644 --- a/openstackclient/tests/unit/network/v2/test_network_segment.py +++ b/openstackclient/tests/unit/network/v2/test_network_segment.py @@ -33,9 +33,8 @@ class TestNetworkSegment(network_fakes.TestNetworkV2): class TestCreateNetworkSegment(TestNetworkSegment): # The network segment to create along with associated network. - _network_segment = \ - network_fakes.FakeNetworkSegment.create_one_network_segment() - _network = network_fakes.FakeNetwork.create_one_network({ + _network_segment = network_fakes.create_one_network_segment() + _network = network_fakes.create_one_network({ 'id': _network_segment.network_id, }) @@ -156,8 +155,7 @@ class TestCreateNetworkSegment(TestNetworkSegment): class TestDeleteNetworkSegment(TestNetworkSegment): # The network segments to delete. - _network_segments = \ - network_fakes.FakeNetworkSegment.create_network_segments() + _network_segments = network_fakes.create_network_segments() def setUp(self): super(TestDeleteNetworkSegment, self).setUp() @@ -240,9 +238,8 @@ class TestDeleteNetworkSegment(TestNetworkSegment): class TestListNetworkSegment(TestNetworkSegment): - _network = network_fakes.FakeNetwork.create_one_network() - _network_segments = \ - network_fakes.FakeNetworkSegment.create_network_segments(count=3) + _network = network_fakes.create_one_network() + _network_segments = network_fakes.create_network_segments(count=3) columns = ( 'ID', @@ -338,8 +335,7 @@ class TestListNetworkSegment(TestNetworkSegment): class TestSetNetworkSegment(TestNetworkSegment): # The network segment to show. - _network_segment = \ - network_fakes.FakeNetworkSegment.create_one_network_segment() + _network_segment = network_fakes.create_one_network_segment() def setUp(self): super(TestSetNetworkSegment, self).setUp() @@ -398,8 +394,7 @@ class TestSetNetworkSegment(TestNetworkSegment): class TestShowNetworkSegment(TestNetworkSegment): # The network segment to show. - _network_segment = \ - network_fakes.FakeNetworkSegment.create_one_network_segment() + _network_segment = network_fakes.create_one_network_segment() columns = ( 'description', diff --git a/openstackclient/tests/unit/network/v2/test_network_segment_range.py b/openstackclient/tests/unit/network/v2/test_network_segment_range.py index b60f1710..20d34bfc 100644 --- a/openstackclient/tests/unit/network/v2/test_network_segment_range.py +++ b/openstackclient/tests/unit/network/v2/test_network_segment_range.py @@ -50,8 +50,7 @@ class TestNetworkSegmentRange(network_fakes.TestNetworkV2): class TestCreateNetworkSegmentRange(TestNetworkSegmentRange): # The network segment range to create. - _network_segment_range = network_fakes.FakeNetworkSegmentRange.\ - create_one_network_segment_range() + _network_segment_range = network_fakes.create_one_network_segment_range() columns = ( 'available', @@ -310,8 +309,7 @@ class TestCreateNetworkSegmentRange(TestNetworkSegmentRange): class TestDeleteNetworkSegmentRange(TestNetworkSegmentRange): # The network segment ranges to delete. - _network_segment_ranges = \ - network_fakes.FakeNetworkSegmentRange.create_network_segment_ranges() + _network_segment_ranges = network_fakes.create_network_segment_ranges() def setUp(self): super(TestDeleteNetworkSegmentRange, self).setUp() @@ -396,8 +394,8 @@ class TestDeleteNetworkSegmentRange(TestNetworkSegmentRange): class TestListNetworkSegmentRange(TestNetworkSegmentRange): - _network_segment_ranges = network_fakes.FakeNetworkSegmentRange.\ - create_network_segment_ranges(count=3) + _network_segment_ranges = ( + network_fakes.create_network_segment_ranges(count=3)) columns = ( 'ID', @@ -496,14 +494,13 @@ class TestListNetworkSegmentRange(TestNetworkSegmentRange): class TestSetNetworkSegmentRange(TestNetworkSegmentRange): # The network segment range to set. - _network_segment_range = network_fakes.FakeNetworkSegmentRange.\ - create_one_network_segment_range() + _network_segment_range = network_fakes.create_one_network_segment_range() # The network segment range updated. minimum_updated = _network_segment_range.minimum - 5 maximum_updated = _network_segment_range.maximum + 5 available_updated = (list(range(minimum_updated, 104)) + [105] + list(range(107, maximum_updated + 1))) - _network_segment_range_updated = network_fakes.FakeNetworkSegmentRange.\ + _network_segment_range_updated = network_fakes.\ create_one_network_segment_range( attrs={'minimum': minimum_updated, 'maximum': maximum_updated, @@ -577,8 +574,7 @@ class TestSetNetworkSegmentRange(TestNetworkSegmentRange): class TestShowNetworkSegmentRange(TestNetworkSegmentRange): # The network segment range to show. - _network_segment_range = network_fakes.FakeNetworkSegmentRange.\ - create_one_network_segment_range() + _network_segment_range = network_fakes.create_one_network_segment_range() columns = ( 'available', diff --git a/openstackclient/tests/unit/network/v2/test_port.py b/openstackclient/tests/unit/network/v2/test_port.py index 6f830aa6..04412c5a 100644 --- a/openstackclient/tests/unit/network/v2/test_port.py +++ b/openstackclient/tests/unit/network/v2/test_port.py @@ -50,6 +50,7 @@ class TestPort(network_fakes.TestNetworkV2): 'binding_vif_details', 'binding_vif_type', 'binding_vnic_type', + 'created_at', 'data_plane_status', 'description', 'device_id', @@ -61,6 +62,7 @@ class TestPort(network_fakes.TestNetworkV2): 'extra_dhcp_opts', 'fixed_ips', 'id', + 'ip_allocation', 'mac_address', 'name', 'network_id', @@ -68,21 +70,26 @@ class TestPort(network_fakes.TestNetworkV2): 'port_security_enabled', 'project_id', 'propagate_uplink_status', + 'resource_request', + 'revision_number', 'qos_network_policy_id', 'qos_policy_id', 'security_group_ids', 'status', 'tags', + 'trunk_details', + 'updated_at', ) data = ( - port.AdminStateColumn(fake_port.admin_state_up), + port.AdminStateColumn(fake_port.is_admin_state_up), format_columns.ListDictColumn(fake_port.allowed_address_pairs), fake_port.binding_host_id, format_columns.DictColumn(fake_port.binding_profile), format_columns.DictColumn(fake_port.binding_vif_details), fake_port.binding_vif_type, fake_port.binding_vnic_type, + fake_port.created_at, fake_port.data_plane_status, fake_port.description, fake_port.device_id, @@ -94,18 +101,23 @@ class TestPort(network_fakes.TestNetworkV2): format_columns.ListDictColumn(fake_port.extra_dhcp_opts), format_columns.ListDictColumn(fake_port.fixed_ips), fake_port.id, + fake_port.ip_allocation, fake_port.mac_address, fake_port.name, fake_port.network_id, fake_port.numa_affinity_policy, - fake_port.port_security_enabled, + fake_port.is_port_security_enabled, fake_port.project_id, fake_port.propagate_uplink_status, + fake_port.resource_request, + fake_port.revision_number, fake_port.qos_network_policy_id, fake_port.qos_policy_id, format_columns.ListColumn(fake_port.security_group_ids), fake_port.status, format_columns.ListColumn(fake_port.tags), + fake_port.trunk_details, + fake_port.updated_at, ) return columns, data @@ -113,7 +125,7 @@ class TestPort(network_fakes.TestNetworkV2): class TestCreatePort(TestPort): - _port = network_fakes.FakePort.create_one_port() + _port = network_fakes.create_one_port() columns, data = TestPort._get_common_cols_data(_port) def setUp(self): @@ -121,7 +133,7 @@ class TestCreatePort(TestPort): self.network.create_port = mock.Mock(return_value=self._port) self.network.set_tags = mock.Mock(return_value=None) - fake_net = network_fakes.FakeNetwork.create_one_network({ + fake_net = network_fakes.create_one_network({ 'id': self._port.network_id, }) self.network.find_network = mock.Mock(return_value=fake_net) @@ -152,7 +164,7 @@ class TestCreatePort(TestPort): }) self.assertFalse(self.network.set_tags.called) - self.assertEqual(self.columns, columns) + self.assertEqual(set(self.columns), set(columns)) self.assertCountEqual(self.data, data) def test_create_full_options(self): @@ -210,7 +222,7 @@ class TestCreatePort(TestPort): 'name': 'test-port', }) - self.assertEqual(self.columns, columns) + self.assertEqual(set(self.columns), set(columns)) self.assertCountEqual(self.data, data) def test_create_invalid_json_binding_profile(self): @@ -261,7 +273,7 @@ class TestCreatePort(TestPort): 'name': 'test-port', }) - self.assertEqual(self.columns, columns) + self.assertEqual(set(self.columns), set(columns)) self.assertCountEqual(self.data, data) def test_create_with_security_group(self): @@ -290,7 +302,7 @@ class TestCreatePort(TestPort): 'name': 'test-port', }) - self.assertEqual(self.columns, columns) + self.assertEqual(set(self.columns), set(columns)) self.assertCountEqual(self.data, data) def test_create_port_with_dns_name(self): @@ -316,7 +328,7 @@ class TestCreatePort(TestPort): 'name': 'test-port', }) - self.assertEqual(self.columns, columns) + self.assertEqual(set(self.columns), set(columns)) self.assertCountEqual(self.data, data) def test_create_with_security_groups(self): @@ -346,7 +358,7 @@ class TestCreatePort(TestPort): 'name': 'test-port', }) - self.assertEqual(self.columns, columns) + self.assertEqual(set(self.columns), set(columns)) self.assertCountEqual(self.data, data) def test_create_with_no_security_groups(self): @@ -372,7 +384,7 @@ class TestCreatePort(TestPort): 'name': 'test-port', }) - self.assertEqual(self.columns, columns) + self.assertEqual(set(self.columns), set(columns)) self.assertCountEqual(self.data, data) def test_create_with_no_fixed_ips(self): @@ -398,7 +410,7 @@ class TestCreatePort(TestPort): 'name': 'test-port', }) - self.assertEqual(self.columns, columns) + self.assertEqual(set(self.columns), set(columns)) self.assertCountEqual(self.data, data) def test_create_port_with_allowed_address_pair_ipaddr(self): @@ -428,7 +440,7 @@ class TestCreatePort(TestPort): 'name': 'test-port', }) - self.assertEqual(self.columns, columns) + self.assertEqual(set(self.columns), set(columns)) self.assertCountEqual(self.data, data) def test_create_port_with_allowed_address_pair(self): @@ -464,7 +476,7 @@ class TestCreatePort(TestPort): 'name': 'test-port', }) - self.assertEqual(self.columns, columns) + self.assertEqual(set(self.columns), set(columns)) self.assertCountEqual(self.data, data) def test_create_port_with_qos(self): @@ -492,7 +504,7 @@ class TestCreatePort(TestPort): 'name': 'test-port', }) - self.assertEqual(self.columns, columns) + self.assertEqual(set(self.columns), set(columns)) self.assertCountEqual(self.data, data) def test_create_port_security_enabled(self): @@ -601,7 +613,7 @@ class TestCreatePort(TestPort): else: self.assertFalse(self.network.set_tags.called) - self.assertEqual(self.columns, columns) + self.assertEqual(set(self.columns), set(columns)) self.assertCountEqual(self.data, data) def test_create_with_tags(self): @@ -644,7 +656,7 @@ class TestCreatePort(TestPort): 'name': 'test-port', }) - self.assertEqual(self.columns, columns) + self.assertEqual(set(self.columns), set(columns)) self.assertCountEqual(self.data, data) def test_create_with_uplink_status_propagation_enabled(self): @@ -724,7 +736,7 @@ class TestCreatePort(TestPort): create_args['numa_affinity_policy'] = numa_affinity_policy self.network.create_port.assert_called_once_with(**create_args) - self.assertEqual(self.columns, columns) + self.assertEqual(set(self.columns), set(columns)) self.assertCountEqual(self.data, data) def test_create_with_numa_affinity_policy_required(self): @@ -763,20 +775,20 @@ class TestCreatePort(TestPort): 'device_profile': 'cyborg_device_profile_1', } self.network.create_port.assert_called_once_with(**create_args) - self.assertEqual(self.columns, columns) + self.assertEqual(set(self.columns), set(columns)) self.assertCountEqual(self.data, data) class TestDeletePort(TestPort): # Ports to delete. - _ports = network_fakes.FakePort.create_ports(count=2) + _ports = network_fakes.create_ports(count=2) def setUp(self): super(TestDeletePort, self).setUp() self.network.delete_port = mock.Mock(return_value=None) - self.network.find_port = network_fakes.FakePort.get_ports( + self.network.find_port = network_fakes.get_ports( ports=self._ports) # Get the command object to test self.cmd = port.DeletePort(self.app, self.namespace) @@ -848,7 +860,7 @@ class TestDeletePort(TestPort): class TestListPort(TestPort): - _ports = network_fakes.FakePort.create_ports(count=3) + _ports = network_fakes.create_ports(count=3) columns = ( 'ID', @@ -901,7 +913,7 @@ class TestListPort(TestPort): fake_router = network_fakes.FakeRouter.create_one_router({ 'id': 'fake-router-id', }) - fake_network = network_fakes.FakeNetwork.create_one_network({ + fake_network = network_fakes.create_one_network({ 'id': 'fake-network-id', }) self.network.find_router = mock.Mock(return_value=fake_router) @@ -1317,7 +1329,7 @@ class TestListPort(TestPort): class TestSetPort(TestPort): - _port = network_fakes.FakePort.create_one_port({'tags': ['green', 'red']}) + _port = network_fakes.create_one_port({'tags': ['green', 'red']}) def setUp(self): super(TestSetPort, self).setUp() @@ -1345,7 +1357,7 @@ class TestSetPort(TestPort): self.assertIsNone(result) def test_set_port_fixed_ip(self): - _testport = network_fakes.FakePort.create_one_port( + _testport = network_fakes.create_one_port( {'fixed_ips': [{'ip_address': '0.0.0.1'}]}) self.network.find_port = mock.Mock(return_value=_testport) arglist = [ @@ -1369,7 +1381,7 @@ class TestSetPort(TestPort): self.assertIsNone(result) def test_set_port_fixed_ip_clear(self): - _testport = network_fakes.FakePort.create_one_port( + _testport = network_fakes.create_one_port( {'fixed_ips': [{'ip_address': '0.0.0.1'}]}) self.network.find_port = mock.Mock(return_value=_testport) arglist = [ @@ -1412,7 +1424,7 @@ class TestSetPort(TestPort): self.assertIsNone(result) def test_set_port_overwrite_binding_profile(self): - _testport = network_fakes.FakePort.create_one_port( + _testport = network_fakes.create_one_port( {'binding_profile': {'lok_i': 'visi_on'}}) self.network.find_port = mock.Mock(return_value=_testport) arglist = [ @@ -1434,7 +1446,7 @@ class TestSetPort(TestPort): self.assertIsNone(result) def test_overwrite_mac_address(self): - _testport = network_fakes.FakePort.create_one_port( + _testport = network_fakes.create_one_port( {'mac_address': '11:22:33:44:55:66'}) self.network.find_port = mock.Mock(return_value=_testport) arglist = [ @@ -1578,7 +1590,7 @@ class TestSetPort(TestPort): sg_2 = network_fakes.FakeSecurityGroup.create_one_security_group() sg_3 = network_fakes.FakeSecurityGroup.create_one_security_group() self.network.find_security_group = mock.Mock(side_effect=[sg_2, sg_3]) - _testport = network_fakes.FakePort.create_one_port( + _testport = network_fakes.create_one_port( {'security_group_ids': [sg_1.id]}) self.network.find_port = mock.Mock(return_value=_testport) arglist = [ @@ -1620,7 +1632,7 @@ class TestSetPort(TestPort): def test_set_port_security_group_replace(self): sg1 = network_fakes.FakeSecurityGroup.create_one_security_group() sg2 = network_fakes.FakeSecurityGroup.create_one_security_group() - _testport = network_fakes.FakePort.create_one_port( + _testport = network_fakes.create_one_port( {'security_group_ids': [sg1.id]}) self.network.find_port = mock.Mock(return_value=_testport) self.network.find_security_group = mock.Mock(return_value=sg2) @@ -1662,7 +1674,7 @@ class TestSetPort(TestPort): self.assertIsNone(result) def test_set_port_append_allowed_address_pair(self): - _testport = network_fakes.FakePort.create_one_port( + _testport = network_fakes.create_one_port( {'allowed_address_pairs': [{'ip_address': '192.168.1.123'}]}) self.network.find_port = mock.Mock(return_value=_testport) arglist = [ @@ -1685,7 +1697,7 @@ class TestSetPort(TestPort): self.assertIsNone(result) def test_set_port_overwrite_allowed_address_pair(self): - _testport = network_fakes.FakePort.create_one_port( + _testport = network_fakes.create_one_port( {'allowed_address_pairs': [{'ip_address': '192.168.1.123'}]}) self.network.find_port = mock.Mock(return_value=_testport) arglist = [ @@ -1787,7 +1799,7 @@ class TestSetPort(TestPort): def test_set_port_with_qos(self): qos_policy = network_fakes.FakeNetworkQosPolicy.create_one_qos_policy() self.network.find_qos_policy = mock.Mock(return_value=qos_policy) - _testport = network_fakes.FakePort.create_one_port( + _testport = network_fakes.create_one_port( {'qos_policy_id': None}) self.network.find_port = mock.Mock(return_value=_testport) arglist = [ @@ -1809,7 +1821,7 @@ class TestSetPort(TestPort): self.assertIsNone(result) def test_set_port_data_plane_status(self): - _testport = network_fakes.FakePort.create_one_port( + _testport = network_fakes.create_one_port( {'data_plane_status': None}) self.network.find_port = mock.Mock(return_value=_testport) arglist = [ @@ -1900,7 +1912,7 @@ class TestSetPort(TestPort): class TestShowPort(TestPort): # The port to show. - _port = network_fakes.FakePort.create_one_port() + _port = network_fakes.create_one_port() columns, data = TestPort._get_common_cols_data(_port) def setUp(self): @@ -1932,7 +1944,7 @@ class TestShowPort(TestPort): self.network.find_port.assert_called_once_with( self._port.name, ignore_missing=False) - self.assertEqual(self.columns, columns) + self.assertEqual(set(self.columns), set(columns)) self.assertCountEqual(self.data, data) @@ -1940,7 +1952,7 @@ class TestUnsetPort(TestPort): def setUp(self): super(TestUnsetPort, self).setUp() - self._testport = network_fakes.FakePort.create_one_port( + self._testport = network_fakes.create_one_port( {'fixed_ips': [{'subnet_id': '042eb10a-3a18-4658-ab-cf47c8d03152', 'ip_address': '0.0.0.1'}, {'subnet_id': '042eb10a-3a18-4658-ab-cf47c8d03152', @@ -2024,7 +2036,7 @@ class TestUnsetPort(TestPort): def test_unset_security_group(self): _fake_sg1 = network_fakes.FakeSecurityGroup.create_one_security_group() _fake_sg2 = network_fakes.FakeSecurityGroup.create_one_security_group() - _fake_port = network_fakes.FakePort.create_one_port( + _fake_port = network_fakes.create_one_port( {'security_group_ids': [_fake_sg1.id, _fake_sg2.id]}) self.network.find_port = mock.Mock(return_value=_fake_port) self.network.find_security_group = mock.Mock(return_value=_fake_sg2) @@ -2049,7 +2061,7 @@ class TestUnsetPort(TestPort): def test_unset_port_security_group_not_existent(self): _fake_sg1 = network_fakes.FakeSecurityGroup.create_one_security_group() _fake_sg2 = network_fakes.FakeSecurityGroup.create_one_security_group() - _fake_port = network_fakes.FakePort.create_one_port( + _fake_port = network_fakes.create_one_port( {'security_group_ids': [_fake_sg1.id]}) self.network.find_security_group = mock.Mock(return_value=_fake_sg2) arglist = [ @@ -2066,7 +2078,7 @@ class TestUnsetPort(TestPort): parsed_args) def test_unset_port_allowed_address_pair(self): - _fake_port = network_fakes.FakePort.create_one_port( + _fake_port = network_fakes.create_one_port( {'allowed_address_pairs': [{'ip_address': '192.168.1.123'}]}) self.network.find_port = mock.Mock(return_value=_fake_port) arglist = [ @@ -2088,7 +2100,7 @@ class TestUnsetPort(TestPort): self.assertIsNone(result) def test_unset_port_allowed_address_pair_not_existent(self): - _fake_port = network_fakes.FakePort.create_one_port( + _fake_port = network_fakes.create_one_port( {'allowed_address_pairs': [{'ip_address': '192.168.1.123'}]}) self.network.find_port = mock.Mock(return_value=_fake_port) arglist = [ @@ -2105,7 +2117,7 @@ class TestUnsetPort(TestPort): parsed_args) def test_unset_port_data_plane_status(self): - _fake_port = network_fakes.FakePort.create_one_port( + _fake_port = network_fakes.create_one_port( {'data_plane_status': 'ACTIVE'}) self.network.find_port = mock.Mock(return_value=_fake_port) arglist = [ @@ -2156,7 +2168,7 @@ class TestUnsetPort(TestPort): self._test_unset_tags(with_tags=False) def test_unset_numa_affinity_policy(self): - _fake_port = network_fakes.FakePort.create_one_port( + _fake_port = network_fakes.create_one_port( {'numa_affinity_policy': 'required'}) self.network.find_port = mock.Mock(return_value=_fake_port) arglist = [ diff --git a/openstackclient/tests/unit/network/v2/test_router.py b/openstackclient/tests/unit/network/v2/test_router.py index 4d035077..fb9673cd 100644 --- a/openstackclient/tests/unit/network/v2/test_router.py +++ b/openstackclient/tests/unit/network/v2/test_router.py @@ -36,7 +36,7 @@ class TestRouter(network_fakes.TestNetworkV2): class TestAddPortToRouter(TestRouter): '''Add port to Router ''' - _port = network_fakes.FakePort.create_one_port() + _port = network_fakes.create_one_port() _router = network_fakes.FakeRouter.create_one_router( attrs={'port': _port.id}) @@ -187,7 +187,7 @@ class TestCreateRouter(TestRouter): self.assertCountEqual(self.data, data) def test_create_with_gateway(self): - _network = network_fakes.FakeNetwork.create_one_network() + _network = network_fakes.create_one_network() _subnet = network_fakes.FakeSubnet.create_one_subnet() self.network.find_network = mock.Mock(return_value=_network) self.network.find_subnet = mock.Mock(return_value=_subnet) @@ -512,8 +512,7 @@ class TestListRouter(TestRouter): self.network.routers = mock.Mock(return_value=self.routers) self.network.find_extension = mock.Mock(return_value=self._extensions) self.network.find_router = mock.Mock(return_value=self.routers[0]) - self._testagent = \ - network_fakes.FakeNetworkAgent.create_one_network_agent() + self._testagent = network_fakes.create_one_network_agent() self.network.get_agent = mock.Mock(return_value=self._testagent) self.network.get_router = mock.Mock(return_value=self.routers[0]) @@ -739,7 +738,7 @@ class TestListRouter(TestRouter): class TestRemovePortFromRouter(TestRouter): '''Remove port from a Router ''' - _port = network_fakes.FakePort.create_one_port() + _port = network_fakes.create_one_port() _router = network_fakes.FakeRouter.create_one_router( attrs={'port': _port.id}) @@ -957,7 +956,7 @@ class TestSetRouter(TestRouter): # The router to set. _default_route = {'destination': '10.20.20.0/24', 'nexthop': '10.20.30.1'} - _network = network_fakes.FakeNetwork.create_one_network() + _network = network_fakes.create_one_network() _subnet = network_fakes.FakeSubnet.create_one_subnet() _router = network_fakes.FakeRouter.create_one_router( attrs={'routes': [_default_route], @@ -1364,7 +1363,7 @@ class TestShowRouter(TestRouter): # The router to set. _router = network_fakes.FakeRouter.create_one_router() - _port = network_fakes.FakePort.create_one_port({ + _port = network_fakes.create_one_port({ 'device_owner': 'network:router_interface', 'device_id': _router.id }) @@ -1485,7 +1484,7 @@ class TestUnsetRouter(TestRouter): def setUp(self): super(TestUnsetRouter, self).setUp() - self.fake_network = network_fakes.FakeNetwork.create_one_network() + self.fake_network = network_fakes.create_one_network() self.fake_qos_policy = ( network_fakes.FakeNetworkQosPolicy.create_one_qos_policy()) self._testrouter = network_fakes.FakeRouter.create_one_router( diff --git a/openstackclient/tests/unit/network/v2/test_security_group_rule_network.py b/openstackclient/tests/unit/network/v2/test_security_group_rule_network.py index 4e765f3d..3c90f281 100644 --- a/openstackclient/tests/unit/network/v2/test_security_group_rule_network.py +++ b/openstackclient/tests/unit/network/v2/test_security_group_rule_network.py @@ -47,7 +47,7 @@ class TestCreateSecurityGroupRuleNetwork(TestSecurityGroupRuleNetwork): network_fakes.FakeSecurityGroup.create_one_security_group() # The address group to be used in security group rules - _address_group = network_fakes.FakeAddressGroup.create_one_address_group() + _address_group = network_fakes.create_one_address_group() expected_columns = ( 'description', diff --git a/openstackclient/tests/unit/network/v2/test_subnet.py b/openstackclient/tests/unit/network/v2/test_subnet.py index dcac2ef8..6b3ab2cc 100644 --- a/openstackclient/tests/unit/network/v2/test_subnet.py +++ b/openstackclient/tests/unit/network/v2/test_subnet.py @@ -95,7 +95,7 @@ class TestCreateSubnet(TestSubnet): ) # The network to be returned from find_network - self._network = network_fakes.FakeNetwork.create_one_network( + self._network = network_fakes.create_one_network( attrs={ 'id': self._subnet.network_id, } @@ -103,7 +103,7 @@ class TestCreateSubnet(TestSubnet): # The network segment to be returned from find_segment self._network_segment = \ - network_fakes.FakeNetworkSegment.create_one_network_segment( + network_fakes.create_one_network_segment( attrs={ 'network_id': self._subnet.network_id, } @@ -828,7 +828,7 @@ class TestListSubnet(TestSubnet): self.assertCountEqual(self.data, list(data)) def test_subnet_list_network(self): - network = network_fakes.FakeNetwork.create_one_network() + network = network_fakes.create_one_network() self.network.find_network = mock.Mock(return_value=network) arglist = [ '--network', network.id, @@ -1185,8 +1185,8 @@ class TestSetSubnet(TestSubnet): self._test_set_tags(with_tags=False) def test_set_segment(self): - _net = network_fakes.FakeNetwork.create_one_network() - _segment = network_fakes.FakeNetworkSegment.create_one_network_segment( + _net = network_fakes.create_one_network() + _segment = network_fakes.create_one_network_segment( attrs={'network_id': _net.id}) _subnet = network_fakes.FakeSubnet.create_one_subnet( {'host_routes': [{'destination': '10.20.20.0/24', diff --git a/openstackclient/tests/unit/network/v2/test_subnet_pool.py b/openstackclient/tests/unit/network/v2/test_subnet_pool.py index 55d2cc29..b24906b5 100644 --- a/openstackclient/tests/unit/network/v2/test_subnet_pool.py +++ b/openstackclient/tests/unit/network/v2/test_subnet_pool.py @@ -44,7 +44,7 @@ class TestCreateSubnetPool(TestSubnetPool): # The new subnet pool to create. _subnet_pool = network_fakes.FakeSubnetPool.create_one_subnet_pool() - _address_scope = network_fakes.FakeAddressScope.create_one_address_scope() + _address_scope = network_fakes.create_one_address_scope() columns = ( 'address_scope_id', @@ -614,7 +614,7 @@ class TestListSubnetPool(TestSubnetPool): self.assertCountEqual(self.data, list(data)) def test_subnet_pool_list_address_scope(self): - addr_scope = network_fakes.FakeAddressScope.create_one_address_scope() + addr_scope = network_fakes.create_one_address_scope() self.network.find_address_scope = mock.Mock(return_value=addr_scope) arglist = [ '--address-scope', addr_scope.id, @@ -665,7 +665,7 @@ class TestSetSubnetPool(TestSubnetPool): 'tags': ['green', 'red']} ) - _address_scope = network_fakes.FakeAddressScope.create_one_address_scope() + _address_scope = network_fakes.create_one_address_scope() def setUp(self): super(TestSetSubnetPool, self).setUp() diff --git a/openstackclient/tests/unit/volume/v3/fakes.py b/openstackclient/tests/unit/volume/v3/fakes.py index 9040b2be..e27d7fca 100644 --- a/openstackclient/tests/unit/volume/v3/fakes.py +++ b/openstackclient/tests/unit/volume/v3/fakes.py @@ -32,6 +32,8 @@ class FakeVolumeClient(object): self.attachments = mock.Mock() self.attachments.resource_class = fakes.FakeResource(None, {}) + self.clusters = mock.Mock() + self.clusters.resource_class = fakes.FakeResource(None, {}) self.groups = mock.Mock() self.groups.resource_class = fakes.FakeResource(None, {}) self.group_snapshots = mock.Mock() @@ -40,6 +42,8 @@ class FakeVolumeClient(object): self.group_types.resource_class = fakes.FakeResource(None, {}) self.messages = mock.Mock() self.messages.resource_class = fakes.FakeResource(None, {}) + self.resource_filters = mock.Mock() + self.resource_filters.resource_class = fakes.FakeResource(None, {}) self.volumes = mock.Mock() self.volumes.resource_class = fakes.FakeResource(None, {}) self.volume_types = mock.Mock() @@ -70,6 +74,105 @@ FakeVolume = volume_v2_fakes.FakeVolume FakeVolumeType = volume_v2_fakes.FakeVolumeType +class FakeCluster: + """Fake one or more clusters.""" + + @staticmethod + def create_one_cluster(attrs=None): + """Create a fake service cluster. + + :param attrs: A dictionary with all attributes of service cluster + :return: A FakeResource object with id, name, status, etc. + """ + attrs = attrs or {} + + # Set default attribute + cluster_info = { + 'name': f'cluster-{uuid.uuid4().hex}', + 'binary': f'binary-{uuid.uuid4().hex}', + 'state': random.choice(['up', 'down']), + 'status': random.choice(['enabled', 'disabled']), + 'disabled_reason': None, + 'num_hosts': random.randint(1, 64), + 'num_down_hosts': random.randint(1, 64), + 'last_heartbeat': '2015-09-16T09:28:52.000000', + 'created_at': '2015-09-16T09:28:52.000000', + 'updated_at': '2015-09-16T09:28:52.000000', + 'replication_status': None, + 'frozen': False, + 'active_backend_id': None, + } + + # Overwrite default attributes if there are some attributes set + cluster_info.update(attrs) + + return fakes.FakeResource( + None, + cluster_info, + loaded=True) + + @staticmethod + def create_clusters(attrs=None, count=2): + """Create multiple fake service clusters. + + :param attrs: A dictionary with all attributes of service cluster + :param count: The number of service clusters to be faked + :return: A list of FakeResource objects + """ + clusters = [] + for n in range(0, count): + clusters.append(FakeCluster.create_one_cluster(attrs)) + + return clusters + + +class FakeResourceFilter: + """Fake one or more resource filters.""" + + @staticmethod + def create_one_resource_filter(attrs=None): + """Create a fake resource filter. + + :param attrs: A dictionary with all attributes of resource filter + :return: A FakeResource object with id, name, status, etc. + """ + attrs = attrs or {} + + # Set default attribute + + resource_filter_info = { + 'filters': [ + 'name', + 'status', + 'image_metadata', + 'bootable', + 'migration_status', + ], + 'resource': 'volume', + } + + # Overwrite default attributes if there are some attributes set + resource_filter_info.update(attrs) + + return fakes.FakeResource(None, resource_filter_info, loaded=True) + + @staticmethod + def create_resource_filters(attrs=None, count=2): + """Create multiple fake resource filters. + + :param attrs: A dictionary with all attributes of resource filter + :param count: The number of resource filters to be faked + :return: A list of FakeResource objects + """ + resource_filters = [] + for n in range(0, count): + resource_filters.append( + FakeResourceFilter.create_one_resource_filter(attrs) + ) + + return resource_filters + + class FakeVolumeGroup: """Fake one or more volume groups.""" @@ -255,11 +358,10 @@ class FakeVolumeMessage: # Overwrite default attributes if there are some attributes set message_info.update(attrs) - message = fakes.FakeResource( + return fakes.FakeResource( None, message_info, loaded=True) - return message @staticmethod def create_volume_messages(attrs=None, count=2): @@ -348,11 +450,10 @@ class FakeVolumeAttachment: # Overwrite default attributes if there are some attributes set attachment_info.update(attrs) - attachment = fakes.FakeResource( + return fakes.FakeResource( None, attachment_info, loaded=True) - return attachment @staticmethod def create_volume_attachments(attrs=None, count=2): diff --git a/openstackclient/tests/unit/volume/v3/test_block_storage_cluster.py b/openstackclient/tests/unit/volume/v3/test_block_storage_cluster.py new file mode 100644 index 00000000..d87a946b --- /dev/null +++ b/openstackclient/tests/unit/volume/v3/test_block_storage_cluster.py @@ -0,0 +1,434 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +from cinderclient import api_versions +from osc_lib import exceptions + +from openstackclient.tests.unit.volume.v3 import fakes as volume_fakes +from openstackclient.volume.v3 import block_storage_cluster + + +class TestBlockStorageCluster(volume_fakes.TestVolume): + + def setUp(self): + super().setUp() + + # Get a shortcut to the BlockStorageClusterManager Mock + self.cluster_mock = self.app.client_manager.volume.clusters + self.cluster_mock.reset_mock() + + +class TestBlockStorageClusterList(TestBlockStorageCluster): + + # The cluster to be listed + fake_clusters = volume_fakes.FakeCluster.create_clusters() + + def setUp(self): + super().setUp() + + self.cluster_mock.list.return_value = self.fake_clusters + + # Get the command object to test + self.cmd = \ + block_storage_cluster.ListBlockStorageCluster(self.app, None) + + def test_cluster_list(self): + self.app.client_manager.volume.api_version = \ + api_versions.APIVersion('3.7') + + arglist = [ + ] + verifylist = [ + ('cluster', None), + ('binary', None), + ('is_up', None), + ('is_disabled', None), + ('num_hosts', None), + ('num_down_hosts', None), + ('long', False), + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + expected_columns = ('Name', 'Binary', 'State', 'Status') + expected_data = tuple( + ( + cluster.name, + cluster.binary, + cluster.state, + cluster.status, + ) for cluster in self.fake_clusters + ) + columns, data = self.cmd.take_action(parsed_args) + + self.assertEqual(expected_columns, columns) + self.assertEqual(expected_data, tuple(data)) + + # checking if proper call was made to list clusters + self.cluster_mock.list.assert_called_with( + name=None, + binary=None, + is_up=None, + disabled=None, + num_hosts=None, + num_down_hosts=None, + detailed=False, + ) + + def test_cluster_list_with_full_options(self): + self.app.client_manager.volume.api_version = \ + api_versions.APIVersion('3.7') + + arglist = [ + '--cluster', 'foo', + '--binary', 'bar', + '--up', + '--disabled', + '--num-hosts', '5', + '--num-down-hosts', '0', + '--long', + ] + verifylist = [ + ('cluster', 'foo'), + ('binary', 'bar'), + ('is_up', True), + ('is_disabled', True), + ('num_hosts', 5), + ('num_down_hosts', 0), + ('long', True), + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + expected_columns = ( + 'Name', + 'Binary', + 'State', + 'Status', + 'Num Hosts', + 'Num Down Hosts', + 'Last Heartbeat', + 'Disabled Reason', + 'Created At', + 'Updated At', + ) + expected_data = tuple( + ( + cluster.name, + cluster.binary, + cluster.state, + cluster.status, + cluster.num_hosts, + cluster.num_down_hosts, + cluster.last_heartbeat, + cluster.disabled_reason, + cluster.created_at, + cluster.updated_at, + ) for cluster in self.fake_clusters + ) + columns, data = self.cmd.take_action(parsed_args) + + self.assertEqual(expected_columns, columns) + self.assertEqual(expected_data, tuple(data)) + + # checking if proper call was made to list clusters + self.cluster_mock.list.assert_called_with( + name='foo', + binary='bar', + is_up=True, + disabled=True, + num_hosts=5, + num_down_hosts=0, + detailed=True, + ) + + def test_cluster_list_pre_v37(self): + self.app.client_manager.volume.api_version = \ + api_versions.APIVersion('3.6') + + arglist = [ + ] + verifylist = [ + ('cluster', None), + ('binary', None), + ('is_up', None), + ('is_disabled', None), + ('num_hosts', None), + ('num_down_hosts', None), + ('long', False), + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + exc = self.assertRaises( + exceptions.CommandError, + self.cmd.take_action, + parsed_args) + self.assertIn( + '--os-volume-api-version 3.7 or greater is required', str(exc)) + + +class TestBlockStorageClusterSet(TestBlockStorageCluster): + + cluster = volume_fakes.FakeCluster.create_one_cluster() + columns = ( + 'Name', + 'Binary', + 'State', + 'Status', + 'Disabled Reason', + 'Hosts', + 'Down Hosts', + 'Last Heartbeat', + 'Created At', + 'Updated At', + 'Replication Status', + 'Frozen', + 'Active Backend ID', + ) + data = ( + cluster.name, + cluster.binary, + cluster.state, + cluster.status, + cluster.disabled_reason, + cluster.num_hosts, + cluster.num_down_hosts, + cluster.last_heartbeat, + cluster.created_at, + cluster.updated_at, + cluster.replication_status, + cluster.frozen, + cluster.active_backend_id, + ) + + def setUp(self): + super().setUp() + + self.cluster_mock.update.return_value = self.cluster + + self.cmd = \ + block_storage_cluster.SetBlockStorageCluster(self.app, None) + + def test_cluster_set(self): + self.app.client_manager.volume.api_version = \ + api_versions.APIVersion('3.7') + + arglist = [ + '--enable', + self.cluster.name, + ] + verifylist = [ + ('cluster', self.cluster.name), + ('binary', 'cinder-volume'), + ('disabled', False), + ('disabled_reason', None), + ] + + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + columns, data = self.cmd.take_action(parsed_args) + self.assertEqual(self.columns, columns) + self.assertEqual(self.data, tuple(data)) + + self.cluster_mock.update.assert_called_once_with( + self.cluster.name, + 'cinder-volume', + disabled=False, + disabled_reason=None, + ) + + def test_cluster_set_disable_with_reason(self): + self.app.client_manager.volume.api_version = \ + api_versions.APIVersion('3.7') + + arglist = [ + '--binary', self.cluster.binary, + '--disable', + '--disable-reason', 'foo', + self.cluster.name, + ] + verifylist = [ + ('cluster', self.cluster.name), + ('binary', self.cluster.binary), + ('disabled', True), + ('disabled_reason', 'foo'), + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + columns, data = self.cmd.take_action(parsed_args) + self.assertEqual(self.columns, columns) + self.assertEqual(self.data, tuple(data)) + + self.cluster_mock.update.assert_called_once_with( + self.cluster.name, + self.cluster.binary, + disabled=True, + disabled_reason='foo', + ) + + def test_cluster_set_only_with_disable_reason(self): + self.app.client_manager.volume.api_version = \ + api_versions.APIVersion('3.7') + + arglist = [ + '--disable-reason', 'foo', + self.cluster.name, + ] + verifylist = [ + ('cluster', self.cluster.name), + ('binary', 'cinder-volume'), + ('disabled', None), + ('disabled_reason', 'foo'), + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + exc = self.assertRaises( + exceptions.CommandError, + self.cmd.take_action, + parsed_args) + self.assertIn( + "Cannot specify --disable-reason without --disable", str(exc)) + + def test_cluster_set_enable_with_disable_reason(self): + self.app.client_manager.volume.api_version = \ + api_versions.APIVersion('3.7') + + arglist = [ + '--enable', + '--disable-reason', 'foo', + self.cluster.name, + ] + verifylist = [ + ('cluster', self.cluster.name), + ('binary', 'cinder-volume'), + ('disabled', False), + ('disabled_reason', 'foo'), + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + exc = self.assertRaises( + exceptions.CommandError, + self.cmd.take_action, + parsed_args) + self.assertIn( + "Cannot specify --disable-reason without --disable", str(exc)) + + def test_cluster_set_pre_v37(self): + self.app.client_manager.volume.api_version = \ + api_versions.APIVersion('3.6') + + arglist = [ + '--enable', + self.cluster.name, + ] + verifylist = [ + ('cluster', self.cluster.name), + ('binary', 'cinder-volume'), + ('disabled', False), + ('disabled_reason', None), + ] + + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + exc = self.assertRaises( + exceptions.CommandError, + self.cmd.take_action, + parsed_args) + self.assertIn( + '--os-volume-api-version 3.7 or greater is required', str(exc)) + + +class TestBlockStorageClusterShow(TestBlockStorageCluster): + + cluster = volume_fakes.FakeCluster.create_one_cluster() + columns = ( + 'Name', + 'Binary', + 'State', + 'Status', + 'Disabled Reason', + 'Hosts', + 'Down Hosts', + 'Last Heartbeat', + 'Created At', + 'Updated At', + 'Replication Status', + 'Frozen', + 'Active Backend ID', + ) + data = ( + cluster.name, + cluster.binary, + cluster.state, + cluster.status, + cluster.disabled_reason, + cluster.num_hosts, + cluster.num_down_hosts, + cluster.last_heartbeat, + cluster.created_at, + cluster.updated_at, + cluster.replication_status, + cluster.frozen, + cluster.active_backend_id, + ) + + def setUp(self): + super().setUp() + + self.cluster_mock.show.return_value = self.cluster + + self.cmd = \ + block_storage_cluster.ShowBlockStorageCluster(self.app, None) + + def test_cluster_show(self): + self.app.client_manager.volume.api_version = \ + api_versions.APIVersion('3.7') + + arglist = [ + '--binary', self.cluster.binary, + self.cluster.name, + ] + verifylist = [ + ('cluster', self.cluster.name), + ('binary', self.cluster.binary), + ] + + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + columns, data = self.cmd.take_action(parsed_args) + self.assertEqual(self.columns, columns) + self.assertEqual(self.data, tuple(data)) + + self.cluster_mock.show.assert_called_once_with( + self.cluster.name, + binary=self.cluster.binary, + ) + + def test_cluster_show_pre_v37(self): + self.app.client_manager.volume.api_version = \ + api_versions.APIVersion('3.6') + + arglist = [ + '--binary', self.cluster.binary, + self.cluster.name, + ] + verifylist = [ + ('cluster', self.cluster.name), + ('binary', self.cluster.binary), + ] + + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + exc = self.assertRaises( + exceptions.CommandError, + self.cmd.take_action, + parsed_args) + self.assertIn( + '--os-volume-api-version 3.7 or greater is required', str(exc)) diff --git a/openstackclient/tests/unit/volume/v3/test_block_storage_resource_filter.py b/openstackclient/tests/unit/volume/v3/test_block_storage_resource_filter.py new file mode 100644 index 00000000..b886726d --- /dev/null +++ b/openstackclient/tests/unit/volume/v3/test_block_storage_resource_filter.py @@ -0,0 +1,144 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +from cinderclient import api_versions +from osc_lib import exceptions + +from openstackclient.tests.unit.volume.v3 import fakes as volume_fakes +from openstackclient.volume.v3 import block_storage_resource_filter + + +class TestBlockStorageResourceFilter(volume_fakes.TestVolume): + + def setUp(self): + super().setUp() + + # Get a shortcut to the ResourceFilterManager Mock + self.resource_filter_mock = \ + self.app.client_manager.volume.resource_filters + self.resource_filter_mock.reset_mock() + + +class TestBlockStorageResourceFilterList(TestBlockStorageResourceFilter): + + # The resource filters to be listed + fake_resource_filters = \ + volume_fakes.FakeResourceFilter.create_resource_filters() + + def setUp(self): + super().setUp() + + self.resource_filter_mock.list.return_value = \ + self.fake_resource_filters + + # Get the command object to test + self.cmd = block_storage_resource_filter\ + .ListBlockStorageResourceFilter(self.app, None) + + def test_resource_filter_list(self): + self.app.client_manager.volume.api_version = \ + api_versions.APIVersion('3.33') + + arglist = [] + verifylist = [] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + expected_columns = ('Resource', 'Filters') + expected_data = tuple( + ( + resource_filter.resource, + resource_filter.filters, + ) for resource_filter in self.fake_resource_filters + ) + columns, data = self.cmd.take_action(parsed_args) + + self.assertEqual(expected_columns, columns) + self.assertEqual(expected_data, tuple(data)) + + # checking if proper call was made to list clusters + self.resource_filter_mock.list.assert_called_with() + + def test_resource_filter_list_pre_v333(self): + self.app.client_manager.volume.api_version = \ + api_versions.APIVersion('3.32') + + arglist = [] + verifylist = [] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + exc = self.assertRaises( + exceptions.CommandError, + self.cmd.take_action, + parsed_args) + self.assertIn( + '--os-volume-api-version 3.33 or greater is required', str(exc)) + + +class TestBlockStorageResourceFilterShow(TestBlockStorageResourceFilter): + + # The resource filters to be listed + fake_resource_filter = \ + volume_fakes.FakeResourceFilter.create_one_resource_filter() + + def setUp(self): + super().setUp() + + self.resource_filter_mock.list.return_value = \ + iter([self.fake_resource_filter]) + + # Get the command object to test + self.cmd = block_storage_resource_filter\ + .ShowBlockStorageResourceFilter(self.app, None) + + def test_resource_filter_show(self): + self.app.client_manager.volume.api_version = \ + api_versions.APIVersion('3.33') + + arglist = [ + self.fake_resource_filter.resource, + ] + verifylist = [ + ('resource', self.fake_resource_filter.resource), + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + expected_columns = ('filters', 'resource') + expected_data = ( + self.fake_resource_filter.filters, + self.fake_resource_filter.resource, + ) + columns, data = self.cmd.take_action(parsed_args) + + self.assertEqual(expected_columns, columns) + self.assertEqual(expected_data, data) + + # checking if proper call was made to list clusters + self.resource_filter_mock.list.assert_called_with(resource='volume') + + def test_resource_filter_show_pre_v333(self): + self.app.client_manager.volume.api_version = \ + api_versions.APIVersion('3.32') + + arglist = [ + self.fake_resource_filter.resource, + ] + verifylist = [ + ('resource', self.fake_resource_filter.resource), + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + exc = self.assertRaises( + exceptions.CommandError, + self.cmd.take_action, + parsed_args) + self.assertIn( + '--os-volume-api-version 3.33 or greater is required', str(exc)) |
