assemblyline-core 4.7.5.dev121__tar.gz → 4.7.5.dev122__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. {assemblyline_core-4.7.5.dev121 → assemblyline_core-4.7.5.dev122}/PKG-INFO +1 -1
  2. assemblyline_core-4.7.5.dev122/assemblyline_core/VERSION +1 -0
  3. {assemblyline_core-4.7.5.dev121 → assemblyline_core-4.7.5.dev122}/assemblyline_core/scaler/controllers/kubernetes_ctl.py +52 -28
  4. {assemblyline_core-4.7.5.dev121 → assemblyline_core-4.7.5.dev122}/assemblyline_core.egg-info/PKG-INFO +1 -1
  5. assemblyline_core-4.7.5.dev121/assemblyline_core/VERSION +0 -1
  6. {assemblyline_core-4.7.5.dev121 → assemblyline_core-4.7.5.dev122}/LICENCE.md +0 -0
  7. {assemblyline_core-4.7.5.dev121 → assemblyline_core-4.7.5.dev122}/README.md +0 -0
  8. {assemblyline_core-4.7.5.dev121 → assemblyline_core-4.7.5.dev122}/assemblyline_core/__init__.py +0 -0
  9. {assemblyline_core-4.7.5.dev121 → assemblyline_core-4.7.5.dev122}/assemblyline_core/alerter/__init__.py +0 -0
  10. {assemblyline_core-4.7.5.dev121 → assemblyline_core-4.7.5.dev122}/assemblyline_core/alerter/processing.py +0 -0
  11. {assemblyline_core-4.7.5.dev121 → assemblyline_core-4.7.5.dev122}/assemblyline_core/alerter/run_alerter.py +0 -0
  12. {assemblyline_core-4.7.5.dev121 → assemblyline_core-4.7.5.dev122}/assemblyline_core/archiver/__init__.py +0 -0
  13. {assemblyline_core-4.7.5.dev121 → assemblyline_core-4.7.5.dev122}/assemblyline_core/archiver/run_archiver.py +0 -0
  14. {assemblyline_core-4.7.5.dev121 → assemblyline_core-4.7.5.dev122}/assemblyline_core/badlist_client.py +0 -0
  15. {assemblyline_core-4.7.5.dev121 → assemblyline_core-4.7.5.dev122}/assemblyline_core/dispatching/__init__.py +0 -0
  16. {assemblyline_core-4.7.5.dev121 → assemblyline_core-4.7.5.dev122}/assemblyline_core/dispatching/client.py +0 -0
  17. {assemblyline_core-4.7.5.dev121 → assemblyline_core-4.7.5.dev122}/assemblyline_core/dispatching/dispatcher.py +0 -0
  18. {assemblyline_core-4.7.5.dev121 → assemblyline_core-4.7.5.dev122}/assemblyline_core/dispatching/schedules.py +0 -0
  19. {assemblyline_core-4.7.5.dev121 → assemblyline_core-4.7.5.dev122}/assemblyline_core/expiry/__init__.py +0 -0
  20. {assemblyline_core-4.7.5.dev121 → assemblyline_core-4.7.5.dev122}/assemblyline_core/expiry/run_expiry.py +0 -0
  21. {assemblyline_core-4.7.5.dev121 → assemblyline_core-4.7.5.dev122}/assemblyline_core/ingester/__init__.py +0 -0
  22. {assemblyline_core-4.7.5.dev121 → assemblyline_core-4.7.5.dev122}/assemblyline_core/ingester/constants.py +0 -0
  23. {assemblyline_core-4.7.5.dev121 → assemblyline_core-4.7.5.dev122}/assemblyline_core/ingester/ingester.py +0 -0
  24. {assemblyline_core-4.7.5.dev121 → assemblyline_core-4.7.5.dev122}/assemblyline_core/metrics/__init__.py +0 -0
  25. {assemblyline_core-4.7.5.dev121 → assemblyline_core-4.7.5.dev122}/assemblyline_core/metrics/es_metrics.py +0 -0
  26. {assemblyline_core-4.7.5.dev121 → assemblyline_core-4.7.5.dev122}/assemblyline_core/metrics/heartbeat_formatter.py +0 -0
  27. {assemblyline_core-4.7.5.dev121 → assemblyline_core-4.7.5.dev122}/assemblyline_core/metrics/helper.py +0 -0
  28. {assemblyline_core-4.7.5.dev121 → assemblyline_core-4.7.5.dev122}/assemblyline_core/metrics/metrics_server.py +0 -0
  29. {assemblyline_core-4.7.5.dev121 → assemblyline_core-4.7.5.dev122}/assemblyline_core/metrics/run_heartbeat_manager.py +0 -0
  30. {assemblyline_core-4.7.5.dev121 → assemblyline_core-4.7.5.dev122}/assemblyline_core/metrics/run_metrics_aggregator.py +0 -0
  31. {assemblyline_core-4.7.5.dev121 → assemblyline_core-4.7.5.dev122}/assemblyline_core/metrics/run_statistics_aggregator.py +0 -0
  32. {assemblyline_core-4.7.5.dev121 → assemblyline_core-4.7.5.dev122}/assemblyline_core/replay/__init__.py +0 -0
  33. {assemblyline_core-4.7.5.dev121 → assemblyline_core-4.7.5.dev122}/assemblyline_core/replay/client.py +0 -0
  34. {assemblyline_core-4.7.5.dev121 → assemblyline_core-4.7.5.dev122}/assemblyline_core/replay/creator/__init__.py +0 -0
  35. {assemblyline_core-4.7.5.dev121 → assemblyline_core-4.7.5.dev122}/assemblyline_core/replay/creator/run.py +0 -0
  36. {assemblyline_core-4.7.5.dev121 → assemblyline_core-4.7.5.dev122}/assemblyline_core/replay/creator/run_worker.py +0 -0
  37. {assemblyline_core-4.7.5.dev121 → assemblyline_core-4.7.5.dev122}/assemblyline_core/replay/loader/__init__.py +0 -0
  38. {assemblyline_core-4.7.5.dev121 → assemblyline_core-4.7.5.dev122}/assemblyline_core/replay/loader/run.py +0 -0
  39. {assemblyline_core-4.7.5.dev121 → assemblyline_core-4.7.5.dev122}/assemblyline_core/replay/loader/run_worker.py +0 -0
  40. {assemblyline_core-4.7.5.dev121 → assemblyline_core-4.7.5.dev122}/assemblyline_core/replay/replay.py +0 -0
  41. {assemblyline_core-4.7.5.dev121 → assemblyline_core-4.7.5.dev122}/assemblyline_core/safelist_client.py +0 -0
  42. {assemblyline_core-4.7.5.dev121 → assemblyline_core-4.7.5.dev122}/assemblyline_core/scaler/__init__.py +0 -0
  43. {assemblyline_core-4.7.5.dev121 → assemblyline_core-4.7.5.dev122}/assemblyline_core/scaler/collection.py +0 -0
  44. {assemblyline_core-4.7.5.dev121 → assemblyline_core-4.7.5.dev122}/assemblyline_core/scaler/controllers/__init__.py +0 -0
  45. {assemblyline_core-4.7.5.dev121 → assemblyline_core-4.7.5.dev122}/assemblyline_core/scaler/controllers/docker_ctl.py +0 -0
  46. {assemblyline_core-4.7.5.dev121 → assemblyline_core-4.7.5.dev122}/assemblyline_core/scaler/controllers/interface.py +0 -0
  47. {assemblyline_core-4.7.5.dev121 → assemblyline_core-4.7.5.dev122}/assemblyline_core/scaler/run_scaler.py +0 -0
  48. {assemblyline_core-4.7.5.dev121 → assemblyline_core-4.7.5.dev122}/assemblyline_core/scaler/scaler_server.py +0 -0
  49. {assemblyline_core-4.7.5.dev121 → assemblyline_core-4.7.5.dev122}/assemblyline_core/server_base.py +0 -0
  50. {assemblyline_core-4.7.5.dev121 → assemblyline_core-4.7.5.dev122}/assemblyline_core/signature_client.py +0 -0
  51. {assemblyline_core-4.7.5.dev121 → assemblyline_core-4.7.5.dev122}/assemblyline_core/submission_client.py +0 -0
  52. {assemblyline_core-4.7.5.dev121 → assemblyline_core-4.7.5.dev122}/assemblyline_core/tasking_client.py +0 -0
  53. {assemblyline_core-4.7.5.dev121 → assemblyline_core-4.7.5.dev122}/assemblyline_core/updater/__init__.py +0 -0
  54. {assemblyline_core-4.7.5.dev121 → assemblyline_core-4.7.5.dev122}/assemblyline_core/updater/helper.py +0 -0
  55. {assemblyline_core-4.7.5.dev121 → assemblyline_core-4.7.5.dev122}/assemblyline_core/updater/run_updater.py +0 -0
  56. {assemblyline_core-4.7.5.dev121 → assemblyline_core-4.7.5.dev122}/assemblyline_core/vacuum/__init__.py +0 -0
  57. {assemblyline_core-4.7.5.dev121 → assemblyline_core-4.7.5.dev122}/assemblyline_core/vacuum/crawler.py +0 -0
  58. {assemblyline_core-4.7.5.dev121 → assemblyline_core-4.7.5.dev122}/assemblyline_core/vacuum/department_map.py +0 -0
  59. {assemblyline_core-4.7.5.dev121 → assemblyline_core-4.7.5.dev122}/assemblyline_core/vacuum/safelist.py +0 -0
  60. {assemblyline_core-4.7.5.dev121 → assemblyline_core-4.7.5.dev122}/assemblyline_core/vacuum/stream_map.py +0 -0
  61. {assemblyline_core-4.7.5.dev121 → assemblyline_core-4.7.5.dev122}/assemblyline_core/vacuum/worker.py +0 -0
  62. {assemblyline_core-4.7.5.dev121 → assemblyline_core-4.7.5.dev122}/assemblyline_core/workflow/__init__.py +0 -0
  63. {assemblyline_core-4.7.5.dev121 → assemblyline_core-4.7.5.dev122}/assemblyline_core/workflow/run_workflow.py +0 -0
  64. {assemblyline_core-4.7.5.dev121 → assemblyline_core-4.7.5.dev122}/assemblyline_core.egg-info/SOURCES.txt +0 -0
  65. {assemblyline_core-4.7.5.dev121 → assemblyline_core-4.7.5.dev122}/assemblyline_core.egg-info/dependency_links.txt +0 -0
  66. {assemblyline_core-4.7.5.dev121 → assemblyline_core-4.7.5.dev122}/assemblyline_core.egg-info/requires.txt +0 -0
  67. {assemblyline_core-4.7.5.dev121 → assemblyline_core-4.7.5.dev122}/assemblyline_core.egg-info/top_level.txt +0 -0
  68. {assemblyline_core-4.7.5.dev121 → assemblyline_core-4.7.5.dev122}/setup.cfg +0 -0
  69. {assemblyline_core-4.7.5.dev121 → assemblyline_core-4.7.5.dev122}/setup.py +0 -0
  70. {assemblyline_core-4.7.5.dev121 → assemblyline_core-4.7.5.dev122}/test/test_alerter.py +0 -0
  71. {assemblyline_core-4.7.5.dev121 → assemblyline_core-4.7.5.dev122}/test/test_badlist_client.py +0 -0
  72. {assemblyline_core-4.7.5.dev121 → assemblyline_core-4.7.5.dev122}/test/test_expiry.py +0 -0
  73. {assemblyline_core-4.7.5.dev121 → assemblyline_core-4.7.5.dev122}/test/test_replay.py +0 -0
  74. {assemblyline_core-4.7.5.dev121 → assemblyline_core-4.7.5.dev122}/test/test_safelist_client.py +0 -0
  75. {assemblyline_core-4.7.5.dev121 → assemblyline_core-4.7.5.dev122}/test/test_scaler.py +0 -0
  76. {assemblyline_core-4.7.5.dev121 → assemblyline_core-4.7.5.dev122}/test/test_scheduler.py +0 -0
  77. {assemblyline_core-4.7.5.dev121 → assemblyline_core-4.7.5.dev122}/test/test_signature_client.py +0 -0
  78. {assemblyline_core-4.7.5.dev121 → assemblyline_core-4.7.5.dev122}/test/test_tasking_client.py +0 -0
  79. {assemblyline_core-4.7.5.dev121 → assemblyline_core-4.7.5.dev122}/test/test_updater_helper.py +0 -0
  80. {assemblyline_core-4.7.5.dev121 → assemblyline_core-4.7.5.dev122}/test/test_vacuum.py +0 -0
  81. {assemblyline_core-4.7.5.dev121 → assemblyline_core-4.7.5.dev122}/test/test_workflow.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: assemblyline-core
