Skip to content

Commit 17aaf5d

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

File tree

2 files changed

+162
-145
lines changed

2 files changed

+162
-145
lines changed

plugins/modules/dw_dbc.py

Lines changed: 72 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,11 @@
3535
requirements:
3636
- cdpy
3737
options:
38+
id:
39+
description:
40+
- If an ID is provided, that Database Catalog will be deleted if C(state=absent)
41+
type: str
42+
required: When state is absent
3843
cluster_id:
3944
description: ID of cluster where Database Catalog should be created.
4045
type: str
@@ -82,14 +87,14 @@
8287
8388
# Create Database Catalog
8489
- cloudera.cloud.dw_dbc:
85-
name: example-database-catalog
86-
cluster_id: example-cluster-id
90+
name: "example-database-catalog-name"
91+
cluster_id: "example-cluster-id"
8792
8893
# Delete Database Catalog
8994
- cloudera.cloud.dw_dbc:
90-
name: example-database-catalog
91-
cluster_id: example-cluster-id
92-
state: absent
95+
id: "example-database-id"
96+
cluster_id: "example-cluster-id"
97+
state: "absent"
9398
'''
9499

95100
RETURN = r'''
@@ -129,6 +134,7 @@ def __init__(self, module):
129134
super(DwDbc, self).__init__(module)
130135

131136
# Set variables
137+
self.id = self._get_param('id')
132138
self.cluster_id = self._get_param('cluster_id')
133139
self.name = self._get_param('name')
134140
self.load_demo_data = self._get_param('load_demo_data')
@@ -148,76 +154,79 @@ def __init__(self, module):
148154

149155
@CdpModule._Decorators.process_debug
150156
def process(self):
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)
154-
else:
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)
157+
if self.id is None:
158+
dbcs = self.cdpy.dw.list_dbcs(cluster_id=self.cluster_id)
159+
for dbc in dbcs:
160+
if self.name is not None and dbc['name'] == self.name:
161+
self.target = self.cdpy.dw.describe_dbc(cluster_id=self.cluster_id, dbc_id=dbc['id'])
162+
elif self.id is not None and dbc['id'] == self.id:
163+
self.target = self.cdpy.dw.describe_dbc(cluster_id=self.cluster_id, dbc_id=self.id)
164+
# If Database Catalog exists
165+
if self.target is not None:
166+
if self.state == 'absent':
167+
if self.module.check_mode:
168+
self.dbcs.append(self.target)
169+
else:
170+
if self.target['status'] not in self.cdpy.sdk.REMOVABLE_STATES:
171+
self.module.warn(
172+
"DW Database Catalog not in valid state for Delete operation: %s" % self.target['status'])
161173
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")
174+
_ = self.cdpy.dw.delete_dbc(cluster_id=self.cluster_id, dbc_id=self.target['id'])
181175
if self.wait:
182-
self.target = self.cdpy.sdk.wait_for_state(
176+
self.cdpy.sdk.wait_for_state(
183177
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
178+
params=dict(cluster_id=self.cluster_id, dbc_id=self.target['id']),
179+
field=None, delay=self.delay, timeout=self.timeout
186180
)
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
199181
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'])
182+
self.cdpy.sdk.sleep(3) # Wait for consistency sync
183+
self.target = self.cdpy.dw.describe_dbc(cluster_id=self.cluster_id, dbc_id=self.target['id'])
210184
self.dbcs.append(self.target)
185+
# Drop Done
186+
elif self.state == 'present':
187+
# Begin Config check
188+
self.module.warn("DW Database Catalog already present and config validation is not implemented")
189+
if self.wait:
190+
self.target = self.cdpy.sdk.wait_for_state(
191+
describe_func=self.cdpy.dw.describe_dbc,
192+
params=dict(cluster_id=self.cluster_id, dbc_id=self.target['id']),
193+
state='Running', delay=self.delay, timeout=self.timeout
194+
)
195+
self.dbcs.append(self.target)
196+
# End Config check
197+
else:
198+
self.module.fail_json(msg="State %s is not valid for this module" % self.state)
199+
# End handling Database Catalog exists
200+
else:
201+
# Begin handling Database Catalog not found
202+
if self.state == 'absent':
203+
self.module.warn("DW Database Catalog %s already absent in Cluster %s" % (self.name, self.cluster_id))
204+
elif self.state == 'present':
205+
if self.module.check_mode:
206+
pass
211207
else:
212-
self.module.fail_json(msg="State %s is not valid for this module" % self.state)
208+
dbc_id = self.cdpy.dw.create_dbc(cluster_id=self.cluster_id, name=self.name,
209+
load_demo_data=self.load_demo_data)
210+
if self.wait:
211+
self.target = self.cdpy.sdk.wait_for_state(
212+
describe_func=self.cdpy.dw.describe_dbc,
213+
params=dict(cluster_id=self.cluster_id, dbc_id=dbc_id),
214+
state='Running', delay=self.delay, timeout=self.timeout
215+
)
216+
else:
217+
self.target = self.cdpy.dw.describe_dbc(cluster_id=self.cluster_id, dbc_id=dbc_id)
218+
self.dbcs.append(self.target)
219+
else:
220+
self.module.fail_json(msg="State %s is not valid for this module" % self.state)
213221

214222

215223
def main():
216224
module = AnsibleModule(
217225
argument_spec=CdpModule.argument_spec(
218-
cluster_id=dict(required=True, type='str', aliases=['cluster_id']),
219-
name = dict(required=True, type='str', aliases=['name']),
220-
load_demo_data=dict(required=False, type='bool', aliases=['load_demo_data']),
226+
id=dict(required=False, type='str', default=None),
227+
cluster_id=dict(required=True, type='str'),
228+
name = dict(required=False, type='str', default=None),
229+
load_demo_data=dict(required=False, type='bool', default=False),
221230
state=dict(required=False, type='str', choices=['present', 'absent'], default='present'),
222231
wait = dict(required=False, type='bool', default=True),
223232
delay = dict(required=False, type='int', aliases=['polling_delay'], default=15),

0 commit comments

Comments
 (0)