Skip to content

Commit b6be854

Browse files
Make vw and dbc modules idempotent
Signed-off-by: Saravanan Raju <saravanan.footloose@gmail.com>
1 parent b671d31 commit b6be854

File tree

2 files changed

+162
-22
lines changed

2 files changed

+162
-22
lines changed

plugins/modules/dw_dbc.py

Lines changed: 71 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
author:
3232
- "Webster Mudge (@wmudge)"
3333
- "Dan Chaffelson (@chaffelson)"
34+
- "Saravanan Raju (@raju-saravanan)"
3435
requirements:
3536
- cdpy
3637
options:
@@ -83,6 +84,12 @@
8384
- cloudera.cloud.dw_dbc:
8485
name: example-database-catalog
8586
cluster_id: example-cluster-id
87+
88+
# Delete Database Catalog
89+
- cloudera.cloud.dw_dbc:
90+
name: example-database-catalog
91+
cluster_id: example-cluster-id
92+
state: absent
8693
'''
8794

8895
RETURN = r'''
@@ -133,22 +140,76 @@ def __init__(self, module):
133140
# Initialize return values
134141
self.dbcs = []
135142

143+
# Initialize internal values
144+
self.target = None
145+
136146
# Execute logic process
137147
self.process()
138148

139149
@CdpModule._Decorators.process_debug
140150
def process(self):
141-
self.name = self.cdpy.dw.create_dbc(cluster_id=self.cluster_id, name=self.name,
142-
load_demo_data=self.load_demo_data)
143-
if self.wait:
144-
self.target = self.cdpy.sdk.wait_for_state(
145-
describe_func=self.cdpy.dw.describe_dbc,
146-
params=dict(cluster_id=self.cluster_id, dbc_id=self.name['dbcId']),
147-
state='Running', delay=self.delay, timeout=self.timeout
148-
)
151+
cluster = self.cdpy.dw.describe_cluster(cluster_id=self.cluster_id)
152+
if cluster is None:
153+
self.module.fail_json(msg="Couldn't retrieve cluster info for %s " % self.cluster_id)
149154
else:
150-
self.target = self.cdpy.dw.describe_dbc(cluster_id=self.cluster_id, dbc_id=self.name['dbcId'])
151-
self.dbcs.append(self.target)
155+
self.target = self.cdpy.dw.describe_dbc(cluster_id=self.cluster_id, dbc_id=self.name)
156+
# If Database Catalog exists
157+
if self.target is not None:
158+
if self.state == 'absent':
159+
if self.module.check_mode:
160+
self.clusters.append(self.target)
161+
else:
162+
if self.target['status'] not in self.cdpy.sdk.REMOVABLE_STATES:
163+
self.module.warn(
164+
"DW Database Catalog not in valid state for Delete operation: %s" % self.target['status'])
165+
else:
166+
_ = self.cdpy.dw.delete_dbc(cluster_id=self.cluster_id, dbc_id=self.name)
167+
if self.wait:
168+
self.cdpy.sdk.wait_for_state(
169+
describe_func=self.cdpy.dw.describe_dbc,
170+
params=dict(cluster_id=self.cluster_id, dbc_id=self.name),
171+
field=None, delay=self.delay, timeout=self.timeout
172+
)
173+
else:
174+
self.cdpy.sdk.sleep(3) # Wait for consistency sync
175+
self.target = self.cdpy.dw.describe_dbc(cluster_id=self.cluster_id, dbc_id=self.name)
176+
self.clusters.append(self.target)
177+
# Drop Done
178+
elif self.state == 'present':
179+
# Begin Config check
180+
self.module.warn("DW Database Catalog already present and config validation is not implemented")
181+
if self.wait:
182+
self.target = self.cdpy.sdk.wait_for_state(
183+
describe_func=self.cdpy.dw.describe_dbc,
184+
params=dict(cluster_id=self.cluster_id,dbc_id=self.name),
185+
state='Running', delay=self.delay, timeout=self.timeout
186+
)
187+
self.clusters.append(self.target)
188+
# End Config check
189+
else:
190+
self.module.fail_json(msg="State %s is not valid for this module" % self.state)
191+
# End handling Database Catalog exists
192+
else:
193+
# Begin handling Database Catalog not found
194+
if self.state == 'absent':
195+
self.module.warn("DW Database Catalog %s already absent in Cluster %s" % (self.name, self.cluster_id))
196+
elif self.state == 'present':
197+
if self.module.check_mode:
198+
pass
199+
else:
200+
self.name = self.cdpy.dw.create_dbc(cluster_id=self.cluster_id, name=self.name,
201+
load_demo_data=self.load_demo_data)
202+
if self.wait:
203+
self.target = self.cdpy.sdk.wait_for_state(
204+
describe_func=self.cdpy.dw.describe_dbc,
205+
params=dict(cluster_id=self.cluster_id, dbc_id=self.name['dbcId']),
206+
state='Running', delay=self.delay, timeout=self.timeout
207+
)
208+
else:
209+
self.target = self.cdpy.dw.describe_dbc(cluster_id=self.cluster_id, dbc_id=self.name['dbcId'])
210+
self.dbcs.append(self.target)
211+
else:
212+
self.module.fail_json(msg="State %s is not valid for this module" % self.state)
152213