3
- Version: 4.7.5.dev121
3
+ Version: 4.7.5.dev122
4
4
  Summary: Assemblyline 4 - Core components
5
5
  Home-page: https://github.com/CybercentreCanada/assemblyline-core/
6
6
  Author: CCCS Assemblyline development team
@@ -0,0 +1 @@
1
+ 4.7.5.dev122
@@ -356,10 +356,11 @@ class KubernetesController(ControllerInterface):
356
356
  node_background = threading.Thread(target=self._loop_forever(self._monitor_node_pool), daemon=True)
357
357
  node_background.start()
358
358
 
359
- self._pod_used_ram: dict[str, float] = defaultdict(float)
360
- self._pod_used_cpu: dict[str, float] = defaultdict(float)
361
- self._pod_used_namespace_ram: dict[str, float] = defaultdict(float)
362
- self._pod_used_namespace_cpu: dict[str, float] = defaultdict(float)
359
+ self._pod_used_ram: dict[str | None, float] = defaultdict(float)
360
+ self._pod_used_cpu: dict[str | None, float] = defaultdict(float)
361
+ self._pod_used_namespace_ram: dict[str | None, float] = defaultdict(float)
362
+ self._pod_used_namespace_cpu: dict[str | None, float] = defaultdict(float)
363
+ self.node_count = 0
363
364
  pod_background = threading.Thread(target=self._loop_forever(self._monitor_pods), daemon=True)
