Skip to content

Commit d6adc5b

Browse files
committed
[ignore] Moved the convert values to string function logic to aci.py and renamed the function to recursive_convert_none_int_float_to_str_in_dict_list
1 parent 1f3ba60 commit d6adc5b

File tree

2 files changed

+35
-28
lines changed

2 files changed

+35
-28
lines changed

plugins/module_utils/aci.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -386,6 +386,19 @@ def storm_control_policy_rate_spec():
386386
)
387387

388388

389+
def recursive_convert_none_int_float_to_str_in_dict_list(data):
390+
if isinstance(data, (bool, str)):
391+
return data
392+
elif isinstance(data, (int, float)):
393+
return str(data)
394+
elif isinstance(data, dict):
395+
return {k: recursive_convert_none_int_float_to_str_in_dict_list(v) for k, v in data.items()}
396+
elif isinstance(data, list):
397+
return [recursive_convert_none_int_float_to_str_in_dict_list(item) for item in data]
398+
elif data is None:
399+
return ""
400+
401+
389402
class ACIModule(object):
390403
def __init__(self, module):
391404
self.module = module

plugins/modules/aci_rest.py

Lines changed: 22 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -71,11 +71,12 @@
7171
type: int
7272
convert_values_to_str:
7373
description:
74-
- When O(convert_values_to_str=true), this attribute converts input object values to strings.
75-
- This ensures compatibility with Jinja2 version 3.1.6 and above.
74+
- This parameter enforces the conversion of integer and float values to strings in Ansible Core v2.19.0 and later, as well as Jinja2 v3.1.6 and later.
75+
- This parameter defaults to O(convert_values_to_str=true) to maintain compatibility with Ansible Core versions earlier than 2.19.0.
7676
- To disable this conversion, set O(convert_values_to_str=false).
7777
type: bool
7878
default: true
79+
aliases: [ convert_none_int_float_to_str, values_to_str ]
7980
extends_documentation_fragment:
8081
- cisco.aci.aci
8182
- cisco.aci.annotation
@@ -314,7 +315,12 @@
314315
HAS_YAML = False
315316

316317
from ansible.module_utils.basic import AnsibleModule
317-
from ansible_collections.cisco.aci.plugins.module_utils.aci import ACIModule, aci_argument_spec, aci_annotation_spec
318+
from ansible_collections.cisco.aci.plugins.module_utils.aci import (
319+
ACIModule,
320+
aci_argument_spec,
321+
aci_annotation_spec,
322+
recursive_convert_none_int_float_to_str_in_dict_list,
323+
)
318324
from ansible.module_utils._text import to_text
319325
from ansible_collections.cisco.aci.plugins.module_utils.annotation_unsupported import (
320326
ANNOTATION_UNSUPPORTED,
@@ -405,7 +411,9 @@ def main():
405411
rsp_subtree_preserve=dict(type="bool", default=False),
406412
page_size=dict(type="int"),
407413
page=dict(type="int"),
408-
convert_values_to_str=dict(type="bool", default=True), # To support Jinja2 3.1.6 and later versions.
414+
# To support Ansible Core 2.19.0 and later, Jinja2 3.1.6 and later versions.
415+
# The convert_values_to_str parameter defaults to True to maintain compatibility with Ansible Core versions earlier than 2.19.0.
416+
convert_values_to_str=dict(type="bool", default=True, aliases=["convert_none_int_float_to_str", "values_to_str"]),
409417
)
410418

411419
module = AnsibleModule(
@@ -460,13 +468,21 @@ def main():
460468
if content and isinstance(content, dict):
461469
# Validate inline YAML/JSON
462470
add_annotation(annotation, payload)
463-
payload = json.dumps(process_rest_payload(payload, convert_values_to_str))
471+
if convert_values_to_str:
472+
payload = json.dumps(recursive_convert_none_int_float_to_str_in_dict_list(payload))
473+
else:
474+
payload = json.dumps(payload)
475+
464476
elif payload and isinstance(payload, str) and HAS_YAML:
465477
try:
466478
# Validate YAML/JSON string
467479
payload = yaml.safe_load(payload)
468480
add_annotation(annotation, payload)
469-
payload = json.dumps(process_rest_payload(payload, convert_values_to_str))
481+
if convert_values_to_str:
482+
payload = json.dumps(recursive_convert_none_int_float_to_str_in_dict_list(payload))
483+
else:
484+
payload = json.dumps(payload)
485+
470486
except Exception as e:
471487
module.fail_json(msg="Failed to parse provided JSON/YAML payload: {0}".format(to_text(e)), exception=to_text(e), payload=payload)
472488
elif rest_type == "xml" and HAS_LXML_ETREE:
@@ -546,27 +562,5 @@ def main():
546562
aci.exit_json(**aci.result)
547563

548564

549-
def process_rest_payload(payload, convert_values_to_str):
550-
if convert_values_to_str:
551-
if isinstance(payload, str):
552-
payload = convert_payload_values_to_str(json.loads(payload))
553-
else:
554-
payload = convert_payload_values_to_str(payload)
555-
return payload
556-
557-
558-
def convert_payload_values_to_str(data):
559-
if data is None:
560-
return ""
561-
if isinstance(data, dict):
562-
return {k: convert_payload_values_to_str(v) for k, v in data.items()}
563-
elif isinstance(data, list):
564-
return [convert_payload_values_to_str(item) for item in data]
565-
elif (isinstance(data, int) and not isinstance(data, bool)) or isinstance(data, float):
566-
return str(data)
567-
else:
568-
return data
569-
570-
571565
if __name__ == "__main__":
572566
main()

0 commit comments

Comments
 (0)