Skip to content

Commit c648109

Browse files
authored
Improve DataFlow Integration (#20)
* Rework DF Disable function and force deletion for better determinism. * Modify `df_info` to accept either a string name of DF Services, or the CRN of an individual service. This allows for situations where DF Services may be disabled but still listed when needing clean up. * Improve DF listing mechanism in env_info to only retrieve active DF Services which need cleanup before an Environment is removed. Signed-off-by: Daniel Chaffelson <chaffelson@gmail.com>
1 parent f4b7911 commit c648109

File tree

3 files changed

+44
-19
lines changed

3 files changed

+44
-19
lines changed

plugins/modules/df.py

Lines changed: 35 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -269,16 +269,7 @@ def process(self):
269269
if self.module.check_mode:
270270
self.service = self.target
271271
else:
272-
if self.target['status']['state'] in self.cdpy.sdk.REMOVABLE_STATES:
273-
self.service = self.cdpy.df.disable_environment(
274-
env_crn=self.env_crn,
275-
persist=self.persist,
276-
force=self.force
277-
)
278-
if self.wait:
279-
self.service = self._wait_for_disabled()
280-
else:
281-
self.service = self.cdpy.df.describe_environment(env_crn=self.name)
272+
self._disable_df()
282273
elif self.state in ['present']:
283274
self.module.warn(
284275
"Dataflow Service already enabled and configuration validation and reconciliation is not supported;" +
@@ -319,11 +310,40 @@ def _wait_for_enabled(self):
319310
delay=self.delay, timeout=self.timeout
320311
)
321312

322-
def _wait_for_disabled(self):
323-
return self.cdpy.sdk.wait_for_state(
324-
describe_func=self.cdpy.df.describe_environment, params=dict(env_crn=self.env_crn), field=None,
325-
delay=self.delay, timeout=self.timeout
326-
)
313+
def _disable_df(self):
314+
# Attempt clean Disable, which also ensures we have tried at least once before we do a forced removal
315+
if self.target['status']['state'] in self.cdpy.sdk.REMOVABLE_STATES:
316+
self.service = self.cdpy.df.disable_environment(
317+
env_crn=self.env_crn,
318+
persist=self.persist
319+
)
320+
if self.wait:
321+
# Wait for Clean Disable, if possible
322+
self.service = self.cdpy.sdk.wait_for_state(
323+
describe_func=self.cdpy.df.describe_environment, params=dict(env_crn=self.env_crn),
324+
field=['status', 'state'],
325+
state=self.cdpy.sdk.STOPPED_STATES + self.cdpy.sdk.REMOVABLE_STATES + [None],
326+
delay=self.delay, timeout=self.timeout, ignore_failures=True
327+
)
328+
else:
329+
self.service = self.cdpy.df.describe_environment(env_crn=self.name)
330+
# Check disable result against need for further forced delete action, in case it didn't work first time around
331+
if self.service is not None:
332+
if self.service['status']['state'] in self.cdpy.sdk.REMOVABLE_STATES:
333+
if self.force:
334+
self.service = self.cdpy.df.delete_environment(
335+
env_crn=self.env_crn
336+
)
337+
else:
338+
self.module.fail_json(msg="DF Service Disable failed and Force delete not requested")
339+
if self.wait:
340+
self.service = self.cdpy.sdk.wait_for_state(
341+
describe_func=self.cdpy.df.describe_environment, params=dict(env_crn=self.env_crn),
342+
field=None, # This time we require removal or declare failure
343+
delay=self.delay, timeout=self.timeout
344+
)
345+
else:
346+
self.service = self.cdpy.df.describe_environment(env_crn=self.name)
327347

328348

329349
def main():

plugins/modules/df_info.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
name:
3838
description:
3939
- If a name is provided, that DataFlow Service will be described.
40+
- Must be CDP Environment CRN or string name of DataFlow Service
4041
type: str
4142
required: False
4243
aliases:
@@ -168,9 +169,12 @@ def __init__(self, module):
168169
@CdpModule._Decorators.process_debug
169170
def process(self):
170171
if self.name: # Note that both None and '' will trigger this
171-
service_single = self.cdpy.df.describe_environment(name=self.name)
172-
if service_single is not None:
173-
self.services.append(service_single)
172+
if self.name.startswith('crn:'):
173+
service_single = self.cdpy.df.describe_environment(env_crn=self.name)
174+
if service_single is not None:
175+
self.services.append(service_single)
176+
else:
177+
self.services = self.cdpy.df.list_environments(name=self.name)
174178
else:
175179
self.services = self.cdpy.df.list_environments()
176180

plugins/modules/env_info.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -434,12 +434,13 @@ def process(self):
434434
if self.descendants and self.environments:
435435
updated_envs = []
436436
for this_env in self.environments:
437+
df = self.cdpy.df.describe_environment(this_env['crn'])
437438
this_env['descendants'] = {
438439
'datahub': self.cdpy.datahub.describe_all_clusters(this_env['environmentName']),
439440
'dw': self.cdpy.dw.gather_clusters(this_env['crn']),
440441
'ml': self.cdpy.ml.describe_all_workspaces(this_env['environmentName']),
441442
'opdb': self.cdpy.opdb.describe_all_databases(this_env['environmentName']),
442-
'df': [self.cdpy.df.describe_environment(this_env['crn'])]
443+
'df': df if df is not None else []
443444
}
444445
updated_envs.append(this_env)
445446
self.environments = updated_envs

0 commit comments

Comments
 (0)