summaryrefslogtreecommitdiff
path: root/openstackclient/tests
diff options
context:
space:
mode:
Diffstat (limited to 'openstackclient/tests')
-rw-r--r--openstackclient/tests/functional/base.py25
-rw-r--r--openstackclient/tests/functional/compute/v2/test_server.py33
-rw-r--r--openstackclient/tests/functional/image/v2/test_image.py8
-rw-r--r--openstackclient/tests/functional/volume/v1/test_volume_type.py4
-rw-r--r--openstackclient/tests/functional/volume/v2/test_volume_type.py4
-rw-r--r--openstackclient/tests/functional/volume/v3/test_volume_type.py4
-rw-r--r--openstackclient/tests/unit/compute/v2/fakes.py4
-rw-r--r--openstackclient/tests/unit/compute/v2/test_server.py101
-rw-r--r--openstackclient/tests/unit/image/v2/test_image.py5
-rw-r--r--openstackclient/tests/unit/network/v2/fakes.py551
-rw-r--r--openstackclient/tests/unit/network/v2/test_floating_ip_network.py8
-rw-r--r--openstackclient/tests/unit/network/v2/test_floating_ip_port_forwarding.py2
-rw-r--r--openstackclient/tests/unit/network/v2/test_local_ip.py2
-rw-r--r--openstackclient/tests/unit/network/v2/test_local_ip_association.py2
-rw-r--r--openstackclient/tests/unit/network/v2/test_network.py5
-rw-r--r--openstackclient/tests/unit/network/v2/test_network_agent.py53
-rw-r--r--openstackclient/tests/unit/network/v2/test_network_flavor.py6
-rw-r--r--openstackclient/tests/unit/network/v2/test_network_flavor_profile.py54
-rw-r--r--openstackclient/tests/unit/network/v2/test_network_rbac.py44
-rw-r--r--openstackclient/tests/unit/network/v2/test_port.py94
-rw-r--r--openstackclient/tests/unit/network/v2/test_router.py9
-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
24 files changed, 1245 insertions, 460 deletions
diff --git a/openstackclient/tests/functional/base.py b/openstackclient/tests/functional/base.py
index 0ed7dff8..b6867f81 100644
--- a/openstackclient/tests/functional/base.py
+++ b/openstackclient/tests/functional/base.py
@@ -10,6 +10,7 @@
# License for the specific language governing permissions and limitations
# under the License.
+import logging
import os
import shlex
import subprocess
@@ -18,22 +19,30 @@ from tempest.lib.cli import output_parser
from tempest.lib import exceptions
import testtools
-
ADMIN_CLOUD = os.environ.get('OS_ADMIN_CLOUD', 'devstack-admin')
+LOG = logging.getLogger(__name__)
def execute(cmd, fail_ok=False, merge_stderr=False):
"""Executes specified command for the given action."""
+ LOG.debug('Executing: %s', cmd)
cmdlist = shlex.split(cmd)
stdout = subprocess.PIPE
stderr = subprocess.STDOUT if merge_stderr else subprocess.PIPE
+
proc = subprocess.Popen(cmdlist, stdout=stdout, stderr=stderr)
- result, result_err = proc.communicate()
- result = result.decode('utf-8')
+
+ result_out, result_err = proc.communicate()
+ result_out = result_out.decode('utf-8')
+ LOG.debug('stdout: %s', result_out)
+ LOG.debug('stderr: %s', result_err)
+
if not fail_ok and proc.returncode != 0:
- raise exceptions.CommandFailed(proc.returncode, cmd, result,
- result_err)
- return result
+ raise exceptions.CommandFailed(
+ proc.returncode, cmd, result_out, result_err,
+ )
+
+ return result_out
class TestCase(testtools.TestCase):
@@ -42,7 +51,7 @@ class TestCase(testtools.TestCase):
def openstack(cls, cmd, cloud=ADMIN_CLOUD, fail_ok=False):
"""Executes openstackclient command for the given action
- NOTE(dtroyer): There is a subtle distinction between pasing
+ NOTE(dtroyer): There is a subtle distinction between passing
cloud=None and cloud='': for compatibility reasons passing
cloud=None continues to include the option '--os-auth-type none'
in the command while passing cloud='' omits the '--os-auth-type'
@@ -61,7 +70,7 @@ class TestCase(testtools.TestCase):
fail_ok=fail_ok
)
else:
- # Execure command with an explicit cloud specified
+ # Execute command with an explicit cloud specified
return execute(
'openstack --os-cloud=' + cloud + ' ' + cmd,
fail_ok=fail_ok
diff --git a/openstackclient/tests/functional/compute/v2/test_server.py b/openstackclient/tests/functional/compute/v2/test_server.py
index cf4bcbc2..0558ef62 100644
--- a/openstackclient/tests/functional/compute/v2/test_server.py
+++ b/openstackclient/tests/functional/compute/v2/test_server.py
@@ -1195,19 +1195,19 @@ class ServerTests(common.ComputeTestCase):
def test_server_add_remove_volume(self):
volume_wait_for = volume_common.BaseVolumeTests.wait_for_status
- name = uuid.uuid4().hex
+ server_name = uuid.uuid4().hex
cmd_output = json.loads(self.openstack(
'server create -f json ' +
'--network private ' +
'--flavor ' + self.flavor_name + ' ' +
'--image ' + self.image_name + ' ' +
'--wait ' +
- name
+ server_name
))
self.assertIsNotNone(cmd_output['id'])
- self.assertEqual(name, cmd_output['name'])
- self.addCleanup(self.openstack, 'server delete --wait ' + name)
+ self.assertEqual(server_name, cmd_output['name'])
+ self.addCleanup(self.openstack, 'server delete --wait ' + server_name)
server_id = cmd_output['id']
volume_name = uuid.uuid4().hex
@@ -1225,7 +1225,7 @@ class ServerTests(common.ComputeTestCase):
cmd_output = json.loads(self.openstack(
'server add volume -f json ' +
- name + ' ' +
+ server_name + ' ' +
volume_name + ' ' +
'--tag bar'
))
@@ -1237,7 +1237,7 @@ class ServerTests(common.ComputeTestCase):
cmd_output = json.loads(self.openstack(
'server volume list -f json ' +
- name
+ server_name
))
self.assertEqual(volume_attachment_id, cmd_output[0]['ID'])
@@ -1245,8 +1245,25 @@ class ServerTests(common.ComputeTestCase):
self.assertEqual(volume_id, cmd_output[0]['Volume ID'])
volume_wait_for('volume', volume_name, 'in-use')
- self.openstack('server remove volume ' + name + ' ' + volume_name)
+
+ cmd_output = json.loads(self.openstack(
+ 'server event list -f json ' +
+ server_name
+ ))
+ self.assertEqual(2, len(cmd_output))
+ self.assertIn('attach_volume', {x['Action'] for x in cmd_output})
+
+ self.openstack(
+ 'server remove volume ' + server_name + ' ' + volume_name
+ )
volume_wait_for('volume', volume_name, 'available')
- raw_output = self.openstack('server volume list ' + name)
+ cmd_output = json.loads(self.openstack(
+ 'server event list -f json ' +
+ server_name
+ ))
+ self.assertEqual(3, len(cmd_output))
+ self.assertIn('detach_volume', {x['Action'] for x in cmd_output})
+
+ raw_output = self.openstack('server volume list ' + server_name)
self.assertEqual('\n', raw_output)
diff --git a/openstackclient/tests/functional/image/v2/test_image.py b/openstackclient/tests/functional/image/v2/test_image.py
index 0a3a7360..5b074700 100644
--- a/openstackclient/tests/functional/image/v2/test_image.py
+++ b/openstackclient/tests/functional/image/v2/test_image.py
@@ -26,6 +26,7 @@ class ImageTests(base.BaseImageTests):
self.name = uuid.uuid4().hex
self.image_tag = 'my_tag'
+ self.image_tag1 = 'random'
json_output = json.loads(self.openstack(
'--os-image-api-version 2 '
'image create -f json --tag {tag} {name}'.format(
@@ -78,13 +79,18 @@ class ImageTests(base.BaseImageTests):
def test_image_list_with_tag_filter(self):
json_output = json.loads(self.openstack(
- 'image list --tag ' + self.image_tag + ' --long -f json'
+ 'image list --tag ' + self.image_tag + ' --tag ' +
+ self.image_tag1 + ' --long -f json'
))
for taglist in [img['Tags'] for img in json_output]:
self.assertIn(
self.image_tag,
taglist
)
+ self.assertIn(
+ self.image_tag1,
+ taglist
+ )
def test_image_attributes(self):
"""Test set, unset, show on attributes, tags and properties"""
diff --git a/openstackclient/tests/functional/volume/v1/test_volume_type.py b/openstackclient/tests/functional/volume/v1/test_volume_type.py
index fb8dabdb..7434b5b3 100644
--- a/openstackclient/tests/functional/volume/v1/test_volume_type.py
+++ b/openstackclient/tests/functional/volume/v1/test_volume_type.py
@@ -118,10 +118,10 @@ class VolumeTypeTests(common.BaseVolumeTests):
raw_output = self.openstack(cmd)
self.assertOutput('', raw_output)
- # NOTE: Add some basic funtional tests with the old format to
+ # NOTE: Add some basic functional tests with the old format to
# make sure the command works properly, need to change
# these to new test format when beef up all tests for
- # volume tye commands.
+ # volume type commands.
def test_encryption_type(self):
encryption_type = uuid.uuid4().hex
# test create new encryption type
diff --git a/openstackclient/tests/functional/volume/v2/test_volume_type.py b/openstackclient/tests/functional/volume/v2/test_volume_type.py
index 3f1a6ea8..861c393d 100644
--- a/openstackclient/tests/functional/volume/v2/test_volume_type.py
+++ b/openstackclient/tests/functional/volume/v2/test_volume_type.py
@@ -139,10 +139,10 @@ class VolumeTypeTests(common.BaseVolumeTests):
raw_output = self.openstack(cmd)
self.assertOutput('', raw_output)
- # NOTE: Add some basic funtional tests with the old format to
+ # NOTE: Add some basic functional tests with the old format to
# make sure the command works properly, need to change
# these to new test format when beef up all tests for
- # volume tye commands.
+ # volume type commands.
def test_encryption_type(self):
name = uuid.uuid4().hex
encryption_type = uuid.uuid4().hex
diff --git a/openstackclient/tests/functional/volume/v3/test_volume_type.py b/openstackclient/tests/functional/volume/v3/test_volume_type.py
index 79d40969..165c625c 100644
--- a/openstackclient/tests/functional/volume/v3/test_volume_type.py
+++ b/openstackclient/tests/functional/volume/v3/test_volume_type.py
@@ -139,10 +139,10 @@ class VolumeTypeTests(common.BaseVolumeTests):
raw_output = self.openstack(cmd)
self.assertOutput('', raw_output)
- # NOTE: Add some basic funtional tests with the old format to
+ # NOTE: Add some basic functional tests with the old format to
# make sure the command works properly, need to change
# these to new test format when beef up all tests for
- # volume tye commands.
+ # volume type commands.
def test_encryption_type(self):
name = uuid.uuid4().hex
encryption_type = uuid.uuid4().hex
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 46ace579..19e90a43 100644
--- a/openstackclient/tests/unit/compute/v2/test_server.py
+++ b/openstackclient/tests/unit/compute/v2/test_server.py
@@ -592,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])
@@ -661,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]
@@ -717,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])
@@ -759,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])
@@ -4885,6 +4885,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):
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 912f451f..1a1a6beb 100644
--- a/openstackclient/tests/unit/network/v2/fakes.py
+++ b/openstackclient/tests/unit/network/v2/fakes.py
@@ -20,6 +20,7 @@ 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
@@ -28,7 +29,10 @@ 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
@@ -128,297 +132,6 @@ class FakeExtension(object):
return extension
-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."""
@@ -1972,6 +1685,262 @@ def create_network_segment_ranges(attrs=None, count=2):
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_floating_ip_network.py b/openstackclient/tests/unit/network/v2/test_floating_ip_network.py
index a850045d..f76dcc79 100644
--- a/openstackclient/tests/unit/network/v2/test_floating_ip_network.py
+++ b/openstackclient/tests/unit/network/v2/test_floating_ip_network.py
@@ -42,7 +42,7 @@ class TestCreateFloatingIPNetwork(TestFloatingIPNetwork):
# Fake data for option tests.
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(
@@ -381,7 +381,7 @@ class TestListFloatingIPNetwork(TestFloatingIPNetwork):
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({
@@ -702,7 +702,7 @@ class TestSetFloatingIP(TestFloatingIPNetwork):
# Fake data for option tests.
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(
@@ -934,7 +934,7 @@ class TestUnsetFloatingIP(TestFloatingIPNetwork):
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_local_ip.py b/openstackclient/tests/unit/network/v2/test_local_ip.py
index 38e352f3..97e246df 100644
--- a/openstackclient/tests/unit/network/v2/test_local_ip.py
+++ b/openstackclient/tests/unit/network/v2/test_local_ip.py
@@ -41,7 +41,7 @@ class TestCreateLocalIP(TestLocalIP):
project = identity_fakes_v3.FakeProject.create_one_project()
domain = identity_fakes_v3.FakeDomain.create_one_domain()
local_ip_network = network_fakes.create_one_network()
- port = network_fakes.FakePort.create_one_port()
+ 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,
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 8edfbef1..6adb9e16 100644
--- a/openstackclient/tests/unit/network/v2/test_network.py
+++ b/openstackclient/tests/unit/network/v2/test_network.py
@@ -568,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(
@@ -859,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))
diff --git a/openstackclient/tests/unit/network/v2/test_network_agent.py b/openstackclient/tests/unit/network/v2/test_network_agent.py
index 6d3d882b..15c4c5de 100644
--- a/openstackclient/tests/unit/network/v2/test_network_agent.py
+++ b/openstackclient/tests/unit/network/v2/test_network_agent.py
@@ -34,7 +34,7 @@ class TestNetworkAgent(network_fakes.TestNetworkV2):
class TestAddNetworkToAgent(TestNetworkAgent):
net = network_fakes.create_one_network()
- agent = network_fakes.FakeNetworkAgent.create_one_network_agent()
+ 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,8 +215,7 @@ 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.create_one_network()
@@ -341,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.create_one_network()
- agent = network_fakes.FakeNetworkAgent.create_one_network_agent()
+ agent = network_fakes.create_one_network_agent()
def setUp(self):
super(TestRemoveNetworkFromAgent, self).setUp()
@@ -398,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()
@@ -438,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()
@@ -515,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',
@@ -524,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):
@@ -568,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_flavor.py b/openstackclient/tests/unit/network/v2/test_network_flavor.py
index 11364107..3149def6 100644
--- a/openstackclient/tests/unit/network/v2/test_network_flavor.py
+++ b/openstackclient/tests/unit/network/v2/test_network_flavor.py
@@ -40,8 +40,7 @@ class TestNetworkFlavor(network_fakes.TestNetworkV2):
class TestAddNetworkFlavorToProfile(TestNetworkFlavor):
network_flavor = network_fakes.create_one_network_flavor()
- service_profile = \
- network_fakes.FakeNetworkFlavorProfile.create_one_service_profile()
+ service_profile = network_fakes.create_one_service_profile()
def setUp(self):
super(TestAddNetworkFlavorToProfile, self).setUp()
@@ -320,8 +319,7 @@ class TestListNetworkFlavor(TestNetworkFlavor):
class TestRemoveNetworkFlavorFromProfile(TestNetworkFlavor):
network_flavor = network_fakes.create_one_network_flavor()
- service_profile = \
- network_fakes.FakeNetworkFlavorProfile.create_one_service_profile()
+ service_profile = network_fakes.create_one_service_profile()
def setUp(self):
super(TestRemoveNetworkFlavorFromProfile, 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 c7e3374d..b0bc7e86 100644
--- a/openstackclient/tests/unit/network/v2/test_network_rbac.py
+++ b/openstackclient/tests/unit/network/v2/test_network_rbac.py
@@ -44,7 +44,7 @@ class TestCreateNetworkRBAC(TestNetworkRBAC):
snp_object = network_fakes.FakeSubnetPool.create_one_subnet_pool()
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_port.py b/openstackclient/tests/unit/network/v2/test_port.py
index bde01800..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):
@@ -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',
@@ -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 14840e1d..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})
@@ -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})
@@ -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
})
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))