1010from linode_api4 import LinodeClient
1111from linode_api4 .objects import (
1212 AlertDefinition ,
13+ ApiError ,
1314 MonitorDashboard ,
1415 MonitorMetricsDefinition ,
1516 MonitorService ,
@@ -218,6 +219,27 @@ def test_integration_create_get_update_delete_alert_definition(
218219 )
219220
220221 created = None
222+
223+ def wait_for_alert_ready (alert_id , service_type : str ):
224+ timeout = 360 # max time alert should take to create
225+ INITIAL_TIMEOUT = 1
226+ start = time .time ()
227+ interval = INITIAL_TIMEOUT
228+ alert = client .load (AlertDefinition , alert_id , service_type )
229+ while (
230+ getattr (alert , "status" , None ) == "in progress"
231+ and (time .time () - start ) < timeout
232+ ):
233+ time .sleep (interval )
234+ interval *= 2
235+ try :
236+ alert ._api_get ()
237+ except ApiError as e :
238+ # transient errors while polling; continue until timeout
239+ if e .status != 404 :
240+ raise
241+ return alert
242+
221243 try :
222244 # Create the alert definition using API-compliant top-level fields
223245 created = client .monitor .create_alert_definition (
@@ -233,50 +255,13 @@ def test_integration_create_get_update_delete_alert_definition(
233255 assert created .id
234256 assert getattr (created , "label" , None ) == label
235257
236- # Wait for server-side processing to complete (status transitions)
237- timeout = 180 # max time alert should take to create
238- interval = 10
239- start = time .time ()
240- while (
241- getattr (created , "status" , None ) == "in progress"
242- and (time .time () - start ) < timeout
243- ):
244- time .sleep (interval )
245- try :
246- created = client .load (AlertDefinition , created .id , service_type )
247- except Exception :
248- # transient errors while polling; continue until timeout
249- pass
258+ created = wait_for_alert_ready (created .id , service_type )
250259
251- update_alert = None
260+ updated = client .load (AlertDefinition , created .id , service_type )
261+ updated .label = f"{ label } -updated"
262+ updated .save ()
252263
253- if created :
254- update_alert = client .load (
255- AlertDefinition , created .id , service_type
256- )
257- update_alert .label = f"{ label } -updated"
258- update_alert .save ()
259- else :
260- pytest .fail ("Alert definition was not created successfully" )
261-
262- if update_alert :
263- updated = client .load (
264- AlertDefinition , update_alert .id , service_type
265- )
266- while (
267- getattr (updated , "status" , None ) == "in progress"
268- and (time .time () - start ) < timeout
269- ):
270- time .sleep (interval )
271- try :
272- updated = client .load (
273- AlertDefinition , updated .id , service_type
274- )
275- except Exception :
276- # transient errors while polling; continue until timeout
277- pass
278- else :
279- pytest .fail ("Alert definition was not updated successfully" )
264+ updated = wait_for_alert_ready (updated .id , service_type )
280265
281266 assert created .id == updated .id
282267 assert updated .label == f"{ label } -updated"
@@ -285,17 +270,7 @@ def test_integration_create_get_update_delete_alert_definition(
285270 if created :
286271 # Best-effort cleanup; allow transient errors.
287272 # max time alert should take to update
288- try :
289- delete_alert = client .load (
290- AlertDefinition , created .id , service_type
291- )
292- delete_alert .delete ()
293- except Exception :
294- assert False , "Could not delete alert definition during cleanup"
295-
296- # confirm it's gone (if API returns 404 or raises)
297- try :
298- client .load (AlertDefinition , created .id , service_type )
299- assert False , "Alert definition still retrievable after delete"
300- except Exception :
301- pass
273+ delete_alert = client .load (
274+ AlertDefinition , created .id , service_type
275+ )
276+ delete_alert .delete ()
0 commit comments