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.
- {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/PKG-INFO +1 -1
- assemblyline_core-4.7.5.dev46/assemblyline_core/VERSION +1 -0
- {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/updater/helper.py +26 -5
- {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core.egg-info/PKG-INFO +1 -1
- {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core.egg-info/SOURCES.txt +1 -0
- assemblyline_core-4.7.5.dev46/test/test_updater_helper.py +47 -0
- assemblyline_core-4.7.5.dev45/assemblyline_core/VERSION +0 -1
- {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/LICENCE.md +0 -0
- {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/README.md +0 -0
- {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/__init__.py +0 -0
- {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/alerter/__init__.py +0 -0
- {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/alerter/processing.py +0 -0
- {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/alerter/run_alerter.py +0 -0
- {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/archiver/__init__.py +0 -0
- {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/archiver/run_archiver.py +0 -0
- {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/badlist_client.py +0 -0
- {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/dispatching/__init__.py +0 -0
- {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/dispatching/client.py +0 -0
- {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/dispatching/dispatcher.py +0 -0
- {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/dispatching/schedules.py +0 -0
- {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/expiry/__init__.py +0 -0
- {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/expiry/run_expiry.py +0 -0
- {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/ingester/__init__.py +0 -0
- {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/ingester/constants.py +0 -0
- {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/ingester/ingester.py +0 -0
- {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/metrics/__init__.py +0 -0
- {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/metrics/es_metrics.py +0 -0
- {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/metrics/heartbeat_formatter.py +0 -0
- {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/metrics/helper.py +0 -0
- {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/metrics/metrics_server.py +0 -0
- {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/metrics/run_heartbeat_manager.py +0 -0
- {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/metrics/run_metrics_aggregator.py +0 -0
- {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/metrics/run_statistics_aggregator.py +0 -0
- {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/replay/__init__.py +0 -0
- {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/replay/client.py +0 -0
- {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/replay/creator/__init__.py +0 -0
- {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/replay/creator/run.py +0 -0
- {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/replay/creator/run_worker.py +0 -0
- {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/replay/loader/__init__.py +0 -0
- {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/replay/loader/run.py +0 -0
- {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/replay/loader/run_worker.py +0 -0
- {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/replay/replay.py +0 -0
- {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/safelist_client.py +0 -0
- {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/scaler/__init__.py +0 -0
- {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/scaler/collection.py +0 -0
- {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/scaler/controllers/__init__.py +0 -0
- {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/scaler/controllers/docker_ctl.py +0 -0
- {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/scaler/controllers/interface.py +0 -0
- {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/scaler/controllers/kubernetes_ctl.py +0 -0
- {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/scaler/run_scaler.py +0 -0
- {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/scaler/scaler_server.py +0 -0
- {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/server_base.py +0 -0
- {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/signature_client.py +0 -0
- {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/submission_client.py +0 -0
- {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/tasking_client.py +0 -0
- {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/updater/__init__.py +0 -0
- {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/updater/run_updater.py +0 -0
- {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/vacuum/__init__.py +0 -0
- {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/vacuum/crawler.py +0 -0
- {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/vacuum/department_map.py +0 -0
- {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/vacuum/safelist.py +0 -0
- {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/vacuum/stream_map.py +0 -0
- {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/vacuum/worker.py +0 -0
- {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/workflow/__init__.py +0 -0
- {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/workflow/run_workflow.py +0 -0
- {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core.egg-info/dependency_links.txt +0 -0
- {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core.egg-info/requires.txt +0 -0
- {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core.egg-info/top_level.txt +0 -0
- {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/setup.cfg +0 -0
- {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/setup.py +0 -0
- {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/test/test_alerter.py +0 -0
- {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/test/test_badlist_client.py +0 -0
- {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/test/test_expiry.py +0 -0
- {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/test/test_replay.py +0 -0
- {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/test/test_safelist_client.py +0 -0
- {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/test/test_scaler.py +0 -0
- {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/test/test_scheduler.py +0 -0
- {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/test/test_signature_client.py +0 -0
- {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/test/test_tasking_client.py +0 -0
- {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/test/test_vacuum.py +0 -0
- {assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/test/test_workflow.py +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
4.7.5.dev46
|
{assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/updater/helper.py
RENAMED
|
@@ -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
|
-
|
|
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
|
-
|
|
98
|
-
|
|
103
|
+
tags = []
|
|
104
|
+
while resp and resp.ok:
|
|
99
105
|
resp_data = resp.json()
|
|
100
|
-
|
|
106
|
+
tags.extend(resp_data.get('tags') or [])
|
|
101
107
|
|
|
102
|
-
|
|
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)]
|
|
@@ -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
|
|
File without changes
|
|
File without changes
|
{assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/badlist_client.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/expiry/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/metrics/helper.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/replay/__init__.py
RENAMED
|
File without changes
|
{assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/replay/client.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/replay/replay.py
RENAMED
|
File without changes
|
{assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/safelist_client.py
RENAMED
|
File without changes
|
{assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/scaler/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/server_base.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/tasking_client.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/vacuum/__init__.py
RENAMED
|
File without changes
|
{assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/vacuum/crawler.py
RENAMED
|
File without changes
|
|
File without changes
|
{assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/vacuum/safelist.py
RENAMED
|
File without changes
|
|
File without changes
|
{assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/assemblyline_core/vacuum/worker.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/test/test_safelist_client.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{assemblyline_core-4.7.5.dev45 → assemblyline_core-4.7.5.dev46}/test/test_signature_client.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|