diff --git a/doc/source/plugins.rst b/doc/source/plugins.rst index 62c0aedc2e..8640efbccd 100644 --- a/doc/source/plugins.rst +++ b/doc/source/plugins.rst @@ -152,13 +152,13 @@ the plugin commands: .. code-block:: python # osc-lib interfaces available to plugins: + from osc_lib.cli import parseractions from osc_lib import exceptions from osc_lib import logs from osc_lib import utils # OSC common interfaces available to plugins: from openstackclient.common import command - from openstackclient.common import parseractions class DeleteMypluginobject(command.Command): diff --git a/openstackclient/common/parseractions.py b/openstackclient/common/parseractions.py index 1e92dc46fe..fa5148eca5 100644 --- a/openstackclient/common/parseractions.py +++ b/openstackclient/common/parseractions.py @@ -1,5 +1,3 @@ -# Copyright 2013 OpenStack Foundation -# # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at @@ -13,154 +11,15 @@ # under the License. # -"""argparse Custom Actions""" +# NOTE(dtroyer): This file is deprecated in Jun 2016, remove after 4.x release +# or Jun 2017. -import argparse +import sys -from openstackclient.i18n import _ +from osc_lib.cli.parseractions import * # noqa -class KeyValueAction(argparse.Action): - """A custom action to parse arguments as 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, {}) - - # Add value if an assignment else remove it - if '=' in values: - getattr(namespace, self.dest, {}).update([values.split('=', 1)]) - else: - msg = _("Expected 'key=value' type, " - "but got: %s") % (str(values)) - raise argparse.ArgumentTypeError(msg) - - -class MultiKeyValueAction(argparse.Action): - """A custom action to parse arguments as key1=value1,key2=value2 pairs - - Ensure that ``dest`` is a list. The list will finally contain multiple - dicts, with key=value pairs in them. - - NOTE: The arguments string should be a comma separated key-value pairs. - And comma(',') and equal('=') may not be used in the key or value. - """ - - def __init__(self, option_strings, dest, nargs=None, - required_keys=None, optional_keys=None, **kwargs): - """Initialize the action object, and parse customized options - - Required keys and optional keys can be specified when initializing - the action to enable the key validation. If none of them specified, - the key validation will be skipped. - - :param required_keys: a list of required keys - :param optional_keys: a list of optional keys - """ - if nargs: - raise ValueError("Parameter 'nargs' is not allowed, but got %s" - % nargs) - - super(MultiKeyValueAction, self).__init__(option_strings, - dest, **kwargs) - - # required_keys: A list of keys that is required. None by default. - if required_keys and not isinstance(required_keys, list): - raise TypeError("'required_keys' must be a list") - self.required_keys = set(required_keys or []) - - # optional_keys: A list of keys that is optional. None by default. - if optional_keys and not isinstance(optional_keys, list): - raise TypeError("'optional_keys' must be a list") - self.optional_keys = set(optional_keys or []) - - def __call__(self, parser, namespace, values, metavar=None): - # Make sure we have an empty list rather than None - if getattr(namespace, self.dest, None) is None: - setattr(namespace, self.dest, []) - - params = {} - for kv in values.split(','): - # Add value if an assignment else raise ArgumentTypeError - if '=' in kv: - params.update([kv.split('=', 1)]) - else: - msg = _("Expected key=value pairs separated by comma, " - "but got: %s") % (str(kv)) - raise argparse.ArgumentTypeError(msg) - - # Check key validation - valid_keys = self.required_keys | self.optional_keys - if valid_keys: - invalid_keys = [k for k in params if k not in valid_keys] - if invalid_keys: - msg = _("Invalid keys %(invalid_keys)s specified.\n" - "Valid keys are: %(valid_keys)s.") - raise argparse.ArgumentTypeError( - msg % {'invalid_keys': ', '.join(invalid_keys), - 'valid_keys': ', '.join(valid_keys)} - ) - - if self.required_keys: - missing_keys = [k for k in self.required_keys if k not in params] - if missing_keys: - msg = _("Missing required keys %(missing_keys)s.\n" - "Required keys are: %(required_keys)s.") - raise argparse.ArgumentTypeError( - msg % {'missing_keys': ', '.join(missing_keys), - 'required_keys': ', '.join(self.required_keys)} - ) - - # Update the dest dict - getattr(namespace, self.dest, []).append(params) - - -class RangeAction(argparse.Action): - """A custom action to parse a single value or a range of values - - Parses single integer values or a range of integer values delimited - by a colon and returns a tuple of integers: - '4' sets ``dest`` to (4, 4) - '6:9' sets ``dest`` to (6, 9) - """ - - def __call__(self, parser, namespace, values, option_string=None): - range = values.split(':') - if len(range) == 0: - # Nothing passed, return a zero default - setattr(namespace, self.dest, (0, 0)) - elif len(range) == 1: - # Only a single value is present - setattr(namespace, self.dest, (int(range[0]), int(range[0]))) - elif len(range) == 2: - # Range of two values - if int(range[0]) <= int(range[1]): - setattr(namespace, self.dest, (int(range[0]), int(range[1]))) - else: - msg = (_("Invalid range, %(range0)s is not " - "less than %(range1)s") - % {'range0': range[0], 'range1': range[1]}) - raise argparse.ArgumentError(self, msg) - else: - # Too many values - msg = _("Invalid range, too many values") - raise argparse.ArgumentError(self, msg) - - -class NonNegativeAction(argparse.Action): - """A custom action to check whether the value is non-negative or not - - Ensures the value is >= 0. - """ - - def __call__(self, parser, namespace, values, option_string=None): - if int(values) >= 0: - setattr(namespace, self.dest, values) - else: - msg = (_("%s expected a non-negative integer") - % (str(option_string))) - raise argparse.ArgumentTypeError(msg) +sys.stderr.write( + "WARNING: %s is deprecated and will be removed after Jun 2017. " + "Please use osc_lib.cli.parseractions\n" % __name__ +) diff --git a/openstackclient/compute/v2/aggregate.py b/openstackclient/compute/v2/aggregate.py index 69227b0c9b..9e44615d4d 100644 --- a/openstackclient/compute/v2/aggregate.py +++ b/openstackclient/compute/v2/aggregate.py @@ -16,11 +16,11 @@ """Compute v2 Aggregate action implementations""" +from osc_lib.cli import parseractions from osc_lib import utils import six from openstackclient.common import command -from openstackclient.common import parseractions from openstackclient.i18n import _ diff --git a/openstackclient/compute/v2/console.py b/openstackclient/compute/v2/console.py index ee16801663..ff7f1af6fa 100644 --- a/openstackclient/compute/v2/console.py +++ b/openstackclient/compute/v2/console.py @@ -17,11 +17,11 @@ import sys +from osc_lib.cli import parseractions from osc_lib import utils import six from openstackclient.common import command -from openstackclient.common import parseractions from openstackclient.i18n import _ diff --git a/openstackclient/compute/v2/flavor.py b/openstackclient/compute/v2/flavor.py index 7cca37e594..439818ebd2 100644 --- a/openstackclient/compute/v2/flavor.py +++ b/openstackclient/compute/v2/flavor.py @@ -15,12 +15,12 @@ """Flavor action implementations""" +from osc_lib.cli import parseractions from osc_lib import exceptions from osc_lib import utils import six from openstackclient.common import command -from openstackclient.common import parseractions from openstackclient.i18n import _ from openstackclient.identity import common as identity_common diff --git a/openstackclient/compute/v2/server.py b/openstackclient/compute/v2/server.py index 7e810898b7..99429c5a24 100644 --- a/openstackclient/compute/v2/server.py +++ b/openstackclient/compute/v2/server.py @@ -21,6 +21,7 @@ import io import os import sys +from osc_lib.cli import parseractions from osc_lib import exceptions from osc_lib import utils import six @@ -31,7 +32,6 @@ except ImportError: from novaclient.v1_1 import servers from openstackclient.common import command -from openstackclient.common import parseractions from openstackclient.i18n import _ from openstackclient.identity import common as identity_common diff --git a/openstackclient/identity/v2_0/project.py b/openstackclient/identity/v2_0/project.py index 688849fa69..b03f8381dd 100644 --- a/openstackclient/identity/v2_0/project.py +++ b/openstackclient/identity/v2_0/project.py @@ -16,11 +16,11 @@ """Identity v2 Project action implementations""" from keystoneauth1 import exceptions as ks_exc +from osc_lib.cli import parseractions from osc_lib import utils import six from openstackclient.common import command -from openstackclient.common import parseractions from openstackclient.i18n import _ diff --git a/openstackclient/identity/v3/project.py b/openstackclient/identity/v3/project.py index 2d504950fb..843767aa14 100644 --- a/openstackclient/identity/v3/project.py +++ b/openstackclient/identity/v3/project.py @@ -16,11 +16,11 @@ """Project action implementations""" from keystoneauth1 import exceptions as ks_exc +from osc_lib.cli import parseractions from osc_lib import utils import six from openstackclient.common import command -from openstackclient.common import parseractions from openstackclient.i18n import _ from openstackclient.identity import common diff --git a/openstackclient/image/v1/image.py b/openstackclient/image/v1/image.py index 73fbe29051..f137f262a9 100644 --- a/openstackclient/image/v1/image.py +++ b/openstackclient/image/v1/image.py @@ -18,7 +18,6 @@ import argparse import io import os -import six import sys if os.name == "nt": @@ -27,11 +26,12 @@ else: msvcrt = None from glanceclient.common import utils as gc_utils +from osc_lib.cli import parseractions from osc_lib import utils +import six from openstackclient.api import utils as api_utils from openstackclient.common import command -from openstackclient.common import parseractions from openstackclient.i18n import _ diff --git a/openstackclient/image/v2/image.py b/openstackclient/image/v2/image.py index 668e4ed90e..7d663a6c83 100644 --- a/openstackclient/image/v2/image.py +++ b/openstackclient/image/v2/image.py @@ -18,13 +18,13 @@ import argparse from glanceclient.common import utils as gc_utils +from osc_lib.cli import parseractions from osc_lib import exceptions from osc_lib import utils import six from openstackclient.api import utils as api_utils from openstackclient.common import command -from openstackclient.common import parseractions from openstackclient.i18n import _ from openstackclient.identity import common diff --git a/openstackclient/network/v2/port.py b/openstackclient/network/v2/port.py index 643207d9b3..a040f20f48 100644 --- a/openstackclient/network/v2/port.py +++ b/openstackclient/network/v2/port.py @@ -16,11 +16,11 @@ import argparse import logging +from osc_lib.cli import parseractions from osc_lib import exceptions from osc_lib import utils from openstackclient.common import command -from openstackclient.common import parseractions from openstackclient.i18n import _ from openstackclient.identity import common as identity_common diff --git a/openstackclient/network/v2/router.py b/openstackclient/network/v2/router.py index eab8b22ca6..db3a90e114 100644 --- a/openstackclient/network/v2/router.py +++ b/openstackclient/network/v2/router.py @@ -17,10 +17,10 @@ import argparse import json import logging +from osc_lib.cli import parseractions from osc_lib import utils from openstackclient.common import command -from openstackclient.common import parseractions from openstackclient.i18n import _ from openstackclient.identity import common as identity_common diff --git a/openstackclient/network/v2/security_group_rule.py b/openstackclient/network/v2/security_group_rule.py index 0132ef4eb5..7c81078691 100644 --- a/openstackclient/network/v2/security_group_rule.py +++ b/openstackclient/network/v2/security_group_rule.py @@ -20,11 +20,11 @@ try: except ImportError: from novaclient.v1_1 import security_group_rules as compute_secgroup_rules +from osc_lib.cli import parseractions from osc_lib import exceptions from osc_lib import utils import six -from openstackclient.common import parseractions from openstackclient.i18n import _ from openstackclient.identity import common as identity_common from openstackclient.network import common diff --git a/openstackclient/network/v2/subnet.py b/openstackclient/network/v2/subnet.py index 2b12ee03a0..6bdb9a5486 100644 --- a/openstackclient/network/v2/subnet.py +++ b/openstackclient/network/v2/subnet.py @@ -15,11 +15,11 @@ import copy +from osc_lib.cli import parseractions from osc_lib import exceptions from osc_lib import utils from openstackclient.common import command -from openstackclient.common import parseractions from openstackclient.i18n import _ from openstackclient.identity import common as identity_common diff --git a/openstackclient/network/v2/subnet_pool.py b/openstackclient/network/v2/subnet_pool.py index 23993300fe..7e0bb2c0a0 100644 --- a/openstackclient/network/v2/subnet_pool.py +++ b/openstackclient/network/v2/subnet_pool.py @@ -13,10 +13,10 @@ """Subnet pool action implementations""" +from osc_lib.cli import parseractions from osc_lib import utils from openstackclient.common import command -from openstackclient.common import parseractions from openstackclient.i18n import _ from openstackclient.identity import common as identity_common diff --git a/openstackclient/object/v1/account.py b/openstackclient/object/v1/account.py index 189f086bb9..8ef3468726 100644 --- a/openstackclient/object/v1/account.py +++ b/openstackclient/object/v1/account.py @@ -13,11 +13,11 @@ """Account v1 action implementations""" +from osc_lib.cli import parseractions from osc_lib import utils import six from openstackclient.common import command -from openstackclient.common import parseractions class SetAccount(command.Command): diff --git a/openstackclient/object/v1/container.py b/openstackclient/object/v1/container.py index b3c6af7498..f26b64a1f4 100644 --- a/openstackclient/object/v1/container.py +++ b/openstackclient/object/v1/container.py @@ -16,11 +16,11 @@ """Container v1 action implementations""" +from osc_lib.cli import parseractions from osc_lib import utils import six from openstackclient.common import command -from openstackclient.common import parseractions class CreateContainer(command.Lister): diff --git a/openstackclient/object/v1/object.py b/openstackclient/object/v1/object.py index 9141c1da45..820780ff39 100644 --- a/openstackclient/object/v1/object.py +++ b/openstackclient/object/v1/object.py @@ -16,11 +16,11 @@ """Object v1 action implementations""" +from osc_lib.cli import parseractions from osc_lib import utils import six from openstackclient.common import command -from openstackclient.common import parseractions class CreateObject(command.Lister): diff --git a/openstackclient/tests/common/test_parseractions.py b/openstackclient/tests/common/test_parseractions.py index 894b224c46..60d4a8cfa2 100644 --- a/openstackclient/tests/common/test_parseractions.py +++ b/openstackclient/tests/common/test_parseractions.py @@ -13,6 +13,9 @@ # under the License. # +# NOTE(dtroyer): This file is deprecated in Jun 2016, remove after 4.x release +# or Jun 2017. + import argparse from openstackclient.common import parseractions diff --git a/openstackclient/volume/v1/qos_specs.py b/openstackclient/volume/v1/qos_specs.py index 70f6826901..d26d9af48d 100644 --- a/openstackclient/volume/v1/qos_specs.py +++ b/openstackclient/volume/v1/qos_specs.py @@ -15,11 +15,11 @@ """Volume v1 QoS action implementations""" +from osc_lib.cli import parseractions from osc_lib import utils import six from openstackclient.common import command -from openstackclient.common import parseractions from openstackclient.i18n import _ diff --git a/openstackclient/volume/v1/snapshot.py b/openstackclient/volume/v1/snapshot.py index af0b522924..c931eeffa8 100644 --- a/openstackclient/volume/v1/snapshot.py +++ b/openstackclient/volume/v1/snapshot.py @@ -17,11 +17,11 @@ import copy +from osc_lib.cli import parseractions from osc_lib import utils import six from openstackclient.common import command -from openstackclient.common import parseractions from openstackclient.i18n import _ diff --git a/openstackclient/volume/v1/volume.py b/openstackclient/volume/v1/volume.py index 359d931ecc..a302ab38d2 100644 --- a/openstackclient/volume/v1/volume.py +++ b/openstackclient/volume/v1/volume.py @@ -17,11 +17,11 @@ import argparse +from osc_lib.cli import parseractions from osc_lib import utils import six from openstackclient.common import command -from openstackclient.common import parseractions from openstackclient.i18n import _ diff --git a/openstackclient/volume/v1/volume_type.py b/openstackclient/volume/v1/volume_type.py index e4d22abb98..fb93753076 100644 --- a/openstackclient/volume/v1/volume_type.py +++ b/openstackclient/volume/v1/volume_type.py @@ -15,11 +15,11 @@ """Volume v1 Type action implementations""" +from osc_lib.cli import parseractions from osc_lib import utils import six from openstackclient.common import command -from openstackclient.common import parseractions from openstackclient.i18n import _ diff --git a/openstackclient/volume/v2/qos_specs.py b/openstackclient/volume/v2/qos_specs.py index c4473117b9..43772b55d9 100644 --- a/openstackclient/volume/v2/qos_specs.py +++ b/openstackclient/volume/v2/qos_specs.py @@ -15,11 +15,11 @@ """Volume v2 QoS action implementations""" +from osc_lib.cli import parseractions from osc_lib import utils import six from openstackclient.common import command -from openstackclient.common import parseractions from openstackclient.i18n import _ diff --git a/openstackclient/volume/v2/snapshot.py b/openstackclient/volume/v2/snapshot.py index 99b7462b52..39af1bd2fd 100644 --- a/openstackclient/volume/v2/snapshot.py +++ b/openstackclient/volume/v2/snapshot.py @@ -16,11 +16,11 @@ import copy +from osc_lib.cli import parseractions from osc_lib import utils import six from openstackclient.common import command -from openstackclient.common import parseractions from openstackclient.i18n import _ diff --git a/openstackclient/volume/v2/volume.py b/openstackclient/volume/v2/volume.py index c6262d1761..c6175c4b6a 100644 --- a/openstackclient/volume/v2/volume.py +++ b/openstackclient/volume/v2/volume.py @@ -16,11 +16,11 @@ import copy +from osc_lib.cli import parseractions from osc_lib import utils import six from openstackclient.common import command -from openstackclient.common import parseractions from openstackclient.i18n import _ from openstackclient.identity import common as identity_common diff --git a/openstackclient/volume/v2/volume_type.py b/openstackclient/volume/v2/volume_type.py index 0896ecffc8..edea91fd77 100644 --- a/openstackclient/volume/v2/volume_type.py +++ b/openstackclient/volume/v2/volume_type.py @@ -14,12 +14,12 @@ """Volume v2 Type action implementations""" +from osc_lib.cli import parseractions from osc_lib import exceptions from osc_lib import utils import six from openstackclient.common import command -from openstackclient.common import parseractions from openstackclient.i18n import _ from openstackclient.identity import common as identity_common