70 lines
2.3 KiB
Python
70 lines
2.3 KiB
Python
#
|
|
# -*- coding: utf-8 -*-
|
|
# Copyright 2021 Red Hat
|
|
# GNU General Public License v3.0+
|
|
# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
|
#
|
|
|
|
"""
|
|
The replace_keys plugin code
|
|
"""
|
|
from __future__ import absolute_import, division, print_function
|
|
|
|
|
|
__metaclass__ = type
|
|
|
|
import re
|
|
|
|
from ansible.errors import AnsibleFilterError
|
|
|
|
|
|
def _raise_error(msg):
|
|
"""Raise an error message, prepend with filter name
|
|
:param msg: The message
|
|
:type msg: str
|
|
:raises: AnsibleError
|
|
"""
|
|
error = "Error when using plugin 'replace_keys': {msg}".format(msg=msg)
|
|
raise AnsibleFilterError(error)
|
|
|
|
|
|
def replace_keys_from_dict_n_list(data, target, matching_parameter):
|
|
if isinstance(data, dict):
|
|
for key in target:
|
|
for k in list(data.keys()):
|
|
if matching_parameter == "regex":
|
|
if re.match(key.get("before"), k):
|
|
data[key.get("after")] = data.pop(k)
|
|
elif matching_parameter == "starts_with":
|
|
if k.startswith(key.get("before")):
|
|
data[key.get("after")] = data.pop(k)
|
|
elif matching_parameter == "ends_with":
|
|
if k.endswith(key.get("before")):
|
|
data[key.get("after")] = data.pop(k)
|
|
else:
|
|
if k == key.get("before"):
|
|
data[key.get("after")] = data.pop(k)
|
|
for k, v in data.items():
|
|
replace_keys_from_dict_n_list(v, target, matching_parameter)
|
|
elif isinstance(data, list):
|
|
for i in data:
|
|
replace_keys_from_dict_n_list(i, target, matching_parameter)
|
|
return data
|
|
|
|
|
|
def replace_keys(data, target, matching_parameter="equality"):
|
|
"""replaces specific keys with mentioned after data"
|
|
:param data: The data passed in (data|replace_keys(...))
|
|
:type data: raw
|
|
:param target: List of keys on with operation is to be performed
|
|
:type data: list
|
|
:type elements: string
|
|
:param matching_parameter: matching type of the target keys with data keys
|
|
:type data: list
|
|
:type elements: dict
|
|
"""
|
|
if not isinstance(data, (list, dict)):
|
|
_raise_error("Input is not valid for replace operation")
|
|
data = replace_keys_from_dict_n_list(data, target, matching_parameter)
|
|
return data
|