Skip to content

Commit 2981c56

Browse files
[zos_lineinfile] Ensure return_content populated in the logs (#2120)
1 parent c9063a1 commit 2981c56

File tree

4 files changed

+52
-5
lines changed

4 files changed

+52
-5
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
bugfixes:
2+
- zos_lineinfile - Return values ``return_content`` and ``backup_name`` were not always being returned.
3+
Fix now ensure that these values are always present in the module's response.
4+
(https://github.com/ansible-collections/ibm_zos_core/pull/2120)

plugins/module_utils/data_set.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3143,8 +3143,12 @@ def temp_member_name():
31433143
first_char_set = ascii_uppercase + "#@$"
31443144
rest_char_set = ascii_uppercase + digits + "#@$"
31453145
# using sample as k=1 and k=7 to avoid using random.choice just for oneline import
3146-
temp_name = sample(first_char_set, k=1)
3147-
temp_name += sample(rest_char_set, k=7)
3146+
# Issue: https://bandit.readthedocs.io/en/latest/blacklists/blacklist_calls.html#b311-random
3147+
# Standard pseudo-random generators are not suitable for security/cryptographic purposes.
3148+
# Ignoring this bandit blacklisted issue because we are not using this pseudo-random generator for
3149+
# SECURITY/CRYPTOGRAPHIC purposes but rather a random sample of characters for a random name generator.
3150+
temp_name = sample(first_char_set, k=1) # nosec B311
3151+
temp_name += sample(rest_char_set, k=7) # nosec B311
31483152
temp_name = "".join(temp_name)
31493153
return temp_name
31503154

plugins/modules/zos_lineinfile.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -722,6 +722,7 @@ def main():
722722
result['rc'] = rc
723723
result['cmd'] = cmd
724724
result['stodut'] = stodut
725+
result['return_content'] = stodut
725726
result['changed'] = True if rc == 0 else False
726727
stderr = 'Failed to insert new entry' if rc != 0 else ""
727728
else:
@@ -734,6 +735,7 @@ def main():
734735
result['rc'] = rc
735736
result['cmd'] = cmd
736737
result['stodut'] = stodut
738+
result['return_content'] = stodut
737739
result['changed'] = True if rc == 0 else False
738740
stderr = 'Failed to insert new entry' if rc != 0 else ""
739741
else:
@@ -790,11 +792,15 @@ def main():
790792
result['cmd'] = ret['cmd']
791793
result['changed'] = ret.get('changed', False)
792794
result['found'] = ret.get('found', 0)
795+
result['stdout'] = stdout
796+
result['return_content'] = stdout
793797
# Only return 'rc' if stderr is not empty to not fail the playbook run in a nomatch case
794798
# That information will be given with 'changed' and 'found'
795799
if len(stderr):
796800
result['stderr'] = str(stderr)
797801
result['rc'] = rc
802+
if 'backup_name' not in result:
803+
result['backup_name'] = ""
798804
module.exit_json(**result)
799805

800806

tests/functional/modules/test_zos_lineinfile_func.py

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,7 @@ def test_uss_line_replace(ansible_zos_module):
310310
results = hosts.all.zos_lineinfile(**params)
311311
for result in results.contacted.values():
312312
assert result.get("changed") == 1
313+
assert "return_content" in result
313314
results = hosts.all.shell(cmd="cat {0}".format(params["path"]))
314315
for result in results.contacted.values():
315316
assert result.get("stdout") == EXPECTED_REPLACE
@@ -333,6 +334,7 @@ def test_uss_line_insertafter_regex(ansible_zos_module):
333334
results = hosts.all.zos_lineinfile(**params)
334335
for result in results.contacted.values():
335336
assert result.get("changed") == 1
337+
assert "return_content" in result
336338
results = hosts.all.shell(cmd="cat {0}".format(params["path"]))
337339
for result in results.contacted.values():
338340
assert result.get("stdout") == EXPECTED_INSERTAFTER_REGEX
@@ -356,6 +358,7 @@ def test_uss_line_insertbefore_regex(ansible_zos_module):
356358
results = hosts.all.zos_lineinfile(**params)
357359
for result in results.contacted.values():
358360
assert result.get("changed") == 1
361+
assert "return_content" in result
359362
results = hosts.all.shell(cmd="cat {0}".format(params["path"]))
360363
for result in results.contacted.values():
361364
assert result.get("stdout") == EXPECTED_INSERTBEFORE_REGEX
@@ -379,6 +382,7 @@ def test_uss_line_insertafter_eof(ansible_zos_module):
379382
results = hosts.all.zos_lineinfile(**params)
380383
for result in results.contacted.values():
381384
assert result.get("changed") == 1
385+
assert "return_content" in result
382386
results = hosts.all.shell(cmd="cat {0}".format(params["path"]))
383387
for result in results.contacted.values():
384388
assert result.get("stdout") == EXPECTED_INSERTAFTER_EOF
@@ -402,6 +406,7 @@ def test_uss_line_insertbefore_bof(ansible_zos_module):
402406
results = hosts.all.zos_lineinfile(**params)
403407
for result in results.contacted.values():
404408
assert result.get("changed") == 1
409+
assert "return_content" in result
405410
results = hosts.all.shell(cmd="cat {0}".format(params["path"]))
406411
for result in results.contacted.values():
407412
assert result.get("stdout") == EXPECTED_INSERTBEFORE_BOF
@@ -426,6 +431,7 @@ def test_uss_line_replace_match_insertafter_ignore(ansible_zos_module):
426431
results = hosts.all.zos_lineinfile(**params)
427432
for result in results.contacted.values():
428433
assert result.get("changed") == 1
434+
assert "return_content" in result
429435
results = hosts.all.shell(cmd="cat {0}".format(params["path"]))
430436
for result in results.contacted.values():
431437
assert result.get("stdout") == EXPECTED_REPLACE_INSERTAFTER_IGNORE
@@ -450,6 +456,7 @@ def test_uss_line_replace_match_insertbefore_ignore(ansible_zos_module):
450456
results = hosts.all.zos_lineinfile(**params)
451457
for result in results.contacted.values():
452458
assert result.get("changed") == 1
459+
assert "return_content" in result
453460
results = hosts.all.shell(cmd="cat {0}".format(params["path"]))
454461
for result in results.contacted.values():
455462
assert result.get("stdout") == EXPECTED_REPLACE_INSERTBEFORE_IGNORE
@@ -474,6 +481,7 @@ def test_uss_line_replace_nomatch_insertafter_match(ansible_zos_module):
474481
results = hosts.all.zos_lineinfile(**params)
475482
for result in results.contacted.values():
476483
assert result.get("changed") == 1
484+
assert "return_content" in result
477485
results = hosts.all.shell(cmd="cat {0}".format(params["path"]))
478486
for result in results.contacted.values():
479487
assert result.get("stdout") == EXPECTED_REPLACE_NOMATCH_INSERTAFTER
@@ -498,6 +506,7 @@ def test_uss_line_replace_nomatch_insertbefore_match(ansible_zos_module):
498506
results = hosts.all.zos_lineinfile(**params)
499507
for result in results.contacted.values():
500508
assert result.get("changed") == 1
509+
assert "return_content" in result
501510
results = hosts.all.shell(cmd="cat {0}".format(params["path"]))
502511
for result in results.contacted.values():
503512
assert result.get("stdout") == EXPECTED_REPLACE_NOMATCH_INSERTBEFORE
@@ -522,6 +531,7 @@ def test_uss_line_replace_nomatch_insertafter_nomatch(ansible_zos_module):
522531
results = hosts.all.zos_lineinfile(**params)
523532
for result in results.contacted.values():
524533
assert result.get("changed") == 1
534+
assert "return_content" in result
525535
results = hosts.all.shell(cmd="cat {0}".format(params["path"]))
526536
for result in results.contacted.values():
527537
assert result.get("stdout") == EXPECTED_REPLACE_NOMATCH_INSERTAFTER_NOMATCH
@@ -546,6 +556,7 @@ def test_uss_line_replace_nomatch_insertbefore_nomatch(ansible_zos_module):
546556
results = hosts.all.zos_lineinfile(**params)
547557
for result in results.contacted.values():
548558
assert result.get("changed") == 1
559+
assert "return_content" in result
549560
results = hosts.all.shell(cmd="cat {0}".format(params["path"]))
550561
for result in results.contacted.values():
551562
assert result.get("stdout") == EXPECTED_REPLACE_NOMATCH_INSERTBEFORE_NOMATCH
@@ -570,6 +581,7 @@ def test_uss_line_absent(ansible_zos_module):
570581
for result in results.contacted.values():
571582
print(result)
572583
assert result.get("changed") == 1
584+
assert "return_content" in result
573585
results = hosts.all.shell(cmd="cat {0}".format(params["path"]))
574586
for result in results.contacted.values():
575587
assert result.get("stdout") == EXPECTED_ABSENT
@@ -592,6 +604,7 @@ def test_uss_advanced_regular_expression_absent(ansible_zos_module):
592604
results = hosts.all.zos_lineinfile(**params)
593605
for result in results.contacted.values():
594606
assert result.get("changed") == 1
607+
assert "return_content" in result
595608
results = hosts.all.shell(cmd="cat {0}".format(params["path"]))
596609
for result in results.contacted.values():
597610
assert result.get("stdout") == TEST_CONTENT
@@ -616,6 +629,7 @@ def test_uss_line_replace_quoted_escaped(ansible_zos_module):
616629
results = hosts.all.zos_lineinfile(**params)
617630
for result in results.contacted.values():
618631
assert result.get("changed") == 1
632+
assert "return_content" in result
619633
results = hosts.all.shell(cmd="cat {0}".format(params["path"]))
620634
for result in results.contacted.values():
621635
assert result.get("stdout") == EXPECTED_QUOTED
@@ -640,6 +654,7 @@ def test_uss_line_replace_quoted_not_escaped(ansible_zos_module):
640654
results = hosts.all.zos_lineinfile(**params)
641655
for result in results.contacted.values():
642656
assert result.get("changed") == 1
657+
assert "return_content" in result
643658
results = hosts.all.shell(cmd="cat {0}".format(params["path"]))
644659
for result in results.contacted.values():
645660
assert result.get("stdout") == EXPECTED_QUOTED
@@ -662,6 +677,7 @@ def test_uss_line_does_not_insert_repeated(ansible_zos_module):
662677
results = hosts.all.zos_lineinfile(**params)
663678
for result in results.contacted.values():
664679
assert result.get("changed") == 1
680+
assert "return_content" in result
665681
results = hosts.all.shell(cmd="cat {0}".format(params["path"]))
666682
for result in results.contacted.values():
667683
assert result.get("stdout") == TEST_CONTENT
@@ -700,6 +716,7 @@ def test_ds_line_insertafter_regex(ansible_zos_module, dstype):
700716
results = hosts.all.zos_lineinfile(**params)
701717
for result in results.contacted.values():
702718
assert result.get("changed") == 1
719+
assert "return_content" in result
703720
results = hosts.all.shell(cmd="cat \"//'{0}'\" ".format(params["path"]))
704721
for result in results.contacted.values():
705722
assert result.get("stdout") == EXPECTED_INSERTAFTER_REGEX
@@ -729,6 +746,7 @@ def test_ds_line_insert_before_ansible_block(ansible_zos_module, dstype):
729746
results = hosts.all.zos_lineinfile(**params)
730747
for result in results.contacted.values():
731748
assert result.get("changed") == 1
749+
assert "return_content" in result
732750
results = hosts.all.shell(cmd="cat \"//'{0}'\" ".format(params["path"]))
733751
for result in results.contacted.values():
734752
assert result.get("stdout") == EXPECTED_TEST_PARSING_CONTENT
@@ -754,6 +772,7 @@ def test_ds_line_insertbefore_regex(ansible_zos_module, dstype):
754772
results = hosts.all.zos_lineinfile(**params)
755773
for result in results.contacted.values():
756774
assert result.get("changed") == 1
775+
assert "return_content" in result
757776
results = hosts.all.shell(cmd="cat \"//'{0}'\" ".format(params["path"]))
758777
for result in results.contacted.values():
759778
assert result.get("stdout") == EXPECTED_INSERTBEFORE_REGEX
@@ -780,6 +799,7 @@ def test_ds_line_insertafter_eof(ansible_zos_module, dstype):
780799
results = hosts.all.zos_lineinfile(**params)
781800
for result in results.contacted.values():
782801
assert result.get("changed") == 1
802+
assert "return_content" in result
783803
results = hosts.all.shell(cmd="cat \"//'{0}'\" ".format(params["path"]))
784804
for result in results.contacted.values():
785805
assert result.get("stdout") == EXPECTED_INSERTAFTER_EOF
@@ -805,6 +825,7 @@ def test_ds_line_insertbefore_bof(ansible_zos_module, dstype):
805825
results = hosts.all.zos_lineinfile(**params)
806826
for result in results.contacted.values():
807827
assert result.get("changed") == 1
828+
assert "return_content" in result
808829
results = hosts.all.shell(cmd="cat \"//'{0}'\" ".format(params["path"]))
809830
for result in results.contacted.values():
810831
assert result.get("stdout") == EXPECTED_INSERTBEFORE_BOF
@@ -832,6 +853,7 @@ def test_ds_line_replace_match_insertafter_ignore(ansible_zos_module, dstype):
832853
results = hosts.all.zos_lineinfile(**params)
833854
for result in results.contacted.values():
834855
assert result.get("changed") == 1
856+
assert "return_content" in result
835857
results = hosts.all.shell(cmd="cat \"//'{0}'\" ".format(params["path"]))
836858
for result in results.contacted.values():
837859
assert result.get("stdout") == EXPECTED_REPLACE_INSERTAFTER_IGNORE
@@ -859,6 +881,7 @@ def test_ds_line_replace_match_insertbefore_ignore(ansible_zos_module, dstype):
859881
results = hosts.all.zos_lineinfile(**params)
860882
for result in results.contacted.values():
861883
assert result.get("changed") == 1
884+
assert "return_content" in result
862885
results = hosts.all.shell(cmd="cat \"//'{0}'\" ".format(params["path"]))
863886
for result in results.contacted.values():
864887
assert result.get("stdout") == EXPECTED_REPLACE_INSERTBEFORE_IGNORE
@@ -867,7 +890,7 @@ def test_ds_line_replace_match_insertbefore_ignore(ansible_zos_module, dstype):
867890

868891

869892
@pytest.mark.ds
870-
def test_gdd_ds_insert_line(ansible_zos_module):
893+
def test_gds_ds_insert_line(ansible_zos_module):
871894
hosts = ansible_zos_module
872895
params = dict(insertafter="eof", line="ZOAU_ROOT=/mvsutil-develop_dsed", state="present")
873896
ds_name = get_tmp_ds_name(3, 2)
@@ -881,6 +904,7 @@ def test_gdd_ds_insert_line(ansible_zos_module):
881904
results = hosts.all.zos_lineinfile(**params)
882905
for result in results.contacted.values():
883906
assert result.get("changed") == 1
907+
assert "return_content" in result
884908
cmd = result.get("cmd").split()
885909
for cmd_p in cmd:
886910
if ds_name in cmd_p:
@@ -893,6 +917,7 @@ def test_gdd_ds_insert_line(ansible_zos_module):
893917
results = hosts.all.zos_lineinfile(**params)
894918
for result in results.contacted.values():
895919
assert result.get("changed") == 1
920+
assert "return_content" in result
896921
cmd = result.get("cmd").split()
897922
for cmd_p in cmd:
898923
if ds_name in cmd_p:
@@ -907,15 +932,17 @@ def test_gdd_ds_insert_line(ansible_zos_module):
907932
for result in results.contacted.values():
908933
assert result.get("changed") == 1
909934
assert result.get("rc") == 0
935+
assert "return_content" in result
910936
backup = ds_name + "(0)"
911937
results = hosts.all.shell(cmd="cat \"//'{0}'\" ".format(backup))
912938
for result in results.contacted.values():
913939
assert result.get("stdout") == "ZOAU_ROOT=/mvsutil-develop_dsed"
914940

915-
params["src"] = ds_name + "(-3)"
941+
params["src"] = ds_name + "(-2)"
916942
results = hosts.all.zos_lineinfile(**params)
917943
for result in results.contacted.values():
918-
assert result.get("changed") == 0
944+
assert result.get("changed") == 1
945+
assert "return_content" in result
919946
finally:
920947
hosts.all.shell(cmd="""drm "{0}*" """.format(ds_name))
921948

@@ -934,6 +961,7 @@ def test_special_characters_ds_insert_line(ansible_zos_module):
934961
results = hosts.all.zos_lineinfile(**params)
935962
for result in results.contacted.values():
936963
assert result.get("changed") == 1
964+
assert "return_content" in result
937965
src = ds_name.replace('$', "\$")
938966
results = hosts.all.shell(cmd="cat \"//'{0}'\" ".format(src))
939967
for result in results.contacted.values():
@@ -946,6 +974,7 @@ def test_special_characters_ds_insert_line(ansible_zos_module):
946974
print(result)
947975
assert result.get("changed") == 1
948976
assert result.get("rc") == 0
977+
assert "return_content" in result
949978
backup = backup.replace('$', "\$")
950979
results = hosts.all.shell(cmd="cat \"//'{0}'\" ".format(backup))
951980
for result in results.contacted.values():
@@ -1071,6 +1100,7 @@ def test_ds_line_absent(ansible_zos_module, dstype):
10711100
results = hosts.all.zos_lineinfile(**params)
10721101
for result in results.contacted.values():
10731102
assert result.get("changed") == 1
1103+
assert "return_content" in result
10741104
results = hosts.all.shell(cmd="cat \"//'{0}'\" ".format(params["path"]))
10751105
for result in results.contacted.values():
10761106
assert result.get("stdout") == EXPECTED_ABSENT
@@ -1109,6 +1139,7 @@ def test_ds_tmp_hlq_option(ansible_zos_module):
11091139
params["path"] = ds_full_name
11101140
results = hosts.all.zos_lineinfile(**params)
11111141
for result in results.contacted.values():
1142+
assert "return_content" in result
11121143
for key in kwargs:
11131144
assert kwargs.get(key) in result.get(key)
11141145
finally:
@@ -1337,6 +1368,7 @@ def test_uss_encoding(ansible_zos_module, encoding):
13371368
results = hosts.all.zos_lineinfile(**params)
13381369
for result in results.contacted.values():
13391370
assert result.get("changed") == 1
1371+
assert "return_content" in result
13401372
results = hosts.all.shell(cmd=f"iconv -f IBM-1047 -t {encoding} {full_path}")
13411373
for result in results.contacted.values():
13421374
assert result.get("stdout") == EXPECTED_ENCODING
@@ -1381,6 +1413,7 @@ def test_ds_encoding(ansible_zos_module, encoding, dstype):
13811413
results = hosts.all.zos_lineinfile(**params)
13821414
for result in results.contacted.values():
13831415
assert result.get("changed") == 1
1416+
assert "return_content" in result
13841417
hosts.all.shell(
13851418
cmd=f"iconv -f {encoding} -t IBM-1047 \"{ds_full_name}\" > \"{ds_full_name}\" "
13861419
)

0 commit comments

Comments
 (0)