Skip to content

Commit ab56784

Browse files
[Enabler][1377]mvs_raw_support_gdg_gds_special_character (#1525)
* Add first iteration mvs_raw * Add soultion * Add fragment * Add documentation * Update plugins/modules/zos_mvs_raw.py Co-authored-by: Fernando Flores <[email protected]> * Update plugins/modules/zos_mvs_raw.py Co-authored-by: Fernando Flores <[email protected]> * Fix raise * Update plugins/modules/zos_mvs_raw.py Co-authored-by: Fernando Flores <[email protected]> --------- Co-authored-by: Fernando Flores <[email protected]>
1 parent 163b7e5 commit ab56784

File tree

3 files changed

+186
-1
lines changed

3 files changed

+186
-1
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
minor_changes:
2+
- zos_mvs_raw - Added support for GDG and GDS relative name notation to use a data set.
3+
Added support for data set names with special characters like $, /#, /- and @.
4+
(https://github.com/ansible-collections/ibm_zos_core/pull/1525).

plugins/modules/zos_mvs_raw.py

Lines changed: 75 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,8 @@
8888
data_set_name:
8989
description:
9090
- The data set name.
91+
- A data set name can be a GDS relative name.
92+
- When using GDS relative name and it is a positive generation, disposition new must be used.
9193
type: str
9294
required: false
9395
type:
@@ -705,6 +707,8 @@
705707
data_set_name:
706708
description:
707709
- The data set name.
710+
- A data set name can be a GDS relative name.
711+
- When using GDS relative name and it is a positive generation, disposition new must be used.
708712
type: str
709713
required: false
710714
type:
@@ -1582,6 +1586,37 @@
15821586
RECORDSIZE(4086 32600) -
15831587
VOLUMES(222222) -
15841588
UNIQUE)
1589+
1590+
- name: List data sets matching pattern in catalog,
1591+
save output to a new generation of gdgs.
1592+
zos_mvs_raw:
1593+
program_name: idcams
1594+
auth: true
1595+
dds:
1596+
- dd_data_set:
1597+
dd_name: sysprint
1598+
data_set_name: TEST.CREATION(+1)
1599+
disposition: new
1600+
return_content:
1601+
type: text
1602+
- dd_input:
1603+
dd_name: sysin
1604+
content: " LISTCAT ENTRIES('SOME.DATASET.*')"
1605+
1606+
- name: List data sets matching pattern in catalog,
1607+
save output to a gds already created.
1608+
zos_mvs_raw:
1609+
program_name: idcams
1610+
auth: true
1611+
dds:
1612+
- dd_data_set:
1613+
dd_name: sysprint
1614+
data_set_name: TEST.CREATION(-2)
1615+
return_content:
1616+
type: text
1617+
- dd_input:
1618+
dd_name: sysin
1619+
content: " LISTCAT ENTRIES('SOME.DATASET.*')"
15851620
"""
15861621

15871622
from ansible_collections.ibm.ibm_zos_core.plugins.module_utils.better_arg_parser import (
@@ -1602,7 +1637,7 @@
16021637
RawInputDefinition,
16031638
RawOutputDefinition,
16041639
)
1605-
1640+
from ansible_collections.ibm.ibm_zos_core.plugins.module_utils import data_set
16061641
from ansible.module_utils.basic import AnsibleModule
16071642
from ansible_collections.ibm.ibm_zos_core.plugins.module_utils.ansible_module import (
16081643
AnsibleModuleHelper,
@@ -2545,6 +2580,9 @@ def get_dd_name_and_key(dd):
25452580
key = ""
25462581
if dd.get("dd_data_set"):
25472582
dd_name = dd.get("dd_data_set").get("dd_name")
2583+
data_set_name = resolve_data_set_names(dd.get("dd_data_set").get("data_set_name"),
2584+
dd.get("dd_data_set").get("disposition"))
2585+
dd.get("dd_data_set")["data_set_name"] = data_set_name
25482586
key = "dd_data_set"
25492587
elif dd.get("dd_unix"):
25502588
dd_name = dd.get("dd_unix").get("dd_name")
@@ -2589,6 +2627,42 @@ def set_extra_attributes_in_dd(dd, tmphlq, key):
25892627
return dd
25902628

25912629

2630+
def resolve_data_set_names(dataset, disposition):
2631+
"""Resolve cases for data set names as relative gds or positive
2632+
that could be accepted if disposition is new.
2633+
Parameters
2634+
----------
2635+
dataset : str
2636+
Data set name to determine if is a GDS relative name or regular name.
2637+
disposition : str
2638+
Disposition of data set for it creation.
2639+
Returns
2640+
-------
2641+
str
2642+
The absolute name of dataset or relative positive if disposition is new.
2643+
"""
2644+
if data_set.DataSet.is_gds_relative_name(dataset):
2645+
if data_set.DataSet.is_gds_positive_relative_name(dataset):
2646+
if disposition and disposition == "new":
2647+
return dataset
2648+
else:
2649+
raise ("To generate a new GDS as {0} disposition 'new' is required.".format(dataset))
2650+
else:
2651+
data = data_set.MVSDataSet(
2652+
name=dataset
2653+
)
2654+
src = data.name
2655+
if data.is_gds_active:
2656+
if disposition and disposition == "new":
2657+
raise ("GDS {0} already created, incorrect parameters for disposition and data_set_name".format(src))
2658+
else:
2659+
return src
2660+
else:
2661+
raise ("{0} does not exist".format(src))
2662+
else:
2663+
return dataset
2664+
2665+
25922666
def build_data_definition(dd):
25932667
"""Build a DataDefinition object for a particular DD parameter.
25942668

tests/functional/modules/test_zos_mvs_raw_func.py

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -668,6 +668,113 @@ def test_replace_existing_data_set_make_backup(ansible_zos_module):
668668
hosts.all.zos_data_set(name=default_data_set, state="absent")
669669

670670

671+
def test_data_set_name_gdgs(ansible_zos_module):
672+
try:
673+
hosts = ansible_zos_module
674+
default_data_set = get_tmp_ds_name(3, 3)
675+
hosts.all.shell(cmd="dtouch -tGDG -L4 {0}".format(default_data_set))
676+
hosts.all.shell(cmd="""dtouch -tseq "{0}(+1)" """.format(default_data_set))
677+
hosts.all.shell(cmd="""dtouch -tseq "{0}(+1)" """.format(default_data_set))
678+
results = hosts.all.zos_mvs_raw(
679+
program_name="idcams",
680+
auth=True,
681+
dds=[
682+
dict(
683+
dd_data_set=dict(
684+
dd_name=SYSPRINT_DD,
685+
data_set_name=default_data_set + "(0)",
686+
return_content=dict(type="text"),
687+
),
688+
),
689+
dict(dd_input=dict(dd_name=SYSIN_DD, content=IDCAMS_STDIN)),
690+
],
691+
)
692+
for result in results.contacted.values():
693+
assert result.get("ret_code", {}).get("code", -1) == 0
694+
assert len(result.get("dd_names", [])) > 0
695+
# Generation minus 1
696+
results = hosts.all.zos_mvs_raw(
697+
program_name="idcams",
698+
auth=True,
699+
dds=[
700+
dict(
701+
dd_data_set=dict(
702+
dd_name=SYSPRINT_DD,
703+
data_set_name=default_data_set + "(-1)",
704+
return_content=dict(type="text"),
705+
),
706+
),
707+
dict(dd_input=dict(dd_name=SYSIN_DD, content=IDCAMS_STDIN)),
708+
],
709+
)
710+
for result in results.contacted.values():
711+
assert result.get("ret_code", {}).get("code", -1) == 0
712+
assert len(result.get("dd_names", [])) > 0
713+
# Create a new one
714+
results = hosts.all.zos_mvs_raw(
715+
program_name="idcams",
716+
auth=True,
717+
dds=[
718+
dict(
719+
dd_data_set=dict(
720+
dd_name=SYSPRINT_DD,
721+
data_set_name=default_data_set + "(+1)",
722+
disposition="new",
723+
return_content=dict(type="text"),
724+
),
725+
),
726+
dict(dd_input=dict(dd_name=SYSIN_DD, content=IDCAMS_STDIN)),
727+
],
728+
)
729+
for result in results.contacted.values():
730+
assert result.get("ret_code", {}).get("code", -1) == 0
731+
assert len(result.get("dd_names", [])) > 0
732+
# Negative case
733+
results = hosts.all.zos_mvs_raw(
734+
program_name="idcams",
735+
auth=True,
736+
dds=[
737+
dict(
738+
dd_data_set=dict(
739+
dd_name=SYSPRINT_DD,
740+
data_set_name=default_data_set + "(-4)",
741+
disposition="new",
742+
return_content=dict(type="text"),
743+
),
744+
),
745+
dict(dd_input=dict(dd_name=SYSIN_DD, content=IDCAMS_STDIN)),
746+
],
747+
)
748+
for result in results.contacted.values():
749+
assert result.get("ret_code", {}).get("code", -1) == 8
750+
finally:
751+
hosts.all.shell(cmd="""drm "ANSIBLE.*" """)
752+
753+
754+
def test_data_set_name_special_characters(ansible_zos_module):
755+
try:
756+
hosts = ansible_zos_module
757+
default_data_set = get_tmp_ds_name(5, 6, symbols=True)
758+
hosts.all.zos_data_set(name=default_data_set, type="seq", state="present")
759+
results = hosts.all.zos_mvs_raw(
760+
program_name="idcams",
761+
auth=True,
762+
dds=[
763+
dict(
764+
dd_data_set=dict(
765+
dd_name=SYSPRINT_DD,
766+
data_set_name=default_data_set,
767+
return_content=dict(type="text"),
768+
),
769+
),
770+
dict(dd_input=dict(dd_name=SYSIN_DD, content=IDCAMS_STDIN)),
771+
],
772+
)
773+
for result in results.contacted.values():
774+
assert result.get("ret_code", {}).get("code", -1) == 0
775+
assert len(result.get("dd_names", [])) > 0
776+
finally:
777+
hosts.all.shell(cmd="""drm "ANSIBLE.*" """)
671778
# ---------------------------------------------------------------------------- #
672779
# Input DD Tests #
673780
# ---------------------------------------------------------------------------- #

0 commit comments

Comments
 (0)