import docker from typing import List, Dict, Any from datetime import datetime from ..models.container import Container, ContainerLog, ContainerStats class DockerService: def __init__(self): self.client = docker.from_env() async def list_containers(self) -> List[Container]: """Liste tous les conteneurs Docker.""" containers = self.client.containers.list(all=True) return [ Container( id=container.id, name=container.name, image=container.image.tags[0] if container.image.tags else container.image.id, status=container.status, ports=container.ports, created_at=datetime.fromtimestamp(container.attrs['Created']), updated_at=datetime.now() ) for container in containers ] async def get_container_logs(self, container_id: str) -> List[ContainerLog]: """Récupère les logs d'un conteneur.""" container = self.client.containers.get(container_id) logs = container.logs(tail=100, timestamps=True).decode('utf-8').split('\n') return [ ContainerLog( timestamp=datetime.fromisoformat(line.split(' ')[0].replace('T', ' ').replace('Z', '')), stream=line.split(' ')[1].strip('[]'), message=' '.join(line.split(' ')[2:]) ) for line in logs if line ] async def update_container(self, container_id: str) -> bool: """Met à jour un conteneur avec la dernière version de son image.""" try: container = self.client.containers.get(container_id) image = container.image container.stop() container.remove() new_container = self.client.containers.run( image=image.id, name=container.name, ports=container.ports, environment=container.attrs['Config']['Env'], restart_policy={"Name": container.attrs['HostConfig']['RestartPolicy']['Name']} ) return True except Exception as e: print(f"Erreur lors de la mise à jour du conteneur : {e}") return False async def get_container_stats(self, container_id: str) -> ContainerStats: """Récupère les statistiques d'un conteneur.""" container = self.client.containers.get(container_id) stats = container.stats(stream=False) # Calcul du pourcentage CPU cpu_delta = stats['cpu_stats']['cpu_usage']['total_usage'] - stats['precpu_stats']['cpu_usage']['total_usage'] system_delta = stats['cpu_stats']['system_cpu_usage'] - stats['precpu_stats']['system_cpu_usage'] cpu_percent = (cpu_delta / system_delta) * 100.0 if system_delta > 0 else 0.0 return ContainerStats( cpu_percent=cpu_percent, memory_usage=stats['memory_stats']['usage'], memory_limit=stats['memory_stats']['limit'], network_rx=stats['networks']['eth0']['rx_bytes'], network_tx=stats['networks']['eth0']['tx_bytes'], block_read=stats['blkio_stats']['io_service_bytes_recursive'][0]['value'], block_write=stats['blkio_stats']['io_service_bytes_recursive'][1]['value'], timestamp=datetime.now() )