mirror of
https://github.com/freeipa/ansible-freeipa.git
synced 2026-03-26 21:33:05 +00:00
Merge pull request #1080 from t-woerner/module_defaults
Create action group in collection for use with module_defaults
This commit is contained in:
@@ -114,6 +114,8 @@ echo -e "\033[ACreating CHANGELOG.rst... \033[32;1mDONE\033[0m"
|
||||
|
||||
sed -i -e "s/ansible.module_utils.ansible_freeipa_module/ansible_collections.${collection_prefix}.plugins.module_utils.ansible_freeipa_module/" plugins/modules/*.py
|
||||
|
||||
python utils/create_action_group.py "meta/runtime.yml" "$collection_prefix"
|
||||
|
||||
(cd plugins/module_utils && {
|
||||
ln -sf ../../roles/*/module_utils/*.py .
|
||||
})
|
||||
|
||||
24
utils/create_action_group.py
Normal file
24
utils/create_action_group.py
Normal file
@@ -0,0 +1,24 @@
|
||||
import sys
|
||||
import yaml
|
||||
from facts import MANAGEMENT_MODULES
|
||||
|
||||
|
||||
def create_action_group(yml_file, project_prefix):
|
||||
yaml_data = None
|
||||
with open(yml_file) as f_in:
|
||||
yaml_data = yaml.safe_load(f_in)
|
||||
|
||||
yaml_data.setdefault("action_groups", {})[
|
||||
"%s.modules" % project_prefix
|
||||
] = MANAGEMENT_MODULES
|
||||
|
||||
with open(yml_file, 'w') as f_out:
|
||||
yaml.safe_dump(yaml_data, f_out, default_flow_style=False,
|
||||
explicit_start=True)
|
||||
|
||||
|
||||
if len(sys.argv) != 3:
|
||||
print("Usage: %s <runtime file> <collection prefix>" % sys.argv[0])
|
||||
sys.exit(-1)
|
||||
|
||||
create_action_group(sys.argv[1], sys.argv[2])
|
||||
41
utils/facts.py
Normal file
41
utils/facts.py
Normal file
@@ -0,0 +1,41 @@
|
||||
import os
|
||||
|
||||
|
||||
def get_roles(dir):
|
||||
roles = []
|
||||
|
||||
_rolesdir = "%s/roles/" % dir
|
||||
for _role in os.listdir(_rolesdir):
|
||||
_roledir = "%s/%s" % (_rolesdir, _role)
|
||||
if not os.path.isdir(_roledir) or \
|
||||
not os.path.isdir("%s/meta" % _roledir) or \
|
||||
not os.path.isdir("%s/tasks" % _roledir):
|
||||
continue
|
||||
roles.append(_role)
|
||||
|
||||
return sorted(roles)
|
||||
|
||||
|
||||
def get_modules(dir):
|
||||
management_modules = []
|
||||
roles_modules = []
|
||||
|
||||
for root, _dirs, files in os.walk(dir):
|
||||
if not root.startswith("%s/plugins/" % dir) and \
|
||||
not root.startswith("%s/roles/" % dir):
|
||||
continue
|
||||
for _file in files:
|
||||
if _file.endswith(".py"):
|
||||
if root == "%s/plugins/modules" % dir:
|
||||
management_modules.append(_file[:-3])
|
||||
elif root.startswith("%s/roles/" % dir):
|
||||
if root.endswith("/library"):
|
||||
roles_modules.append(_file[:-3])
|
||||
|
||||
return sorted(management_modules), sorted(roles_modules)
|
||||
|
||||
|
||||
BASE_DIR = os.path.abspath(os.path.dirname(__file__) + "/..")
|
||||
ROLES = get_roles(BASE_DIR)
|
||||
MANAGEMENT_MODULES, ROLES_MODULES = get_modules(BASE_DIR)
|
||||
ALL_MODULES = sorted(MANAGEMENT_MODULES + ROLES_MODULES)
|
||||
@@ -4,7 +4,7 @@
|
||||
# Authors:
|
||||
# Thomas Woerner <twoerner@redhat.com>
|
||||
#
|
||||
# Copyright (C) 2019,2020 Red Hat
|
||||
# Copyright (C) 2019-2023 Red Hat
|
||||
# see file 'COPYING' for use and warranty information
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
@@ -21,49 +21,95 @@
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
import re
|
||||
from facts import ROLES, ALL_MODULES
|
||||
|
||||
|
||||
def get_indent(txt):
|
||||
return len(txt) - len(txt.lstrip())
|
||||
|
||||
|
||||
def galaxyfy_playbook(project_prefix, collection_prefix, lines):
|
||||
po1 = re.compile('(%s.*:)$' % project_prefix)
|
||||
po2 = re.compile('(.*:) (%s.*)$' % project_prefix)
|
||||
po_module = re.compile('(%s.*):$' % project_prefix)
|
||||
po_module_arg = re.compile('(%s.*): (.*)$' % project_prefix)
|
||||
po_module_unnamed = re.compile('- (%s.*):$' % project_prefix)
|
||||
po_role = re.compile('(.*:) (%s.*)$' % project_prefix)
|
||||
|
||||
pattern_module = r'%s.\1:' % collection_prefix
|
||||
pattern_module_arg = r'%s.\1: \2' % collection_prefix
|
||||
pattern_module_unnamed = r'- %s.\1:' % collection_prefix
|
||||
pattern_role = r'\1 %s.\2' % collection_prefix
|
||||
|
||||
out_lines = []
|
||||
|
||||
pattern1 = r'%s.\1' % collection_prefix
|
||||
pattern2 = r'\1 %s.\2' % collection_prefix
|
||||
|
||||
changed = False
|
||||
changeable = False
|
||||
include_role = False
|
||||
module_defaults = False
|
||||
module_defaults_indent = -1
|
||||
for line in lines:
|
||||
stripped = line.strip()
|
||||
if stripped.startswith("- name:") or \
|
||||
stripped.startswith("- block:"):
|
||||
changeable = True
|
||||
module_defaults = False
|
||||
module_defaults_indent = -1
|
||||
elif stripped in ["set_fact:", "ansible.builtin.set_fact:", "vars:"]:
|
||||
changeable = False
|
||||
include_role = False
|
||||
module_defaults = False
|
||||
module_defaults_indent = -1
|
||||
elif stripped == "roles:":
|
||||
changeable = True
|
||||
include_role = False
|
||||
module_defaults = False
|
||||
module_defaults_indent = -1
|
||||
elif (stripped.startswith("include_role:") or
|
||||
stripped.startswith("ansible.builtin.include_role:")):
|
||||
include_role = True
|
||||
module_defaults = False
|
||||
module_defaults_indent = -1
|
||||
elif include_role and stripped.startswith("name:"):
|
||||
line = po2.sub(pattern2, line)
|
||||
changed = True
|
||||
match = po_role.search(line)
|
||||
if match and match.group(2) in ROLES:
|
||||
line = po_role.sub(pattern_role, line)
|
||||
changed = True
|
||||
elif stripped == "module_defaults:":
|
||||
changeable = True
|
||||
include_role = False
|
||||
module_defaults = True
|
||||
module_defaults_indent = -1
|
||||
elif module_defaults:
|
||||
_indent = get_indent(line)
|
||||
if module_defaults_indent == -1:
|
||||
module_defaults_indent = _indent
|
||||
if _indent == module_defaults_indent:
|
||||
# only module, no YAML anchor or alias
|
||||
match = po_module.search(line)
|
||||
if match and match.group(1) in ALL_MODULES:
|
||||
line = po_module.sub(pattern_module, line)
|
||||
changed = True
|
||||
# module with YAML anchor or alias
|
||||
match = po_module_arg.search(line)
|
||||
if match and match.group(1) in ALL_MODULES:
|
||||
line = po_module_arg.sub(pattern_module_arg, line)
|
||||
changed = True
|
||||
elif changeable and stripped.startswith("- role:"):
|
||||
line = po2.sub(pattern2, line)
|
||||
changed = True
|
||||
match = po_role.search(line)
|
||||
if match and match.group(2) in ROLES:
|
||||
line = po_role.sub(pattern_role, line)
|
||||
changed = True
|
||||
elif (changeable and stripped.startswith(project_prefix)
|
||||
and not stripped.startswith(collection_prefix) # noqa
|
||||
and stripped.endswith(":")): # noqa
|
||||
line = po1.sub(pattern1, line)
|
||||
changed = True
|
||||
changeable = False # Only change first line in task
|
||||
match = po_module.search(line)
|
||||
if match and match.group(1) in ALL_MODULES:
|
||||
line = po_module.sub(pattern_module, line)
|
||||
changed = True
|
||||
changeable = False # Only change first line in task
|
||||
elif (stripped.startswith("- %s" % project_prefix)
|
||||
and stripped.endswith(":")): # noqa
|
||||
line = po1.sub(pattern1, line)
|
||||
changed = True
|
||||
match = po_module_unnamed.search(line)
|
||||
if match and match.group(1) in ALL_MODULES:
|
||||
line = po_module_unnamed.sub(pattern_module_unnamed, line)
|
||||
changed = True
|
||||
|
||||
out_lines.append(line)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user