Add event generation.

This commit is contained in:
Michael Lipp 2024-01-09 13:56:19 +01:00
parent 41a0ef1adb
commit 245fad39a9
2 changed files with 44 additions and 0 deletions

View file

@ -30,12 +30,14 @@ import io.kubernetes.client.openapi.models.V1ConfigMap;
import io.kubernetes.client.openapi.models.V1ConfigMapList; import io.kubernetes.client.openapi.models.V1ConfigMapList;
import io.kubernetes.client.openapi.models.V1GroupVersionForDiscovery; import io.kubernetes.client.openapi.models.V1GroupVersionForDiscovery;
import io.kubernetes.client.openapi.models.V1ObjectMeta; 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.V1PersistentVolumeClaim;
import io.kubernetes.client.openapi.models.V1PersistentVolumeClaimList; import io.kubernetes.client.openapi.models.V1PersistentVolumeClaimList;
import io.kubernetes.client.openapi.models.V1Pod; import io.kubernetes.client.openapi.models.V1Pod;
import io.kubernetes.client.openapi.models.V1PodList; import io.kubernetes.client.openapi.models.V1PodList;
import io.kubernetes.client.util.generic.GenericKubernetesApi; import io.kubernetes.client.util.generic.GenericKubernetesApi;
import io.kubernetes.client.util.generic.dynamic.DynamicKubernetesApi; 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.DeleteOptions;
import io.kubernetes.client.util.generic.options.PatchOptions; import io.kubernetes.client.util.generic.options.PatchOptions;
import java.util.Optional; import java.util.Optional;
@ -204,4 +206,19 @@ public class K8s {
return response.getObject(); 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());
}
} }

View file

@ -24,8 +24,11 @@ import io.kubernetes.client.custom.Quantity.Format;
import io.kubernetes.client.openapi.ApiException; import io.kubernetes.client.openapi.ApiException;
import io.kubernetes.client.openapi.apis.ApisApi; import io.kubernetes.client.openapi.apis.ApisApi;
import io.kubernetes.client.openapi.apis.CustomObjectsApi; 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.V1APIGroup;
import io.kubernetes.client.openapi.models.V1GroupVersionForDiscovery; 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.Config;
import io.kubernetes.client.util.generic.dynamic.DynamicKubernetesApi; import io.kubernetes.client.util.generic.dynamic.DynamicKubernetesApi;
import io.kubernetes.client.util.generic.dynamic.DynamicKubernetesObject; 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.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.time.Instant; import java.time.Instant;
import java.time.OffsetDateTime;
import java.util.Map; import java.util.Map;
import java.util.Optional; import java.util.Optional;
import java.util.Set; import java.util.Set;
import java.util.logging.Level; 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_GROUP;
import static org.jdrupes.vmoperator.common.Constants.VM_OP_KIND_VM; 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.BalloonChangeEvent;
import org.jdrupes.vmoperator.runner.qemu.events.Exit; import org.jdrupes.vmoperator.runner.qemu.events.Exit;
import org.jdrupes.vmoperator.runner.qemu.events.HotpluggableCpuStatus; import org.jdrupes.vmoperator.runner.qemu.events.HotpluggableCpuStatus;
@ -67,6 +73,7 @@ public class StatusUpdater extends Component {
private String namespace; private String namespace;
private String vmName; private String vmName;
private DynamicKubernetesApi vmCrApi; private DynamicKubernetesApi vmCrApi;
private EventsV1Api evtsApi;
private long observedGeneration; private long observedGeneration;
/** /**
@ -149,6 +156,14 @@ public class StatusUpdater extends Component {
event.cancel(true); event.cancel(true);
fire(new Exit(1)); 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 { private void initVmCrApi(Start event) throws IOException, ApiException {
@ -252,6 +267,18 @@ public class StatusUpdater extends Component {
} }
return status; return status;
}).throwsApiException(); }).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, private void updateRunningCondition(RunnerStateChange event,