summaryrefslogtreecommitdiff
path: root/openstackclient/tests/unit
diff options
context:
space:
mode:
Diffstat (limited to 'openstackclient/tests/unit')
-rw-r--r--openstackclient/tests/unit/common/test_availability_zone.py3
-rw-r--r--openstackclient/tests/unit/common/test_quota.py1
-rw-r--r--openstackclient/tests/unit/compute/v2/fakes.py4
-rw-r--r--openstackclient/tests/unit/compute/v2/test_server.py894
-rw-r--r--openstackclient/tests/unit/compute/v2/test_server_migration.py1028
-rw-r--r--openstackclient/tests/unit/image/v2/test_image.py5
-rw-r--r--openstackclient/tests/unit/network/v2/fakes.py1585
-rw-r--r--openstackclient/tests/unit/network/v2/test_address_group.py20
-rw-r--r--openstackclient/tests/unit/network/v2/test_address_scope.py32
-rw-r--r--openstackclient/tests/unit/network/v2/test_floating_ip_network.py16
-rw-r--r--openstackclient/tests/unit/network/v2/test_floating_ip_port_forwarding.py2
-rw-r--r--openstackclient/tests/unit/network/v2/test_ip_availability.py10
-rw-r--r--openstackclient/tests/unit/network/v2/test_local_ip.py6
-rw-r--r--openstackclient/tests/unit/network/v2/test_local_ip_association.py2
-rw-r--r--openstackclient/tests/unit/network/v2/test_network.py97
-rw-r--r--openstackclient/tests/unit/network/v2/test_network_agent.py63
-rw-r--r--openstackclient/tests/unit/network/v2/test_network_auto_allocated_topology.py12
-rw-r--r--openstackclient/tests/unit/network/v2/test_network_flavor.py72
-rw-r--r--openstackclient/tests/unit/network/v2/test_network_flavor_profile.py54
-rw-r--r--openstackclient/tests/unit/network/v2/test_network_rbac.py50
-rw-r--r--openstackclient/tests/unit/network/v2/test_network_segment.py19
-rw-r--r--openstackclient/tests/unit/network/v2/test_network_segment_range.py18
-rw-r--r--openstackclient/tests/unit/network/v2/test_port.py98
-rw-r--r--openstackclient/tests/unit/network/v2/test_router.py15
-rw-r--r--openstackclient/tests/unit/network/v2/test_security_group_rule_network.py2
-rw-r--r--openstackclient/tests/unit/network/v2/test_subnet.py10
-rw-r--r--openstackclient/tests/unit/network/v2/test_subnet_pool.py6
-rw-r--r--openstackclient/tests/unit/volume/v3/fakes.py109
-rw-r--r--openstackclient/tests/unit/volume/v3/test_block_storage_cluster.py434
-rw-r--r--openstackclient/tests/unit/volume/v3/test_block_storage_resource_filter.py144
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))