def parse_cli_input(cls, arg_parser, args=None): """:param arg_parser: argparse object :param args: replace sys.argv[1:] :return: dict. Parsed CLI input """ parse_args, unknown_args = arg_parser.parse_known_args(args) # todo(obaranov) Pass all the unknown arguments to the ansible # For now just raise exception if unknown_args: raise exceptions.IRUnrecognizedOptionsException(unknown_args) parse_args = parse_args.__dict__ # move sub commands to the nested dicts result = collections.defaultdict(dict) expr = '^(?P<subcmd_name>subcommand)+(?P<arg_name>.*)$$' for arg, value in parse_args.items(): if value is None: continue match = re.search(expr, arg) if match and match.groupdict().get('subcmd_name', None) \ and not match.groupdict().get('arg_name', None): # create empty nested dict for subcommands if value not in result: result[value] = {} if match and match.groupdict().get('arg_name', None): # we have subcommand. put it as nested dict arg_name = match.group('arg_name') cmd_name = match.group('subcmd_name') sub_name = parse_args[cmd_name] result[sub_name][arg_name] = value return result
def parse_cli_input(cls, arg_parser, args=None): """Parse CLI input. :param arg_parser: argparse object :param args: replace sys.argv[1:] :return: dict. Parsed CLI input """ parse_args, unknown_args = arg_parser.parse_known_args(args) # todo(obaranov) Pass all the unknown arguments to the ansible # For now just raise exception if unknown_args: raise exceptions.IRUnrecognizedOptionsException(unknown_args) parse_args = parse_args.__dict__ # Save all command line arguments to a file all_argument_file = CoreServices.workspace_manager().get_active_workspace().path + '/' \ + parse_args['subcommand'] + '_all_argument_file.txt' with open(all_argument_file, 'w') as file: for arg in parse_args: if 'subcommand' in arg: arg_name = arg[10:] if arg_name == '': data = 'plugin' + ': ' + str(parse_args[arg]) else: data = arg_name + ': ' + str(parse_args[arg]) file.write(data) file.write('\n') # move sub commands to the nested dicts result = collections.defaultdict(dict) expr = '^(?P<subcmd_name>subcommand)+(?P<arg_name>.*)$$' for arg, value in parse_args.items(): if value is None: continue match = re.search(expr, arg) if match and match.groupdict().get('subcmd_name', None) \ and not match.groupdict().get('arg_name', None): # create empty nested dict for subcommands if value not in result: result[value] = {} if match and match.groupdict().get('arg_name', None): # we have subcommand. put it as nested dict arg_name = match.group('arg_name') cmd_name = match.group('subcmd_name') sub_name = parse_args[cmd_name] result[sub_name][arg_name] = value return result
def parse_args(self, arg_parser): """ Parses all the arguments (cli, file, env) and returns two dicts: * command arguments dict (arguments to control the IR logic) * nested arguments dict (arguments to pass to the playbooks) """ spec_defaults = self.get_spec_defaults() env_defaults = self.get_env_defaults() cli_args, unknown_args = CliParser.parse_args( self, arg_parser=arg_parser) file_args = self.get_config_file_args(cli_args) # generate config file and exit if self.generate_config_file(cli_args, spec_defaults): LOG.warning("Config file has been generated. Exiting.") return None # print warnings when something was overridden from non-cli source. self.validate_arg_sources( cli_args, env_defaults, file_args, spec_defaults) # todo(obaranov) Pass all the unknown arguments to the ansible # For now just raise exception if unknown_args: raise exceptions.IRUnrecognizedOptionsException(unknown_args) # merge defaults into one utils.dict_merge(spec_defaults, env_defaults) # now filter defaults to have only parser defined in cli defaults = {key: spec_defaults[key] for key in cli_args.keys() if key in spec_defaults} # copy cli args with the same name to all parser groups self._merge_duplicated_cli_args(cli_args) self._merge_duplicated_cli_args(file_args) utils.dict_merge(defaults, file_args) utils.dict_merge(defaults, cli_args) self.validate_requires_args(defaults) # now resolve complex types. self.resolve_custom_types(defaults) nested, control = self.get_nested_and_control_args(defaults) return nested, control, unknown_args