|
|
import requests
|
|
|
from django.shortcuts import render, redirect
|
|
|
from django.urls import reverse
|
|
|
|
|
|
DOCKER_REGISTRY_URL = "https://registry.reymota.es/v2"
|
|
|
REGISTRY_USERNAME = "creylopez"
|
|
|
REGISTRY_PASSWORD = "Rey-1176"
|
|
|
|
|
|
def get_docker_registry_data():
|
|
|
# Autenticarse en el registro Docker
|
|
|
response = requests.get(f"{DOCKER_REGISTRY_URL}/_catalog", auth=(REGISTRY_USERNAME, REGISTRY_PASSWORD))
|
|
|
|
|
|
if response.status_code == 200:
|
|
|
repositories = response.json().get('repositories', [])
|
|
|
registry_data = []
|
|
|
|
|
|
for repo in repositories:
|
|
|
tags_response = requests.get(f"{DOCKER_REGISTRY_URL}/{repo}/tags/list", auth=(REGISTRY_USERNAME, REGISTRY_PASSWORD))
|
|
|
if tags_response.status_code == 200:
|
|
|
tags = tags_response.json().get('tags', [])
|
|
|
registry_data.append({'repository': repo, 'tags': tags})
|
|
|
|
|
|
return registry_data
|
|
|
else:
|
|
|
return []
|
|
|
|
|
|
def registry_list(request):
|
|
|
data = get_docker_registry_data()
|
|
|
return render(request, 'registry/registry_list.html', {'data': data})
|
|
|
|
|
|
# Nueva vista para mostrar los detalles de un repositorio específico
|
|
|
def repository_detail(request, repository_name):
|
|
|
tags_response = requests.get(f"{DOCKER_REGISTRY_URL}/{repository_name}/tags/list", auth=(REGISTRY_USERNAME, REGISTRY_PASSWORD))
|
|
|
|
|
|
if tags_response.status_code == 200:
|
|
|
tags = tags_response.json().get('tags', [])
|
|
|
else:
|
|
|
tags = []
|
|
|
|
|
|
return render(request, 'registry/repository_detail.html', {'repository': repository_name, 'tags': tags})
|
|
|
|
|
|
# Vista para eliminar un tag específico
|
|
|
def delete_tag(request, repository_name, tag):
|
|
|
manifest_url = f"{DOCKER_REGISTRY_URL}/{repository_name}/manifests/{tag}"
|
|
|
|
|
|
# Obtener el digest del tag
|
|
|
manifest_response = requests.head(manifest_url, auth=(REGISTRY_USERNAME, REGISTRY_PASSWORD), headers={"Accept": "application/vnd.docker.distribution.manifest.v2+json"})
|
|
|
print("delete_tag: manifest_url ", manifest_url)
|
|
|
if manifest_response.status_code == 200:
|
|
|
digest = manifest_response.headers.get('Docker-Content-Digest')
|
|
|
delete_response = requests.delete(f"{DOCKER_REGISTRY_URL}/{repository_name}/manifests/{digest}", auth=(REGISTRY_USERNAME, REGISTRY_PASSWORD))
|
|
|
print("delete_tag: digest->",digest)
|
|
|
if delete_response.status_code == 202:
|
|
|
return redirect(reverse('repository_detail', args=[repository_name]))
|
|
|
else:
|
|
|
# Obtener las etiquetas nuevamente para renderizar la plantilla
|
|
|
tags_response = requests.get(f"{DOCKER_REGISTRY_URL}/{repository_name}/tags/list", auth=(REGISTRY_USERNAME, REGISTRY_PASSWORD))
|
|
|
tags = tags_response.json().get('tags', []) if tags_response.status_code == 200 else []
|
|
|
return render(request, 'registry/repository_detail.html', {'repository': repository_name, 'tags': tags, 'error': 'Error deleting the tag.'})
|
|
|
else:
|
|
|
# Obtener las etiquetas nuevamente para renderizar la plantilla
|
|
|
tags_response = requests.get(f"{DOCKER_REGISTRY_URL}/{repository_name}/tags/list", auth=(REGISTRY_USERNAME, REGISTRY_PASSWORD))
|
|
|
tags = tags_response.json().get('tags', []) if tags_response.status_code == 200 else []
|
|
|
return render(request, 'registry/repository_detail.html', {'repository': repository_name, 'tags': tags, 'error': 'Tag not found.'})
|