Skip to content

Commit 2a009ac

Browse files
committed
Merge branch 'retry-on-early-missing' into 'main'
Requeue on missing resource validation failure for new domain See merge request weblogic-cloud/weblogic-kubernetes-operator!4696
2 parents 54bbf58 + 47fdde3 commit 2a009ac

File tree

5 files changed

+178
-140
lines changed

5 files changed

+178
-140
lines changed

operator/src/main/java/oracle/kubernetes/operator/helpers/DomainValidationSteps.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -139,11 +139,14 @@ static class DomainValidationStep extends Step {
139139
DomainPresenceInfo info = (DomainPresenceInfo) packet.get(ProcessingConstants.DOMAIN_PRESENCE_INFO);
140140
DomainResource domain = info.getDomain();
141141
List<String> fatalValidationFailures = domain.getFatalValidationFailures();
142-
List<String> validationFailures = domain.getValidationFailures(new KubernetesResourceLookupImpl(packet));
143-
String errorMsg = getErrorMessage(fatalValidationFailures, validationFailures);
144-
if (validationFailures.isEmpty()) {
142+
DomainResource.ValidationResult validationResult
143+
= domain.getValidationFailures(new KubernetesResourceLookupImpl(packet));
144+
if (validationResult.isDelay()) {
145+
return doRequeue(packet);
146+
} else if (validationResult.failures().isEmpty()) {
145147
return doNext(createRemoveSelectedFailuresStep(getNext(), DOMAIN_INVALID), packet);
146148
} else {
149+
String errorMsg = getErrorMessage(fatalValidationFailures, validationResult.failures());
147150
LOGGER.severe(DOMAIN_VALIDATION_FAILED, domain.getDomainUid(), errorMsg);
148151
return doNext(DomainStatusUpdater.createDomainInvalidFailureSteps(errorMsg), packet);
149152
}

operator/src/main/java/oracle/kubernetes/weblogic/domain/model/DomainResource.java

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
import oracle.kubernetes.operator.processing.EffectiveClusterSpec;
5050
import oracle.kubernetes.operator.processing.EffectiveIntrospectorJobPodSpec;
5151
import oracle.kubernetes.operator.processing.EffectiveServerSpec;
52+
import oracle.kubernetes.utils.SystemClock;
5253
import oracle.kubernetes.weblogic.domain.EffectiveConfigurationFactory;
5354
import org.apache.commons.lang3.builder.EqualsBuilder;
5455
import org.apache.commons.lang3.builder.HashCodeBuilder;
@@ -964,7 +965,7 @@ public List<String> getFatalValidationFailures() {
964965
}
965966

966967
// used by the operator
967-
public List<String> getValidationFailures(KubernetesResourceLookup kubernetesResources) {
968+
public ValidationResult getValidationFailures(KubernetesResourceLookup kubernetesResources) {
968969
return new DomainValidator().getValidationFailures(kubernetesResources);
969970
}
970971

@@ -1038,14 +1039,18 @@ public int getMaxConcurrentShutdown(ClusterSpec clusterSpec) {
10381039
}
10391040
}
10401041

1042+
public static record ValidationResult(List<String> failures, boolean isDelay) {
1043+
}
1044+
10411045
class DomainValidator extends Validator {
10421046
private final Set<String> clusterNames = new HashSet<>();
10431047
private final Set<String> serverNames = new HashSet<>();
1048+
private boolean isDelay;
10441049

1045-
private List<String> getValidationFailures(KubernetesResourceLookup kubernetesResources) {
1050+
private ValidationResult getValidationFailures(KubernetesResourceLookup kubernetesResources) {
10461051
addFatalValidationFailures();
10471052
addCrossReferenceValidationFailures(kubernetesResources);
1048-
return failures;
1053+
return new ValidationResult(failures, isDelay);
10491054
}
10501055

10511056
private void addCrossReferenceValidationFailures(KubernetesResourceLookup kubernetesResources) {
@@ -1542,16 +1547,27 @@ private void addMissingClusterResource(KubernetesResourceLookup resourceLookup)
15421547
.forEach(cluster -> verifyClusterExists(resourceLookup, cluster));
15431548
}
15441549

1550+
private boolean isRecentlyCreatedDomain() {
1551+
return Optional.ofNullable(getMetadata()).map(V1ObjectMeta::getCreationTimestamp)
1552+
.map(timestamp -> timestamp.isAfter(SystemClock.now().minusSeconds(10))).orElse(false);
1553+
}
1554+
15451555
private void verifyClusterExists(KubernetesResourceLookup resourceLookup, V1LocalObjectReference cluster) {
15461556
if (resourceLookup.findClusterInNamespace(cluster, getNamespace()) == null) {
15471557
failures.add(missingClusterResource(cluster.getName(), getNamespace()));
1558+
if (isRecentlyCreatedDomain()) {
1559+
isDelay = true;
1560+
}
15481561
}
15491562
}
15501563

15511564
@SuppressWarnings("SameParameterValue")
15521565
private void verifySecretExists(KubernetesResourceLookup resources, String secretName, SecretType type) {
15531566
if (secretName != null && !isSecretExists(resources.getSecrets(), secretName, getNamespace())) {
15541567
failures.add(DomainValidationMessages.noSuchSecret(secretName, getNamespace(), type));
1568+
if (isRecentlyCreatedDomain()) {
1569+
isDelay = true;
1570+
}
15551571
}
15561572
}
15571573

@@ -1611,6 +1627,9 @@ private void verifyModelConfigMapExists(KubernetesResourceLookup resources, Stri
16111627
&& modelConfigMapName != null && !resources.isConfigMapExists(modelConfigMapName, getNamespace())) {
16121628
failures.add(DomainValidationMessages.noSuchModelConfigMap(modelConfigMapName,
16131629
"spec.configuration.model.configMap", getNamespace()));
1630+
if (isRecentlyCreatedDomain()) {
1631+
isDelay = true;
1632+
}
16141633
}
16151634
}
16161635

@@ -1621,6 +1640,9 @@ && getDomainCreationConfigMap() != null
16211640
&& !resources.isConfigMapExists(configMapName, getNamespace())) {
16221641
failures.add(DomainValidationMessages.noSuchModelConfigMap(configMapName,
16231642
"spec.configuration.initializeDomainOnPV.domain.domainCreationConfigMap", getNamespace()));
1643+
if (isRecentlyCreatedDomain()) {
1644+
isDelay = true;
1645+
}
16241646
}
16251647
}
16261648

@@ -1629,9 +1651,15 @@ private void verifyVolumeWithPVCWhenInitDomainOnPVDefined() {
16291651
if (isPVCConfigured()) {
16301652
if (noMatchVolumeWithPVC(getInitPvDomainPVCName())) {
16311653
failures.add(DomainValidationMessages.noMatchVolumeWithPVC(getInitPvDomainPVCName()));
1654+
if (isRecentlyCreatedDomain()) {
1655+
isDelay = true;
1656+
}
16321657
}
16331658
} else if (noVolumeWithPVC()) {
16341659
failures.add(DomainValidationMessages.noVolumeWithPVC());
1660+
if (isRecentlyCreatedDomain()) {
1661+
isDelay = true;
1662+
}
16351663
}
16361664
}
16371665
}