364
365
  pod_background.start()
365
366
 
@@ -440,7 +441,7 @@ class KubernetesController(ControllerInterface):
440
441
  self._create_deployment(profile.name, self._deployment_name(profile.name),
441
442
  profile.container_config, profile.shutdown_seconds, scale,
442
443
  change_key=profile.config_blob, core_mounts=profile.privileged,
443
- security_context=self.security_policy),
444
+ security_context=self.security_policy)
444
445
  self._external_profiles[profile.name] = profile
445
446
 
446
447
  def _loop_forever(self, function):
@@ -459,7 +460,7 @@ class KubernetesController(ControllerInterface):
459
460
  self.logger.exception(f"Error in {function.__name__}")
460
461
  return _function
461
462
 
462
- def _monitor_node_pool(self):
463
+ def _monitor_node_pool(self) -> None:
463
464
  self._node_pool_max_cpu = 0
464
465
  self._node_pool_max_ram = 0
465
466
  self.node_count = 0
@@ -497,19 +498,19 @@ class KubernetesController(ControllerInterface):
497
498
 
498
499
  # Update the totals
499
500
  self.node_count = len(self.ready_nodes)
500
- max_cpu = 0
501
- max_ram = 0
501
+ max_cpu = 0.0
502
+ max_ram = 0.0
502
503
  for cpu, ram in self.ready_nodes.values():
