summaryrefslogtreecommitdiff
path: root/openstackclient
diff options
context:
space:
mode:
Diffstat (limited to 'openstackclient')
-rw-r--r--openstackclient/compute/v2/server.py18
-rw-r--r--openstackclient/identity/v3/access_rule.py4
-rw-r--r--openstackclient/network/v2/network.py7
-rw-r--r--openstackclient/tests/unit/compute/v2/test_server.py25
-rw-r--r--openstackclient/tests/unit/network/v2/test_network.py33
5 files changed, 72 insertions, 15 deletions
diff --git a/openstackclient/compute/v2/server.py b/openstackclient/compute/v2/server.py
index b5c420fe..5cc73284 100644
--- a/openstackclient/compute/v2/server.py
+++ b/openstackclient/compute/v2/server.py
@@ -689,8 +689,8 @@ class CreateServer(command.ShowOne):
parser.add_argument(
'--hint',
metavar='<key=value>',
- action='append',
- default=[],
+ action=parseractions.KeyValueAppendAction,
+ default={},
help=_('Hints for the scheduler (optional extension)'),
)
parser.add_argument(
@@ -986,16 +986,12 @@ class CreateServer(command.ShowOne):
security_group_names.append(sg['name'])
hints = {}
- for hint in parsed_args.hint:
- key, _sep, value = hint.partition('=')
- # NOTE(vish): multiple copies of the same hint will
- # result in a list of values
- if key in hints:
- if isinstance(hints[key], six.string_types):
- hints[key] = [hints[key]]
- hints[key] += [value]
+ for key, values in parsed_args.hint.items():
+ # only items with multiple values will result in a list
+ if len(values) == 1:
+ hints[key] = values[0]
else:
- hints[key] = value
+ hints[key] = values
# What does a non-boolean value for config-drive do?
# --config-drive argument is either a volume id or
diff --git a/openstackclient/identity/v3/access_rule.py b/openstackclient/identity/v3/access_rule.py
index d96b44da..65e78be1 100644
--- a/openstackclient/identity/v3/access_rule.py
+++ b/openstackclient/identity/v3/access_rule.py
@@ -38,7 +38,7 @@ class DeleteAccessRule(command.Command):
'access_rule',
metavar='<access-rule>',
nargs="+",
- help=_('Application credentials(s) to delete (name or ID)'),
+ help=_('Access rule(s) to delete (name or ID)'),
)
return parser
@@ -104,7 +104,7 @@ class ShowAccessRule(command.ShowOne):
parser.add_argument(
'access_rule',
metavar='<access-rule>',
- help=_('Application credential to display (name or ID)'),
+ help=_('Access rule to display (name or ID)'),
)
return parser
diff --git a/openstackclient/network/v2/network.py b/openstackclient/network/v2/network.py
index 00cb782b..3f579b6d 100644
--- a/openstackclient/network/v2/network.py
+++ b/openstackclient/network/v2/network.py
@@ -16,6 +16,7 @@
from cliff import columns as cliff_columns
from osc_lib.cli import format_columns
from osc_lib.command import command
+from osc_lib import exceptions
from osc_lib import utils
from osc_lib.utils import tags as _tag
@@ -125,6 +126,9 @@ def _get_attrs_network(client_manager, parsed_args):
attrs['is_default'] = False
if parsed_args.default:
attrs['is_default'] = True
+ if attrs.get('is_default') and not attrs.get('router:external'):
+ msg = _("Cannot set default for internal network")
+ raise exceptions.CommandError(msg)
# Update Provider network options
if parsed_args.provider_network_type:
attrs['provider:network_type'] = parsed_args.provider_network_type
@@ -702,7 +706,8 @@ class SetNetwork(command.Command):
default_router_grp.add_argument(
'--default',
action='store_true',
- help=_("Set the network as the default external network")
+ help=_("Set the network as the default external network "
+ "(cannot be used with internal network).")
)
default_router_grp.add_argument(
'--no-default',
diff --git a/openstackclient/tests/unit/compute/v2/test_server.py b/openstackclient/tests/unit/compute/v2/test_server.py
index b3be5147..27eefd85 100644
--- a/openstackclient/tests/unit/compute/v2/test_server.py
+++ b/openstackclient/tests/unit/compute/v2/test_server.py
@@ -860,7 +860,7 @@ class TestServerCreate(TestServer):
('key_name', 'keyname'),
('property', {'Beta': 'b'}),
('security_group', ['securitygroup']),
- ('hint', ['a=b', 'a=c']),
+ ('hint', {'a': ['b', 'c']}),
('config_drive', False),
('server_name', self.new_server.name),
]
@@ -2060,6 +2060,29 @@ class TestServerCreate(TestServer):
self.cmd.take_action,
parsed_args)
+ def test_server_create_invalid_hint(self):
+ # Not a key-value pair
+ arglist = [
+ '--image', 'image1',
+ '--flavor', 'flavor1',
+ '--hint', 'a0cf03a5-d921-4877-bb5c-86d26cf818e1',
+ self.new_server.name,
+ ]
+ self.assertRaises(argparse.ArgumentTypeError,
+ self.check_parser,
+ self.cmd, arglist, [])
+
+ # Empty key
+ arglist = [
+ '--image', 'image1',
+ '--flavor', 'flavor1',
+ '--hint', '=a0cf03a5-d921-4877-bb5c-86d26cf818e1',
+ self.new_server.name,
+ ]
+ self.assertRaises(argparse.ArgumentTypeError,
+ self.check_parser,
+ self.cmd, arglist, [])
+
def test_server_create_with_description_api_newer(self):
# Description is supported for nova api version 2.19 or above
diff --git a/openstackclient/tests/unit/network/v2/test_network.py b/openstackclient/tests/unit/network/v2/test_network.py
index 5f8eed67..45d6008b 100644
--- a/openstackclient/tests/unit/network/v2/test_network.py
+++ b/openstackclient/tests/unit/network/v2/test_network.py
@@ -278,6 +278,24 @@ class TestCreateNetworkIdentityV3(TestNetwork):
def test_create_with_no_tag(self):
self._test_create_with_tag(add_tags=False)
+ def test_create_default_internal(self):
+ arglist = [
+ self._network.name,
+ "--default",
+ ]
+ verifylist = [
+ ('name', self._network.name),
+ ('enable', True),
+ ('share', None),
+ ('project', None),
+ ('external', False),
+ ('default', True),
+ ]
+
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ self.assertRaises(exceptions.CommandError, self.cmd.take_action,
+ parsed_args)
+
class TestCreateNetworkIdentityV2(TestNetwork):
@@ -1025,6 +1043,21 @@ class TestSetNetwork(TestNetwork):
def test_set_with_no_tag(self):
self._test_set_tags(with_tags=False)
+ def test_set_default_internal(self):
+ arglist = [
+ self._network.name,
+ '--internal',
+ '--default',
+ ]
+ verifylist = [
+ ('internal', True),
+ ('default', True),
+ ]
+
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ self.assertRaises(exceptions.CommandError, self.cmd.take_action,
+ parsed_args)
+
class TestShowNetwork(TestNetwork):