mirror of
https://github.com/ansible-collections/community.general.git
synced 2025-04-24 03:11:24 -07:00
keeps backwards compat by not removing the previouslly non grammer matching states and introduces new ones so user can decide which one he wants (or keep both and still be inconsistent to annoy those that care)
109 lines
3.4 KiB
Python
109 lines
3.4 KiB
Python
# (c) 2012, Jeroen Hoekx <jeroen@hoekx.be>
|
|
#
|
|
# 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 <http://www.gnu.org/licenses/>.
|
|
|
|
# Make coding more python3-ish
|
|
from __future__ import (absolute_import, division, print_function)
|
|
__metaclass__ = type
|
|
|
|
import re
|
|
from ansible import errors
|
|
|
|
def failed(*a, **kw):
|
|
''' Test if task result yields failed '''
|
|
item = a[0]
|
|
if type(item) != dict:
|
|
raise errors.AnsibleFilterError("|failed expects a dictionary")
|
|
rc = item.get('rc',0)
|
|
failed = item.get('failed',False)
|
|
if rc != 0 or failed:
|
|
return True
|
|
else:
|
|
return False
|
|
|
|
def success(*a, **kw):
|
|
''' Test if task result yields success '''
|
|
return not failed(*a, **kw)
|
|
|
|
def changed(*a, **kw):
|
|
''' Test if task result yields changed '''
|
|
item = a[0]
|
|
if type(item) != dict:
|
|
raise errors.AnsibleFilterError("|changed expects a dictionary")
|
|
if not 'changed' in item:
|
|
changed = False
|
|
if ('results' in item # some modules return a 'results' key
|
|
and type(item['results']) == list
|
|
and type(item['results'][0]) == dict):
|
|
for result in item['results']:
|
|
changed = changed or result.get('changed', False)
|
|
else:
|
|
changed = item.get('changed', False)
|
|
return changed
|
|
|
|
def skipped(*a, **kw):
|
|
''' Test if task result yields skipped '''
|
|
item = a[0]
|
|
if type(item) != dict:
|
|
raise errors.AnsibleFilterError("|skipped expects a dictionary")
|
|
skipped = item.get('skipped', False)
|
|
return skipped
|
|
|
|
def regex(value='', pattern='', ignorecase=False, match_type='search'):
|
|
''' Expose `re` as a boolean filter using the `search` method by default.
|
|
This is likely only useful for `search` and `match` which already
|
|
have their own filters.
|
|
'''
|
|
if ignorecase:
|
|
flags = re.I
|
|
else:
|
|
flags = 0
|
|
_re = re.compile(pattern, flags=flags)
|
|
_bool = __builtins__.get('bool')
|
|
return _bool(getattr(_re, match_type, 'search')(value))
|
|
|
|
def match(value, pattern='', ignorecase=False):
|
|
''' Perform a `re.match` returning a boolean '''
|
|
return regex(value, pattern, ignorecase, 'match')
|
|
|
|
def search(value, pattern='', ignorecase=False):
|
|
''' Perform a `re.search` returning a boolean '''
|
|
return regex(value, pattern, ignorecase, 'search')
|
|
|
|
class TestModule(object):
|
|
''' Ansible core jinja2 tests '''
|
|
|
|
def tests(self):
|
|
return {
|
|
# failure testing
|
|
'failed' : failed,
|
|
'failure' : failed,
|
|
'success' : success,
|
|
'succeeded' : success,
|
|
|
|
# changed testing
|
|
'changed' : changed,
|
|
'change' : changed,
|
|
|
|
# skip testing
|
|
'skipped' : skipped,
|
|
'skip' : skipped,
|
|
|
|
# regex
|
|
'match': match,
|
|
'search': search,
|
|
'regex': regex,
|
|
}
|