Пример #1
0
    def _add_subparser_args(self, subparser, arguments, version, do_help,
                            input_args, command):
        # NOTE(ntpttr): We get a counter for each argument in this
        # command here because during the microversion check we only
        # want to raise an exception if no version of the argument
        # matches the current microversion. The exception will only
        # be raised after the last instance of a particular argument
        # fails the check.
        arg_counter = collections.defaultdict(int)
        for (args, kwargs) in arguments:
            arg_counter[args[0]] += 1

        for (args, kwargs) in arguments:
            start_version = kwargs.get("start_version", None)
            start_version = api_versions.APIVersion(start_version)
            end_version = kwargs.get('end_version', None)
            end_version = api_versions.APIVersion(end_version)
            if do_help and (start_version or end_version):
                kwargs["help"] = kwargs.get(
                    "help", "") + (self._build_versioned_help_message(
                        start_version, end_version))
            if not version.matches(start_version, end_version):
                if args[0] in input_args and command == input_args[0]:
                    if arg_counter[args[0]] == 1:
                        # This is the last version of this argument,
                        # raise the exception.
                        raise exc.UnsupportedAttribute(args[0], start_version,
                                                       end_version)
                    arg_counter[args[0]] -= 1
                continue
            kw = kwargs.copy()
            kw.pop("start_version", None)
            kw.pop("end_version", None)
            subparser.add_argument(*args, **kw)
Пример #2
0
    def _find_actions(self, subparsers, actions_module, version, do_help,
                      input_args):
        for attr in (a for a in dir(actions_module) if a.startswith('do_')):
            # I prefer to be hyphen-separated instead of underscores.
            command = attr[3:].replace('_', '-')
            callback = getattr(actions_module, attr)
            desc = callback.__doc__ or ''
            action_help = desc.strip().split('\n')[0]
            if hasattr(callback, "versioned"):
                additional_msg = ""
                subs = api_versions.get_substitutions(
                    utils.get_function_name(callback))
                if do_help:
                    additional_msg = self._build_versioned_help_message(
                        subs[0].start_version, subs[-1].end_version)
                    if version.is_latest():
                        additional_msg += HINT_HELP_MSG
                subs = [
                    versioned_method for versioned_method in subs
                    if version.matches(versioned_method.start_version,
                                       versioned_method.end_version)
                ]
                if not subs:
                    # There is no proper versioned method.
                    continue
                # Use the "latest" substitution.
                callback = subs[-1].func
                desc = callback.__doc__ or desc
                action_help = desc.strip().split('\n')[0]
                action_help += additional_msg

            arguments = getattr(callback, 'arguments', [])

            subparser = subparsers.add_parser(
                command,
                help=action_help,
                description=desc,
                add_help=False,
                formatter_class=OpenStackHelpFormatter)

            subparser.add_argument(
                '-h',
                '--help',
                action='help',
                help=argparse.SUPPRESS,
            )

            self.subcommands[command] = subparser

            # NOTE(ntpttr): We get a counter for each argument in this
            # command here because during the microversion check we only
            # want to raise an exception if no version of the argument
            # matches the current microversion. The exception will only
            # be raised after the last instance of a particular argument
            # fails the check.
            arg_counter = dict()
            for (args, kwargs) in arguments:
                arg_counter[args[0]] = arg_counter.get(args[0], 0) + 1

            for (args, kwargs) in arguments:
                start_version = kwargs.get("start_version", None)
                start_version = api_versions.APIVersion(start_version)
                end_version = kwargs.get('end_version', None)
                end_version = api_versions.APIVersion(end_version)
                if do_help and (start_version or end_version):
                    kwargs["help"] = kwargs.get(
                        "help", "") + (self._build_versioned_help_message(
                            start_version, end_version))
                if not version.matches(start_version, end_version):
                    if args[0] in input_args and command == input_args[0]:
                        if arg_counter[args[0]] == 1:
                            # This is the last version of this argument,
                            # raise the exception.
                            raise exc.UnsupportedAttribute(
                                args[0], start_version, end_version)
                        arg_counter[args[0]] -= 1
                    continue
                kw = kwargs.copy()
                kw.pop("start_version", None)
                kw.pop("end_version", None)
                subparser.add_argument(*args, **kw)
            subparser.set_defaults(func=callback)