operator/src/test/java/oracle/kubernetes/operator/helpers/DomainValidationStepTest.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright (c) 2019, 2023, Oracle and/or its affiliates.
1+
// Copyright (c) 2019, 2024, Oracle and/or its affiliates.
22
// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
33

44
package oracle.kubernetes.operator.helpers;
@@ -25,6 +25,7 @@
2525
import oracle.kubernetes.operator.DomainProcessorTestSetup;
2626
import oracle.kubernetes.operator.work.Step;
2727
import oracle.kubernetes.operator.work.TerminalStep;
28+
import oracle.kubernetes.utils.SystemClock;
2829
import oracle.kubernetes.utils.TestUtils;
2930
import oracle.kubernetes.weblogic.domain.model.ClusterResource;
3031
import oracle.kubernetes.weblogic.domain.model.Configuration;
@@ -231,6 +232,7 @@ private boolean isFailedCondition(DomainCondition condition) {
231232
@Test
232233
void whenDomainRefersToUnknownSecret_updateStatus() {
233234
domain.getSpec().withWebLogicCredentialsSecret(new V1LocalObjectReference().name("name"));
235+
domain.getMetadata().setCreationTimestamp(SystemClock.now().minusSeconds(20));
234236

235237
testSupport.runSteps(domainValidationSteps);
236238

operator/src/test/java/oracle/kubernetes/operator/makeright/FailureReportingTest.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,11 @@ private void executeMakeRight() {
191191
executeMakeRight((String) null);
192192
}
193193

194+
private void updateDomain() {
195+
removeCredentialsSecret();
196+
domain.getMetadata().setCreationTimestamp(SystemClock.now().minusSeconds(20));
197+
}
198+
194199
private void removeCredentialsSecret() {
195200
DomainCommonConfigurator commonConfigurator = new DomainCommonConfigurator(domain);
196201
commonConfigurator.withWebLogicCredentialsSecret("no-such-secret");
@@ -292,7 +297,7 @@ enum TestCase {
292297
DOMAIN_VALIDATION_FAILURE {
293298
@Override
294299
Consumer<FailureReportingTest> getMutator() {
295-
return FailureReportingTest::removeCredentialsSecret;
300+
return FailureReportingTest::updateDomain;
296301
}
297302

298303
@Override

0 commit comments

Comments
 (0)