summaryrefslogtreecommitdiff
path: root/openstackclient
diff options
context:
space:
mode:
Diffstat (limited to 'openstackclient')
-rw-r--r--openstackclient/compute/v2/server.py2
-rw-r--r--openstackclient/compute/v2/service.py22
-rw-r--r--openstackclient/network/v2/port.py52
-rw-r--r--openstackclient/network/v2/subnet_pool.py114
-rw-r--r--openstackclient/tests/compute/v2/fakes.py51
-rw-r--r--openstackclient/tests/compute/v2/test_service.py26
-rw-r--r--openstackclient/tests/identity/v2_0/test_endpoint.py3
-rw-r--r--openstackclient/tests/identity/v2_0/test_project.py4
-rw-r--r--openstackclient/tests/identity/v2_0/test_role.py6
-rw-r--r--openstackclient/tests/identity/v2_0/test_service.py3
-rw-r--r--openstackclient/tests/identity/v2_0/test_token.py3
-rw-r--r--openstackclient/tests/identity/v2_0/test_user.py24
-rw-r--r--openstackclient/tests/network/v2/fakes.py8
-rw-r--r--openstackclient/tests/network/v2/test_port.py79
-rw-r--r--openstackclient/tests/network/v2/test_subnet_pool.py206
-rw-r--r--openstackclient/tests/utils.py24
16 files changed, 535 insertions, 92 deletions
diff --git a/openstackclient/compute/v2/server.py b/openstackclient/compute/v2/server.py
index 7376eabb..58174018 100644
--- a/openstackclient/compute/v2/server.py
+++ b/openstackclient/compute/v2/server.py
@@ -1445,7 +1445,7 @@ class ShowServer(command.ShowOne):
class SshServer(command.Command):
- """Ssh to server"""
+ """SSH to server"""
def get_parser(self, prog_name):
parser = super(SshServer, self).get_parser(prog_name)
diff --git a/openstackclient/compute/v2/service.py b/openstackclient/compute/v2/service.py
index 3c062724..1cc91711 100644
--- a/openstackclient/compute/v2/service.py
+++ b/openstackclient/compute/v2/service.py
@@ -95,14 +95,24 @@ class SetService(command.Command):
dest="enabled",
help="Disable a service",
action="store_false")
+ parser.add_argument(
+ "--disable-reason",
+ default=None,
+ metavar="<reason>",
+ help="Reason for disabling the service (in quotas)"
+ )
return parser
def take_action(self, parsed_args):
compute_client = self.app.client_manager.compute
-
- if parsed_args.enabled:
- action = compute_client.services.enable
+ cs = compute_client.services
+
+ if not parsed_args.enabled:
+ if parsed_args.disable_reason:
+ cs.disable_log_reason(parsed_args.host,
+ parsed_args.service,
+ parsed_args.disable_reason)
+ else:
+ cs.disable(parsed_args.host, parsed_args.service)
else:
- action = compute_client.services.disable
-
- action(parsed_args.host, parsed_args.service)
+ cs.enable(parsed_args.host, parsed_args.service)
diff --git a/openstackclient/network/v2/port.py b/openstackclient/network/v2/port.py
index 449dcfd4..b618a4b0 100644
--- a/openstackclient/network/v2/port.py
+++ b/openstackclient/network/v2/port.py
@@ -14,6 +14,7 @@
"""Port action implementations"""
from openstackclient.common import command
+from openstackclient.common import exceptions
from openstackclient.common import parseractions
from openstackclient.common import utils
from openstackclient.identity import common as identity_common
@@ -56,8 +57,6 @@ def _get_columns(item):
def _get_attrs(client_manager, parsed_args):
attrs = {}
- if parsed_args.name is not None:
- attrs['name'] = str(parsed_args.name)
if parsed_args.fixed_ip is not None:
attrs['fixed_ips'] = parsed_args.fixed_ip
if parsed_args.device_id is not None:
@@ -75,6 +74,8 @@ def _get_attrs(client_manager, parsed_args):
# The remaining options do not support 'port set' command, so they require
# additional check
+ if 'name' in parsed_args and parsed_args.name is not None:
+ attrs['name'] = str(parsed_args.name)
if 'mac_address' in parsed_args and parsed_args.mac_address is not None:
attrs['mac_address'] = parsed_args.mac_address
if 'network' in parsed_args and parsed_args.network is not None:
@@ -145,8 +146,9 @@ def _add_updatable_args(parser):
metavar='<vnic-type>',
choices=['direct', 'direct-physical', 'macvtap',
'normal', 'baremetal'],
- help='VNIC type for this port (direct | direct-physical |'
- ' macvtap | normal(default) | baremetal)')
+ help="VNIC type for this port (direct | direct-physical |"
+ " macvtap | normal | baremetal). If unspecified during"
+ " port creation, default value will be 'normal'.")
parser.add_argument(
'--binding-profile',
metavar='<binding-profile>',
@@ -265,6 +267,48 @@ class ListPort(command.Lister):
) for s in data))
+class SetPort(command.Command):
+ """Set port properties"""
+
+ def get_parser(self, prog_name):
+ parser = super(SetPort, self).get_parser(prog_name)
+ _add_updatable_args(parser)
+ admin_group = parser.add_mutually_exclusive_group()
+ admin_group.add_argument(
+ '--enable',
+ dest='admin_state',
+ action='store_true',
+ default=None,
+ help='Enable port',
+ )
+ admin_group.add_argument(
+ '--disable',
+ dest='admin_state',
+ action='store_false',
+ help='Disable port',
+ )
+ parser.add_argument(
+ 'port',
+ metavar="<port>",
+ help=("Port to modify (name or ID)")
+ )
+
+ return parser
+
+ def take_action(self, parsed_args):
+ client = self.app.client_manager.network
+
+ _prepare_fixed_ips(self.app.client_manager, parsed_args)
+ attrs = _get_attrs(self.app.client_manager, parsed_args)
+
+ if attrs == {}:
+ msg = "Nothing specified to be set"
+ raise exceptions.CommandError(msg)
+
+ obj = client.find_port(parsed_args.port, ignore_missing=False)
+ client.update_port(obj, **attrs)
+
+
class ShowPort(command.ShowOne):
"""Display port details"""
diff --git a/openstackclient/network/v2/subnet_pool.py b/openstackclient/network/v2/subnet_pool.py
index 5bb45c12..44f30207 100644
--- a/openstackclient/network/v2/subnet_pool.py
+++ b/openstackclient/network/v2/subnet_pool.py
@@ -14,6 +14,8 @@
"""Subnet pool action implementations"""
from openstackclient.common import command
+from openstackclient.common import exceptions
+from openstackclient.common import parseractions
from openstackclient.common import utils
@@ -30,6 +32,74 @@ _formatters = {
}
+def _get_attrs(parsed_args):
+ attrs = {}
+ if parsed_args.name is not None:
+ attrs['name'] = str(parsed_args.name)
+ if parsed_args.prefixes is not None:
+ attrs['prefixes'] = parsed_args.prefixes
+ if parsed_args.default_prefix_length is not None:
+ attrs['default_prefix_length'] = parsed_args.default_prefix_length
+ if parsed_args.min_prefix_length is not None:
+ attrs['min_prefix_length'] = parsed_args.min_prefix_length
+ if parsed_args.max_prefix_length is not None:
+ attrs['max_prefix_length'] = parsed_args.max_prefix_length
+
+ return attrs
+
+
+def _add_prefix_options(parser):
+ parser.add_argument(
+ '--pool-prefix',
+ metavar='<pool-prefix>',
+ dest='prefixes',
+ action='append',
+ help='Set subnet pool prefixes (in CIDR notation). '
+ 'Repeat this option to set multiple prefixes.',
+ )
+ parser.add_argument(
+ '--default-prefix-length',
+ metavar='<default-prefix-length>',
+ action=parseractions.NonNegativeAction,
+ help='Set subnet pool default prefix length',
+ )
+ parser.add_argument(
+ '--min-prefix-length',
+ metavar='<min-prefix-length>',
+ action=parseractions.NonNegativeAction,
+ help='Set subnet pool minimum prefix length',
+ )
+ parser.add_argument(
+ '--max-prefix-length',
+ metavar='<max-prefix-length>',
+ action=parseractions.NonNegativeAction,
+ help='Set subnet pool maximum prefix length',
+ )
+
+
+class CreateSubnetPool(command.ShowOne):
+ """Create subnet pool"""
+
+ def get_parser(self, prog_name):
+ parser = super(CreateSubnetPool, self).get_parser(prog_name)
+ parser.add_argument(
+ 'name',
+ metavar="<name>",
+ help='Name of the new subnet pool'
+ )
+ _add_prefix_options(parser)
+
+ return parser
+
+ def take_action(self, parsed_args):
+ client = self.app.client_manager.network
+ attrs = _get_attrs(parsed_args)
+ obj = client.create_subnet_pool(**attrs)
+ columns = _get_columns(obj)
+ data = utils.get_item_properties(obj, columns, formatters=_formatters)
+ return (columns, data)
+
+
class DeleteSubnetPool(command.Command):
"""Delete subnet pool"""
@@ -37,8 +107,8 @@ class DeleteSubnetPool(command.Command):
parser = super(DeleteSubnetPool, self).get_parser(prog_name)
parser.add_argument(
'subnet_pool',
- metavar="<subnet-pool>",
- help=("Subnet pool to delete (name or ID)")
+ metavar='<subnet-pool>',
+ help='Subnet pool to delete (name or ID)'
)
return parser
@@ -98,6 +168,42 @@ class ListSubnetPool(command.Lister):
) for s in data))
+class SetSubnetPool(command.Command):
+ """Set subnet pool properties"""
+
+ def get_parser(self, prog_name):
+ parser = super(SetSubnetPool, self).get_parser(prog_name)
+ parser.add_argument(
+ 'subnet_pool',
+ metavar='<subnet-pool>',
+ help='Subnet pool to modify (name or ID)'
+ )
+ parser.add_argument(
+ '--name',
+ metavar='<name>',
+ help='Set subnet pool name',
+ )
+ _add_prefix_options(parser)
+
+ return parser
+
+ def take_action(self, parsed_args):
+ client = self.app.client_manager.network
+ obj = client.find_subnet_pool(parsed_args.subnet_pool,
+ ignore_missing=False)
+
+ attrs = _get_attrs(parsed_args)
+ if attrs == {}:
+ msg = "Nothing specified to be set"
+ raise exceptions.CommandError(msg)
+
+ # Existing prefixes must be a subset of the new prefixes.
+ if 'prefixes' in attrs:
+ attrs['prefixes'].extend(obj.prefixes)
+
+ client.update_subnet_pool(obj, **attrs)
+
+
class ShowSubnetPool(command.ShowOne):
"""Display subnet pool details"""
@@ -105,8 +211,8 @@ class ShowSubnetPool(command.ShowOne):
parser = super(ShowSubnetPool, self).get_parser(prog_name)
parser.add_argument(
'subnet_pool',
- metavar="<subnet-pool>",
- help=("Subnet pool to display (name or ID)")
+ metavar='<subnet-pool>',
+ help='Subnet pool to display (name or ID)'
)
return parser
diff --git a/openstackclient/tests/compute/v2/fakes.py b/openstackclient/tests/compute/v2/fakes.py
index 32d257f1..11d9ff1b 100644
--- a/openstackclient/tests/compute/v2/fakes.py
+++ b/openstackclient/tests/compute/v2/fakes.py
@@ -501,42 +501,21 @@ class FakeServer(object):
return mock.MagicMock(side_effect=servers)
-class FakeFlavorResource(fakes.FakeResource):
- """Fake flavor object's methods to help test.
-
- The flavor object has three methods to get, set, unset its properties.
- Need to fake them, otherwise the functions to be tested won't run properly.
- """
-
- def __init__(self, manager=None, info={}, loaded=False, methods={}):
- super(FakeFlavorResource, self).__init__(manager, info,
- loaded, methods)
- # Fake properties.
- self._keys = {'property': 'value'}
-
- def set_keys(self, args):
- self._keys.update(args)
-
- def unset_keys(self, keys):
- for key in keys:
- self._keys.pop(key, None)
-
- def get_keys(self):
- return self._keys
-
-
class FakeFlavor(object):
"""Fake one or more flavors."""
@staticmethod
- def create_one_flavor(attrs={}):
+ def create_one_flavor(attrs=None):
"""Create a fake flavor.
:param Dictionary attrs:
A dictionary with all attributes
:return:
- A FakeFlavorResource object, with id, name, ram, vcpus, properties
+ A FakeResource object, with id, name, ram, vcpus, properties
"""
+ if attrs is None:
+ attrs = {}
+
# Set default attributes.
flavor_info = {
'id': 'flavor-id-' + uuid.uuid4().hex,
@@ -554,7 +533,15 @@ class FakeFlavor(object):
# Overwrite default attributes.
flavor_info.update(attrs)
- flavor = FakeFlavorResource(info=copy.deepcopy(flavor_info),
+ # Set default methods.
+ flavor_methods = {
+ 'set_keys': None,
+ 'unset_keys': None,
+ 'get_keys': {'property': 'value'},
+ }
+
+ flavor = fakes.FakeResource(info=copy.deepcopy(flavor_info),
+ methods=flavor_methods,
loaded=True)
# Set attributes with special mappings in nova client.
@@ -573,7 +560,7 @@ class FakeFlavor(object):
:param int count:
The number of flavors to fake
:return:
- A list of FakeFlavorResource objects faking the flavors
+ A list of FakeResource objects faking the flavors
"""
flavors = []
for i in range(0, count):
@@ -589,7 +576,7 @@ class FakeFlavor(object):
list. Otherwise create one.
:param List flavors:
- A list of FakeFlavorResource objects faking flavors
+ A list of FakeResource objects faking flavors
:param int count:
The number of flavors to fake
:return:
@@ -636,14 +623,14 @@ class FakeKeypair(object):
@staticmethod
def create_keypairs(attrs=None, count=2):
- """Create multiple fake flavors.
+ """Create multiple fake keypairs.
:param Dictionary attrs:
A dictionary with all attributes
:param int count:
- The number of flavors to fake
+ The number of keypairs to fake
:return:
- A list of FakeFlavorResource objects faking the flavors
+ A list of FakeResource objects faking the keypairs
"""
keypairs = []
diff --git a/openstackclient/tests/compute/v2/test_service.py b/openstackclient/tests/compute/v2/test_service.py
index 2f8b2e7d..0246fbc8 100644
--- a/openstackclient/tests/compute/v2/test_service.py
+++ b/openstackclient/tests/compute/v2/test_service.py
@@ -153,3 +153,29 @@ class TestServiceSet(TestService):
compute_fakes.service_binary,
)
self.assertIsNone(result)
+
+ def test_service_set_disable_with_reason(self):
+ reason = 'earthquake'
+ arglist = [
+ compute_fakes.service_host,
+ compute_fakes.service_binary,
+ '--disable',
+ '--disable-reason',
+ reason
+ ]
+ verifylist = [
+ ('host', compute_fakes.service_host),
+ ('service', compute_fakes.service_binary),
+ ('enabled', False),
+ ('disable_reason', reason)
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+
+ self.service_mock.disable_log_reason.assert_called_with(
+ compute_fakes.service_host,
+ compute_fakes.service_binary,
+ reason
+ )
+ self.assertIsNone(result)
diff --git a/openstackclient/tests/identity/v2_0/test_endpoint.py b/openstackclient/tests/identity/v2_0/test_endpoint.py
index 088fdcd1..45ece45a 100644
--- a/openstackclient/tests/identity/v2_0/test_endpoint.py
+++ b/openstackclient/tests/identity/v2_0/test_endpoint.py
@@ -132,11 +132,12 @@ class TestEndpointDelete(TestEndpoint):
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
- self.cmd.take_action(parsed_args)
+ result = self.cmd.take_action(parsed_args)
self.endpoints_mock.delete.assert_called_with(
identity_fakes.endpoint_id,
)
+ self.assertIsNone(result)
class TestEndpointList(TestEndpoint):
diff --git a/openstackclient/tests/identity/v2_0/test_project.py b/openstackclient/tests/identity/v2_0/test_project.py
index 98570297..38684aaf 100644
--- a/openstackclient/tests/identity/v2_0/test_project.py
+++ b/openstackclient/tests/identity/v2_0/test_project.py
@@ -613,10 +613,9 @@ class TestProjectUnset(TestProject):
verifylist = [
('property', ['fee', 'fo']),
]
-
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
- self.cmd.take_action(parsed_args)
+ result = self.cmd.take_action(parsed_args)
# Set expected values
kwargs = {
'description': identity_fakes.project_description,
@@ -631,3 +630,4 @@ class TestProjectUnset(TestProject):
identity_fakes.project_id,
**kwargs
)
+ self.assertIsNone(result)
diff --git a/openstackclient/tests/identity/v2_0/test_role.py b/openstackclient/tests/identity/v2_0/test_role.py
index 03b7f924..3c4b79a4 100644
--- a/openstackclient/tests/identity/v2_0/test_role.py
+++ b/openstackclient/tests/identity/v2_0/test_role.py
@@ -240,11 +240,12 @@ class TestRoleDelete(TestRole):
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
- self.cmd.take_action(parsed_args)
+ result = self.cmd.take_action(parsed_args)
self.roles_mock.delete.assert_called_with(
identity_fakes.role_id,
)
+ self.assertIsNone(result)
class TestRoleList(TestRole):
@@ -459,7 +460,7 @@ class TestRoleRemove(TestRole):
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
- self.cmd.take_action(parsed_args)
+ result = self.cmd.take_action(parsed_args)
# RoleManager.remove_user_role(user, role, tenant=None)
self.roles_mock.remove_user_role.assert_called_with(
@@ -467,6 +468,7 @@ class TestRoleRemove(TestRole):
identity_fakes.role_id,
identity_fakes.project_id,
)
+ self.assertIsNone(result)
class TestRoleShow(TestRole):
diff --git a/openstackclient/tests/identity/v2_0/test_service.py b/openstackclient/tests/identity/v2_0/test_service.py
index 606b1433..dc0fbcd1 100644
--- a/openstackclient/tests/identity/v2_0/test_service.py
+++ b/openstackclient/tests/identity/v2_0/test_service.py
@@ -194,11 +194,12 @@ class TestServiceDelete(TestService):
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
- self.cmd.take_action(parsed_args)
+ result = self.cmd.take_action(parsed_args)
self.services_mock.delete.assert_called_with(
identity_fakes.service_id,
)
+ self.assertIsNone(result)
class TestServiceList(TestService):
diff --git a/openstackclient/tests/identity/v2_0/test_token.py b/openstackclient/tests/identity/v2_0/test_token.py
index c90477f9..613139dd 100644
--- a/openstackclient/tests/identity/v2_0/test_token.py
+++ b/openstackclient/tests/identity/v2_0/test_token.py
@@ -99,6 +99,7 @@ class TestTokenRevoke(TestToken):
verifylist = [('token', self.TOKEN)]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
- self.cmd.take_action(parsed_args)
+ result = self.cmd.take_action(parsed_args)
self.tokens_mock.delete.assert_called_with(self.TOKEN)
+ self.assertIsNone(result)
diff --git a/openstackclient/tests/identity/v2_0/test_user.py b/openstackclient/tests/identity/v2_0/test_user.py
index 9afe4ad1..921e215d 100644
--- a/openstackclient/tests/identity/v2_0/test_user.py
+++ b/openstackclient/tests/identity/v2_0/test_user.py
@@ -414,11 +414,12 @@ class TestUserDelete(TestUser):
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
- self.cmd.take_action(parsed_args)
+ result = self.cmd.take_action(parsed_args)
self.users_mock.delete.assert_called_with(
identity_fakes.user_id,
)
+ self.assertIsNone(result)
class TestUserList(TestUser):
@@ -578,7 +579,7 @@ class TestUserSet(TestUser):
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
- self.cmd.take_action(parsed_args)
+ result = self.cmd.take_action(parsed_args)
# Set expected values
kwargs = {
@@ -590,6 +591,7 @@ class TestUserSet(TestUser):
identity_fakes.user_id,
**kwargs
)
+ self.assertIsNone(result)
def test_user_set_password(self):
arglist = [
@@ -608,13 +610,14 @@ class TestUserSet(TestUser):
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
- self.cmd.take_action(parsed_args)
+ result = self.cmd.take_action(parsed_args)
# UserManager.update_password(user, password)
self.users_mock.update_password.assert_called_with(
identity_fakes.user_id,
'secret',
)
+ self.assertIsNone(result)
def test_user_set_password_prompt(self):
arglist = [
@@ -636,13 +639,14 @@ class TestUserSet(TestUser):
mocker = mock.Mock()
mocker.return_value = 'abc123'
with mock.patch("openstackclient.common.utils.get_password", mocker):
- self.cmd.take_action(parsed_args)
+ result = self.cmd.take_action(parsed_args)
# UserManager.update_password(user, password)
self.users_mock.update_password.assert_called_with(
identity_fakes.user_id,
'abc123',
)
+ self.assertIsNone(result)
def test_user_set_email(self):
arglist = [
@@ -660,7 +664,7 @@ class TestUserSet(TestUser):
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
- self.cmd.take_action(parsed_args)
+ result = self.cmd.take_action(parsed_args)
# Set expected values
kwargs = {
@@ -672,6 +676,7 @@ class TestUserSet(TestUser):
identity_fakes.user_id,
**kwargs
)
+ self.assertIsNone(result)
def test_user_set_project(self):
arglist = [
@@ -689,13 +694,14 @@ class TestUserSet(TestUser):
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
- self.cmd.take_action(parsed_args)
+ result = self.cmd.take_action(parsed_args)
# UserManager.update_tenant(user, tenant)
self.users_mock.update_tenant.assert_called_with(
identity_fakes.user_id,
identity_fakes.project_id,
)
+ self.assertIsNone(result)
def test_user_set_enable(self):
arglist = [
@@ -713,7 +719,7 @@ class TestUserSet(TestUser):
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
- self.cmd.take_action(parsed_args)
+ result = self.cmd.take_action(parsed_args)
# Set expected values
kwargs = {
@@ -724,6 +730,7 @@ class TestUserSet(TestUser):
identity_fakes.user_id,
**kwargs
)
+ self.assertIsNone(result)
def test_user_set_disable(self):
arglist = [
@@ -741,7 +748,7 @@ class TestUserSet(TestUser):
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
- self.cmd.take_action(parsed_args)
+ result = self.cmd.take_action(parsed_args)
# Set expected values
kwargs = {
@@ -752,6 +759,7 @@ class TestUserSet(TestUser):
identity_fakes.user_id,
**kwargs
)
+ self.assertIsNone(result)
class TestUserShow(TestUser):
diff --git a/openstackclient/tests/network/v2/fakes.py b/openstackclient/tests/network/v2/fakes.py
index 9e6bf97f..26213b1f 100644
--- a/openstackclient/tests/network/v2/fakes.py
+++ b/openstackclient/tests/network/v2/fakes.py
@@ -734,15 +734,15 @@ class FakeSubnetPool(object):
'id': 'subnet-pool-id-' + uuid.uuid4().hex,
'name': 'subnet-pool-name-' + uuid.uuid4().hex,
'prefixes': ['10.0.0.0/24', '10.1.0.0/24'],
- 'default_prefixlen': 8,
+ 'default_prefixlen': '8',
'address_scope_id': 'address-scope-id-' + uuid.uuid4().hex,
'tenant_id': 'project-id-' + uuid.uuid4().hex,
'is_default': False,
'shared': False,
- 'max_prefixlen': 32,
- 'min_prefixlen': 8,
+ 'max_prefixlen': '32',
+ 'min_prefixlen': '8',
'default_quota': None,
- 'ip_version': 4,
+ 'ip_version': '4',
}
# Overwrite default attributes.
diff --git a/openstackclient/tests/network/v2/test_port.py b/openstackclient/tests/network/v2/test_port.py
index 30e290c6..7b1c655f 100644
--- a/openstackclient/tests/network/v2/test_port.py
+++ b/openstackclient/tests/network/v2/test_port.py
@@ -240,6 +240,85 @@ class TestListPort(TestPort):
self.assertEqual(self.data, list(data))
+class TestSetPort(TestPort):
+
+ _port = network_fakes.FakePort.create_one_port()
+
+ def setUp(self):
+ super(TestSetPort, self).setUp()
+
+ self.fake_subnet = network_fakes.FakeSubnet.create_one_subnet()
+ self.network.find_subnet = mock.Mock(return_value=self.fake_subnet)
+ self.network.find_port = mock.Mock(return_value=self._port)
+ self.network.update_port = mock.Mock(return_value=None)
+
+ # Get the command object to test
+ self.cmd = port.SetPort(self.app, self.namespace)
+
+ def test_set_fixed_ip(self):
+ arglist = [
+ '--fixed-ip', 'ip-address=10.0.0.11',
+ self._port.name,
+ ]
+ verifylist = [
+ ('fixed_ip', [{'ip-address': '10.0.0.11'}]),
+ ]
+
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ result = self.cmd.take_action(parsed_args)
+
+ attrs = {
+ 'fixed_ips': [{'ip_address': '10.0.0.11'}],
+ }
+ self.network.update_port.assert_called_with(self._port, **attrs)
+ self.assertIsNone(result)
+
+ def test_set_this(self):
+ arglist = [
+ '--disable',
+ self._port.name,
+ ]
+ verifylist = [
+ ('admin_state', False),
+ ]
+
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ result = self.cmd.take_action(parsed_args)
+
+ attrs = {
+ 'admin_state_up': False,
+ }
+ self.network.update_port.assert_called_with(self._port, **attrs)
+ self.assertIsNone(result)
+
+ def test_set_that(self):
+ arglist = [
+ '--enable',
+ '--vnic-type', 'macvtap',
+ '--binding-profile', 'foo=bar',
+ '--host-id', 'binding-host-id-xxxx',
+ self._port.name,
+ ]
+ verifylist = [
+ ('admin_state', True),
+ ('vnic_type', 'macvtap'),
+ ('binding_profile', {'foo': 'bar'}),
+ ('host_id', 'binding-host-id-xxxx'),
+ ]
+
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ result = self.cmd.take_action(parsed_args)
+
+ attrs = {
+ 'admin_state_up': True,
+ 'binding:vnic_type': 'macvtap',
+ 'binding:profile': {'foo': 'bar'},
+ 'binding:host_id': 'binding-host-id-xxxx',
+ }
+ self.network.update_port.assert_called_with(self._port, **attrs)
+ self.assertIsNone(result)
+
+
class TestShowPort(TestPort):
# The port to show.
diff --git a/openstackclient/tests/network/v2/test_subnet_pool.py b/openstackclient/tests/network/v2/test_subnet_pool.py
index c4e3340d..99994681 100644
--- a/openstackclient/tests/network/v2/test_subnet_pool.py
+++ b/openstackclient/tests/network/v2/test_subnet_pool.py
@@ -11,8 +11,10 @@
# under the License.
#
+import argparse
import mock
+from openstackclient.common import exceptions
from openstackclient.common import utils
from openstackclient.network.v2 import subnet_pool
from openstackclient.tests.network.v2 import fakes as network_fakes
@@ -28,6 +30,117 @@ class TestSubnetPool(network_fakes.TestNetworkV2):
self.network = self.app.client_manager.network
+class TestCreateSubnetPool(TestSubnetPool):
+
+ # The new subnet pool to create.
+ _subnet_pool = network_fakes.FakeSubnetPool.create_one_subnet_pool()
+
+ columns = (
+ 'address_scope_id',
+ 'default_prefixlen',
+ 'default_quota',
+ 'id',
+ 'ip_version',
+ 'is_default',
+ 'max_prefixlen',
+ 'min_prefixlen',
+ 'name',
+ 'prefixes',
+ 'project_id',
+ 'shared',
+ )
+ data = (
+ _subnet_pool.address_scope_id,
+ _subnet_pool.default_prefixlen,
+ _subnet_pool.default_quota,
+ _subnet_pool.id,
+ _subnet_pool.ip_version,
+ _subnet_pool.is_default,
+ _subnet_pool.max_prefixlen,
+ _subnet_pool.min_prefixlen,
+ _subnet_pool.name,
+ utils.format_list(_subnet_pool.prefixes),
+ _subnet_pool.project_id,
+ _subnet_pool.shared,
+ )
+
+ def setUp(self):
+ super(TestCreateSubnetPool, self).setUp()
+
+ self.network.create_subnet_pool = mock.Mock(
+ return_value=self._subnet_pool)
+
+ # Get the command object to test
+ self.cmd = subnet_pool.CreateSubnetPool(self.app, self.namespace)
+
+ def test_create_no_options(self):
+ arglist = []
+ verifylist = []
+
+ # Missing required args should bail here
+ self.assertRaises(tests_utils.ParserException, self.check_parser,
+ self.cmd, arglist, verifylist)
+
+ def test_create_default_options(self):
+ arglist = [
+ '--pool-prefix', '10.0.10.0/24',
+ self._subnet_pool.name,
+ ]
+ verifylist = [
+ ('prefixes', ['10.0.10.0/24']),
+ ('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_with(**{
+ 'prefixes': ['10.0.10.0/24'],
+ 'name': self._subnet_pool.name,
+ })
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.data, data)
+
+ def test_create_prefixlen_options(self):
+ arglist = [
+ '--default-prefix-length', self._subnet_pool.default_prefixlen,
+ '--max-prefix-length', self._subnet_pool.max_prefixlen,
+ '--min-prefix-length', self._subnet_pool.min_prefixlen,
+ self._subnet_pool.name,
+ ]
+ verifylist = [
+ ('default_prefix_length', self._subnet_pool.default_prefixlen),
+ ('max_prefix_length', self._subnet_pool.max_prefixlen),
+ ('min_prefix_length', self._subnet_pool.min_prefixlen),
+ ('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_with(**{
+ 'default_prefix_length': self._subnet_pool.default_prefixlen,
+ 'max_prefix_length': self._subnet_pool.max_prefixlen,
+ 'min_prefix_length': self._subnet_pool.min_prefixlen,
+ 'name': self._subnet_pool.name,
+ })
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.data, data)
+
+ def test_create_len_negative(self):
+ arglist = [
+ self._subnet_pool.name,
+ '--min-prefix-length', '-16',
+ ]
+ verifylist = [
+ ('subnet_pool', self._subnet_pool.name),
+ ('min_prefix_length', '-16'),
+ ]
+
+ self.assertRaises(argparse.ArgumentTypeError, self.check_parser,
+ self.cmd, arglist, verifylist)
+
+
class TestDeleteSubnetPool(TestSubnetPool):
# The subnet pool to delete.
@@ -129,6 +242,96 @@ class TestListSubnetPool(TestSubnetPool):
self.assertEqual(self.data_long, list(data))
+class TestSetSubnetPool(TestSubnetPool):
+
+ # The subnet_pool to set.
+ _subnet_pool = network_fakes.FakeSubnetPool.create_one_subnet_pool()
+
+ def setUp(self):
+ super(TestSetSubnetPool, self).setUp()
+
+ self.network.update_subnet_pool = mock.Mock(return_value=None)
+
+ self.network.find_subnet_pool = mock.Mock(
+ return_value=self._subnet_pool)
+
+ # 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',
+ ]
+ verifylist = [
+ ('subnet_pool', self._subnet_pool.name),
+ ('name', 'noob'),
+ ('default_prefix_length', '8'),
+ ('min_prefix_length', '8'),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+
+ attrs = {
+ 'name': 'noob',
+ 'default_prefix_length': '8',
+ 'min_prefix_length': '8',
+ }
+ self.network.update_subnet_pool.assert_called_with(
+ self._subnet_pool, **attrs)
+ self.assertIsNone(result)
+
+ 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',
+ ]
+ verifylist = [
+ ('subnet_pool', self._subnet_pool.name),
+ ('prefixes', ['10.0.1.0/24', '10.0.2.0/24']),
+ ('max_prefix_length', '16'),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+
+ prefixes = ['10.0.1.0/24', '10.0.2.0/24']
+ prefixes.extend(self._subnet_pool.prefixes)
+ attrs = {
+ 'prefixes': prefixes,
+ 'max_prefix_length': '16',
+ }
+ self.network.update_subnet_pool.assert_called_with(
+ self._subnet_pool, **attrs)
+ self.assertIsNone(result)
+
+ def test_set_nothing(self):
+ arglist = [self._subnet_pool.name, ]
+ verifylist = [('subnet_pool', self._subnet_pool.name), ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ self.assertRaises(exceptions.CommandError, self.cmd.take_action,
+ parsed_args)
+
+ def test_set_len_negative(self):
+ arglist = [
+ self._subnet_pool.name,
+ '--max-prefix-length', '-16',
+ ]
+ verifylist = [
+ ('subnet_pool', self._subnet_pool.name),
+ ('max_prefix_length', '-16'),
+ ]
+
+ self.assertRaises(argparse.ArgumentTypeError, self.check_parser,
+ self.cmd, arglist, verifylist)
+
+
class TestShowSubnetPool(TestSubnetPool):
# The subnet_pool to set.
@@ -189,14 +392,13 @@ class TestShowSubnetPool(TestSubnetPool):
verifylist = [
('subnet_pool', self._subnet_pool.name),
]
-
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
columns, data = self.cmd.take_action(parsed_args)
self.network.find_subnet_pool.assert_called_with(
self._subnet_pool.name,
ignore_missing=False
)
-
self.assertEqual(self.columns, columns)
self.assertEqual(self.data, data)
diff --git a/openstackclient/tests/utils.py b/openstackclient/tests/utils.py
index d3f3853f..319c1c11 100644
--- a/openstackclient/tests/utils.py
+++ b/openstackclient/tests/utils.py
@@ -17,7 +17,6 @@
import os
import fixtures
-import sys
import testtools
from openstackclient.tests import fakes
@@ -50,29 +49,6 @@ class TestCase(testtools.TestCase):
msg = 'method %s should not have been called' % m
self.fail(msg)
- # 2.6 doesn't have the assert dict equals so make sure that it exists
- if tuple(sys.version_info)[0:2] < (2, 7):
-
- def assertIsInstance(self, obj, cls, msg=None):
- """self.assertTrue(isinstance(obj, cls)), with a nicer message"""
-
- if not isinstance(obj, cls):
- standardMsg = '%s is not an instance of %r' % (obj, cls)
- self.fail(self._formatMessage(msg, standardMsg))
-
- def assertDictEqual(self, d1, d2, msg=None):
- # Simple version taken from 2.7
- self.assertIsInstance(d1, dict,
- 'First argument is not a dictionary')
- self.assertIsInstance(d2, dict,
- 'Second argument is not a dictionary')
- if d1 != d2:
- if msg:
- self.fail(msg)
- else:
- standardMsg = '%r != %r' % (d1, d2)
- self.fail(standardMsg)
-
class TestCommand(TestCase):
"""Test cliff command classes"""