assemblyline-core 4.7.5.dev45__tar.gz → 4.7.5.dev46__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.dev45 → assemblyline_core-4.7.5.dev46}/PKG-INFO +1 -1
  2. assemblyline_core-4.7.5.dev46/assemblyline_core/VERSION +1 -0
  3. {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/updater/helper.py +26 -5
  4. {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core.egg-info/PKG-INFO +1 -1
  5. {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core.egg-info/SOURCES.txt +1 -0
  6. assemblyline_core-4.7.5.dev46/test/test_updater_helper.py +47 -0
  7. assemblyline_core-4.7.5.dev45/assemblyline_core/VERSION +0 -1
  8. {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/LICENCE.md +0 -0
  9. {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/README.md +0 -0
  10. {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/__init__.py +0 -0
  11. {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/alerter/__init__.py +0 -0
  12. {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/alerter/processing.py +0 -0
  13. {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/alerter/run_alerter.py +0 -0
  14. {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/archiver/__init__.py +0 -0
  15. {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/archiver/run_archiver.py +0 -0
  16. {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/badlist_client.py +0 -0
  17. {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/dispatching/__init__.py +0 -0
  18. {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/dispatching/client.py +0 -0
  19. {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/dispatching/dispatcher.py +0 -0
  20. {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/dispatching/schedules.py +0 -0
  21. {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/expiry/__init__.py +0 -0
  22. {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/expiry/run_expiry.py +0 -0
  23. {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/ingester/__init__.py +0 -0
  24. {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/ingester/constants.py +0 -0
  25. {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/ingester/ingester.py +0 -0
  26. {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/metrics/__init__.py +0 -0
  27. {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/metrics/es_metrics.py +0 -0
  28. {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/metrics/heartbeat_formatter.py +0 -0
  29. {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/metrics/helper.py +0 -0
  30. {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/metrics/metrics_server.py +0 -0
  31. {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/metrics/run_heartbeat_manager.py +0 -0
  32. {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/metrics/run_metrics_aggregator.py +0 -0
  33. {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/metrics/run_statistics_aggregator.py +0 -0
  34. {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/replay/__init__.py +0 -0
  35. {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/replay/client.py +0 -0
  36. {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/replay/creator/__init__.py +0 -0
  37. {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/replay/creator/run.py +0 -0
  38. {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/replay/creator/run_worker.py +0 -0
  39. {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/replay/loader/__init__.py +0 -0
  40. {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/replay/loader/run.py +0 -0
  41. {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/replay/loader/run_worker.py +0 -0
  42. {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/replay/replay.py +0 -0
  43. {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/safelist_client.py +0 -0
  44. {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/scaler/__init__.py +0 -0
  45. {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/scaler/collection.py +0 -0
  46. {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/scaler/controllers/__init__.py +0 -0
  47. {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/scaler/controllers/docker_ctl.py +0 -0
  48. {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/scaler/controllers/interface.py +0 -0
  49. {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/scaler/controllers/kubernetes_ctl.py +0 -0
  50. {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/scaler/run_scaler.py +0 -0
  51. {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/scaler/scaler_server.py +0 -0
  52. {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/server_base.py +0 -0
  53. {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/signature_client.py +0 -0
  54. {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/submission_client.py +0 -0
  55. {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/tasking_client.py +0 -0
  56. {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/updater/__init__.py +0 -0
  57. {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/updater/run_updater.py +0 -0
  58. {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/vacuum/__init__.py +0 -0
  59. {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/vacuum/crawler.py +0 -0
  60. {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/vacuum/department_map.py +0 -0
  61. {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/vacuum/safelist.py +0 -0
  62. {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/vacuum/stream_map.py +0 -0
  63. {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/vacuum/worker.py +0 -0
  64. {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/workflow/__init__.py +0 -0
  65. {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/workflow/run_workflow.py +0 -0
  66. {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core.egg-info/dependency_links.txt +0 -0
  67. {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core.egg-info/requires.txt +0 -0
  68. {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core.egg-info/top_level.txt +0 -0
  69. {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/setup.cfg +0 -0
  70. {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/setup.py +0 -0
  71. {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/test/test_alerter.py +0 -0
  72. {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/test/test_badlist_client.py +0 -0
  73. {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/test/test_expiry.py +0 -0
  74. {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/test/test_replay.py +0 -0
  75. {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/test/test_safelist_client.py +0 -0
  76. {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/test/test_scaler.py +0 -0
  77. {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/test/test_scheduler.py +0 -0
  78. {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/test/test_signature_client.py +0 -0
  79. {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/test/test_tasking_client.py +0 -0
  80. {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/test/test_vacuum.py +0 -0
  81. {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/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.dev45
3
+ Version: 4.7.5.dev46
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.dev46
@@ -70,7 +70,13 @@ class DockerRegistry(ContainerRegistry):
70
70
  class AzureContainerRegistry(ContainerRegistry):
71
71
  def _get_proprietary_registry_tags(self, server, image_name, auth, verify, proxies=None, token_server=None):
72
72
  # Find latest tag for each types
73
- url = f"https://{server}/v2/{image_name}/tags/list"
73
+ # Explicitly request the maximum page size (1000) supported by ACR. Without the 'n' parameter,
74
+ # ACR defaults to only 100 tags per page, alphabetically sorted (not by push date/time).
75
+ # Repositories with more tags than the page size (e.g. long-running services with nightly
76
+ # builds) would silently have their most recent tags dropped if pagination isn't followed,
77
+ # since lexicographic ordering of variable-length build numbers doesn't match numeric order
78
+ # (e.g. "100" sorts before "99").
79
+ url = f"https://{server}/v2/{image_name}/tags/list?n=1000"
74
80
 
75
81
  # Get tag list
76
82
  headers = {}
@@ -94,12 +100,25 @@ class AzureContainerRegistry(ContainerRegistry):
94
100
  resp = self._perform_request(url, headers, verify, proxies)
95
101
 
96
102
  # At this point, we should have a response from the API
97
- if resp and resp.ok:
98
- # Test for positive list of tags
103
+ tags = []
104
+ while resp and resp.ok:
99
105
  resp_data = resp.json()
100
- return resp_data['tags'] or []
106
+ tags.extend(resp_data.get('tags') or [])
101
107
 
102
- return []
108
+ # Link header format: <https://{server}/v2/{image_name}/tags/list?n=1000&last=...>; rel="next"
109
+ next_link = resp.links.get("next")
110
+ if not next_link:
111
+ # If there's no next link, we've reached the last page of results
112
+ break
113
+
114
+ # Prepare the next URL for the subsequent request. The 'next' link may be relative or absolute.
115
+ next_url = next_link["url"]
116
+ if next_url.startswith('/'):
117
+ # Resolve relative URL to absolute URL if necessary
118
+ next_url = f"https://{server}{next_url}"
119
+ resp = self._perform_request(next_url, headers, verify, proxies)
120
+
121
+ return tags
103
122
 
104
123
  class GitHubContainerRegistry(ContainerRegistry):
105
124
  def _get_proprietary_registry_tags(self, server, image_name, auth, verify, proxies=None, token_server=None):
@@ -300,6 +319,8 @@ def get_latest_tag_for_service(service_config: ServiceConfig, system_config: Sys
300
319
  tags = registry._get_proprietary_registry_tags(server, image_name, auth,
301
320
  not system_config.services.allow_insecure_registry,
302
321
  proxies, token_server)
322
+ logger.info(f"{prefix}Fetched {len(tags)} raw tag(s) for service {service_name} - {image_name} "
323
+ f"from {server} before filtering.")
303
324
  # Pre-filter tags to only consider 'compatible' tags relative to the running system
304
325
  tags = [tag for tag in tags
305
326
  if re.match(f"({FRAMEWORK_VERSION})\\.({SYSTEM_VERSION})\\.\\d+\\.({update_channel})\\d+", tag)]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: assemblyline-core
3
- Version: 4.7.5.dev45
3
+ Version: 4.7.5.dev46
4
4
  Summary: Assemblyline 4 - Core components
5
5
  Home-page: https://github.com/CybercentreCanada/assemblyline-core/
6
6
  Author: CCCS Assemblyline development team
@@ -74,5 +74,6 @@ test/test_scaler.py
74
74
  test/test_scheduler.py
75
75
  test/test_signature_client.py
76
76
  test/test_tasking_client.py
77
+ test/test_updater_helper.py
77
78
  test/test_vacuum.py
78
79
  test/test_workflow.py
@@ -0,0 +1,47 @@
1
+ from unittest.mock import MagicMock, patch
2
+
3
+ from assemblyline_core.updater.helper import AzureContainerRegistry
4
+
5
+ SERVER = "registry.example"
6
+ IMAGE_NAME = "namespace/service"
7
+ FIRST_PAGE_URL = f"https://{SERVER}/v2/{IMAGE_NAME}/tags/list?n=1000"
8
+ NEXT_PAGE_URL = f"https://{SERVER}/v2/{IMAGE_NAME}/tags/list?n=1000&last=tag-b"
9
+
10
+
11
+ def _make_response(tags, links=None):
12
+ resp = MagicMock()
13
+ resp.ok = True
14
+ resp.json.return_value = {"tags": tags}
15
+ resp.links = links or {}
16
+ return resp
17
+
18
+
19
+ def test_azure_registry_follows_pagination_links():
20
+ first_page = _make_response(
21
+ ["tag-a", "tag-b"],
22
+ links= {
23
+ 'next': {
24
+ 'url': NEXT_PAGE_URL,
25
+ 'rel': 'next'
26
+ }
27
+ }
28
+ )
29
+ second_page = _make_response(["tag-c"], links=None)
30
+ requested_urls = []
31
+
32
+ def fake_get(url, headers=None, verify=None, proxies=None):
33
+ requested_urls.append(url)
34
+ if url == FIRST_PAGE_URL:
35
+ return first_page
36
+ if url == NEXT_PAGE_URL:
37
+ return second_page
38
+ raise AssertionError(f"Unexpected URL requested: {url}")
39
+
40
+ registry = AzureContainerRegistry()
41
+ with patch("assemblyline_core.updater.helper.requests.get", side_effect=fake_get):
42
+ tags = registry._get_proprietary_registry_tags(
43
+ server=SERVER, image_name=IMAGE_NAME, auth="Bearer token", verify=True
44
+ )
45
+
46
+ assert tags == ["tag-a", "tag-b", "tag-c"]
47
+ assert requested_urls == [FIRST_PAGE_URL, NEXT_PAGE_URL]
@@ -1 +0,0 @@
1
- 4.7.5.dev45