153214

154215
def main():

plugins/modules/dw_vw.py

Lines changed: 91 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
author:
3232
- "Webster Mudge (@wmudge)"
3333
- "Dan Chaffelson (@chaffelson)"
34+
- "Saravanan Raju (@raju-saravanan)"
3435
requirements:
3536
- cdpy
3637
options:
@@ -157,6 +158,14 @@
157158
description: Tags associated with the resources.
158159
type: dict
159160
required: False
161+
state:
162+
description: The declarative state of the Virtual Warehouse
163+
type: str
164+
required: False
165+
default: present
166+
choices:
167+
- present
168+
- absent
160169
wait:
161170
description:
162171
- Flag to enable internal polling to wait for the Data Warehouse Cluster to achieve the declared state.
@@ -192,6 +201,7 @@
192201
193202
# Create Virtual Warehouse
194203
- cloudera.cloud.dw_vw:
204+
cluster_id: "example-cluster-id"
195205
name: "example-virtual-warehouse"
196206
vw_type: "hive"
197207
template: "xsmall"
@@ -203,6 +213,12 @@
203213
configs:
204214
enable_sso: true
205215
ldap_groups: ['group1','group2','group3']
216+
217+
# Delete Virtual Warehouse
218+
- cloudera.cloud.dw_vw:
219+
cluster_id: "example-cluster-id"
220+
name: "example-virtual-warehouse"
221+
state: absent
206222
'''
207223

208224
RETURN = r'''
@@ -289,6 +305,7 @@ def __init__(self, module):
289305
self.application_configs = self._get_param('application_configs')
290306
self.ldap_groups = self._get_param('ldap_groups')
291307
self.enable_sso = self._get_param('enable_sso')
308+
self.state = self._get_param('state')
292309
self.tags = self._get_param('tags')
293310
self.wait = self._get_param('wait')
294311
self.delay = self._get_param('delay')
@@ -297,33 +314,94 @@ def __init__(self, module):
297314
# Initialize return values
298315
self.vws = []
299316

317+
# Initialize internal values
318+
self.target = None
319+
300320
# Execute logic process
301321
self.process()
302322

