From 245fad39a94ea3af0a3b2080bccf63f0e827b5f5 Mon Sep 17 00:00:00 2001 From: "Michael N. Lipp" Date: Tue, 9 Jan 2024 13:56:19 +0100 Subject: [PATCH] Add event generation. --- .../org/jdrupes/vmoperator/common/K8s.java | 17 ++++++++++++ .../vmoperator/runner/qemu/StatusUpdater.java | 27 +++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/org.jdrupes.vmoperator.common/src/org/jdrupes/vmoperator/common/K8s.java b/org.jdrupes.vmoperator.common/src/org/jdrupes/vmoperator/common/K8s.java index 5a87ecd..f61b431 100644 --- a/org.jdrupes.vmoperator.common/src/org/jdrupes/vmoperator/common/K8s.java +++ b/org.jdrupes.vmoperator.common/src/org/jdrupes/vmoperator/common/K8s.java @@ -30,12 +30,14 @@ import io.kubernetes.client.openapi.models.V1ConfigMap; import io.kubernetes.client.openapi.models.V1ConfigMapList; import io.kubernetes.client.openapi.models.V1GroupVersionForDiscovery; import io.kubernetes.client.openapi.models.V1ObjectMeta; +import io.kubernetes.client.openapi.models.V1ObjectReference; import io.kubernetes.client.openapi.models.V1PersistentVolumeClaim; import io.kubernetes.client.openapi.models.V1PersistentVolumeClaimList; import io.kubernetes.client.openapi.models.V1Pod; import io.kubernetes.client.openapi.models.V1PodList; import io.kubernetes.client.util.generic.GenericKubernetesApi; import io.kubernetes.client.util.generic.dynamic.DynamicKubernetesApi; +import io.kubernetes.client.util.generic.dynamic.DynamicKubernetesObject; import io.kubernetes.client.util.generic.options.DeleteOptions; import io.kubernetes.client.util.generic.options.PatchOptions; import java.util.Optional; @@ -204,4 +206,19 @@ public class K8s { return response.getObject(); } + /** + * Create an object reference. + * + * @param object the object + * @return the v 1 object reference + */ + public static V1ObjectReference + objectReference(DynamicKubernetesObject object) { + return new V1ObjectReference().apiVersion(object.getApiVersion()) + .kind(object.getKind()) + .namespace(object.getMetadata().getNamespace()) + .name(object.getMetadata().getName()) + .resourceVersion(object.getMetadata().getResourceVersion()) + .uid(object.getMetadata().getUid()); + } } diff --git a/org.jdrupes.vmoperator.runner.qemu/src/org/jdrupes/vmoperator/runner/qemu/StatusUpdater.java b/org.jdrupes.vmoperator.runner.qemu/src/org/jdrupes/vmoperator/runner/qemu/StatusUpdater.java index 4edcb46..542fa06 100644 --- a/org.jdrupes.vmoperator.runner.qemu/src/org/jdrupes/vmoperator/runner/qemu/StatusUpdater.java +++ b/org.jdrupes.vmoperator.runner.qemu/src/org/jdrupes/vmoperator/runner/qemu/StatusUpdater.java @@ -24,8 +24,11 @@ import io.kubernetes.client.custom.Quantity.Format; import io.kubernetes.client.openapi.ApiException; import io.kubernetes.client.openapi.apis.ApisApi; import io.kubernetes.client.openapi.apis.CustomObjectsApi; +import io.kubernetes.client.openapi.apis.EventsV1Api; +import io.kubernetes.client.openapi.models.EventsV1Event; import io.kubernetes.client.openapi.models.V1APIGroup; import io.kubernetes.client.openapi.models.V1GroupVersionForDiscovery; +import io.kubernetes.client.openapi.models.V1ObjectMeta; import io.kubernetes.client.util.Config; import io.kubernetes.client.util.generic.dynamic.DynamicKubernetesApi; import io.kubernetes.client.util.generic.dynamic.DynamicKubernetesObject; @@ -34,12 +37,15 @@ import java.math.BigDecimal; import java.nio.file.Files; import java.nio.file.Path; import java.time.Instant; +import java.time.OffsetDateTime; import java.util.Map; import java.util.Optional; import java.util.Set; import java.util.logging.Level; +import static org.jdrupes.vmoperator.common.Constants.APP_NAME; import static org.jdrupes.vmoperator.common.Constants.VM_OP_GROUP; import static org.jdrupes.vmoperator.common.Constants.VM_OP_KIND_VM; +import org.jdrupes.vmoperator.common.K8s; import org.jdrupes.vmoperator.runner.qemu.events.BalloonChangeEvent; import org.jdrupes.vmoperator.runner.qemu.events.Exit; import org.jdrupes.vmoperator.runner.qemu.events.HotpluggableCpuStatus; @@ -67,6 +73,7 @@ public class StatusUpdater extends Component { private String namespace; private String vmName; private DynamicKubernetesApi vmCrApi; + private EventsV1Api evtsApi; private long observedGeneration; /** @@ -149,6 +156,14 @@ public class StatusUpdater extends Component { event.cancel(true); fire(new Exit(1)); } + try { + evtsApi = new EventsV1Api(Config.defaultClient()); + } catch (IOException e) { + logger.log(Level.SEVERE, e, + () -> "Cannot access events API, terminating."); + event.cancel(true); + fire(new Exit(1)); + } } private void initVmCrApi(Start event) throws IOException, ApiException { @@ -252,6 +267,18 @@ public class StatusUpdater extends Component { } return status; }).throwsApiException(); + + // Log event + var evt = new EventsV1Event().kind("Event") + .metadata(new V1ObjectMeta().namespace(namespace) + .generateName("vmrunner-")) + .reportingController(VM_OP_GROUP + "/" + APP_NAME) + .reportingInstance(vmCr.getMetadata().getName()) + .eventTime(OffsetDateTime.now()).type("Normal") + .regarding(K8s.objectReference(vmCr)) + .action("StatusUpdate").reason(event.reason()) + .note(event.message()); + evtsApi.createNamespacedEvent(namespace, evt, null, null, null, null); } private void updateRunningCondition(RunnerStateChange event,