101 lines
4.4 KiB
Python
101 lines
4.4 KiB
Python
# websocket_server/events/docker.py
|
|
|
|
from flask_socketio import SocketIO
|
|
from datetime import datetime
|
|
import logging
|
|
import requests
|
|
import json
|
|
|
|
from websocket_server.events import base
|
|
|
|
logger = logging.getLogger("websocket_server")
|
|
socketio = base.socketio
|
|
|
|
api_server_url = "http://172.17.0.1:5000/api"
|
|
|
|
def register_socketio_handlers(socketio):
|
|
|
|
|
|
@socketio.on("docker_event")
|
|
def handle_docker_event(data):
|
|
"""Process docker-related status events arriving from workers."""
|
|
try:
|
|
worker_id = data.get("worker_id")
|
|
event_type = data.get("type") # e.g. docker_start, docker_die, docker_launch_failed
|
|
details = data.get("details", {})
|
|
|
|
container_id = details.get("container_id")
|
|
system_container_id = details.get("system_container_id")
|
|
container_name = details.get("container_name")
|
|
unix_timestamp = details.get("timestamp")
|
|
timestamp = datetime.utcfromtimestamp(unix_timestamp).isoformat()
|
|
status = details.get("details", {}).get("status")
|
|
image = details.get("details", {}).get("from")
|
|
action = details.get("details", {}).get("Action")
|
|
error = details.get("details", {}).get("error")
|
|
|
|
# ----------------- logging boilerplate ----------------------- #
|
|
logger.info(f"Received Docker event from worker {worker_id}:")
|
|
logger.info(f" Event Type: {event_type}")
|
|
logger.info(f" Docker Container ID: {container_id}")
|
|
logger.info(f" System Container ID: {system_container_id}")
|
|
logger.info(f" Container Name: {container_name}")
|
|
logger.info(f" Timestamp: {timestamp}")
|
|
logger.info(f" Status: {status}")
|
|
logger.info(f" Image: {image}")
|
|
logger.info(f" Action: {action}")
|
|
logger.info(f" Error: {error}")
|
|
logger.debug(f"Full event details: {data}")
|
|
|
|
# ------------------- status-update calls --------------------- #
|
|
if event_type in (
|
|
"docker_running",
|
|
"docker_start",
|
|
"docker_destroy",
|
|
"docker_die",
|
|
"docker_launch_failed",
|
|
"docker_pull_progress",
|
|
"docker_absent",
|
|
):
|
|
action_URL = f"workloads/containers/status_update/{system_container_id}"
|
|
|
|
if event_type == "docker_pull_progress":
|
|
# Handle pull progress events
|
|
pull_progress = details.get("pull_progress", {})
|
|
payload = {
|
|
"new_status": "pulling",
|
|
"system_container_id": system_container_id,
|
|
"worker_id": worker_id,
|
|
"timestamp": timestamp,
|
|
"pull_progress": pull_progress,
|
|
**({"error": error} if error else {})
|
|
}
|
|
logger.info(f"Processing pull progress update for container {system_container_id}: {pull_progress.get('bytes_downloaded', 0)} bytes, {pull_progress.get('layers_completed', 0)}/{pull_progress.get('layers_total', 0)} layers")
|
|
else:
|
|
# Handle standard status events
|
|
new_status_map = {
|
|
"docker_start": "running",
|
|
"docker_running": "running",
|
|
"docker_destroy": "deleted",
|
|
"docker_absent": "deleted",
|
|
"docker_die": "dead",
|
|
"docker_launch_failed": "launch_failed",
|
|
}
|
|
payload = {
|
|
"new_status": new_status_map[event_type],
|
|
"system_container_id": system_container_id,
|
|
"worker_id": worker_id,
|
|
"timestamp": timestamp,
|
|
**({"error": error} if error else {})
|
|
}
|
|
|
|
headers = {"Content-Type": "application/json"}
|
|
websocket_server_response = requests.put(
|
|
f"{api_server_url}/{action_URL}",
|
|
data=json.dumps(payload),
|
|
headers=headers,
|
|
)
|
|
logger.info("Status update sent to API server")
|
|
|
|
except Exception as e:
|
|
logger.error(f"Error processing Docker event: {e}") |