From 8a754e0858d922e955e71b253c139e071ecec432 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 28 Apr 2024 18:04:21 +0200 Subject: Adding upstream version 2.14.3. Signed-off-by: Daniel Baumann --- lib/ansible/playbook/taggable.py | 89 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 lib/ansible/playbook/taggable.py (limited to 'lib/ansible/playbook/taggable.py') diff --git a/lib/ansible/playbook/taggable.py b/lib/ansible/playbook/taggable.py new file mode 100644 index 0000000..4038d7f --- /dev/null +++ b/lib/ansible/playbook/taggable.py @@ -0,0 +1,89 @@ +# (c) 2012-2014, Michael DeHaan +# +# This file is part of Ansible +# +# Ansible is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Ansible is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Ansible. If not, see . + +# Make coding more python3-ish +from __future__ import (absolute_import, division, print_function) +__metaclass__ = type + +from ansible.errors import AnsibleError +from ansible.module_utils.six import string_types +from ansible.playbook.attribute import FieldAttribute +from ansible.template import Templar + + +class Taggable: + + untagged = frozenset(['untagged']) + tags = FieldAttribute(isa='list', default=list, listof=(string_types, int), extend=True) + + def _load_tags(self, attr, ds): + if isinstance(ds, list): + return ds + elif isinstance(ds, string_types): + value = ds.split(',') + if isinstance(value, list): + return [x.strip() for x in value] + else: + return [ds] + else: + raise AnsibleError('tags must be specified as a list', obj=ds) + + def evaluate_tags(self, only_tags, skip_tags, all_vars): + ''' this checks if the current item should be executed depending on tag options ''' + + if self.tags: + templar = Templar(loader=self._loader, variables=all_vars) + tags = templar.template(self.tags) + + _temp_tags = set() + for tag in tags: + if isinstance(tag, list): + _temp_tags.update(tag) + else: + _temp_tags.add(tag) + tags = _temp_tags + self.tags = list(tags) + else: + # this makes isdisjoint work for untagged + tags = self.untagged + + should_run = True # default, tasks to run + + if only_tags: + if 'always' in tags: + should_run = True + elif ('all' in only_tags and 'never' not in tags): + should_run = True + elif not tags.isdisjoint(only_tags): + should_run = True + elif 'tagged' in only_tags and tags != self.untagged and 'never' not in tags: + should_run = True + else: + should_run = False + + if should_run and skip_tags: + + # Check for tags that we need to skip + if 'all' in skip_tags: + if 'always' not in tags or 'always' in skip_tags: + should_run = False + elif not tags.isdisjoint(skip_tags): + should_run = False + elif 'tagged' in skip_tags and tags != self.untagged: + should_run = False + + return should_run -- cgit v1.2.3