mirror of
https://github.com/ansible-collections/community.general.git
synced 2025-04-24 11:21:25 -07:00
Add latest updates from FTD Ansible downstream repository. (#53638)
* Add latest updates from FTD Ansible downstream repository. - add a better implementation of the upsert operation; - add API version lookup functionality; - add filter which remove duplicated references from the list of references; - fix minor bugs. * fix issues outlined by ansibot * fix argument name for _check_enum_method
This commit is contained in:
parent
71216cace5
commit
2176b53a55
15 changed files with 882 additions and 298 deletions
|
@ -15,11 +15,11 @@
|
|||
# You should have received a copy of the GNU General Public License
|
||||
# along with Ansible. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
import re
|
||||
|
||||
from ansible.module_utils._text import to_text
|
||||
from ansible.module_utils.common.collections import is_string
|
||||
from ansible.module_utils.six import iteritems
|
||||
|
||||
INVALID_IDENTIFIER_SYMBOLS = r'[^a-zA-Z0-9_]'
|
||||
|
||||
|
@ -65,7 +65,7 @@ def construct_ansible_facts(response, params):
|
|||
response_body = response['items'] if 'items' in response else response
|
||||
if params.get('register_as'):
|
||||
facts[params['register_as']] = response_body
|
||||
elif 'name' in response_body and 'type' in response_body:
|
||||
elif response_body.get('name') and response_body.get('type'):
|
||||
object_name = re.sub(INVALID_IDENTIFIER_SYMBOLS, '_', response_body['name'].lower())
|
||||
fact_name = '%s_%s' % (response_body['type'], object_name)
|
||||
facts[fact_name] = response_body
|
||||
|
@ -181,13 +181,58 @@ def equal_objects(d1, d2):
|
|||
"""
|
||||
Checks whether two objects are equal. Ignores special object properties (e.g. 'id', 'version') and
|
||||
properties with None and empty values. In case properties contains a reference to the other object,
|
||||
only object identities (ids and types) are checked.
|
||||
only object identities (ids and types) are checked. Also, if an array field contains multiple references
|
||||
to the same object, duplicates are ignored when comparing objects.
|
||||
|
||||
:type d1: dict
|
||||
:type d2: dict
|
||||
:return: True if passed objects and their properties are equal. Otherwise, returns False.
|
||||
"""
|
||||
d1 = dict((k, d1[k]) for k in d1.keys() if k not in NON_COMPARABLE_PROPERTIES and d1[k])
|
||||
d2 = dict((k, d2[k]) for k in d2.keys() if k not in NON_COMPARABLE_PROPERTIES and d2[k])
|
||||
|
||||
def prepare_data_for_comparison(d):
|
||||
d = dict((k, d[k]) for k in d.keys() if k not in NON_COMPARABLE_PROPERTIES and d[k])
|
||||
d = delete_ref_duplicates(d)
|
||||
return d
|
||||
|
||||
d1 = prepare_data_for_comparison(d1)
|
||||
d2 = prepare_data_for_comparison(d2)
|
||||
return equal_dicts(d1, d2, compare_by_reference=False)
|
||||
|
||||
|
||||
def delete_ref_duplicates(d):
|
||||
"""
|
||||
Removes reference duplicates from array fields: if an array contains multiple items and some of
|
||||
them refer to the same object, only unique references are preserved (duplicates are removed).
|
||||
|
||||
:param d: dict with data
|
||||
:type d: dict
|
||||
:return: dict without reference duplicates
|
||||
"""
|
||||
|
||||
def delete_ref_duplicates_from_list(refs):
|
||||
if all(type(i) == dict and is_object_ref(i) for i in refs):
|
||||
unique_refs = set()
|
||||
unique_list = list()
|
||||
for i in refs:
|
||||
key = (i['id'], i['type'])
|
||||
if key not in unique_refs:
|
||||
unique_refs.add(key)
|
||||
unique_list.append(i)
|
||||
|
||||
return list(unique_list)
|
||||
|
||||
else:
|
||||
return refs
|
||||
|
||||
if not d:
|
||||
return d
|
||||
|
||||
modified_d = {}
|
||||
for k, v in iteritems(d):
|
||||
if type(v) == list:
|
||||
modified_d[k] = delete_ref_duplicates_from_list(v)
|
||||
elif type(v) == dict:
|
||||
modified_d[k] = delete_ref_duplicates(v)
|
||||
else:
|
||||
modified_d[k] = v
|
||||
return modified_d
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue