From bf2c72891c5873578121c48dcd32e03406db1ac2 Mon Sep 17 00:00:00 2001 From: "Michael N. Lipp" Date: Fri, 11 Aug 2023 13:59:29 +0200 Subject: [PATCH] Force configuration update. --- .../vmoperator/manager/CmReconciler.java | 51 ++++++++++++++++++- 1 file changed, 49 insertions(+), 2 deletions(-) diff --git a/org.jdrupes.vmoperator.manager/src/org/jdrupes/vmoperator/manager/CmReconciler.java b/org.jdrupes.vmoperator.manager/src/org/jdrupes/vmoperator/manager/CmReconciler.java index 841eac4..85e2e94 100644 --- a/org.jdrupes.vmoperator.manager/src/org/jdrupes/vmoperator/manager/CmReconciler.java +++ b/org.jdrupes.vmoperator.manager/src/org/jdrupes/vmoperator/manager/CmReconciler.java @@ -20,13 +20,18 @@ package org.jdrupes.vmoperator.manager; import freemarker.template.Configuration; import freemarker.template.TemplateException; +import io.kubernetes.client.custom.V1Patch; +import io.kubernetes.client.openapi.ApiClient; import io.kubernetes.client.openapi.ApiException; import io.kubernetes.client.util.generic.dynamic.DynamicKubernetesApi; import io.kubernetes.client.util.generic.dynamic.DynamicKubernetesObject; import io.kubernetes.client.util.generic.dynamic.Dynamics; +import io.kubernetes.client.util.generic.options.ListOptions; +import io.kubernetes.client.util.generic.options.PatchOptions; import java.io.IOException; import java.io.StringWriter; import java.util.Map; +import java.util.logging.Logger; import org.jdrupes.vmoperator.manager.VmDefChanged.Type; /** @@ -35,6 +40,7 @@ import org.jdrupes.vmoperator.manager.VmDefChanged.Type; @SuppressWarnings("PMD.DataflowAnomalyAnalysis") /* default */ class CmReconciler { + protected final Logger logger = Logger.getLogger(getClass().getName()); private final Configuration fmConfig; /** @@ -81,8 +87,49 @@ import org.jdrupes.vmoperator.manager.VmDefChanged.Type; // https://github.com/kubernetes-client/java/issues/2741 var mapDef = Dynamics.newFromYaml(out.toString()); - // Apply - return K8s.apply(cmApi, mapDef, out.toString()); + // Apply and maybe force pod update + var newState = K8s.apply(cmApi, mapDef, out.toString()); + maybeForceUpdate(channel.client(), newState); + return newState; + } + + /** + * Triggers update of config map mounted in pod + * See https://ahmet.im/blog/kubernetes-secret-volumes-delay/ + * @param client + * + * @param newCm + */ + private void maybeForceUpdate(ApiClient client, + DynamicKubernetesObject newCm) { + ListOptions listOpts = new ListOptions(); + listOpts.setLabelSelector( + "app.kubernetes.io/managed-by=" + Constants.VM_OP_NAME + "," + + "app.kubernetes.io/name=" + Constants.APP_NAME); + // Get pod, selected by label + var podApi = new DynamicKubernetesApi("", "v1", "pods", client); + var pods = podApi + .list(newCm.getMetadata().getNamespace(), listOpts).getObject(); + if (pods == null) { + return; + } + var pod = pods.getItems().get(0); + + // Patch pod annotation + PatchOptions patchOpts = new PatchOptions(); + patchOpts.setFieldManager("kubernetes-java-kubectl-apply"); + var podMeta = pod.getMetadata(); + var res = podApi.patch(podMeta.getNamespace(), podMeta.getName(), + V1Patch.PATCH_FORMAT_JSON_PATCH, + new V1Patch("[{\"op\": \"replace\", \"path\": " + + "\"/metadata/annotations/vmrunner.jdrupes.org~1cmVersion\", " + + "\"value\": \"" + newCm.getMetadata().getResourceVersion() + + "\"}]"), + patchOpts); + if (!res.isSuccess()) { + logger.warning( + () -> "Cannot patch pod annotations: " + res.getStatus()); + } } }