diff options
author | Brian Coca <bcoca@users.noreply.github.com> | 2022-09-28 09:13:05 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-09-28 09:13:05 -0400 |
commit | 95236c556951bf421fec439cad25cef59402a6b6 (patch) | |
tree | 6be46d83dc37be80572701b526a5c838f86e838c | |
parent | 3515b3c5fcf011ba9bb63fe069520c7d528e3c54 (diff) | |
download | ansible-95236c556951bf421fec439cad25cef59402a6b6.tar.gz |
slight var loading optimization (#78835)
Avoid having to recalculate these values since they don't change from first access
-rw-r--r-- | changelogs/fragments/optimize_vars_loads.yml | 2 | ||||
-rw-r--r-- | lib/ansible/utils/vars.py | 87 |
2 files changed, 49 insertions, 40 deletions
diff --git a/changelogs/fragments/optimize_vars_loads.yml b/changelogs/fragments/optimize_vars_loads.yml new file mode 100644 index 0000000000..4c0ec1eaa0 --- /dev/null +++ b/changelogs/fragments/optimize_vars_loads.yml @@ -0,0 +1,2 @@ +minor_changes: + - optimized var loading by caching results as there is no variance in input during run. diff --git a/lib/ansible/utils/vars.py b/lib/ansible/utils/vars.py index a3224c8b5c..5a1e729cc2 100644 --- a/lib/ansible/utils/vars.py +++ b/lib/ansible/utils/vars.py @@ -181,53 +181,60 @@ def merge_hash(x, y, recursive=True, list_merge='replace'): def load_extra_vars(loader): - extra_vars = {} - for extra_vars_opt in context.CLIARGS.get('extra_vars', tuple()): - data = None - extra_vars_opt = to_text(extra_vars_opt, errors='surrogate_or_strict') - if extra_vars_opt is None or not extra_vars_opt: - continue - if extra_vars_opt.startswith(u"@"): - # Argument is a YAML file (JSON is a subset of YAML) - data = loader.load_from_file(extra_vars_opt[1:]) - elif extra_vars_opt[0] in [u'/', u'.']: - raise AnsibleOptionsError("Please prepend extra_vars filename '%s' with '@'" % extra_vars_opt) - elif extra_vars_opt[0] in [u'[', u'{']: - # Arguments as YAML - data = loader.load(extra_vars_opt) - else: - # Arguments as Key-value - data = parse_kv(extra_vars_opt) + if not getattr(load_extra_vars, 'extra_vars', None): + extra_vars = {} + for extra_vars_opt in context.CLIARGS.get('extra_vars', tuple()): + data = None + extra_vars_opt = to_text(extra_vars_opt, errors='surrogate_or_strict') + if extra_vars_opt is None or not extra_vars_opt: + continue + + if extra_vars_opt.startswith(u"@"): + # Argument is a YAML file (JSON is a subset of YAML) + data = loader.load_from_file(extra_vars_opt[1:]) + elif extra_vars_opt[0] in [u'/', u'.']: + raise AnsibleOptionsError("Please prepend extra_vars filename '%s' with '@'" % extra_vars_opt) + elif extra_vars_opt[0] in [u'[', u'{']: + # Arguments as YAML + data = loader.load(extra_vars_opt) + else: + # Arguments as Key-value + data = parse_kv(extra_vars_opt) + + if isinstance(data, MutableMapping): + extra_vars = combine_vars(extra_vars, data) + else: + raise AnsibleOptionsError("Invalid extra vars data supplied. '%s' could not be made into a dictionary" % extra_vars_opt) - if isinstance(data, MutableMapping): - extra_vars = combine_vars(extra_vars, data) - else: - raise AnsibleOptionsError("Invalid extra vars data supplied. '%s' could not be made into a dictionary" % extra_vars_opt) + setattr(load_extra_vars, 'extra_vars', extra_vars) - return extra_vars + return load_extra_vars.extra_vars def load_options_vars(version): - if version is None: - version = 'Unknown' - options_vars = {'ansible_version': version} - attrs = {'check': 'check_mode', - 'diff': 'diff_mode', - 'forks': 'forks', - 'inventory': 'inventory_sources', - 'skip_tags': 'skip_tags', - 'subset': 'limit', - 'tags': 'run_tags', - 'verbosity': 'verbosity'} - - for attr, alias in attrs.items(): - opt = context.CLIARGS.get(attr) - if opt is not None: - options_vars['ansible_%s' % alias] = opt - - return options_vars + if not getattr(load_options_vars, 'options_vars', None): + if version is None: + version = 'Unknown' + options_vars = {'ansible_version': version} + attrs = {'check': 'check_mode', + 'diff': 'diff_mode', + 'forks': 'forks', + 'inventory': 'inventory_sources', + 'skip_tags': 'skip_tags', + 'subset': 'limit', + 'tags': 'run_tags', + 'verbosity': 'verbosity'} + + for attr, alias in attrs.items(): + opt = context.CLIARGS.get(attr) + if opt is not None: + options_vars['ansible_%s' % alias] = opt + + setattr(load_options_vars, 'options_vars', options_vars) + + return load_options_vars.options_vars def _isidentifier_PY3(ident): |