Show k8s event on instance page

This commit is contained in:
Tobias Kunze 2025-12-09 15:53:16 +01:00
parent ee2efe1d47
commit a698d4b0ec
2 changed files with 90 additions and 0 deletions

View file

@ -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)

View file

@ -148,6 +148,51 @@
</div>
</div>
{% endif %}
{% if instance.kubernetes_events %}
<div class="card">
<div class="card-header">
<h4>{% translate "Events" %}</h4>
</div>
<div class="card-body">
<div class="row">
<div class="table-responsive">
<table class="table table-bordered table-sm">
<thead>
<tr>
<th style="width: 80px;">{% translate "Type" %}</th>
<th style="width: 150px;">{% translate "Reason" %}</th>
<th>{% translate "Message" %}</th>
<th style="width: 60px;">{% translate "Count" %}</th>
<th style="width: 180px;">{% translate "Last Seen" %}</th>
</tr>
</thead>
<tbody>
{% for event in instance.kubernetes_events %}
<tr>
<td>
{% if event.type == "Warning" %}
<span class="badge text-bg-warning">{{ event.type }}</span>
{% elif event.type == "Normal" %}
<span class="badge text-bg-success">{{ event.type }}</span>
{% else %}
<span class="badge text-bg-secondary">{{ event.type }}</span>
{% endif %}
</td>
<td>{{ event.reason|default:"-" }}</td>
<td>
<span class="text-break">{{ event.message|default:"-"|truncatewords:50 }}</span>
</td>
<td class="text-center">{{ event.count }}</td>
<td>{{ event.last_timestamp|localtime_tag }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>
</div>
{% endif %}
</div>
{% if instance.spec and spec_fieldsets %}
<div class="col-12">