503
504
  max_cpu += cpu
504
505
  max_ram += ram
505
506
  self._node_pool_max_cpu = max_cpu
506
507
  self._node_pool_max_ram = max_ram
507
508
 
508
- def _monitor_pods(self):
509
+ def _monitor_pods(self) -> None:
509
510
  watch = Watch()
510
511
  log_cache = CacheDict(cache_len=8000)
511
- per_node_containers: dict[str, dict[str, tuple[float, float]]] = defaultdict(dict)
512
- per_node_namespaced_containers: dict[str, dict[str, tuple[float, float]]] = defaultdict(dict)
512
+ per_node_containers: dict[str | None, dict[str, tuple[float, float]]] = defaultdict(dict)
513
+ per_node_namespaced_containers: dict[str | None, dict[str, tuple[float, float]]] = defaultdict(dict)
513
514
  self._pod_used_cpu = defaultdict(float)
514
515
  self._pod_used_ram = defaultdict(float)
515
516
  self._pod_used_namespace_cpu = defaultdict(float)
@@ -529,19 +530,34 @@ class KubernetesController(ControllerInterface):
529
530
  continue
530
531
 
531
532
  pod_name = "Unknown Pod"
533
+ changed_nodes: list[str | None] = []
532
534
  try:
535
+ # Read some basic information about the pod we are looking at
533
536
  pod_name = event['raw_object']['metadata']['name']
534
537
  uid = event['raw_object']['metadata']['uid']
535
538
  namespace = event['raw_object']['metadata']['namespace']
536
- node = event['raw_object']['spec']['nodeName']
539
+ node = event['raw_object']['spec'].get('nodeName', None)
540
+ changed_nodes.append(node)
541
+
537
542
  containers = per_node_containers[node]
538
543
  namespaced_containers = per_node_namespaced_containers[node]
539
544
 
540
545
  if event['type'] in ['ADDED', 'MODIFIED']:
541
546
  for container in event['raw_object']['spec']['containers']:
542
- containers[f"{uid}-{container['name']}"] = get_resources(container)
547
+ key = f"{uid}-{container['name']}"
548
+
549
+ # If the pod has already been seen without a node assigned we will have records
550
+ # for it under the None node, if we see it again with a non-null node we need to
551
+ # clean up those duplicate records.
552
+ if node is not None:
553
+ per_node_namespaced_containers[None].pop(key, None)
554
+ if per_node_containers[None].pop(key, None) is not None:
555
+ changed_nodes.append(None)
556
+
557
+ # Write resource records under the current node's container -> resource map
558
+ containers[key] = get_resources(container)
543
559
  if namespace == self.namespace:
