33
33
import time
34
34
35
35
from ansible .module_utils .connection import Connection
36
+ from enum import Enum
36
37
38
+ # class syntax
39
+ class RequestType (Enum ):
40
+ BEFORE_REQUEST = 1
41
+ AFTER_REQUEST = 2
37
42
38
43
checkpoint_argument_spec_for_async = dict (
39
44
wait_for_task = dict (type = 'bool' , default = True )
@@ -69,7 +74,10 @@ def idempotency_check(old_val, new_val):
69
74
70
75
# if user insert a specific version, we add it to the url
71
76
def get_version (module ):
72
- return ('v' + module .params ['version' ] + '/' ) if module .params .get ('version' ) else ''
77
+ res = ('v' + module .params ['version' ] + '/' ) if module .params .get ('version' ) else ''
78
+ del module .params ['version' ]
79
+ return res
80
+
73
81
74
82
75
83
# send the request to checkpoint
@@ -81,28 +89,38 @@ def send_request(connection, version, url, payload=None):
81
89
# get the payload from the user parameters
82
90
def is_checkpoint_param (parameter ):
83
91
if parameter == 'state' or \
84
- parameter == 'wait_for_task' or \
85
- parameter == 'version' :
92
+ parameter == 'wait_for_task' :
86
93
return False
87
94
return True
88
95
89
96
90
97
# build the payload from the parameters which has value (not None), and they are parameter of checkpoint API as well
91
- def replace_chkp_params (params , old , new ):
98
+ def replace_chkp_params (params , request_type ):
92
99
payload = {}
93
- # we used a dedicated 'msg' parametr because we can not use 'message' parameter
94
- # as 'message' is used internally in Ansible Core engine
95
- if "msg" in params :
96
- params ["message" ] = params .pop ("msg" )
100
+ old = ""
101
+ new = ""
102
+ if request_type == RequestType .BEFORE_REQUEST :
103
+ old = "_"
104
+ new = "-"
105
+ # we used a dedicated 'msg' parametr because we can not use 'message' parameter
106
+ # as 'message' is used internally in Ansible Core engine
107
+ if "msg" in params :
108
+ params ["message" ] = params .pop ("msg" )
109
+ elif request_type == RequestType .AFTER_REQUEST :
110
+ old = "-"
111
+ new = "_"
112
+ if "message" in params :
113
+ params ["msg" ] = params .pop ("message" )
114
+
97
115
for parameter in params :
98
116
parameter_value = params [parameter ]
99
117
if parameter_value is not None and is_checkpoint_param (parameter ):
100
118
if isinstance (parameter_value , dict ):
101
- payload [parameter .replace (old , new )] = replace_chkp_params (parameter_value , old , new )
119
+ payload [parameter .replace (old , new )] = replace_chkp_params (parameter_value , request_type )
102
120
elif isinstance (parameter_value , list ) and len (parameter_value ) != 0 and isinstance (parameter_value [0 ], dict ):
103
121
payload_list = []
104
122
for element_dict in parameter_value :
105
- payload_list .append (replace_chkp_params (element_dict , old , new ))
123
+ payload_list .append (replace_chkp_params (element_dict , request_type ))
106
124
payload [parameter .replace (old , new )] = payload_list
107
125
else :
108
126
payload [parameter .replace (old , new )] = parameter_value
@@ -158,11 +176,11 @@ def wait_for_task(module, version, task_id):
158
176
159
177
# handle api call
160
178
def api_call (module , target_version , api_call_object ):
161
- payload = replace_chkp_params (module .params , "_" , "-" )
179
+ payload = replace_chkp_params (module .params , RequestType . BEFORE_REQUEST )
162
180
connection = Connection (module ._socket_path )
163
181
code , response = send_request (connection , target_version , api_call_object , payload )
164
182
165
- response = replace_chkp_params (response , "-" , "_" )
183
+ response = replace_chkp_params (response , RequestType . AFTER_REQUEST )
166
184
return code , response
167
185
168
186
@@ -225,17 +243,21 @@ def chkp_api_call(module, api_call_object, has_add_api, ignore=None, show_params
225
243
if not is_checkpoint_param (key ):
226
244
del params_dict [key ]
227
245
228
- if idempotency_check (res , params_dict ) is True :
229
- return {
230
- api_call_object .replace ('-' , '_' ): res ,
231
- "changed" : False
232
- }
233
- code , res = api_call (module , target_version , api_call_object = "set-{0}" .format (api_call_object ))
234
- if code != 200 and has_add_api is True :
235
- if add_params :
236
- [module .params .pop (key ) for key in show_params if key not in add_params ]
237
- module .params .update (add_params )
238
- code , res = api_call (module , target_version , api_call_object = "add-{0}" .format (api_call_object ))
246
+ if code == 200 :
247
+ if idempotency_check (res , params_dict ) is True :
248
+ return {
249
+ api_call_object .replace ('-' , '_' ): res ,
250
+ "changed" : False
251
+ }
252
+ code , res = api_call (module , target_version , api_call_object = "set-{0}" .format (api_call_object ))
253
+ else :
254
+ if has_add_api is True :
255
+ if add_params :
256
+ [module .params .pop (key ) for key in show_params if key not in add_params ]
257
+ module .params .update (add_params )
258
+ code , res = api_call (module , target_version , api_call_object = "add-{0}" .format (api_call_object ))
259
+ else : # some requests like static-route don't have add, try set instead
260
+ code , res = api_call (module , target_version , api_call_object = "set-{0}" .format (api_call_object ))
239
261
240
262
if code != 200 :
241
263
module .fail_json (msg = parse_fail_message (code , res ))
0 commit comments