3131author:
3232 - "Webster Mudge (@wmudge)"
3333 - "Dan Chaffelson (@chaffelson)"
34+ - "Saravanan Raju (@raju-saravanan)"
3435requirements:
3536 - cdpy
3637options:
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.
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"
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
208224RETURN = 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
321399def 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