1
- import os
2
1
from typing import List
3
2
4
3
import pytest
5
4
6
- from common .external import IpUpdater , build_workers_whitelist
5
+ from common import constants
6
+ from common .external import ExternalIpUpdater , build_workers_whitelist
7
7
8
8
9
9
class TestWorkersCommon :
@@ -212,6 +212,8 @@ def test_checkin_another_user(
212
212
213
213
214
214
class TestWorkerRequestedTasks :
215
+ new_ip_address = "88.88.88.88"
216
+
215
217
def test_requested_task_worker_as_admin (self , client , access_token , worker ):
216
218
response = client .get (
217
219
"/requested-tasks/worker" ,
@@ -238,18 +240,35 @@ def test_requested_task_worker_as_worker(self, client, make_access_token, worker
238
240
)
239
241
assert response .status_code == 200
240
242
241
- new_ip_address = "88.88.88.88"
242
-
243
243
def custom_ip_update (self , ip_addresses : List ):
244
244
self .ip_updated = True
245
245
assert TestWorkerRequestedTasks .new_ip_address in ip_addresses
246
246
247
+ def custom_failing_ip_update (self , ip_addresses : List ):
248
+ raise Exception ()
249
+
250
+ @pytest .mark .parametrize (
251
+ "prev_ip, new_ip, external_update_enabled, external_update_fails,"
252
+ " external_update_called" ,
253
+ [
254
+ ("77.77.77.77" , "88.88.88.88" , False , False , False ), # ip update disabled
255
+ ("77.77.77.77" , "77.77.77.77" , True , False , False ), # ip did not changed
256
+ ("77.77.77.77" , "88.88.88.88" , True , False , True ), # ip should be updated
257
+ ("77.77.77.77" , "88.88.88.88" , True , True , False ), # ip update fails
258
+ ],
259
+ )
247
260
def test_requested_task_worker_update_ip_whitelist (
248
- self , client , make_access_token , worker
261
+ self ,
262
+ client ,
263
+ make_access_token ,
264
+ worker ,
265
+ prev_ip ,
266
+ new_ip ,
267
+ external_update_enabled ,
268
+ external_update_fails ,
269
+ external_update_called ,
249
270
):
250
- self .ip_updated = False
251
- IpUpdater .update_fn = self .custom_ip_update
252
- os .environ ["USES_WORKERS_IPS_WHITELIST" ] = "1"
271
+ # call it once to set prev_ip
253
272
response = client .get (
254
273
"/requested-tasks/worker" ,
255
274
query_string = {
@@ -260,8 +279,69 @@ def test_requested_task_worker_update_ip_whitelist(
260
279
},
261
280
headers = {
262
281
"Authorization" : make_access_token (worker ["username" ], "worker" ),
263
- "X-Forwarded-For" : TestWorkerRequestedTasks . new_ip_address ,
282
+ "X-Forwarded-For" : prev_ip ,
264
283
},
265
284
)
266
285
assert response .status_code == 200
267
- assert self .ip_updated
286
+
287
+ # check prev_ip has been set
288
+ response = client .get ("/workers/" )
289
+ assert response .status_code == 200
290
+ response_data = response .get_json ()
291
+ for item in response_data ["items" ]:
292
+ if item ["name" ] != worker ["name" ]:
293
+ continue
294
+ assert item ["last_ip" ] == prev_ip
295
+
296
+ # setup custom ip updater to intercept Wasabi operations
297
+ updater = IpUpdaterAndChecker (should_fail = external_update_fails )
298
+ assert TestWorkerRequestedTasks .new_ip_address not in updater .ip_addresses
299
+ ExternalIpUpdater .update_fn = updater .ip_update
300
+ constants .USES_WORKERS_IPS_WHITELIST = external_update_enabled
301
+
302
+ # call it once to set next_ip
303
+ response = client .get (
304
+ "/requested-tasks/worker" ,
305
+ query_string = {
306
+ "worker" : worker ["name" ],
307
+ "avail_cpu" : 4 ,
308
+ "avail_memory" : 2048 ,
309
+ "avail_disk" : 4096 ,
310
+ },
311
+ headers = {
312
+ "Authorization" : make_access_token (worker ["username" ], "worker" ),
313
+ "X-Forwarded-For" : new_ip ,
314
+ },
315
+ )
316
+ if external_update_fails :
317
+ assert response .status_code == 503
318
+ else :
319
+ assert response .status_code == 200
320
+ assert updater .ips_updated == external_update_called
321
+ if external_update_called :
322
+ assert new_ip in updater .ip_addresses
323
+
324
+ # check new_ip has been set (even if ip update is disabled or has failed)
325
+ response = client .get ("/workers/" )
326
+ assert response .status_code == 200
327
+ response_data = response .get_json ()
328
+ for item in response_data ["items" ]:
329
+ if item ["name" ] != worker ["name" ]:
330
+ continue
331
+ assert item ["last_ip" ] == new_ip
332
+
333
+
334
+ class IpUpdaterAndChecker :
335
+ """Helper class to intercept Wasabi operations and perform assertions"""
336
+
337
+ def __init__ (self , should_fail : bool ) -> None :
338
+ self .ips_updated = False
339
+ self .should_fail = should_fail
340
+ self .ip_addresses = []
341
+
342
+ def ip_update (self , ip_addresses : List ):
343
+ if self .should_fail :
344
+ raise Exception ()
345
+ else :
346
+ self .ips_updated = True
347
+ self .ip_addresses = ip_addresses
0 commit comments