summaryrefslogtreecommitdiff
path: root/openstackclient/tests
diff options
context:
space:
mode:
Diffstat (limited to 'openstackclient/tests')
-rw-r--r--openstackclient/tests/network/v2/fakes.py37
-rw-r--r--openstackclient/tests/network/v2/test_subnet.py20
-rw-r--r--openstackclient/tests/network/v2/test_subnet_pool.py105
-rw-r--r--openstackclient/tests/volume/v2/fakes.py2
-rw-r--r--openstackclient/tests/volume/v2/test_type.py66
5 files changed, 222 insertions, 8 deletions
diff --git a/openstackclient/tests/network/v2/fakes.py b/openstackclient/tests/network/v2/fakes.py
index 815e677d..5fd7ea3b 100644
--- a/openstackclient/tests/network/v2/fakes.py
+++ b/openstackclient/tests/network/v2/fakes.py
@@ -71,6 +71,43 @@ class TestNetworkV2(utils.TestCommand):
)
+class FakeAddressScope(object):
+ """Fake one or more address scopes."""
+
+ @staticmethod
+ def create_one_address_scope(attrs=None):
+ """Create a fake address scope.
+
+ :param Dictionary attrs:
+ A dictionary with all attributes
+ :return:
+ A FakeResource object with name, id, etc.
+ """
+ if attrs is None:
+ attrs = {}
+
+ # Set default attributes.
+ address_scope_attrs = {
+ 'name': 'address-scope-name-' + uuid.uuid4().hex,
+ 'id': 'address-scope-id-' + uuid.uuid4().hex,
+ 'tenant_id': 'project-id-' + uuid.uuid4().hex,
+ 'shared': False,
+ 'ip_version': 4,
+ }
+
+ # Overwrite default attributes.
+ address_scope_attrs.update(attrs)
+
+ address_scope = fakes.FakeResource(
+ info=copy.deepcopy(address_scope_attrs),
+ loaded=True)
+
+ # Set attributes with special mapping in OpenStack SDK.
+ address_scope.project_id = address_scope_attrs['tenant_id']
+
+ return address_scope
+
+
class FakeAvailabilityZone(object):
"""Fake one or more network availability zones (AZs)."""
diff --git a/openstackclient/tests/network/v2/test_subnet.py b/openstackclient/tests/network/v2/test_subnet.py
index 2535bbe6..ede37416 100644
--- a/openstackclient/tests/network/v2/test_subnet.py
+++ b/openstackclient/tests/network/v2/test_subnet.py
@@ -536,6 +536,26 @@ class TestSetSubnet(TestSubnet):
self.assertRaises(exceptions.CommandError, self.cmd.take_action,
parsed_args)
+ def test_append_options(self):
+ _testsubnet = network_fakes.FakeSubnet.create_one_subnet(
+ {'dns_nameservers': ["10.0.0.1"]})
+ self.network.find_subnet = mock.Mock(return_value=_testsubnet)
+ arglist = [
+ '--dns-nameserver', '10.0.0.2',
+ _testsubnet.name,
+ ]
+ verifylist = [
+ ('dns_nameservers', ['10.0.0.2']),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ result = self.cmd.take_action(parsed_args)
+ attrs = {
+ 'dns_nameservers': ['10.0.0.2', '10.0.0.1'],
+ }
+ self.network.update_subnet.assert_called_once_with(
+ _testsubnet, **attrs)
+ self.assertIsNone(result)
+
class TestShowSubnet(TestSubnet):
# The subnets to be shown
diff --git a/openstackclient/tests/network/v2/test_subnet_pool.py b/openstackclient/tests/network/v2/test_subnet_pool.py
index 093e26c6..cbb32fc3 100644
--- a/openstackclient/tests/network/v2/test_subnet_pool.py
+++ b/openstackclient/tests/network/v2/test_subnet_pool.py
@@ -38,6 +38,8 @@ class TestCreateSubnetPool(TestSubnetPool):
# The new subnet pool to create.
_subnet_pool = network_fakes.FakeSubnetPool.create_one_subnet_pool()
+ _address_scope = network_fakes.FakeAddressScope.create_one_address_scope()
+
columns = (
'address_scope_id',
'default_prefixlen',
@@ -76,6 +78,9 @@ class TestCreateSubnetPool(TestSubnetPool):
# Get the command object to test
self.cmd = subnet_pool.CreateSubnetPool(self.app, self.namespace)
+ self.network.find_address_scope = mock.Mock(
+ return_value=self._address_scope)
+
# Set identity client. And get a shortcut to Identity client.
identity_client = identity_fakes_v3.FakeIdentityv3Client(
endpoint=fakes.AUTH_URL,
@@ -193,6 +198,29 @@ class TestCreateSubnetPool(TestSubnetPool):
self.assertEqual(self.columns, columns)
self.assertEqual(self.data, data)
+ def test_create_address_scope_option(self):
+ arglist = [
+ '--pool-prefix', '10.0.10.0/24',
+ '--address-scope', self._address_scope.id,
+ self._subnet_pool.name,
+ ]
+ verifylist = [
+ ('prefixes', ['10.0.10.0/24']),
+ ('address_scope', self._address_scope.id),
+ ('name', self._subnet_pool.name),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ columns, data = (self.cmd.take_action(parsed_args))
+
+ self.network.create_subnet_pool.assert_called_once_with(**{
+ 'prefixes': ['10.0.10.0/24'],
+ 'address_scope_id': self._address_scope.id,
+ 'name': self._subnet_pool.name,
+ })
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.data, data)
+
class TestDeleteSubnetPool(TestSubnetPool):
@@ -246,7 +274,7 @@ class TestListSubnetPool(TestSubnetPool):
data.append((
pool.id,
pool.name,
- pool.prefixes,
+ utils.format_list(pool.prefixes),
))
data_long = []
@@ -254,7 +282,7 @@ class TestListSubnetPool(TestSubnetPool):
data_long.append((
pool.id,
pool.name,
- pool.prefixes,
+ utils.format_list(pool.prefixes),
pool.default_prefixlen,
pool.address_scope_id,
))
@@ -301,6 +329,8 @@ class TestSetSubnetPool(TestSubnetPool):
# The subnet_pool to set.
_subnet_pool = network_fakes.FakeSubnetPool.create_one_subnet_pool()
+ _address_scope = network_fakes.FakeAddressScope.create_one_address_scope()
+
def setUp(self):
super(TestSetSubnetPool, self).setUp()
@@ -309,21 +339,24 @@ class TestSetSubnetPool(TestSubnetPool):
self.network.find_subnet_pool = mock.Mock(
return_value=self._subnet_pool)
+ self.network.find_address_scope = mock.Mock(
+ return_value=self._address_scope)
+
# Get the command object to test
self.cmd = subnet_pool.SetSubnetPool(self.app, self.namespace)
def test_set_this(self):
arglist = [
- self._subnet_pool.name,
'--name', 'noob',
'--default-prefix-length', '8',
'--min-prefix-length', '8',
+ self._subnet_pool.name,
]
verifylist = [
- ('subnet_pool', self._subnet_pool.name),
('name', 'noob'),
('default_prefix_length', '8'),
('min_prefix_length', '8'),
+ ('subnet_pool', self._subnet_pool.name),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
@@ -340,15 +373,15 @@ class TestSetSubnetPool(TestSubnetPool):
def test_set_that(self):
arglist = [
- self._subnet_pool.name,
'--pool-prefix', '10.0.1.0/24',
'--pool-prefix', '10.0.2.0/24',
'--max-prefix-length', '16',
+ self._subnet_pool.name,
]
verifylist = [
- ('subnet_pool', self._subnet_pool.name),
('prefixes', ['10.0.1.0/24', '10.0.2.0/24']),
('max_prefix_length', '16'),
+ ('subnet_pool', self._subnet_pool.name),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
@@ -374,17 +407,73 @@ class TestSetSubnetPool(TestSubnetPool):
def test_set_len_negative(self):
arglist = [
- self._subnet_pool.name,
'--max-prefix-length', '-16',
+ self._subnet_pool.name,
]
verifylist = [
- ('subnet_pool', self._subnet_pool.name),
('max_prefix_length', '-16'),
+ ('subnet_pool', self._subnet_pool.name),
]
self.assertRaises(argparse.ArgumentTypeError, self.check_parser,
self.cmd, arglist, verifylist)
+ def test_set_address_scope(self):
+ arglist = [
+ '--address-scope', self._address_scope.id,
+ self._subnet_pool.name,
+ ]
+ verifylist = [
+ ('address_scope', self._address_scope.id),
+ ('subnet_pool', self._subnet_pool.name),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+
+ attrs = {
+ 'address_scope_id': self._address_scope.id,
+ }
+ self.network.update_subnet_pool.assert_called_once_with(
+ self._subnet_pool, **attrs)
+ self.assertIsNone(result)
+
+ def test_set_no_address_scope(self):
+ arglist = [
+ '--no-address-scope',
+ self._subnet_pool.name,
+ ]
+ verifylist = [
+ ('no_address_scope', True),
+ ('subnet_pool', self._subnet_pool.name),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+
+ attrs = {
+ 'address_scope_id': None,
+ }
+ self.network.update_subnet_pool.assert_called_once_with(
+ self._subnet_pool, **attrs)
+ self.assertIsNone(result)
+
+ def test_set_no_address_scope_conflict(self):
+ arglist = [
+ '--address-scope', self._address_scope.id,
+ '--no-address-scope',
+ self._subnet_pool.name,
+ ]
+ verifylist = [
+ ('address_scope', self._address_scope.id),
+ ('no_address_scope', True),
+ ('subnet_pool', self._subnet_pool.name),
+ ]
+
+ # Exclusive arguments will conflict here.
+ self.assertRaises(tests_utils.ParserException, self.check_parser,
+ self.cmd, arglist, verifylist)
+
class TestShowSubnetPool(TestSubnetPool):
diff --git a/openstackclient/tests/volume/v2/fakes.py b/openstackclient/tests/volume/v2/fakes.py
index 97bbc59b..3c238d10 100644
--- a/openstackclient/tests/volume/v2/fakes.py
+++ b/openstackclient/tests/volume/v2/fakes.py
@@ -243,6 +243,8 @@ class FakeVolumeClient(object):
self.backups.resource_class = fakes.FakeResource(None, {})
self.volume_types = mock.Mock()
self.volume_types.resource_class = fakes.FakeResource(None, {})
+ self.volume_type_access = mock.Mock()
+ self.volume_type_access.resource_class = fakes.FakeResource(None, {})
self.restores = mock.Mock()
self.restores.resource_class = fakes.FakeResource(None, {})
self.qos_specs = mock.Mock()
diff --git a/openstackclient/tests/volume/v2/test_type.py b/openstackclient/tests/volume/v2/test_type.py
index b014706b..448da432 100644
--- a/openstackclient/tests/volume/v2/test_type.py
+++ b/openstackclient/tests/volume/v2/test_type.py
@@ -15,6 +15,8 @@
import copy
from openstackclient.tests import fakes
+from openstackclient.tests.identity.v3 import fakes as identity_fakes
+from openstackclient.tests import utils as tests_utils
from openstackclient.tests.volume.v2 import fakes as volume_fakes
from openstackclient.volume.v2 import volume_type
@@ -41,6 +43,13 @@ class TestType(volume_fakes.TestVolume):
self.types_mock = self.app.client_manager.volume.volume_types
self.types_mock.reset_mock()
+ self.types_access_mock = (
+ self.app.client_manager.volume.volume_type_access)
+ self.types_access_mock.reset_mock()
+
+ self.projects_mock = self.app.client_manager.identity.projects
+ self.projects_mock.reset_mock()
+
class TestTypeCreate(TestType):
@@ -211,6 +220,13 @@ class TestTypeSet(TestType):
loaded=True,
)
+ # Return a project
+ self.projects_mock.get.return_value = fakes.FakeResource(
+ None,
+ copy.deepcopy(identity_fakes.PROJECT),
+ loaded=True,
+ )
+
# Get the command object to test
self.cmd = volume_type.SetVolumeType(self.app, None)
@@ -286,6 +302,56 @@ class TestTypeSet(TestType):
self.assertIn('myprop', result)
self.assertEqual('myvalue', result['myprop'])
+ def test_type_set_not_called_without_project_argument(self):
+ arglist = [
+ '--project', '',
+ volume_fakes.type_id,
+ ]
+ verifylist = [
+ ('project', ''),
+ ('volume_type', volume_fakes.type_id),
+ ]
+
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+ self.assertIsNone(result)
+
+ self.assertFalse(self.types_access_mock.add_project_access.called)
+
+ def test_type_set_failed_with_missing_volume_type_argument(self):
+ arglist = [
+ '--project', 'identity_fakes.project_id',
+ ]
+ verifylist = [
+ ('project', 'identity_fakes.project_id'),
+ ]
+
+ self.assertRaises(tests_utils.ParserException,
+ self.check_parser,
+ self.cmd,
+ arglist,
+ verifylist)
+
+ def test_type_set_project_access(self):
+ arglist = [
+ '--project', identity_fakes.project_id,
+ volume_fakes.type_id,
+ ]
+ verifylist = [
+ ('project', identity_fakes.project_id),
+ ('volume_type', volume_fakes.type_id),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+ self.assertIsNone(result)
+
+ self.types_access_mock.add_project_access.assert_called_with(
+ volume_fakes.type_id,
+ identity_fakes.project_id,
+ )
+
class TestTypeShow(TestType):