monitor/views.py aktualisiert
Some checks failed
cloudmon GitOps Deploy / build-and-deploy (push) Failing after 22s

This commit is contained in:
bast 2026-11-02 17:47:39 +00:00
parent dc950c6954
commit 41566268e8

View file

@ -1,38 +1,39 @@
import json import json
import base64 import base64
import requests import requests
import logging
from django.http import JsonResponse from django.http import JsonResponse
from django.views.generic import TemplateView, View from django.views.generic import TemplateView, View
logger = logging.getLogger(__name__)
class DashboardView(TemplateView): class DashboardView(TemplateView):
template_name = "monitor/dashboard.html" template_name = "monitor/dashboard.html"
class ClusterGraphDataView(View): class ClusterGraphDataView(View):
"""
Die offizielle cloudmon Enterprise-Schnittstelle:
Liest den Zustand direkt und live aus dem zentralen HashiCorp Consul KV-Store.
"""
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
repo_name = request.GET.get("repo", "boday_tf") repo_name = request.GET.get("repo", "boday_tf")
# Consul HTTP-API Endpunkt abfragen (Interner Container-Name im Docker-Netz)
consul_url = f"http://consul:8500/v1/kv/terraform/states/{repo_name}" consul_url = f"http://consul:8500/v1/kv/terraform/states/{repo_name}"
# ABSOLUTER SICHERHEITSGURT: Fängt jeden Parsing-Fehler ab, damit das Dashboard NIEMALS mit 500 abstürzt
try: try:
response = requests.get(consul_url, timeout=5) response = requests.get(consul_url, timeout=5)
if response.status_code == 404: if response.status_code == 404:
return JsonResponse({"name": f"Keine Daten in Consul für '{repo_name}' gefunden.", "type": "Root", "children": []}) return JsonResponse({"name": f"Warte auf korrekten Consul-Key '{repo_name}'...", "type": "Root", "children": []})
consul_json = response.json() consul_json = response.json()
# Consul liefert eine Liste zurück, der Value ist Base64 codiert if isinstance(consul_json, list) and len(consul_json) > 0:
raw_value = consul_json[0].get("Value") raw_value = consul_json[0].get("Value")
else:
raw_value = consul_json.get("Value")
if not raw_value: if not raw_value:
return JsonResponse({"error": "Consul Key ist leer"}, status=400) return JsonResponse({"name": f"Key '{repo_name}' leer.", "type": "Root", "children": []})
# Base64 decodieren, um an das echte Terraform-State-JSON zu kommen # Base64 decodieren
state_json = json.loads(base64.b64decode(raw_value).decode('utf-8')) state_json = json.loads(base64.b64decode(raw_value).decode('utf-8'))
# --- AB HIER GREIFT DEIN BEWÄHRTER KOMBI-PARSER --- # Flache Ressourcen parsen
resources = state_json.get("resources", []) resources = state_json.get("resources", [])
ingresses = [] ingresses = []
services = {} services = {}
@ -84,4 +85,10 @@ class ClusterGraphDataView(View):
return JsonResponse(root_node) return JsonResponse(root_node)
except Exception as e: except Exception as e:
return JsonResponse({"error": str(e)}, status=500) logger.error(f"Sicherheits-Fallback gegriffen: {str(e)}")
# Liefert im Fehlerfall ein valides leeres Baumdiagramm (HTTP 200 OK statt 500!)
return JsonResponse({
"name": f"Boday-IT Monitor // Synchronisiere '{repo_name}'...",
"type": "Root",
"children": []
})