aquafire / paginate_tags.py

Last active 6 months ago

Like 0

aquafire revised this gist 10 months ago · ee05a00

1 file changed, 55 insertions

paginate_tags.py (file created)
@@ -0,0 +1,55 @@
1 + async def get_artifacts(
2 + client: HarborAsyncClient,
3 + project_name: str,
4 + repository_name: str,
5 + page_number: int,
6 + page_size: int,
7 + ) -> List[str]:
8 + # номер страницы с артефактами в Harbor
9 + harbor_page_number = 1
10 + # номер страницы с тегами (RIM)
11 + rim_page_number = page_number # используем входной page_number
12 + # буфер под все собранные теги
13 + all_tags = []
14 +
15 + # собираем ВСЕ теги из Harbor
16 + while True:
17 + # считываем из Harbor артефакты
18 + artifacts = await client.get_artifacts(
19 + project_name=project_name,
20 + repository_name=repository_name,
21 + page=harbor_page_number,
22 + page_size=10,
23 + limit=10,
24 + )
25 +
26 + print(f"Harbor page number: {harbor_page_number}")
27 +
28 + # обрабатываем артефакты
29 + for artifact in artifacts:
30 + # проверяем есть ли тэги
31 + if artifact.tags:
32 + # перебираем все ссылки на тэги
33 + for tag_reference in artifact.tags:
34 + # путь до артефакта
35 + artifact_name = (
36 + f"{project_name}/{repository_name}:{tag_reference.name}"
37 + )
38 + all_tags.append(artifact_name)
39 +
40 + # если нет артефактов - выходим
41 + if not artifacts:
42 + break
43 +
44 + # увеличичиваем номер страницы в harbor
45 + harbor_page_number += 1
46 +
47 + # применяем пагинацию к собранным тегам
48 + start_idx = (rim_page_number - 1) * page_size
49 + end_idx = start_idx + page_size
50 +
51 + # проверяем валидность запрошенной страницы
52 + if start_idx >= len(all_tags):
53 + return [] # несуществующая страница - пустой результат
54 +
55 + return all_tags[start_idx:end_idx]