diff --git a/deploy/crds/vms-crd.yaml b/deploy/crds/vms-crd.yaml index 017050f..0292b8d 100644 --- a/deploy/crds/vms-crd.yaml +++ b/deploy/crds/vms-crd.yaml @@ -999,6 +999,12 @@ spec: type: string enum: [ "Stopped", "Running" ] default: "Stopped" + guestShutdownStops: + description: >- + If true, sets the state to "Stopped" when + the VM terminates due to a shutdown by the guest. + type: boolean + default: false machineUuid: description: >- The machine's uuid. If none is specified, a uuid diff --git a/org.jdrupes.vmoperator.manager/resources/org/jdrupes/vmoperator/manager/runnerConfig.ftl.yaml b/org.jdrupes.vmoperator.manager/resources/org/jdrupes/vmoperator/manager/runnerConfig.ftl.yaml index 75371cc..d96a66b 100644 --- a/org.jdrupes.vmoperator.manager/resources/org/jdrupes/vmoperator/manager/runnerConfig.ftl.yaml +++ b/org.jdrupes.vmoperator.manager/resources/org/jdrupes/vmoperator/manager/runnerConfig.ftl.yaml @@ -63,6 +63,8 @@ data: + guestShutdownStops: ${ cr.spec.guestShutdownStops!false?string('true', 'false') } + # Define the VM (required) vm: # The VM's name (required) diff --git a/org.jdrupes.vmoperator.runner.qemu/config-sample.yaml b/org.jdrupes.vmoperator.runner.qemu/config-sample.yaml index 4dc87a2..c365a12 100644 --- a/org.jdrupes.vmoperator.runner.qemu/config-sample.yaml +++ b/org.jdrupes.vmoperator.runner.qemu/config-sample.yaml @@ -41,6 +41,11 @@ # config file's modification timestamp. .userData and .networkConfig # are optional. + # Whether a guest initiated shutdown event patches the state + # property in the CRD. + # "guestShutdownStops": + # false + # Define the VM (required) "vm": # The VM's name (required) diff --git a/org.jdrupes.vmoperator.runner.qemu/src/org/jdrupes/vmoperator/runner/qemu/Configuration.java b/org.jdrupes.vmoperator.runner.qemu/src/org/jdrupes/vmoperator/runner/qemu/Configuration.java index 192b44c..7fc3f95 100644 --- a/org.jdrupes.vmoperator.runner.qemu/src/org/jdrupes/vmoperator/runner/qemu/Configuration.java +++ b/org.jdrupes.vmoperator.runner.qemu/src/org/jdrupes/vmoperator/runner/qemu/Configuration.java @@ -76,6 +76,9 @@ public class Configuration implements Dto { /** Optional cloud-init data. */ public CloudInit cloudInit; + /** If guest shutdown changes CRD .vm.state to "Stopped". */ + public boolean guestShutdownStops; + /** The vm. */ @SuppressWarnings("PMD.ShortVariable") public Vm vm; 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 5f8cf13..1cb5e74 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 @@ -78,6 +78,7 @@ public class StatusUpdater extends Component { private DynamicKubernetesApi vmCrApi; private EventsV1Api evtsApi; private long observedGeneration; + private boolean guestShutdownStops; private boolean shutdownByGuest; /** @@ -217,6 +218,9 @@ public class StatusUpdater extends Component { @Handler public void onRunnerConfigurationUpdate(RunnerConfigurationUpdate event) throws ApiException { + guestShutdownStops = event.configuration().guestShutdownStops; + + // Remainder applies only if we have a connection to k8s. if (vmCrApi == null) { return; } @@ -274,7 +278,8 @@ public class StatusUpdater extends Component { // Maybe stop VM if (event.state() == State.TERMINATING && !event.failed() - && shutdownByGuest) { + && guestShutdownStops && shutdownByGuest) { + logger.info(() -> "Stopping VM because of shutdown by guest."); PatchOptions patchOpts = new PatchOptions(); patchOpts.setFieldManager("kubernetes-java-kubectl-apply"); var res = vmCrApi.patch(namespace, vmName,