544
- namespaced_containers[f"{uid}-{container['name']}"] = get_resources(container)
560
+ namespaced_containers[key] = get_resources(container)
545
561
  for status in event['raw_object']['status'].get('containerStatuses', []):
546
562
  restarts = status['restartCount']
547
563
  if restarts > CONTAINER_RESTART_THRESHOLD and log_cache.get(pod_name, 0) <= restarts:
@@ -553,8 +569,12 @@ class KubernetesController(ControllerInterface):
553
569
  f"with reason {detail.get('reason', 'UNKNOWN')}")
554
570
  elif event['type'] == 'DELETED':
555
571
  for container in event['raw_object']['spec']['containers']:
556
- containers.pop(f"{uid}-{container['name']}", None)
557
- namespaced_containers.pop(f"{uid}-{container['name']}", None)
572
+ key = f"{uid}-{container['name']}"
573
+ containers.pop(key, None)
574
+ namespaced_containers.pop(key, None)
575
+ per_node_namespaced_containers[None].pop(key, None)
576
+ if per_node_containers[None].pop(key, None) is not None:
577
+ changed_nodes.append(None)
558
578
  else:
559
579
  continue
560
580
  except KeyError as e:
@@ -566,23 +586,27 @@ class KubernetesController(ControllerInterface):
566
586
  self.logger.exception(f"Couldn't parse container information for {pod_name}: {e}")
567
587
  continue
568
588
 
569
- memory_unrestricted = sum(1 for _, mem in containers.values() if mem is None)
570
- cpu_unrestricted = sum(1 for cpu, _ in containers.values() if cpu is None)
589
+ for node in changed_nodes:
590
+ containers = per_node_containers[node]
591
+ namespaced_containers = per_node_namespaced_containers[node]
592
+
593
+ memory_unrestricted = sum(1 for _, mem in containers.values() if mem is None)
594
+ cpu_unrestricted = sum(1 for cpu, _ in containers.values() if cpu is None)
571
595
 
572
- memory_used = [mem for _, mem in containers.values() if mem is not None]
573
- cpu_used = [cpu for cpu, _ in containers.values() if cpu is not None]
596
+ memory_used = [mem for _, mem in containers.values() if mem is not None]
597
+ cpu_used = [cpu for cpu, _ in containers.values() if cpu is not None]
574
598
 
575
- self._pod_used_cpu[node] = sum(cpu_used) + cpu_unrestricted * mean(cpu_used)
576
- self._pod_used_ram[node] = sum(memory_used) + memory_unrestricted * mean(memory_used)
599
+ self._pod_used_cpu[node] = sum(cpu_used) + cpu_unrestricted * mean(cpu_used)
600
+ self._pod_used_ram[node] = sum(memory_used) + memory_unrestricted * mean(memory_used)
577
601
 
578
- memory_unrestricted = sum(1 for _, mem in namespaced_containers.values() if mem is None)
579
- cpu_unrestricted = sum(1 for cpu, _ in namespaced_containers.values() if cpu is None)
602
+ memory_unrestricted = sum(1 for _, mem in namespaced_containers.values() if mem is None)
603
+ cpu_unrestricted = sum(1 for cpu, _ in namespaced_containers.values() if cpu is None)
580
604
 
581
- memory_used = [mem for _, mem in namespaced_containers.values() if mem is not None]
582
- cpu_used = [cpu for cpu, _ in namespaced_containers.values() if cpu is not None]
605
+ memory_used = [mem for _, mem in namespaced_containers.values() if mem is not None]
606
+ cpu_used = [cpu for cpu, _ in namespaced_containers.values() if cpu is not None]
583
607
 
584
- self._pod_used_namespace_cpu[node] = sum(cpu_used) + cpu_unrestricted * mean(cpu_used)
585
- self._pod_used_namespace_ram[node] = sum(memory_used) + memory_unrestricted * mean(memory_used)
608
+ self._pod_used_namespace_cpu[node] = sum(cpu_used) + cpu_unrestricted * mean(cpu_used)
609
+ self._pod_used_namespace_ram[node] = sum(memory_used) + memory_unrestricted * mean(memory_used)
586
610
 
587
611
  def _monitor_quotas(self):
588
612
  watch = Watch()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: assemblyline-core
3
- Version: 4.7.5.dev121
3
+ Version: 4.7.5.dev122
4
4
  Summary: Assemblyline 4 - Core components
5
5
  Home-page: https://github.com/CybercentreCanada/assemblyline-core/
6
6
  Author: CCCS Assemblyline development team
@@ -1 +0,0 @@
1
- 4.7.5.dev121