mirror of
https://github.com/ublue-os/forge.git
synced 2025-04-12 09:43:44 +03:00
66 lines
2.4 KiB
Python
66 lines
2.4 KiB
Python
import requests
|
|
from nicegui import ui
|
|
|
|
|
|
class DockerRegistry:
|
|
|
|
def __init__(
|
|
self,
|
|
*,
|
|
registry_url: str = "https://registry.ublue.local",
|
|
registry_root_cert: str = "/data/ublue-os_forge-root.pem",
|
|
) -> None:
|
|
"""
|
|
Docker Registry integration for ublue-os forge
|
|
"""
|
|
|
|
self.registry_url = registry_url
|
|
self.registry_root_cert = registry_root_cert
|
|
|
|
def get_repositories(self) -> list:
|
|
endpoint = f"{self.registry_url}/v2/_catalog"
|
|
response = requests.get(url=endpoint, verify=self.registry_root_cert)
|
|
if response.status_code == 200:
|
|
repositories = response.json()["repositories"]
|
|
else:
|
|
with self, ui.notify() as notify:
|
|
notify(message=f"Error: {response.text}")
|
|
return repositories
|
|
|
|
def get_image_tags(self, image_name=str) -> dict:
|
|
endpoint = f"{self.registry_url}/v2/{image_name}/tags/list"
|
|
response = requests.get(url=endpoint, verify=self.registry_root_cert)
|
|
if response.status_code == 200:
|
|
tags = response.json()["tags"]
|
|
else:
|
|
with self, ui.notify() as notify:
|
|
notify(message=f"Error: {response.text}")
|
|
return tags
|
|
|
|
def get_image_manifest(self, image_name=str, image_tag=str) -> dict:
|
|
endpoint = f"{self.registry_url}/v2/{image_name}/manifests/{image_tag}"
|
|
headers = {"accept": "application/vnd.oci.image.manifest.v1+json"}
|
|
response = requests.get(
|
|
url=endpoint, verify=self.registry_root_cert, headers=headers
|
|
)
|
|
if response.status_code == 200:
|
|
manifest = response.json()
|
|
else:
|
|
with self, ui.notify() as notify:
|
|
notify(message=f"Error: {response.text}")
|
|
return manifest
|
|
|
|
def get_all_image_info(self, image_name=str) -> list:
|
|
repositories = self.get_repositories()
|
|
all_image_info = []
|
|
for repository in repositories:
|
|
tags = self.get_image_tags(image_name=repository)
|
|
for tag in tags:
|
|
manifest = self.get_image_manifest(image_name=repository, image_tag=tag)
|
|
image_info = {
|
|
"name": repository,
|
|
"tags": [{"name": tag, "manifest": manifest}],
|
|
}
|
|
all_image_info.append(image_info)
|
|
return all_image_info
|