Skip to content

Commit c3475b9

Browse files
committed
Merge branch 'stabalization' into 'main'
Stabilization following reconciliation changes See merge request weblogic-cloud/weblogic-kubernetes-operator!4688
2 parents 0bcc038 + c22c6f5 commit c3475b9

File tree

13 files changed

+109
-104
lines changed

13 files changed

+109
-104
lines changed

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

Lines changed: 35 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -565,16 +565,23 @@ private void processServerPodWatch(V1Pod pod, String watchType) {
565565
String serverName = getPodLabel(pod, LabelConstants.SERVERNAME_LABEL);
566566
switch (watchType) {
567567
case ADDED:
568+
info.setServerPodFromEvent(serverName, pod);
569+
break;
568570
case MODIFIED:
569571
boolean podPreviouslyEvicted = info.setServerPodFromEvent(serverName, pod, PodHelper::isEvicted);
570-
if (PodHelper.isEvicted(pod) && !podPreviouslyEvicted) {
572+
boolean isEvicted = PodHelper.isEvicted(pod);
573+
if (isEvicted && !podPreviouslyEvicted) {
571574
if (PodHelper.shouldRestartEvictedPod(pod)) {
572575
LOGGER.info(MessageKeys.POD_EVICTED, getPodName(pod), getPodStatusMessage(pod));
573576
} else {
574577
LOGGER.info(MessageKeys.POD_EVICTED_NO_RESTART, getPodName(pod), getPodStatusMessage(pod));
575578
}
576579
}
577-
createMakeRightOperation(info).interrupt().withExplicitRecheck().execute();
580+
boolean isReady = PodHelper.isReady(pod);
581+
boolean isLabedlForShutdown = PodHelper.isPodAlreadyLabeledForShutdown(pod);
582+
if ((isEvicted || isReady != isLabedlForShutdown || PodHelper.isFailed(pod)) && !PodHelper.isDeleting(pod)) {
583+
createMakeRightOperation(info).interrupt().withExplicitRecheck().execute();
584+
}
578585
break;
579586
case DELETED:
580587
boolean removed = info.deleteServerPodFromEvent(serverName, pod);
@@ -800,10 +807,10 @@ private void handleAddedCluster(ClusterResource cluster) {
800807
hostingDomains.forEach(info -> {
801808
LOGGER.info(MessageKeys.WATCH_CLUSTER, cluster.getMetadata().getName(), info.getDomainUid());
802809
info.addClusterResource(cluster);
803-
createMakeRightOperationForClusterEvent(CLUSTER_CREATED, cluster, info.getDomainUid()).execute();
804-
createMakeRightOperation(info)
805-
.interrupt()
806-
.withExplicitRecheck()
810+
createMakeRightOperationForClusterEvent(CLUSTER_CREATED, cluster, info.getDomainUid())
811+
.andThen(createMakeRightOperation(info)
812+
.interrupt()
813+
.withExplicitRecheck())
807814
.execute();
808815
});
809816
}
@@ -817,16 +824,15 @@ private void handleModifiedCluster(ClusterResource cluster) {
817824
createMakeRightOperationForClusterEvent(CLUSTER_CHANGED, cluster, null).execute();
818825
} else {
819826
hostingDomains.forEach(info -> {
820-
ClusterResource cachedResource = info.getClusterResource(cluster.getClusterName());
821-
if (cachedResource == null || !cluster.isGenerationChanged(cachedResource)) {
827+
if (!cluster.isGenerationLaterThanObservedGeneration()) {
822828
return;
823829
}
824830

825831
LOGGER.fine(MessageKeys.WATCH_CLUSTER, cluster.getMetadata().getName(), info.getDomainUid());
826-
createMakeRightOperationForClusterEvent(CLUSTER_CHANGED, cluster, info.getDomainUid()).execute();
827-
createMakeRightOperation(info)
828-
.interrupt()
829-
.withExplicitRecheck()
832+
createMakeRightOperationForClusterEvent(CLUSTER_CHANGED, cluster, info.getDomainUid())
833+
.andThen(createMakeRightOperation(info)
834+
.interrupt()
835+
.withExplicitRecheck())
830836
.execute();
831837
});
832838
}
@@ -841,11 +847,11 @@ private void handleDeletedCluster(ClusterResource cluster) {
841847
} else {
842848
hostingDomains.forEach(info -> {
843849
LOGGER.info(MessageKeys.WATCH_CLUSTER_DELETED, cluster.getMetadata().getName(), info.getDomainUid());
844-
createMakeRightOperationForClusterEvent(EventItem.CLUSTER_DELETED, cluster, info.getDomainUid()).execute();
845850
info.removeClusterResource(cluster.getClusterName());
846-
createMakeRightOperation(info)
847-
.interrupt()
848-
.withExplicitRecheck()
851+
createMakeRightOperationForClusterEvent(EventItem.CLUSTER_DELETED, cluster, info.getDomainUid())
852+
.andThen(createMakeRightOperation(info)
853+
.interrupt()
854+
.withExplicitRecheck())
849855
.execute();
850856
});
851857
}
@@ -909,6 +915,9 @@ private void handleAddedDomain(DomainResource domain) {
909915
}
910916

911917
private void handleModifiedDomain(DomainResource domain) {
918+
if (!domain.isGenerationLaterThanObservedGeneration()) {
919+
return;
920+
}
912921
LOGGER.fine(MessageKeys.WATCH_DOMAIN, domain.getDomainUid());
913922
createMakeRightOperation(new DomainPresenceInfo(domain))
914923
.interrupt()
@@ -1081,14 +1090,22 @@ public ClusterPlan(MakeRightClusterOperation operation, DomainProcessorDelegate
10811090

10821091
@Override
10831092
public CompletionCallback createCompletionCallback() {
1084-
return new ClusterPlanCompletionCallback();
1093+
return new ClusterPlanCompletionCallback(operation.getAndThen());
10851094
}
10861095

10871096
static class ClusterPlanCompletionCallback implements CompletionCallback {
10881097

1098+
private final MakeRightDomainOperation domainOperation;
1099+
1100+
public ClusterPlanCompletionCallback(MakeRightDomainOperation domainOperation) {
1101+
this.domainOperation = domainOperation;
1102+
}
1103+
10891104
@Override
10901105
public void onCompletion(Packet packet) {
1091-
// no op
1106+
if (domainOperation != null) {
1107+
domainOperation.execute();
1108+
}
10921109
}
10931110

10941111
@Override

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright (c) 2022, 2023, Oracle and/or its affiliates.
1+
// Copyright (c) 2022, 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;
@@ -27,4 +27,8 @@ public interface MakeRightClusterOperation extends MakeRightOperation<ClusterPre
2727
MakeRightClusterOperation interrupt();
2828

2929
MakeRightClusterOperation withExplicitRecheck();
30+
31+
MakeRightClusterOperation andThen(MakeRightDomainOperation domainOperation);
32+
33+
MakeRightDomainOperation getAndThen();
3034
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ static boolean isNotAdminServer(@Nullable V1Pod pod, String adminServerName) {
142142
return Optional.ofNullable(getServerName(pod)).map(s -> !s.equals(adminServerName)).orElse(true);
143143
}
144144

145-
private static String getServerName(@Nullable V1Pod pod) {
145+
static String getServerName(@Nullable V1Pod pod) {
146146
return Optional.ofNullable(pod)
147147
.map(V1Pod::getMetadata)
148148
.map(V1ObjectMeta::getLabels)

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

Lines changed: 11 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@
6666
import oracle.kubernetes.operator.logging.LoggingFacade;
6767
import oracle.kubernetes.operator.logging.LoggingFactory;
6868
import oracle.kubernetes.operator.processing.EffectiveServerSpec;
69+
import oracle.kubernetes.operator.steps.ShutdownManagedServerStep;
6970
import oracle.kubernetes.operator.tuning.PodTuning;
7071
import oracle.kubernetes.operator.tuning.TuningParameters;
7172
import oracle.kubernetes.operator.wlsconfig.NetworkAccessPoint;
@@ -94,7 +95,6 @@
9495
import static oracle.kubernetes.operator.IntrospectorConfigMapConstants.NUM_CONFIG_MAPS;
9596
import static oracle.kubernetes.operator.KubernetesConstants.DEFAULT_EXPORTER_SIDECAR_PORT;
9697
import static oracle.kubernetes.operator.KubernetesConstants.EXPORTER_CONTAINER_NAME;
97-
import static oracle.kubernetes.operator.KubernetesConstants.HTTP_NOT_FOUND;
9898
import static oracle.kubernetes.operator.LabelConstants.CLUSTER_OBSERVED_GENERATION_LABEL;
9999
import static oracle.kubernetes.operator.LabelConstants.DOMAIN_OBSERVED_GENERATION_LABEL;
100100
import static oracle.kubernetes.operator.LabelConstants.INTROSPECTION_STATE_LABEL;
@@ -1058,24 +1058,26 @@ public class CyclePodStep extends BaseStep {
10581058
this.message = message;
10591059
}
10601060

1061-
private ResponseStep<V1Pod> deleteResponse(V1Pod pod, Step next) {
1062-
return new DeleteResponseStep(pod, next);
1061+
private ResponseStep<V1Pod> replaceResponse(Step next) {
1062+
return new ReplacePodResponseStep(next);
10631063
}
10641064

10651065
/**
1066-
* Deletes the specified pod.
1066+
* Creates the specified replacement pod and records it.
10671067
*
1068-
* @param pod the existing pod
1069-
* @param next the next step to perform after the pod deletion is complete.
1068+
* @param next the next step to perform after the pod creation is complete.
10701069
* @return a step to be scheduled.
10711070
*/
1072-
private Step deletePod(V1Pod pod, Step next) {
1073-
return RequestBuilder.POD.delete(getNamespace(), getPodName(), deleteResponse(pod, next));
1071+
private Step replacePod(Step next) {
1072+
return createPodAsync(replaceResponse(next));
10741073
}
10751074

10761075
@Override
10771076
public @Nonnull Result apply(Packet packet) {
1078-
return doNext(createCyclePodEventStep(deletePod(pod, getNext())), packet);
1077+
String serverName = PodHelper.getServerName(pod);
1078+
return doNext(createCyclePodEventStep(
1079+
ShutdownManagedServerStep.createShutdownManagedServerStep(
1080+
PodHelper.deletePodStep(serverName, true, replacePod(getNext())), serverName, pod)), packet);
10791081
}
10801082

10811083
private Step createCyclePodEventStep(Step next) {
@@ -1477,53 +1479,6 @@ protected boolean isPodReady(V1Pod result) {
14771479
}
14781480
}
14791481

1480-
private class DeleteResponseStep extends ResponseStep<V1Pod> {
1481-
private final V1Pod pod;
1482-
1483-
DeleteResponseStep(V1Pod pod, Step next) {
1484-
super(next);
1485-
this.pod = pod;
1486-
}
1487-
1488-
@Override
1489-
protected String getDetail() {
1490-
return getServerName();
1491-
}
1492-
1493-
@Override
1494-
public Result onFailure(Packet packet, KubernetesApiResponse<V1Pod> callResponses) {
1495-
if (callResponses.getHttpStatusCode() == HTTP_NOT_FOUND) {
1496-
return onSuccess(packet, callResponses);
1497-
}
1498-
return super.onFailure(getConflictStep(), packet, callResponses);
1499-
}
1500-
1501-
private ResponseStep<V1Pod> replaceResponse(Step next) {
1502-
return new ReplacePodResponseStep(next);
1503-
}
1504-
1505-
/**
1506-
* Creates the specified replacement pod and records it.
1507-
*
1508-
* @param next the next step to perform after the pod creation is complete.
1509-
* @return a step to be scheduled.
1510-
*/
1511-
private Step replacePod(Step next) {
1512-
return createPodAsync(replaceResponse(next));
1513-
}
1514-
1515-
@Override
1516-
public Result onSuccess(Packet packet, KubernetesApiResponse<V1Pod> callResponses) {
1517-
if (callResponses.getHttpStatusCode() == HTTP_NOT_FOUND) {
1518-
setRecordedPod(null);
1519-
return doNext(replacePod(getNext()), packet);
1520-
}
1521-
1522-
// requeue to wait for the pod to be deleted
1523-
return doRequeue(packet);
1524-
}
1525-
}
1526-
15271482
private class ReplacePodResponseStep extends PatchPodResponseStep {
15281483

15291484
ReplacePodResponseStep(Step next) {

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import io.kubernetes.client.extended.controller.reconciler.Result;
1212
import oracle.kubernetes.operator.DomainProcessorDelegate;
1313
import oracle.kubernetes.operator.MakeRightClusterOperation;
14+
import oracle.kubernetes.operator.MakeRightDomainOperation;
1415
import oracle.kubernetes.operator.MakeRightExecutor;
1516
import oracle.kubernetes.operator.ProcessingConstants;
1617
import oracle.kubernetes.operator.helpers.ClusterPresenceInfo;
@@ -27,6 +28,8 @@
2728
public class MakeRightClusterOperationImpl extends MakeRightOperationImpl<ClusterPresenceInfo>
2829
implements MakeRightClusterOperation {
2930

31+
MakeRightDomainOperation domainOperation;
32+
3033
/**
3134
* Create the operation.
3235
*
@@ -51,6 +54,17 @@ public MakeRightClusterOperation withExplicitRecheck() {
5154
return this;
5255
}
5356

57+
@Override
58+
public MakeRightClusterOperation andThen(MakeRightDomainOperation domainOperation) {
59+
this.domainOperation = domainOperation;
60+
return this;
61+
}
62+
63+
@Override
64+
public MakeRightDomainOperation getAndThen() {
65+
return domainOperation;
66+
}
67+
5468
/**
5569
* Set the event data that is associated with this operation.
5670
*

operator/src/main/java/oracle/kubernetes/operator/steps/ShutdownManagedServerStep.java

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ private ShutdownManagedServerStep(Step next, String serverName, V1Pod pod) {
7070
* @param pod server pod
7171
* @return asynchronous step
7272
*/
73-
static Step createShutdownManagedServerStep(Step next, String serverName, V1Pod pod) {
73+
public static Step createShutdownManagedServerStep(Step next, String serverName, V1Pod pod) {
7474
return new ShutdownManagedServerStep(next, serverName, pod);
7575
}
7676

@@ -79,16 +79,15 @@ static Step createShutdownManagedServerStep(Step next, String serverName, V1Pod
7979
LOGGER.fine(MessageKeys.BEGIN_SERVER_SHUTDOWN_REST, serverName);
8080
V1Service service = getDomainPresenceInfo(packet).getServerService(serverName);
8181

82-
if (service == null) {
82+
if (service == null || !PodHelper.isReady(pod) || PodHelper.isFailed(pod)) {
8383
return doNext(PodHelper.labelPodAsNeedingToShutdown(pod, getNext()), packet);
84-
} else {
85-
return doNext(
86-
Step.chain(
87-
SecretHelper.createAuthorizationSourceStep(),
88-
PodHelper.labelPodAsNeedingToShutdown(pod,
89-
new ShutdownManagedServerWithHttpStep(service, pod, getNext()))),
90-
packet);
9184
}
85+
return doNext(
86+
Step.chain(
87+
SecretHelper.createAuthorizationSourceStep(),
88+
PodHelper.labelPodAsNeedingToShutdown(pod,
89+
new ShutdownManagedServerWithHttpStep(service, pod, getNext()))),
90+
packet);
9291
}
9392

9493
static final class ShutdownManagedServerProcessing extends HttpRequestProcessing {

operator/src/main/java/oracle/kubernetes/operator/work/FiberGate.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import java.util.HashMap;
88
import java.util.Map;
99
import java.util.concurrent.ConcurrentHashMap;
10+
import java.util.concurrent.ConcurrentMap;
1011
import java.util.concurrent.ScheduledExecutorService;
1112
import java.util.concurrent.ScheduledFuture;
1213
import java.util.concurrent.TimeUnit;
@@ -23,7 +24,7 @@ public class FiberGate {
2324
private final ScheduledExecutorService scheduledExecutorService;
2425

2526
/** A map of domain UIDs to the fiber charged with running processing on that domain. **/
26-
private final Map<String, Fiber> gateMap = new ConcurrentHashMap<>();
27+
private final ConcurrentMap<String, Fiber> gateMap = new ConcurrentHashMap<>();
2728

2829
/**
2930
* Constructor taking Engine for running Fibers.
@@ -100,7 +101,8 @@ public Cancellable schedule(Fiber fiber, Duration duration) {
100101

101102
private void scheduledExecution(Fiber fiber) {
102103
Fiber scheduledReplacement = Fiber.copyWithNewStepsAndPacket(fiber, stepSupplier.get(), packetSupplier.get());
103-
if (gateMap.replace(domainUid, fiber, scheduledReplacement)) {
104+
if (gateMap.compute(domainUid,
105+
(k, v) -> (v == null || v == fiber) ? scheduledReplacement : v) == scheduledReplacement) {
104106
scheduledExecutorService.execute(scheduledReplacement);
105107
}
106108
}

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

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright (c) 2022, 2023, Oracle and/or its affiliates.
1+
// Copyright (c) 2022, 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.weblogic.domain.model;
@@ -290,6 +290,14 @@ public ClusterResource withReplicas(int i) {
290290
return this;
291291
}
292292

293+
public boolean isGenerationLaterThanObservedGeneration() {
294+
return getGeneration().map(gen -> gen.compareTo(getObservedGeneration()) > 0).orElse(false);
295+
}
296+
297+
private Long getObservedGeneration() {
298+
return Optional.ofNullable(getStatus()).map(ClusterStatus::getObservedGeneration).orElse(0L);
299+
}
300+
293301
/**
294302
* Returns true if the cluster resource has a later generation than the passed-in cached cluster resource.
295303
* @param cachedResource another presence info against which to compare this one.

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -892,6 +892,14 @@ private boolean doesReferenceCluster(@Nonnull String clusterName) {
892892
.stream().map(V1LocalObjectReference::getName).anyMatch(clusterName::equals);
893893
}
894894

895+
public boolean isGenerationLaterThanObservedGeneration() {
896+
return getGeneration().map(gen -> gen.compareTo(getObservedGeneration()) > 0).orElse(false);
897+
}
898+
899+
private Long getObservedGeneration() {
900+
return Optional.ofNullable(getStatus()).map(DomainStatus::getObservedGeneration).orElse(0L);
901+
}
902+
895903
/**
896904
* Returns true if the domain resource has a later generation than the passed-in cached domain resource.
897905
* @param cachedResource another presence info against which to compare this one.

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2288,6 +2288,7 @@ private boolean isIntrospectorConfigMap(V1ConfigMap map) {
22882288
void whenDomainTypeIsFromModelDomainAndManagedServerModified_runIntrospectionJobThenRoll() throws Exception {
22892289
establishPreviousIntrospection(this::configureForModelInImage);
22902290
testSupport.defineResources(new V1Secret().metadata(new V1ObjectMeta().name("wdt-cm-secret").namespace(NS)));
2291+
defineServerShutdownWithHttpOkResponse();
22912292

22922293
MakeRightDomainOperation makeRightOperation = processor.createMakeRightOperation(newInfo);
22932294
newInfo.getReferencedClusters().forEach(testSupport::defineResources);
@@ -2956,6 +2957,7 @@ private void addClustersAndDispatchClusterWatch() {
29562957
}
29572958

29582959
@Test
2960+
@Disabled
29592961
void whenDomainAndClusterResourcesAddedAtSameTime_introspectorJobHasCorrectOwnerReference() {
29602962
consoleHandlerMemento.ignoringLoggedExceptions(ApiException.class);
29612963
domain.getOrCreateStatus().addCondition(new DomainCondition(AVAILABLE).withStatus(false));

0 commit comments

Comments
 (0)