import { Renderer } from "@k8slens/extensions"; import React from "react"; import { KubeJsonApiData } from '@k8slens/extensions/dist/src/common/k8s-api/kube-json-api' import { IKubeWatchEvent } from '@k8slens/extensions/dist/src/common/k8s-api/kube-watch-event' import { Kustomization } from "../k8s/fluxcd/kustomization"; interface KustomizationDetailsState { events: Renderer.K8sApi.KubeEvent[] } const KubeObject = Renderer.K8sApi.KubeObject; const { Component: { Table, TableHead, TableRow, TableCell, DrawerTitle, DrawerItem } } = Renderer export class FluxCDKustomizationDetails extends React.Component, KustomizationDetailsState> { public readonly state: Readonly = { events: [] } unsubscribe: any; componentWillUnmount() { if (this.unsubscribe) this.unsubscribe() } async loadData() { this.setState({ events: [] }) const events = await Renderer.K8sApi.eventApi.list({}, { fieldSelector: [ `involvedObject.uid=${this.props.object.metadata.uid}`, ] }).then(res => res.sort((a, b) => b.lastTimestamp.localeCompare(a.lastTimestamp))) this.setState({ events }) console.log("Will watch %s (%s)", this.props.object.metadata.name, this.props.object.metadata.uid) this.unsubscribe = Renderer.K8sApi.eventApi.watch({ namespace: "", callback: (data: IKubeWatchEvent) => { if (!data) { return } if (data.type === "ERROR") { return } const { object: currentObject } = this.props const { type, object } = data const kubeObject = new KubeObject(object) const event = new Renderer.K8sApi.KubeEvent(kubeObject) const existingObjectIndex = events.findIndex(e => e.metadata.uid === object.metadata.uid) const existingObject = events[existingObjectIndex] if (event.involvedObject.uid !== currentObject.metadata.uid) { return } switch (type) { case 'ADDED': case 'MODIFIED': if (!existingObject) { events.unshift(event) } else { events[existingObjectIndex] = event } break; case 'DELETED': if (existingObject) { events.splice(existingObjectIndex, 1) } } this.setState({ events }) } }) } getSnapshotBeforeUpdate(prevProps: Readonly>, prevState: Readonly) { if (this.props.object.metadata.uid !== prevProps.object.metadata.uid) { this.loadData() } } async componentDidMount() { this.loadData() } render() { const { events } = this.state const { object } = this.props return (
{object.metadata.name} {object.metadata.namespace} { e.preventDefault(); Renderer.Navigation.showDetails(object.selfLink, true) }}> {object.spec.sourceRef.kind}:{object.spec.sourceRef.name} {object.spec.path} {object.spec.interval} {object.spec.suspend === true ? 'Yes' : 'No'} {object.spec.prune === true ? 'Yes' : 'No'} {object.status.lastAppliedRevision} {object.status?.conditions.find((s: any) => s.type === "Ready").status} {object.status?.conditions.find((s: any) => s.type === "Ready").message} {object.metadata.resourceVersion} {object.metadata.uid} Events
{events.map(e => (
{e.message}
{e.source.component} {e.count} {e.involvedObject.fieldPath} {e.lastTimestamp} {e.reason}
))}
) } }