Skip to content

Commit 6e9492c

Browse files
committed
Cherry-pick changes from branch 'owls-108056' into 'release/4.0'
1 parent c012ad4 commit 6e9492c

File tree

4 files changed

+142
-11
lines changed

4 files changed

+142
-11
lines changed

operator/src/main/java/oracle/kubernetes/operator/DomainStatusUpdater.java

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -200,9 +200,10 @@ private boolean wasNotRolling() {
200200
/**
201201
* Creates an asynchronous step to initialize the domain status, if needed, to indicate that the operator has
202202
* seen the domain and is now working on it.
203+
* @param hasEventData tue if the make right operation is associated with an event data
203204
*/
204-
public static Step createStatusInitializationStep() {
205-
return new StatusInitializationStep();
205+
public static Step createStatusInitializationStep(boolean hasEventData) {
206+
return new StatusInitializationStep(hasEventData);
206207
}
207208

208209
/**
@@ -592,12 +593,23 @@ void addDomainEvent(DomainCondition condition) {
592593
}
593594

594595
public static class StatusInitializationStep extends DomainStatusUpdaterStep {
596+
private boolean hasEventData;
597+
598+
StatusInitializationStep(boolean hasEventData) {
599+
super();
600+
this.hasEventData = hasEventData;
601+
}
595602

596603
@Override
597604
void modifyStatus(DomainStatus status) {
598605
if (status.getConditions().isEmpty()) {
599-
status.addCondition(new DomainCondition(COMPLETED).withStatus(false));
600-
status.addCondition(new DomainCondition(AVAILABLE).withStatus(false));
606+
if (hasEventData) {
607+
status.addCondition(new DomainCondition(COMPLETED).withStatus(false));
608+
status.addCondition(new DomainCondition(AVAILABLE).withStatus(false));
609+
}
610+
} else {
611+
status.markFailuresForRemoval(KUBERNETES);
612+
status.removeMarkedFailures();
601613
}
602614
}
603615
}
@@ -765,11 +777,8 @@ class Conditions {
765777
public Conditions(DomainStatus status) {
766778
this.status = status != null ? status : new DomainStatus();
767779
this.clusterChecks = createClusterChecks();
768-
boolean isCompleted = isProcessingCompleted();
780+
boolean isCompleted = isProcessingCompleted() && !this.status.hasConditionWithType(FAILED);
769781
conditionList.add(new DomainCondition(COMPLETED).withStatus(isCompleted));
770-
if (isCompleted && this.status.hasConditionWithType(FAILED)) {
771-
this.status.removeConditionsWithType(FAILED);
772-
}
773782
conditionList.add(createAvailableCondition());
774783
if (allIntendedServersReady()) {
775784
this.status.removeConditionsWithType(ROLLING);

operator/src/main/java/oracle/kubernetes/operator/makeright/MakeRightDomainOperationImpl.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -211,9 +211,7 @@ public Step createSteps() {
211211

212212
result.add(Optional.ofNullable(eventData).map(EventHelper::createEventStep).orElse(null));
213213
result.add(new DomainProcessorImpl.PopulatePacketServerMapsStep());
214-
if (hasEventData()) {
215-
result.add(createStatusInitializationStep());
216-
}
214+
result.add(createStatusInitializationStep(hasEventData()));
217215
if (deleting || domainHasDeletionTimestamp()) {
218216
result.add(new StartPlanStep(liveInfo, createDomainDownPlan()));
219217
} else {

operator/src/test/java/oracle/kubernetes/operator/DomainProcessorTest.java

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,9 @@
169169
import static oracle.kubernetes.weblogic.domain.model.DomainConditionType.COMPLETED;
170170
import static oracle.kubernetes.weblogic.domain.model.DomainConditionType.FAILED;
171171
import static oracle.kubernetes.weblogic.domain.model.DomainFailureReason.ABORTED;
172+
import static oracle.kubernetes.weblogic.domain.model.DomainFailureReason.DOMAIN_INVALID;
173+
import static oracle.kubernetes.weblogic.domain.model.DomainFailureReason.KUBERNETES;
174+
import static oracle.kubernetes.weblogic.domain.model.DomainStatusNoConditionMatcher.hasNoCondition;
172175
import static org.hamcrest.Matchers.allOf;
173176
import static org.hamcrest.Matchers.contains;
174177
import static org.hamcrest.Matchers.empty;
@@ -685,6 +688,22 @@ void afterServersUpdated_updateDomainStatus() {
685688
assertThat(testSupport.getResourceWithName(DOMAIN, UID), hasCondition(COMPLETED).withStatus("True"));
686689
}
687690

691+
@Test
692+
void afterServersUpdatedWhenFailedConditionExists_dontUpdateDomainStatus() {
693+
domainConfigurator.configureCluster(newInfo, CLUSTER).withReplicas(MIN_REPLICAS);
694+
newInfo.getReferencedClusters().forEach(testSupport::defineResources);
695+
processor.createMakeRightOperation(newInfo).execute();
696+
newInfo.setWebLogicCredentialsSecret(createCredentialsSecret());
697+
newDomain.getOrCreateStatus().addCondition(new DomainCondition(FAILED).withReason(KUBERNETES).withStatus(true));
698+
makePodsReady();
699+
makePodsHealthy();
700+
701+
triggerStatusUpdate();
702+
703+
assertThat(((DomainResource)testSupport.getResourceWithName(DOMAIN, UID)).getStatus(),
704+
hasNoCondition(COMPLETED).withStatus("True"));
705+
}
706+
688707
@Test
689708
void afterChangeToNever_statusUpdateRetainsStateGoal() {
690709
domainConfigurator.configureCluster(newInfo, CLUSTER).withReplicas(MIN_REPLICAS);
@@ -1530,6 +1549,24 @@ void beforeIntrospectionForNewDomain_addDefaultCondition() {
15301549
assertThat(newInfo.getDomain(), hasCondition(COMPLETED).withStatus("False"));
15311550
}
15321551

1552+
@Test
1553+
void runStatusInitializationStepWithKubernetesFailure_removeFailedCondition() {
1554+
newDomain.getOrCreateStatus().addCondition(new DomainCondition(FAILED).withReason(KUBERNETES).withStatus(true));
1555+
testSupport.addDomainPresenceInfo(newInfo);
1556+
testSupport.runSteps(DomainStatusUpdater.createStatusInitializationStep(false));
1557+
1558+
assertThat(newInfo.getDomain().getStatus(), hasNoCondition(FAILED).withReason(KUBERNETES));
1559+
}
1560+
1561+
@Test
1562+
void runStatusInitializationStepWithNonKubernetesFailure_dontRemoveFailedCondition() throws JsonProcessingException {
1563+
newDomain.getOrCreateStatus().addCondition(new DomainCondition(FAILED).withReason(DOMAIN_INVALID).withStatus(true));
1564+
testSupport.addDomainPresenceInfo(newInfo);
1565+
testSupport.runSteps(DomainStatusUpdater.createStatusInitializationStep(false));
1566+
1567+
assertThat(newInfo.getDomain(), hasCondition(FAILED).withStatus("True"));
1568+
}
1569+
15331570
@Test
15341571
void whenDomainHasRunningServersAndExistingTopology_dontRunIntrospectionJob() throws JsonProcessingException {
15351572
establishPreviousIntrospection(null);
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
// Copyright (c) 2023, Oracle and/or its affiliates.
2+
// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
3+
4+
package oracle.kubernetes.weblogic.domain.model;
5+
6+
import java.util.ArrayList;
7+
import java.util.List;
8+
import java.util.Optional;
9+
import javax.annotation.Nonnull;
10+
11+
import oracle.kubernetes.utils.OperatorUtils;
12+
import org.hamcrest.Description;
13+
import org.hamcrest.TypeSafeDiagnosingMatcher;
14+
15+
@SuppressWarnings("unused")
16+
public class DomainStatusNoConditionMatcher extends TypeSafeDiagnosingMatcher<DomainStatus> {
17+
private @Nonnull final DomainConditionType unexpectedType;
18+
private String unexpectedStatus;
19+
private DomainFailureReason unexpectedReason;
20+
21+
private DomainStatusNoConditionMatcher(@Nonnull DomainConditionType unexpectedType) {
22+
this.unexpectedType = unexpectedType;
23+
}
24+
25+
public static DomainStatusNoConditionMatcher hasNoCondition(DomainConditionType type) {
26+
return new DomainStatusNoConditionMatcher(type);
27+
}
28+
29+
public DomainStatusNoConditionMatcher withStatus(String status) {
30+
unexpectedStatus = status;
31+
return this;
32+
}
33+
34+
public DomainStatusNoConditionMatcher withReason(@Nonnull DomainFailureReason reason) {
35+
unexpectedReason = reason;
36+
return this;
37+
}
38+
39+
@Override
40+
protected boolean matchesSafely(DomainStatus item, Description mismatchDescription) {
41+
for (DomainCondition condition : item.getConditions()) {
42+
if (matches(condition)) {
43+
mismatchDescription.appendValueList(
44+
"found domain with conditions ", ", ", ".", item.getConditions());
45+
return false;
46+
}
47+
}
48+
return true;
49+
}
50+
51+
private boolean matches(DomainCondition condition) {
52+
if (unexpectedType != condition.getType()) {
53+
return false;
54+
}
55+
if (unexpectedStatus != null && !unexpectedStatus.equals(condition.getStatus())) {
56+
return false;
57+
}
58+
return unexpectedReason == null || unexpectedReason == condition.getReason();
59+
}
60+
61+
private DomainStatus getStatus(DomainResource domain) {
62+
return Optional.ofNullable(domain.getStatus()).orElse(new DomainStatus());
63+
}
64+
65+
@Override
66+
public void describeTo(Description description) {
67+
describeTo(description, "domain status not containing condition: ");
68+
}
69+
70+
void describeTo(Description description, String commentPrefix) {
71+
List<String> expectations = new ArrayList<>();
72+
expectations.add(expectation("type", unexpectedType.toString()));
73+
if (unexpectedStatus != null) {
74+
expectations.add(expectation("status", unexpectedStatus));
75+
}
76+
if (unexpectedReason != null) {
77+
expectations.add(expectation("reason", unexpectedReason.toString()));
78+
}
79+
description
80+
.appendText(commentPrefix)
81+
.appendText(OperatorUtils.joinListGrammatically(expectations));
82+
}
83+
84+
private String expectation(String description, String value) {
85+
return description + " = '" + value + "'";
86+
}
87+
}

0 commit comments

Comments
 (0)