Show k8s event on instance page
This commit is contained in:
parent
c853153533
commit
fc93a77d9d
2 changed files with 90 additions and 0 deletions
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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">
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue