Skip to content

Commit d5ba951

Browse files
Fix initial data set behaviour
1 parent 078d909 commit d5ba951

File tree

9 files changed

+173
-59
lines changed

9 files changed

+173
-59
lines changed

plugins/module_utils/data_set.py

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,14 @@
44
# Apache License, Version 2.0 (see https://opensource.org/licenses/Apache-2.0)
55

66
from __future__ import (absolute_import, division, print_function)
7+
8+
from ansible_collections.ibm.ibm_zos_cics.plugins.module_utils.icetool import _run_icetool
9+
from ansible_collections.ibm.ibm_zos_core.plugins.module_utils.better_arg_parser import BetterArgParser
710
__metaclass__ = type
811

912
from ansible.module_utils.basic import AnsibleModule
10-
from ansible_collections.ibm.ibm_zos_cics.plugins.module_utils import dataset_utils
13+
from ansible_collections.ibm.ibm_zos_cics.plugins.module_utils.dataset_utils import (
14+
_build_idcams_define_cmd, _data_set, _dataset_size, _run_idcams, _run_listds, _run_iefbr14)
1115
from ansible_collections.ibm.ibm_zos_cics.plugins.module_utils.response import _response, _state
1216
from ansible_collections.ibm.ibm_zos_core.plugins.module_utils.better_arg_parser import BetterArgParser
1317
from ansible_collections.ibm.ibm_zos_core.plugins.module_utils.dd_statement import DatasetDefinition
@@ -61,16 +65,16 @@ def _get_arg_defs(self): # type: () -> dict
6165
},
6266
}
6367

