17
17
from octodns .record import Create , Delete , Record , Update
18
18
from octodns .zone import Zone
19
19
20
- from octodns_cloudflare import CloudflareProvider , CloudflareRateLimitError
20
+ from octodns_cloudflare import (
21
+ CloudflareAuthenticationError ,
22
+ CloudflareProvider ,
23
+ CloudflareRateLimitError ,
24
+ )
21
25
22
26
23
27
def set_record_proxied_flag (record , proxied ):
@@ -2177,7 +2181,11 @@ def test_emailless_auth(self):
2177
2181
2178
2182
def test_retry_behavior (self ):
2179
2183
provider = CloudflareProvider (
2180
- 'test' , token = 'token 123' , email = 'email 234' , retry_period = 0
2184
+ 'test' ,
2185
+ token = 'token 123' ,
2186
+ email = 'email 234' ,
2187
+ retry_period = 0 ,
2188
+ auth_error_retry_count = 2 , # Add auth retry config
2181
2189
)
2182
2190
result = {
2183
2191
"success" : True ,
@@ -2198,7 +2206,7 @@ def test_retry_behavior(self):
2198
2206
[call ('GET' , '/zones' , params = {'page' : 1 , 'per_page' : 50 })]
2199
2207
)
2200
2208
2201
- # One retry required
2209
+ # One rate limit retry required
2202
2210
provider ._zones = None
2203
2211
provider ._request .reset_mock ()
2204
2212
provider ._request .side_effect = [CloudflareRateLimitError ('{}' ), result ]
@@ -2207,20 +2215,32 @@ def test_retry_behavior(self):
2207
2215
[call ('GET' , '/zones' , params = {'page' : 1 , 'per_page' : 50 })]
2208
2216
)
2209
2217
2210
- # Two retries required
2218
+ # One auth retry required
2219
+ provider ._zones = None
2220
+ provider ._request .reset_mock ()
2221
+ provider ._request .side_effect = [
2222
+ CloudflareAuthenticationError ('{}' ),
2223
+ result ,
2224
+ ]
2225
+ self .assertEqual ([], provider .zone_records (zone ))
2226
+ provider ._request .assert_has_calls (
2227
+ [call ('GET' , '/zones' , params = {'page' : 1 , 'per_page' : 50 })]
2228
+ )
2229
+
2230
+ # Two retries required - mixed rate limit and auth errors
2211
2231
provider ._zones = None
2212
2232
provider ._request .reset_mock ()
2213
2233
provider ._request .side_effect = [
2214
2234
CloudflareRateLimitError ('{}' ),
2215
- CloudflareRateLimitError ('{}' ),
2235
+ CloudflareAuthenticationError ('{}' ),
2216
2236
result ,
2217
2237
]
2218
2238
self .assertEqual ([], provider .zone_records (zone ))
2219
2239
provider ._request .assert_has_calls (
2220
2240
[call ('GET' , '/zones' , params = {'page' : 1 , 'per_page' : 50 })]
2221
2241
)
2222
2242
2223
- # # Exhaust our retries
2243
+ # Exhaust rate limit retries
2224
2244
provider ._zones = None
2225
2245
provider ._request .reset_mock ()
2226
2246
provider ._request .side_effect = [
@@ -2234,6 +2254,29 @@ def test_retry_behavior(self):
2234
2254
provider .zone_records (zone )
2235
2255
self .assertEqual ('last' , str (ctx .exception ))
2236
2256
2257
+ # Exhaust auth retries
2258
+ provider ._zones = None
2259
+ provider ._request .reset_mock ()
2260
+ provider ._request .side_effect = [
2261
+ CloudflareAuthenticationError ({"errors" : [{"message" : "first" }]}),
2262
+ CloudflareAuthenticationError ({"errors" : [{"message" : "second" }]}),
2263
+ CloudflareAuthenticationError ({"errors" : [{"message" : "last" }]}),
2264
+ ]
2265
+ with self .assertRaises (CloudflareAuthenticationError ) as ctx :
2266
+ provider .zone_records (zone )
2267
+ self .assertEqual ('last' , str (ctx .exception ))
2268
+
2269
+ # Test with auth retries disabled (default behavior)
2270
+ provider = CloudflareProvider (
2271
+ 'test' , token = 'token 123' , email = 'email 234' , retry_period = 0
2272
+ )
2273
+ provider ._request = Mock ()
2274
+ provider ._zones = None
2275
+ provider ._request .side_effect = [CloudflareAuthenticationError ('{}' )]
2276
+ with self .assertRaises (CloudflareAuthenticationError ):
2277
+ provider .zone_records (zone )
2278
+ self .assertEqual (1 , provider ._request .call_count )
2279
+
2237
2280
def test_ttl_mapping (self ):
2238
2281
provider = CloudflareProvider ('test' , 'email' , 'token' )
2239
2282
0 commit comments