From a698d4b0ec71fcf567452a053ead5a83456c236c Mon Sep 17 00:00:00 2001 From: Tobias Kunze Date: Tue, 9 Dec 2025 15:53:16 +0100 Subject: [PATCH] Show k8s event on instance page --- src/servala/core/models/service.py | 45 +++++++++++++++++++ .../service_instance_detail.html | 45 +++++++++++++++++++ 2 files changed, 90 insertions(+) diff --git a/src/servala/core/models/service.py b/src/servala/core/models/service.py index c2fedad..31527c5 100644 --- a/src/servala/core/models/service.py +++ b/src/servala/core/models/service.py @@ -1202,5 +1202,50 @@ class ServiceInstance(ServalaModelMixin, models.Model): except (AttributeError, KeyError, IndexError): return None + @cached_property + def kubernetes_events(self) -> dict: + """ + Returns a list of event dictionaries sorted by last timestamp (newest first). + """ + if not self.kubernetes_object: + return [] + + try: + v1 = kubernetes.client.CoreV1Api( + self.context.control_plane.get_kubernetes_client() + ) + events = v1.list_namespaced_event( + namespace=self.organization.namespace, + field_selector=f"involvedObject.name={self.name},involvedObject.kind={self.context.kind}", + ) + event_list = [] + for event in events.items: + event_dict = { + "type": event.type, # Normal or Warning + "reason": event.reason, + "message": event.message, + "count": event.count or 1, + "first_timestamp": ( + event.first_timestamp.isoformat() + if event.first_timestamp + else None + ), + "last_timestamp": ( + event.last_timestamp.isoformat() + if event.last_timestamp + else None + ), + "source": event.source.component if event.source else None, + } + event_list.append(event_dict) + + event_list.sort(key=lambda x: x.get("last_timestamp") or "", reverse=True) + + return event_list + except ApiException: + return [] + except Exception: + return [] + auditlog.register(ServiceInstance, exclude_fields=["updated_at"], serialize_data=True) diff --git a/src/servala/frontend/templates/frontend/organizations/service_instance_detail.html b/src/servala/frontend/templates/frontend/organizations/service_instance_detail.html index 06ef5df..dc6f1e3 100644 --- a/src/servala/frontend/templates/frontend/organizations/service_instance_detail.html +++ b/src/servala/frontend/templates/frontend/organizations/service_instance_detail.html @@ -148,6 +148,51 @@ {% endif %} + {% if instance.kubernetes_events %} +
+
+

{% translate "Events" %}

+
+
+
+
+ + + + + + + + + + + + {% for event in instance.kubernetes_events %} + + + + + + + + {% endfor %} + +
{% translate "Type" %}{% translate "Reason" %}{% translate "Message" %}{% translate "Count" %}{% translate "Last Seen" %}
+ {% if event.type == "Warning" %} + {{ event.type }} + {% elif event.type == "Normal" %} + {{ event.type }} + {% else %} + {{ event.type }} + {% endif %} + {{ event.reason|default:"-" }} + {{ event.message|default:"-"|truncatewords:50 }} + {{ event.count }}{{ event.last_timestamp|localtime_tag }}
+
+
+
+
+ {% endif %} {% if instance.spec and spec_fieldsets %}