diff --git a/operator/src/main/java/oracle/kubernetes/operator/helpers/ConfigMapHelper.java b/operator/src/main/java/oracle/kubernetes/operator/helpers/ConfigMapHelper.java index 216611ec77c..f2ec9c067e3 100644 --- a/operator/src/main/java/oracle/kubernetes/operator/helpers/ConfigMapHelper.java +++ b/operator/src/main/java/oracle/kubernetes/operator/helpers/ConfigMapHelper.java @@ -328,6 +328,8 @@ public NextAction onSuccess(Packet packet, CallResponse callRespons return doNext(replaceConfigMap(getNext()), packet); } else if (mustPatchCurrentMap(existingMap)) { return doNext(patchCurrentMap(existingMap, getNext()), packet); + } else if (mustPatchImageHashInMap(existingMap, packet)) { + return doNext(patchImageHashInCurrentMap(existingMap, packet, getNext()), packet); } else { logConfigMapExists(); recordCurrentMap(packet, existingMap); @@ -354,6 +356,11 @@ private boolean mustPatchCurrentMap(V1ConfigMap currentMap) { return KubernetesUtils.isMissingValues(getMapLabels(currentMap), getLabels()); } + private boolean mustPatchImageHashInMap(V1ConfigMap currentMap, Packet packet) { + return (currentMap.getData() != null) && Optional.ofNullable((String)packet.get(DOMAIN_INPUTS_HASH)) + .map(hash -> !hash.equals(currentMap.getData().get(DOMAIN_INPUTS_HASH))).orElse(false); + } + private Map getMapLabels(@NotNull V1ConfigMap map) { return Optional.ofNullable(map.getMetadata()).map(V1ObjectMeta::getLabels).orElseGet(Collections::emptyMap); } @@ -374,6 +381,17 @@ private Step patchCurrentMap(V1ConfigMap currentMap, Step next) { new V1Patch(patchBuilder.build().toString()), createPatchResponseStep(next)); } + private Step patchImageHashInCurrentMap(V1ConfigMap currentMap, Packet packet, Step next) { + JsonPatchBuilder patchBuilder = Json.createPatchBuilder(); + + patchBuilder.add("/data/" + DOMAIN_INPUTS_HASH, (String)packet.get(DOMAIN_INPUTS_HASH)); + + return new CallBuilder() + .patchConfigMapAsync(name, namespace, + getDomainUidLabel(Optional.of(currentMap).map(V1ConfigMap::getMetadata).orElse(null)), + new V1Patch(patchBuilder.build().toString()), createPatchResponseStep(next)); + } + private boolean labelsNotDefined(V1ConfigMap currentMap) { return Objects.requireNonNull(currentMap.getMetadata()).getLabels() == null; } @@ -476,6 +494,7 @@ public NextAction apply(Packet packet) { if (loader.isTopologyNotValid()) { return doNext(reportTopologyErrorsAndStop(), packet); } else if (loader.getDomainConfig() == null) { + loader.updateImageHashInPacket(); return doNext(loader.createIntrospectionVersionUpdateStep(), packet); } else { LOGGER.fine(MessageKeys.WLS_CONFIGURATION_READ, timeSinceJobStart(packet), loader.getDomainConfig()); @@ -554,6 +573,10 @@ private void updatePacket() { copyToPacketAndFileIfPresent(DOMAIN_INPUTS_HASH, getModelInImageSpecHash()); } + private void updateImageHashInPacket() { + copyToPacketAndFileIfPresent(DOMAIN_INPUTS_HASH, getModelInImageSpecHash()); + } + private Step createIntrospectionVersionUpdateStep() { return DomainValidationSteps.createValidateDomainTopologyStep( createIntrospectorConfigMapContext().patchOnly().verifyConfigMap(conflictStep.getNext()));