@@ -321,5 +321,76 @@ def update(self, name, namespace, updated_record):
321321 self .lock .release ()
322322
323323
324+ def test_acquire_survives_non_json_error_body (self ):
325+ """A proxy answering with an HTML error page must not kill the elector."""
326+ class GatewayErrorLock :
327+ def __init__ (self ):
328+ self .name = "lock"
329+ self .namespace = "ns"
330+ self .identity = "candidate"
331+
332+ def get (self , name , namespace ):
333+ return False , ApiException (
334+ status = 502 , reason = "Bad Gateway" ,
335+ body = "<html><body>502 Bad Gateway</body></html>" )
336+
337+ config = electionconfig .Config (
338+ lock = GatewayErrorLock (), lease_duration = 4 , renew_deadline = 3 ,
339+ retry_period = 1 , onstarted_leading = lambda : None ,
340+ onstopped_leading = lambda : None )
341+
342+ result = leaderelection .LeaderElection (config ).try_acquire_or_renew ()
343+ self .assertFalse (result )
344+
345+ def test_acquire_survives_empty_error_body (self ):
346+ class EmptyErrorLock :
347+ def __init__ (self ):
348+ self .name = "lock"
349+ self .namespace = "ns"
350+ self .identity = "candidate"
351+
352+ def get (self , name , namespace ):
353+ return False , ApiException (status = 500 , reason = "Server Error" ,
354+ body = None )
355+
356+ config = electionconfig .Config (
357+ lock = EmptyErrorLock (), lease_duration = 4 , renew_deadline = 3 ,
358+ retry_period = 1 , onstarted_leading = lambda : None ,
359+ onstopped_leading = lambda : None )
360+
361+ result = leaderelection .LeaderElection (config ).try_acquire_or_renew ()
362+ self .assertFalse (result )
363+
364+ def test_acquire_still_creates_on_clean_404 (self ):
365+ class NotFoundLock :
366+ def __init__ (self ):
367+ self .name = "lock"
368+ self .namespace = "ns"
369+ self .identity = "candidate"
370+ self .created = False
371+
372+ def get (self , name , namespace ):
373+ if self .created :
374+ return True , LeaderElectionRecord (
375+ "candidate" , "4" , "now" , "now" )
376+ return False , ApiException (
377+ status = 404 , reason = "Not Found" ,
378+ body = json .dumps ({'code' : 404 }))
379+
380+ def create (self , name , namespace , election_record ):
381+ self .created = True
382+ return True
383+
384+ def update (self , name , namespace , updated_record ):
385+ return True
386+
387+ config = electionconfig .Config (
388+ lock = NotFoundLock (), lease_duration = 4 , renew_deadline = 3 ,
389+ retry_period = 1 , onstarted_leading = lambda : None ,
390+ onstopped_leading = lambda : None )
391+
392+ self .assertTrue (leaderelection .LeaderElection (config ).try_acquire_or_renew ())
393+
394+
324395if __name__ == '__main__' :
325396 unittest .main ()
0 commit comments