diff options
Diffstat (limited to 'openstackclient')
| -rw-r--r-- | openstackclient/compute/v2/server.py | 2 | ||||
| -rw-r--r-- | openstackclient/compute/v2/service.py | 22 | ||||
| -rw-r--r-- | openstackclient/network/v2/port.py | 52 | ||||
| -rw-r--r-- | openstackclient/network/v2/subnet_pool.py | 114 | ||||
| -rw-r--r-- | openstackclient/tests/compute/v2/fakes.py | 51 | ||||
| -rw-r--r-- | openstackclient/tests/compute/v2/test_service.py | 26 | ||||
| -rw-r--r-- | openstackclient/tests/identity/v2_0/test_endpoint.py | 3 | ||||
| -rw-r--r-- | openstackclient/tests/identity/v2_0/test_project.py | 4 | ||||
| -rw-r--r-- | openstackclient/tests/identity/v2_0/test_role.py | 6 | ||||
| -rw-r--r-- | openstackclient/tests/identity/v2_0/test_service.py | 3 | ||||
| -rw-r--r-- | openstackclient/tests/identity/v2_0/test_token.py | 3 | ||||
| -rw-r--r-- | openstackclient/tests/identity/v2_0/test_user.py | 24 | ||||
| -rw-r--r-- | openstackclient/tests/network/v2/fakes.py | 8 | ||||
| -rw-r--r-- | openstackclient/tests/network/v2/test_port.py | 79 | ||||
| -rw-r--r-- | openstackclient/tests/network/v2/test_subnet_pool.py | 206 | ||||
| -rw-r--r-- | openstackclient/tests/utils.py | 24 |
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""" |
