| 1284 | gcp.close() |
| 1285 | |
| 1286 | def test_task_auto_processing_node(self): |
| 1287 | project = Project.objects.get(name="User Test Project") |
| 1288 | task = Task.objects.create(project=project, name="Test") |
| 1289 | pnode = ProcessingNode.objects.create(hostname="invalid-host", port=11223) |
| 1290 | another_pnode = ProcessingNode.objects.create(hostname="invalid-host-2", port=11223) |
| 1291 | assign_perm('view_processingnode', project.owner, pnode) |
| 1292 | assign_perm('view_processingnode', project.owner, another_pnode) |
| 1293 | |
| 1294 | # By default |
| 1295 | self.assertTrue(task.auto_processing_node) |
| 1296 | self.assertTrue(task.processing_node is None) |
| 1297 | |
| 1298 | # Simulate an error |
| 1299 | task.last_error = "Test error" |
| 1300 | task.save() |
| 1301 | |
| 1302 | worker.tasks.process_pending_tasks() |
| 1303 | |
| 1304 | # A processing node should not have been assigned |
| 1305 | task.refresh_from_db() |
| 1306 | self.assertTrue(task.processing_node is None) |
| 1307 | |
| 1308 | # Remove error |
| 1309 | task.last_error = None |
| 1310 | task.save() |
| 1311 | |
| 1312 | worker.tasks.process_pending_tasks() |
| 1313 | |
| 1314 | # A processing node should not have been assigned because no processing nodes are online |
| 1315 | task.refresh_from_db() |
| 1316 | self.assertTrue(task.processing_node is None) |
| 1317 | |
| 1318 | # Bring a processing node online |
| 1319 | pnode.last_refreshed = timezone.now() |
| 1320 | pnode.save() |
| 1321 | self.assertTrue(pnode.is_online()) |
| 1322 | |
| 1323 | # A processing node has been assigned |
| 1324 | worker.tasks.process_pending_tasks() |
| 1325 | task.refresh_from_db() |
| 1326 | self.assertTrue(task.processing_node.id == pnode.id) |
| 1327 | |
| 1328 | # Task should have failed (no images provided, invalid host...) |
| 1329 | self.assertTrue(task.last_error is not None) |
| 1330 | |
| 1331 | # Bring another processing node online, and bring the old one offline |
| 1332 | pnode.last_refreshed = timezone.now() - timedelta(minutes=settings.NODE_OFFLINE_MINUTES) |
| 1333 | pnode.save() |
| 1334 | |
| 1335 | another_pnode.last_refreshed = timezone.now() |
| 1336 | another_pnode.save() |
| 1337 | |
| 1338 | # Remove error, set status to queued |
| 1339 | task.last_error = None |
| 1340 | task.status = status_codes.QUEUED |
| 1341 | task.save() |
| 1342 | |
| 1343 | worker.tasks.process_pending_tasks() |