303323
@CdpModule._Decorators.process_debug
304324
def process(self):
305-
self.name = self.cdpy.dw.create_vw(cluster_id=self.cluster_id, dbc_id=self.dbc_id, vw_type=self.vw_type, name=self.name,
325+
cluster = self.cdpy.dw.describe_cluster(cluster_id=self.cluster_id)
326+
if cluster is None:
327+
self.module.fail_json(msg="Couldn't retrieve cluster info for %s " % self.cluster_id)
328+
else:
329+
dbc = self.cdpy.dw.describe_dbc(cluster_id=self.cluster_id, dbc_id=self.dbc_id)
330+
if dbc is None:
331+
self.module.fail_json(msg="Couldn't retrieve dbc info for %s " % self.dbc_id)
332+
else:
333+
self.target = self.cdpy.dw.describe_vw(cluster_id=self.cluster_id, vw_id=self.name)
334+
# If Virtual Warehouse exists
335+
if self.target is not None:
336+
if self.state == 'absent':
337+
if self.module.check_mode:
338+
self.clusters.append(self.target)
339+
else:
340+
if self.target['status'] not in self.cdpy.sdk.REMOVABLE_STATES:
341+
self.module.warn(
342+
"DW Virtual Warehouse not in valid state for Delete operation: %s" % self.target[
343+
'status'])
344+
else:
345+
_ = self.cdpy.dw.delete_vw(cluster_id=self.cluster_id, vw_id=self.name)
346+
if self.wait:
347+
self.cdpy.sdk.wait_for_state(
348+
describe_func=self.cdpy.dw.describe_vw,
349+
params=dict(cluster_id=self.cluster_id, vw_id=self.name),
350+
field=None, delay=self.delay, timeout=self.timeout
351+
)
352+
else:
353+
self.cdpy.sdk.sleep(3) # Wait for consistency sync
354+
self.target = self.cdpy.dw.describe_vw(cluster_id=self.cluster_id, vw_id=self.name)
355+
self.clusters.append(self.target)
356+
# Drop Done
357+
elif self.state == 'present':
358+
# Begin Config check
359+
self.module.warn("DW Virtual Warehouse already present and config validation is not implemented")
360+
if self.wait:
361+
self.target = self.cdpy.sdk.wait_for_state(
362+
describe_func=self.cdpy.dw.delete_vw,
363+
params=dict(cluster_id=self.cluster_id, vw_id=self.name),
364+
state='Running', delay=self.delay, timeout=self.timeout
365+
)
366+
self.clusters.append(self.target)
367+
# End Config check
368+
else:
369+
self.module.fail_json(msg="State %s is not valid for this module" % self.state)
370+
# End handling Virtual Warehouse exists
371+
else:
372+
# Begin handling Virtual Warehouse not found
373+
if self.state == 'absent':
374+
self.module.warn(
375+
"DW Virtual Warehouse %s already absent in Cluster %s" % (self.name, self.cluster_id))
376+
elif self.state == 'present':
377+
if self.module.check_mode:
378+
pass
379+
else:
380+
self.name = self.cdpy.dw.create_vw(cluster_id=self.cluster_id,
381+
dbc_id=self.dbc_id, vw_type=self.vw_type, name=self.name,
306382
template=self.template, autoscaling_min_cluster=self.autoscaling_min_cluster,
307383
autoscaling_max_cluster=self.autoscaling_max_cluster,
308384
common_configs=self.common_configs, application_configs=self.application_configs,
309385
ldap_groups=self.ldap_groups, enable_sso=self.enable_sso, tags=self.tags)
310-
if self.wait:
311-
self.target = self.cdpy.sdk.wait_for_state(
312-
describe_func=self.cdpy.dw.describe_vw,
313-
params=dict(cluster_id=self.cluster_id, vw_id=self.name),
314-
state='Running', delay=self.delay, timeout=self.timeout
315-
)
316-
else:
317-
self.target = self.cdpy.dw.describe_vw(cluster_id=self.cluster_id, vw_id=self.vw_id)
318-
self.vws.append(self.target)
386+
if self.wait:
387+
self.target = self.cdpy.sdk.wait_for_state(
388+
describe_func=self.cdpy.dw.describe_vw,
389+
params=dict(cluster_id=self.cluster_id, vw_id=self.name),
390+
state='Running', delay=self.delay, timeout=self.timeout
391+
)
392+
else:
393+
self.target = self.cdpy.dw.describe_vw(cluster_id=self.cluster_id, vw_id=self.vw_id)
394+
self.vws.append(self.target)
395+
else:
396+
self.module.fail_json(msg="State %s is not valid for this module" % self.state)
319397

320398

321399
def main():
322400
module = AnsibleModule(
323401
argument_spec=CdpModule.argument_spec(
324402
cluster_id=dict(required=True, type='str', aliases=['cluster_id']),
325-
dbc_id=dict(required=True, type='str', aliases=['dbc_id']),
326-
vw_type = dict(required=True, type='str', aliases=['vw_type']),
403+
dbc_id=dict(required=False, type='str', aliases=['dbc_id']),
404+
vw_type = dict(required=False, type='str', aliases=['vw_type']),
327405
name = dict(required=True, type='str', aliases=['name']),
328406
template=dict(required=False, type='str', aliases=['template']),
329407
autoscaling_min_cluster=dict(required=False, type='int', aliases=['autoscaling_min_cluster']),
@@ -333,6 +411,7 @@ def main():
333411
ldap_groups=dict(required=False, type='list', aliases=['ldap_groups']),
334412
enable_sso=dict(required=False, type='bool', aliases=['enable_sso']),
335413
tags=dict(required=False, type='dict', aliases=['tags']),
414+
state=dict(required=False, type='str', choices=['present', 'absent'], default='present'),
336415
wait = dict(required=False, type='bool', default=True),
337416
delay = dict(required=False, type='int', aliases=['polling_delay'], default=15),
338417
timeout = dict(required=False, type='int', aliases=['polling_timeout'], default=3600)

0 commit comments

Comments
 (0)