64-
def _get_data_set_object(self, size, result): # type: (dataset_utils._dataset_size, dict) -> dataset_utils._data_set
65-
return dataset_utils._data_set(
68+
def _get_data_set_object(self, size, result): # type: (_dataset_size, dict) -> _data_set
69+
return _data_set(
6670
size=size,
6771
name=result.get(_dataset_constants["DATASET_LOCATION_ALIAS"]).upper(),
6872
state=result.get(_dataset_constants["TARGET_STATE_ALIAS"]),
6973
exists=False,
7074
vsam=False)
7175

7276
def _get_data_set_size(self, result):
73-
return dataset_utils._dataset_size(
77+
return _dataset_size(
7478
unit=result.get(_dataset_constants["PRIMARY_SPACE_UNIT_ALIAS"]),
7579
primary=result.get(_dataset_constants["PRIMARY_SPACE_VALUE_ALIAS"]),
7680
secondary=_dataset_constants["SECONDARY_SPACE_VALUE_DEFAULT"])
@@ -93,11 +97,11 @@ def validate_parameters(self): # type: () -> None
9397
self.data_set = self._get_data_set_object(size, result)
9498

9599
def create_data_set(self):
96-
create_cmd = dataset_utils._build_idcams_define_cmd({})
100+
create_cmd = _build_idcams_define_cmd({})
97101

98102
def build_vsam_data_set(self, create_cmd, message): # type: (str, str) -> None
99103
try:
100-
idcams_executions = dataset_utils._run_idcams(
104+
idcams_executions = _run_idcams(
101105
cmd=create_cmd,
102106
name=message,
103107
location=self.data_set["name"],
@@ -111,7 +115,7 @@ def build_vsam_data_set(self, create_cmd, message): # type: (str, str) -> None
111115

112116
def build_seq_data_set(self, ddname, definition): # type: (str, DatasetDefinition) -> None
113117
try:
114-
iefbr14_executions = dataset_utils._run_iefbr14(ddname, definition)
118+
iefbr14_executions = _run_iefbr14(ddname, definition)
115119
self.result["executions"] = self.result["executions"] + iefbr14_executions
116120
self.result["changed"] = True
117121
except Exception as e:
@@ -124,7 +128,7 @@ def delete_data_set(self, message): # type: (str) -> None
124128
'''.format(self.data_set["name"])
125129

126130
try:
127-
idcams_executions = dataset_utils._run_idcams(
131+
idcams_executions = _run_idcams(
128132
cmd=delete_cmd,
129133
name=message,
130134
location=self.data_set["name"],
@@ -137,10 +141,17 @@ def delete_data_set(self, message): # type: (str) -> None
137141

138142
def init_data_set(self): # type: () -> None
139143
if self.data_set["exists"]:
140-
self.result["end_state"] = _state(exists=self.data_set["exists"], vsam=self.data_set["vsam"])
141-
self._exit()
144+
icetool_executions, record_count = _run_icetool(self.data_set["name"])
145+
self.result["executions"] = self.result["executions"] + icetool_executions
146+
if record_count["record_count"] <= 0:
147+
self.result["end_state"] = _state(exists=self.data_set["exists"], vsam=self.data_set["vsam"])
148+
self._exit()
149+
else:
150+
self.delete_data_set()
151+
self.data_set = self.get_data_set_state(self.data_set)
152+
self.create_data_set()
142153

143-
if not self.data_set["exists"]:
154+
else:
144155
self.create_data_set()
145156

146157
def warm_data_set(self): # type: () -> None
@@ -177,7 +188,7 @@ def get_target_method(self, target): # type: (str) -> [str | invalid_target_sta
177188

178189
def get_data_set_state(self, data_set): # type: (dict) -> dict
179190
try:
180-
listds_executions, ds_status = dataset_utils._run_listds(data_set["name"])
191+
listds_executions, ds_status = _run_listds(data_set["name"])
181192

182193
data_set["exists"] = ds_status["exists"]
183194
data_set["vsam"] = ds_status["vsam"]

plugins/module_utils/icetool.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,13 @@
55

66
from __future__ import (absolute_import, division, print_function)
77
__metaclass__ = type
8-
from typing import List
98

109
from ansible_collections.ibm.ibm_zos_core.plugins.module_utils.zos_mvs_raw import MVSCmd, MVSCmdResponse
1110
from ansible_collections.ibm.ibm_zos_core.plugins.module_utils.dd_statement import StdoutDefinition, DatasetDefinition, DDStatement, InputDefinition
1211
from ansible_collections.ibm.ibm_zos_cics.plugins.module_utils.response import _execution
1312

1413

15-
def _get_icetool_dds(location): # type: (str) -> List[DDStatement]
14+
def _get_icetool_dds(location): # type: (str) -> list[DDStatement]
1615
return [
1716
DDStatement('sysprint', StdoutDefinition()),
1817
DDStatement('dd1', DatasetDefinition(dataset_name=location, disposition="SHR")),

plugins/modules/local_catalog.py

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,7 @@
211211
_run_dfhccutl, _get_idcams_cmd_lcd)
212212
from ansible_collections.ibm.ibm_zos_cics.plugins.module_utils.local_catalog import _local_catalog_constants as lc_constants
213213
from ansible_collections.ibm.ibm_zos_cics.plugins.module_utils.data_set import _dataset_constants as ds_constants
214+
from ansible_collections.ibm.ibm_zos_cics.plugins.module_utils.icetool import _run_icetool
214215

215216

216217
class AnsibleLocalCatalogModule(DataSet):
@@ -364,13 +365,15 @@ def delete_data_set(self): # type: () -> None
364365

365366
def init_data_set(self): # type: () -> None
366367
if self.data_set["exists"]:
367-
self.result["end_state"] = {
368-
"exists": self.data_set["exists"],
369-
"vsam": self.data_set["vsam"]
370-
}
371-
self._exit()
372-
373-
if not self.data_set["exists"]:
368+
icetool_executions, record_count = _run_icetool(self.data_set["name"])
369+
self.result["executions"] = self.result["executions"] + icetool_executions
370+
if record_count["record_count"] > 0:
371+
# If records are present, empty the data set and rerun DFHCCUTL
372+
self.delete_data_set()
373+
self.data_set = self.get_data_set_state(self.data_set)
374+
self.create_data_set()
375+
376+
else:
374377
self.create_data_set()
375378

376379
try:

tests/integration/targets/cics_local_catalog/playbooks/check_output.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,11 +73,11 @@
7373
ansible.builtin.debug:
7474
msg: "{{ res }}"
7575

76-
- name: Assert Catalog Created, changed is false
76+
- name: Assert Catalog Created, changed is true
7777
ansible.builtin.assert:
7878
that:
7979
- res.failed is false
80-
- res.changed is false
80+
- res.changed is true
8181
- res.start_state.exists is true
8282
- res.start_state.vsam is true
8383
- res.end_state.exists is true

tests/unit/modules/test_auxiliary_temp.py

Lines changed: 44 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
# (c) Copyright IBM Corp. 2023
44
# Apache License, Version 2.0 (see https://opensource.org/licenses/Apache-2.0)
55
from __future__ import absolute_import, division, print_function
6-
from ansible_collections.ibm.ibm_zos_cics.plugins.module_utils import dataset_utils
6+
from ansible_collections.ibm.ibm_zos_cics.plugins.module_utils import dataset_utils, icetool
77
from ansible_collections.ibm.ibm_zos_cics.plugins.module_utils.response import (
88
_execution, _response, _state, )
99
from ansible_collections.ibm.ibm_zos_cics.tests.unit.helpers.data_set_helper import (
@@ -56,8 +56,8 @@ def test_create_an_intial_temp_ds():
5656
(0, "TEST.REGIONS.DFHTEMP VSAM", "stderr"),
5757
]
5858
)
59-
auxiliary_temp.AnsibleAuxiliaryTempModule._exit = MagicMock(
60-
return_value=None)
59+
icetool._execute_icetool = MagicMock(return_value=MVSCmdResponse(rc=0, stdout="RECORD COUNT: 000000000000000", stderr="stderr"))
60+
auxiliary_temp.AnsibleAuxiliaryTempModule._exit = MagicMock(return_value=None)
6161

6262
temp_module.main()
6363
expected_result = _response(
@@ -103,8 +103,8 @@ def test_delete_an_existing_auxiliary_temp_ds():
103103
(8, "TEST.REGIONS.DFHTEMP NOT IN CATALOG", "stderr"),
104104
]
105105
)
106-
auxiliary_temp.AnsibleAuxiliaryTempModule._exit = MagicMock(
107-
return_value=None)
106+
icetool._execute_icetool = MagicMock(return_value=MVSCmdResponse(rc=0, stdout="RECORD COUNT: 000000000000052", stderr="stderr"))
107+
auxiliary_temp.AnsibleAuxiliaryTempModule._exit = MagicMock(return_value=None)
108108

109109
temp_module.main()
110110
expected_result = _response(
@@ -138,7 +138,7 @@ def test_delete_an_existing_auxiliary_temp_ds():
138138
@pytest.mark.skipif(
139139
sys.version_info.major < 3, reason="Requires python 3 language features"
140140
)
141-
def test_do_nothing_to_an_existing_temp():
141+
def test_delete_an_existing_temp_and_replace():
142142
temp_module = initialise_module()
143143
data_set = set_data_set(
144144
exists=True,
@@ -149,11 +149,22 @@ def test_do_nothing_to_an_existing_temp():
149149
dataset_utils.ikjeft01 = MagicMock(
150150
side_effect=[
151151
(0, "TEST.REGIONS.DFHTEMP VSAM", "stderr"),
152+
(8, "TEST.REGIONS.DFHTEMP NOT IN CATALOG", "stderr"),
152153
(0, "TEST.REGIONS.DFHTEMP VSAM", "stderr"),
153154
]
154155
)
155-
auxiliary_temp.AnsibleAuxiliaryTempModule._exit = MagicMock(
156-
return_value=None)
156+
dataset_utils.idcams = MagicMock(
157+
side_effect=[
158+
(0, "ENTRY (C) TEST.REGIONS.DFHTEMP DELETED\n", "stderr"),
159+
(0, "TEST.REGIONS.DFHTEMP", "stderr"),
160+
]
161+
)
162+
icetool._execute_icetool = MagicMock(
163+
return_value=(
164+
MVSCmdResponse(rc=0, stdout="RECORD COUNT: 000000000000052", stderr="stderr")
165+
)
166+
)
167+
auxiliary_temp.AnsibleAuxiliaryTempModule._exit = MagicMock(return_value=None)
157168

158169
temp_module.main()
159170
expected_result = _response(
@@ -164,6 +175,30 @@ def test_do_nothing_to_an_existing_temp():
164175
stdout="TEST.REGIONS.DFHTEMP VSAM",
165176
stderr="stderr",
166177
),
178+
_execution(
179+
name="ICETOOL - Get record count",
180+
rc=0,
181+
stdout="RECORD COUNT: 000000000000052",
182+
stderr="stderr"
183+
),
184+
_execution(
185+
name="IDCAMS - Removing auxiliary temp data set - Run 1",
186+
rc=0,
187+
stdout="ENTRY (C) TEST.REGIONS.DFHTEMP DELETED\n",
188+
stderr="stderr",
189+
),
190+
_execution(
191+
name="IKJEFT01 - Get Data Set Status - Run 1",
192+
rc=8,
193+
stdout="TEST.REGIONS.DFHTEMP NOT IN CATALOG",
194+
stderr="stderr",
195+
),
196+
_execution(
197+
name="IDCAMS - Create auxiliary temp data set - Run 1",
198+
rc=0,
199+
stdout="TEST.REGIONS.DFHTEMP",
200+
stderr="stderr",
201+
),
167202
_execution(
168203
name="IKJEFT01 - Get Data Set Status - Run 1",
169204
rc=0,
@@ -174,6 +209,7 @@ def test_do_nothing_to_an_existing_temp():
174209
start_state=_state(exists=True, vsam=True),
175210
end_state=_state(exists=True, vsam=True),
176211
)
212+
expected_result.update({"changed": True})
177213
assert temp_module.result == expected_result
178214

179215

tests/unit/modules/test_global_catalog.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ def test_warm_start_a_global_catalog():
120120
gcd_module.data_set = data_set
121121

122122
dataset_utils.ikjeft01 = MagicMock(return_value=(0, "TEST.REGIONS.GCD VSAM", "stderr"))
123+
dataset_utils.idcams = MagicMock(return_value=(0, "ENTRY (C) TEST.REGIONS.GCD DELETED\n", "stderr"))
123124
global_catalog_utils._execute_dfhrmutl = MagicMock(
124125
return_value=MVSCmdResponse(rc=0, stdout="auto-start override : AUTOASIS \n next start type : UNKNOWN", stderr="stderr")
125126
)

tests/unit/modules/test_intrapartition.py

Lines changed: 41 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
# (c) Copyright IBM Corp. 2023
44
# Apache License, Version 2.0 (see https://opensource.org/licenses/Apache-2.0)
55
from __future__ import absolute_import, division, print_function
6-
from ansible_collections.ibm.ibm_zos_cics.plugins.module_utils import dataset_utils
6+
from ansible_collections.ibm.ibm_zos_cics.plugins.module_utils import dataset_utils, icetool
77
from ansible_collections.ibm.ibm_zos_cics.plugins.module_utils.response import (
88
_execution,
99
_response,
@@ -17,6 +17,8 @@
1717
import pytest
1818
import sys
1919

20+
from ansible_collections.ibm.ibm_zos_core.plugins.module_utils.zos_mvs_raw import MVSCmdResponse
21+
2022
try:
2123
from unittest.mock import MagicMock
2224
except ImportError:
@@ -135,17 +137,29 @@ def test_delete_an_existing_intrapartition_ds():
135137
@pytest.mark.skipif(
136138
sys.version_info.major < 3, reason="Requires python 3 language features"
137139
)
138-
def test_do_nothing_to_an_existing_intra():
140+
def test_delete_an_existing_intra_and_replace():
139141
intra_module = initialise_module()
140142
data_set = set_data_set(exists=True, name="TEST.REGIONS.INTRA", vsam=True)
141143
intra_module.data_set = data_set
142144

145+
dataset_utils.idcams = MagicMock(
146+
side_effect=[
147+
(0, "ENTRY (C) TEST.REGIONS.INTRA DELETED\n", "stderr"),
148+
(0, "TEST.REGIONS.INTRA", "stderr"),
149+
]
150+
)
143151
dataset_utils.ikjeft01 = MagicMock(
144152
side_effect=[
145153
(0, "TEST.REGIONS.INTRA VSAM", "stderr"),
154+
(8, "TEST.REGIONS.INTRA NOT IN CATALOG", "stderr"),
146155
(0, "TEST.REGIONS.INTRA VSAM", "stderr"),
147156
]
148157
)
158+
icetool._execute_icetool = MagicMock(
159+
return_value=(
160+
MVSCmdResponse(rc=0, stdout="RECORD COUNT: 000000000000052", stderr="stderr")
161+
)
162+
)
149163
intrapartition.AnsibleIntrapartitionModule._exit = MagicMock(return_value=None)
150164

151165
intra_module.main()
@@ -157,6 +171,30 @@ def test_do_nothing_to_an_existing_intra():
157171
stdout="TEST.REGIONS.INTRA VSAM",
158172
stderr="stderr",
159173
),
174+
_execution(
175+
name="ICETOOL - Get record count",
176+
rc=0,
177+
stdout="RECORD COUNT: 000000000000052",
178+
stderr="stderr"
179+
),
180+
_execution(
181+
name="IDCAMS - Removing intrapartition data set - Run 1",
182+
rc=0,
183+
stdout="ENTRY (C) TEST.REGIONS.INTRA DELETED\n",
184+
stderr="stderr",
185+
),
186+
_execution(
187+
name="IKJEFT01 - Get Data Set Status - Run 1",
188+
rc=8,
189+
stdout="TEST.REGIONS.INTRA NOT IN CATALOG",
190+
stderr="stderr",
191+
),
192+
_execution(
193+
name="IDCAMS - Create intrapartition data set - Run 1",
194+
rc=0,
195+
stdout="TEST.REGIONS.INTRA",
196+
stderr="stderr",
197+
),
160198
_execution(
161199
name="IKJEFT01 - Get Data Set Status - Run 1",
162200
rc=0,
@@ -167,6 +205,7 @@ def test_do_nothing_to_an_existing_intra():
167205
start_state=_state(exists=True, vsam=True),
168206
end_state=_state(exists=True, vsam=True),
169207
)
208+
expected_result.update({"changed": True})
170209
assert intra_module.result == expected_result
171210

172211

0 commit comments

Comments
 (0)