diff options
| author | Jenkins <jenkins@review.openstack.org> | 2016-06-23 21:31:05 +0000 |
|---|---|---|
| committer | Gerrit Code Review <review@openstack.org> | 2016-06-23 21:31:05 +0000 |
| commit | 5b144334bf526c8d368e592019fbb80c072911dc (patch) | |
| tree | 4d524ae1365aef49aeb57f06ff681667a10af6b1 /openstackclient/network | |
| parent | 8b70f31178c80a429ee0291e883ba748b407b313 (diff) | |
| parent | 5cc62d90b03714d65af04c73e01a89ac8d96c895 (diff) | |
| download | python-openstackclient-5b144334bf526c8d368e592019fbb80c072911dc.tar.gz | |
Merge "Support JSON data for port binding profile"
Diffstat (limited to 'openstackclient/network')
| -rw-r--r-- | openstackclient/network/v2/port.py | 39 |
1 files changed, 33 insertions, 6 deletions
diff --git a/openstackclient/network/v2/port.py b/openstackclient/network/v2/port.py index 57461f89..5d1431b5 100644 --- a/openstackclient/network/v2/port.py +++ b/openstackclient/network/v2/port.py @@ -14,6 +14,7 @@ """Port action implementations""" import argparse +import json import logging from osc_lib.cli import parseractions @@ -63,6 +64,32 @@ def _get_columns(item): return tuple(sorted(columns)) +class JSONKeyValueAction(argparse.Action): + """A custom action to parse arguments as JSON or key=value pairs + + Ensures that ``dest`` is a dict + """ + + def __call__(self, parser, namespace, values, option_string=None): + + # Make sure we have an empty dict rather than None + if getattr(namespace, self.dest, None) is None: + setattr(namespace, self.dest, {}) + + # Try to load JSON first before falling back to <key>=<value>. + current_dest = getattr(namespace, self.dest) + try: + current_dest.update(json.loads(values)) + except ValueError as e: + if '=' in values: + current_dest.update([values.split('=', 1)]) + else: + msg = _("Expected '<key>=<value>' or JSON data for option " + "%(option)s, but encountered JSON parsing error: " + "%(error)s") % {"option": option_string, "error": e} + raise argparse.ArgumentTypeError(msg) + + def _get_attrs(client_manager, parsed_args): attrs = {} @@ -219,9 +246,9 @@ class CreatePort(command.ShowOne): parser.add_argument( '--binding-profile', metavar='<binding-profile>', - action=parseractions.KeyValueAction, - help=_("Custom data to be passed as binding:profile: " - "<key>=<value> " + action=JSONKeyValueAction, + help=_("Custom data to be passed as binding:profile. Data may " + "be passed as <key>=<value> or JSON. " "(repeat option to set multiple binding:profile data)") ) admin_group = parser.add_mutually_exclusive_group() @@ -390,9 +417,9 @@ class SetPort(command.Command): binding_profile.add_argument( '--binding-profile', metavar='<binding-profile>', - action=parseractions.KeyValueAction, - help=_("Custom data to be passed as binding:profile: " - "<key>=<value> " + action=JSONKeyValueAction, + help=_("Custom data to be passed as binding:profile. Data may " + "be passed as <key>=<value> or JSON. " "(repeat option to set multiple binding:profile data)") ) binding_profile.add_argument( |
