3232argument_spec = ise_argument_spec ()
3333# Add arguments specific for this module
3434argument_spec .update (dict (
35- state = dict (type = "str" , default = "present" , choices = ["present" ]),
35+ state = dict (type = "str" , default = "present" , choices = ["present" , "absent" ]),
3636 authenticationSettings = dict (type = "dict" ),
3737 coaPort = dict (type = "float" ),
3838 dtlsDnsName = dict (type = "str" ),
5151))
5252
5353required_if = [
54- ("state" , "present" , ["name" ], True ),
54+ ("state" , "present" , ["id" , "name" ], True ),
55+ ("state" , "absent" , ["id" , "name" ], True ),
5556]
5657required_one_of = []
5758mutually_exclusive = []
@@ -108,14 +109,31 @@ def get_object_by_name(self, name):
108109 return result
109110
110111 def get_object_by_id (self , id ):
111- # NOTICE: Does not have a get by id method or it is in another action
112- result = None
112+ try :
113+ result = self .ise .exec (
114+ family = "networkdevice" ,
115+ function = "get_networkdevice_by_id" ,
116+ handle_func_exception = False ,
117+ params = {"id" : id }
118+ ).response ['NetworkDevice' ]
119+ except (TypeError , AttributeError ) as e :
120+ self .ise .fail_json (
121+ msg = (
122+ "An error occured when executing operation."
123+ " Check the configuration of your API Settings and API Gateway settings on your ISE server."
124+ " This collection assumes that the API Gateway, the ERS APIs and OpenAPIs are enabled."
125+ " You may want to enable the (ise_debug: True) argument."
126+ " The error was: {error}"
127+ ).format (error = e )
128+ )
129+ except Exception :
130+ result = None
113131 return result
114132
115133 def exists (self ):
116- prev_obj = None
117134 id_exists = False
118135 name_exists = False
136+ prev_obj = None
119137 o_id = self .new_object .get ("id" )
120138 name = self .new_object .get ("name" )
121139 if o_id :
@@ -128,6 +146,8 @@ def exists(self):
128146 _id = prev_obj .get ("id" )
129147 if id_exists and name_exists and o_id != _id :
130148 raise InconsistentParameters ("The 'id' and 'name' params don't refer to the same object" )
149+ if _id :
150+ prev_obj = self .get_object_by_id (_id )
131151 it_exists = prev_obj is not None and isinstance (prev_obj , dict )
132152 return (it_exists , prev_obj )
133153
@@ -165,6 +185,34 @@ def create(self):
165185 ).response
166186 return result
167187
188+ def update (self ):
189+ id = self .new_object .get ("id" )
190+ name = self .new_object .get ("name" )
191+ result = None
192+ if not id :
193+ id_ = self .get_object_by_name (name ).get ("id" )
194+ self .new_object .update (dict (id = id_ ))
195+ result = self .ise .exec (
196+ family = "networkdevice" ,
197+ function = "update_networkdevice_by_id" ,
198+ params = self .new_object
199+ ).response
200+ return result
201+
202+ def delete (self ):
203+ id = self .new_object .get ("id" )
204+ name = self .new_object .get ("name" )
205+ result = None
206+ if not id :
207+ id_ = self .get_object_by_name (name ).get ("id" )
208+ self .new_object .update (dict (id = id_ ))
209+ result = self .ise .exec (
210+ family = "networkdevice" ,
211+ function = "delete_networkdevice_by_id" ,
212+ params = self .new_object
213+ ).response
214+ return result
215+
168216
169217class ActionModule (ActionBase ):
170218 def __init__ (self , * args , ** kwargs ):
@@ -205,12 +253,16 @@ def run(self, tmp=None, task_vars=None):
205253 state = self ._task .args .get ("state" )
206254
207255 response = None
256+
208257 if state == "present" :
209258 (obj_exists , prev_obj ) = obj .exists ()
210259 if obj_exists :
211260 if obj .requires_update (prev_obj ):
212- response = prev_obj
213- ise .object_present_and_different ()
261+ ise_update_response = obj .update ()
262+ self ._result .update (dict (ise_update_response = ise_update_response ))
263+ (obj_exists , updated_obj ) = obj .exists ()
264+ response = updated_obj
265+ ise .object_updated ()
214266 else :
215267 response = prev_obj
216268 ise .object_already_present ()
@@ -220,6 +272,15 @@ def run(self, tmp=None, task_vars=None):
220272 response = created_obj
221273 ise .object_created ()
222274
275+ elif state == "absent" :
276+ (obj_exists , prev_obj ) = obj .exists ()
277+ if obj_exists :
278+ obj .delete ()
279+ response = prev_obj
280+ ise .object_deleted ()
281+ else :
282+ ise .object_already_absent ()
283+
223284 self ._result .update (dict (ise_response = response ))
224285 self ._result .update (ise .exit_json ())
225286 return self ._result
0 commit comments