Skip to content

Commit 619f661

Browse files
authored
Owls 93071 - Display correct readyReplicas and server state when domain serverStartPolicy switched to NEVER (#2578)
* Display correct readyReplicas and server state when domain serverStartPolicy switched to NEVER
1 parent 50b3da9 commit 619f661

File tree

9 files changed

+195
-66
lines changed

9 files changed

+195
-66
lines changed

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ public DomainProcessorImpl(DomainProcessorDelegate delegate, SemanticVersion pro
118118
this.productVersion = productVersion;
119119
}
120120

121-
private static DomainPresenceInfo getExistingDomainPresenceInfo(String ns, String domainUid) {
121+
static DomainPresenceInfo getExistingDomainPresenceInfo(String ns, String domainUid) {
122122
return DOMAINS.computeIfAbsent(ns, k -> new ConcurrentHashMap<>()).get(domainUid);
123123
}
124124

@@ -419,7 +419,6 @@ private void processServerPodWatch(V1Pod pod, String watchType) {
419419
createMakeRightOperation(info).interrupt().withExplicitRecheck().execute();
420420
}
421421
break;
422-
423422
case "ERROR":
424423
default:
425424
}

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

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757
import oracle.kubernetes.weblogic.domain.model.ServerStatus;
5858
import org.jetbrains.annotations.NotNull;
5959

60+
import static oracle.kubernetes.operator.DomainProcessorImpl.getExistingDomainPresenceInfo;
6061
import static oracle.kubernetes.operator.LabelConstants.CLUSTERNAME_LABEL;
6162
import static oracle.kubernetes.operator.MIINonDynamicChangesMethod.CommitUpdateOnly;
6263
import static oracle.kubernetes.operator.ProcessingConstants.DOMAIN_TOPOLOGY;
@@ -71,6 +72,7 @@
7172
import static oracle.kubernetes.operator.ProcessingConstants.SERVER_STATE_MAP;
7273
import static oracle.kubernetes.operator.WebLogicConstants.RUNNING_STATE;
7374
import static oracle.kubernetes.operator.WebLogicConstants.SHUTDOWN_STATE;
75+
import static oracle.kubernetes.operator.WebLogicConstants.SHUTTING_DOWN_STATE;
7476
import static oracle.kubernetes.operator.helpers.EventHelper.EventItem.DOMAIN_PROCESSING_ABORTED;
7577
import static oracle.kubernetes.operator.helpers.EventHelper.EventItem.DOMAIN_PROCESSING_STARTING;
7678
import static oracle.kubernetes.weblogic.domain.model.DomainConditionType.Available;
@@ -420,7 +422,7 @@ boolean isStatusUnchanged(DomainStatus newStatus) {
420422
return newStatus.equals(getStatus());
421423
}
422424

423-
private String getNamespace() {
425+
String getNamespace() {
424426
return getMetadata().getNamespace();
425427
}
426428

@@ -567,7 +569,7 @@ private boolean stillHasPodPendingRestart(DomainStatus status) {
567569
}
568570

569571
private V1Pod getServerPod(ServerStatus serverStatus) {
570-
return getInfo().getServerPod(serverStatus.getServerName());
572+
return getCachedInfo().getServerPod(serverStatus.getServerName());
571573
}
572574

573575
private Map<String, String> getLabels(V1Pod pod) {
@@ -585,19 +587,24 @@ private boolean allIntendedServersRunning() {
585587
}
586588

587589
private Stream<ServerStartupInfo> getServerStartupInfos() {
588-
return Optional.ofNullable(getInfo().getServerStartupInfo()).stream().flatMap(Collection::stream);
590+
return Optional.ofNullable(getCachedInfo()
591+
.getServerStartupInfo()).stream().flatMap(Collection::stream);
589592
}
590593

591594
private Optional<WlsDomainConfig> getDomainConfig() {
592595
return Optional.ofNullable(config).or(this::getScanCacheDomainConfig);
593596
}
594597

595598
private Optional<WlsDomainConfig> getScanCacheDomainConfig() {
596-
DomainPresenceInfo info = getInfo();
599+
DomainPresenceInfo info = getCachedInfo();
597600
Scan scan = ScanCache.INSTANCE.lookupScan(info.getNamespace(), info.getDomainUid());
598601
return Optional.ofNullable(scan).map(Scan::getWlsDomainConfig);
599602
}
600603

604+
private DomainPresenceInfo getCachedInfo() {
605+
return Optional.ofNullable(getExistingDomainPresenceInfo(getNamespace(), getDomainUid())).orElse(getInfo());
606+
}
607+
601608
private boolean shouldBeRunning(ServerStartupInfo startupInfo) {
602609
return startupInfo.isNotServiceOnly() && RUNNING_STATE.equals(startupInfo.getDesiredState());
603610
}
@@ -607,15 +614,17 @@ private boolean isNotRunning(@Nonnull String serverName) {
607614
}
608615

609616
private boolean isHasFailedPod() {
610-
return getInfo().getServerPods().anyMatch(PodHelper::isFailed);
617+
return getCachedInfo().getServerPods().anyMatch(PodHelper::isFailed);
611618
}
612619

613620
private boolean hasServerPod(String serverName) {
614-
return Optional.ofNullable(getInfo().getServerPod(serverName)).isPresent();
621+
return Optional.ofNullable(getCachedInfo().getServerPod(serverName)).isPresent();
615622
}
616623

617624
private boolean hasReadyServerPod(String serverName) {
618-
return Optional.ofNullable(getInfo().getServerPod(serverName)).filter(PodHelper::getReadyStatus).isPresent();
625+
return (!getCachedInfo().isServerPodBeingDeleted(serverName))
626+
&& Optional.ofNullable(getCachedInfo().getServerPod(serverName))
627+
.filter(PodHelper::getReadyStatus).isPresent();
619628
}
620629

621630
Map<String, ServerStatus> getServerStatuses(final String adminServerName) {
@@ -637,7 +646,18 @@ private ServerStatus createServerStatus(String serverName, boolean isAdminServer
637646
}
638647

639648
private String getRunningState(String serverName) {
640-
return Optional.ofNullable(serverState).map(m -> m.get(serverName)).orElse(null);
649+
String state = Optional.ofNullable(serverState).map(m -> m.get(serverName)).orElse(null);
650+
if (getCachedInfo().getServerPod(serverName) == null) {
651+
return SHUTDOWN_STATE;
652+
} else if (isDeleting(serverName)) {
653+
return SHUTTING_DOWN_STATE;
654+
}
655+
return state;
656+
}
657+
658+
private boolean isDeleting(String serverName) {
659+
return Optional.ofNullable(getCachedInfo().getServerPod(serverName))
660+
.map(p -> PodHelper.isDeleting(p)).orElse(false);
641661
}
642662

643663
private String getDesiredState(String serverName, String clusterName, boolean isAdminServer) {
@@ -697,7 +717,7 @@ private ClusterStatus createClusterStatus(String clusterName) {
697717

698718

699719
private String getNodeName(String serverName) {
700-
return Optional.ofNullable(getInfo().getServerPod(serverName))
720+
return Optional.ofNullable(getCachedInfo().getServerPod(serverName))
701721
.map(V1Pod::getSpec)
702722
.map(V1PodSpec::getNodeName)
703723
.orElse(null);

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import oracle.kubernetes.operator.builders.WatchBuilder;
2929
import oracle.kubernetes.operator.calls.CallResponse;
3030
import oracle.kubernetes.operator.helpers.CallBuilder;
31+
import oracle.kubernetes.operator.helpers.DomainPresenceInfo;
3132
import oracle.kubernetes.operator.helpers.KubernetesUtils;
3233
import oracle.kubernetes.operator.helpers.ResponseStep;
3334
import oracle.kubernetes.operator.logging.LoggingFacade;
@@ -241,8 +242,11 @@ private WaitForJobReadyStep(V1Job job, Step next) {
241242
metadata.getCreationTimestamp());
242243
}
243244

244-
// A job is considered ready once it has either successfully completed, or been marked as failed.
245245
@Override
246+
boolean isReady(V1Job job, DomainPresenceInfo info, String serverName) {
247+
return isReady(job);
248+
}
249+
246250
boolean isReady(V1Job job) {
247251
return isComplete(job) || isFailed(job);
248252
}
@@ -255,7 +259,7 @@ boolean onReadNotFoundForCachedResource(V1Job cachedJob, boolean isNotFoundOnRea
255259
// Ignore modified callbacks from different jobs (identified by having different creation times) or those
256260
// where the job is not yet ready.
257261
@Override
258-
boolean shouldProcessCallback(V1Job job) {
262+
boolean shouldProcessCallback(V1Job job, Packet packet) {
259263
return hasExpectedCreationTime(job) && isReady(job);
260264
}
261265

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

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -353,7 +353,7 @@ public NextAction onSuccess(Packet packet, CallResponse<V1Pod> callResponse) {
353353
}
354354
}
355355

356-
if (isReady(callResponse.getResult()) || callback.didResumeFiber()) {
356+
if (isReady(callResponse.getResult(), info, serverName) || callback.didResumeFiber()) {
357357
callback.proceedFromWait(callResponse.getResult());
358358
return null;
359359
}
@@ -407,16 +407,17 @@ private WaitForPodReadyStep(String podName, Step next) {
407407
super(podName, next);
408408
}
409409

410-
// A pod is ready if it is not being deleted and has the ready status.
411410
@Override
412-
protected boolean isReady(V1Pod result) {
411+
protected boolean isReady(V1Pod result, DomainPresenceInfo info, String serverName) {
413412
return result != null && !PodHelper.isDeleting(result) && PodHelper.isReady(result);
414413
}
415414

416415
// Pods should be processed if ready.
417416
@Override
418-
boolean shouldProcessCallback(V1Pod resource) {
419-
return isReady(resource);
417+
boolean shouldProcessCallback(V1Pod resource, Packet packet) {
418+
DomainPresenceInfo info = packet.getSpi(DomainPresenceInfo.class);
419+
String serverName = (String)packet.get(SERVER_NAME);
420+
return isReady(resource, info, serverName);
420421
}
421422

422423
@Override
@@ -452,9 +453,11 @@ protected boolean onReadNotFoundForCachedResource(V1Pod cachedPod, boolean isNot
452453
return false;
453454
}
454455

455-
// A pod is considered deleted when reading its value from Kubernetes returns null.
456456
@Override
457-
protected boolean isReady(V1Pod result) {
457+
protected boolean isReady(V1Pod result, DomainPresenceInfo info, String serverName) {
458+
if (result == null) {
459+
Optional.ofNullable(info).ifPresent(i -> i.setServerPod(serverName, null));
460+
}
458461
return result == null;
459462
}
460463

@@ -467,5 +470,27 @@ protected void addCallback(String podName, Consumer<V1Pod> callback) {
467470
protected void removeCallback(String podName, Consumer<V1Pod> callback) {
468471
removeOnDeleteCallback(podName, callback);
469472
}
473+
474+
@Override
475+
protected DefaultResponseStep<V1Pod> resumeIfReady(Callback callback) {
476+
return new DefaultResponseStep<>(getNext()) {
477+
@Override
478+
public NextAction onSuccess(Packet packet, CallResponse<V1Pod> callResponse) {
479+
480+
DomainPresenceInfo info = packet.getSpi(DomainPresenceInfo.class);
481+
String serverName = (String)packet.get(SERVER_NAME);
482+
if ((info != null) && (callResponse != null) && (callResponse.getResult() == null)) {
483+
info.setServerPod(serverName, null);
484+
}
485+
486+
if (isReady(callResponse.getResult(), info, serverName) || callback.didResumeFiber()) {
487+
callback.proceedFromWait(callResponse.getResult());
488+
return null;
489+
}
490+
return doDelay(createReadAndIfReadyCheckStep(callback), packet,
491+
getWatchBackstopRecheckDelaySeconds(), TimeUnit.SECONDS);
492+
}
493+
};
494+
}
470495
}
471496
}

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

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import oracle.kubernetes.weblogic.domain.model.Domain;
2424

2525
import static oracle.kubernetes.operator.ProcessingConstants.MAKE_RIGHT_DOMAIN_OPERATION;
26+
import static oracle.kubernetes.operator.ProcessingConstants.SERVER_NAME;
2627
import static oracle.kubernetes.operator.helpers.KubernetesUtils.getDomainUidLabel;
2728

2829
/**
@@ -79,9 +80,11 @@ static int getWatchBackstopRecheckCount() {
7980
/**
8081
* Returns true if the specified resource is deemed "ready." Different steps may define readiness in different ways.
8182
* @param resource the resource to check
83+
* @param info domain presence info
84+
* @param serverName Server name
8285
* @return true if processing can proceed
8386
*/
84-
abstract boolean isReady(T resource);
87+
abstract boolean isReady(T resource, DomainPresenceInfo info, String serverName);
8588

8689
/**
8790
* Returns true if the cached resource is not found during periodic listing.
@@ -100,7 +103,7 @@ static int getWatchBackstopRecheckCount() {
100103
* @param resource the resource to check
101104
* @return true if the resource is expected
102105
*/
103-
boolean shouldProcessCallback(T resource) {
106+
boolean shouldProcessCallback(T resource, Packet packet) {
104107
return true;
105108
}
106109

@@ -174,9 +177,11 @@ void logWaiting(String name) {
174177

175178
@Override
176179
public final NextAction apply(Packet packet) {
180+
String serverName = (String)packet.get(SERVER_NAME);
181+
DomainPresenceInfo info = packet.getSpi(DomainPresenceInfo.class);
177182
if (shouldTerminateFiber(initialResource)) {
178183
return doTerminate(createTerminationException(initialResource), packet);
179-
} else if (isReady(initialResource)) {
184+
} else if (isReady(initialResource, packet.getSpi(DomainPresenceInfo.class), serverName)) {
180185
return doNext(packet);
181186
}
182187

@@ -283,7 +288,7 @@ class Callback implements Consumer<T> {
283288

284289
@Override
285290
public void accept(T resource) {
286-
boolean shouldProcessCallback = shouldProcessCallback(resource);
291+
boolean shouldProcessCallback = shouldProcessCallback(resource, packet);
287292
if (shouldProcessCallback) {
288293
proceedFromWait(resource);
289294
}

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,13 @@
99
import java.util.HashMap;
1010
import java.util.List;
1111
import java.util.Map;
12+
import java.util.Optional;
1213
import java.util.Queue;
1314
import java.util.concurrent.ConcurrentLinkedQueue;
1415
import java.util.stream.Collectors;
1516
import java.util.stream.IntStream;
1617

18+
import oracle.kubernetes.operator.PodAwaiterStepFactory;
1719
import oracle.kubernetes.operator.ProcessingConstants;
1820
import oracle.kubernetes.operator.helpers.DomainPresenceInfo;
1921
import oracle.kubernetes.operator.helpers.ServiceHelper;
@@ -52,10 +54,21 @@ public NextAction apply(Packet packet) {
5254
getShutdownClusteredServersStepFactories(getServerShutdownInfos(), packet).values()
5355
.forEach(factory -> shutdownDetails.addAll(factory.getServerShutdownStepAndPackets(info)));
5456

57+
Collection<StepAndPacket> shutdownWaiters =
58+
getServerShutdownInfos().stream()
59+
.map(ssi -> createServerDownWaiters(packet, ssi)).collect(Collectors.toList());
60+
shutdownDetails.addAll(shutdownWaiters);
5561
return doNext((new ShutdownManagedServersStep(shutdownDetails, getNext())), packet);
5662

5763
}
5864

65+
private StepAndPacket createServerDownWaiters(Packet packet, DomainPresenceInfo.ServerShutdownInfo ssi) {
66+
DomainPresenceInfo info = packet.getSpi(DomainPresenceInfo.class);
67+
return new StepAndPacket(Optional.ofNullable(packet.getSpi(PodAwaiterStepFactory.class))
68+
.map(p -> p.waitForDelete(info.getServerPod(ssi.getServerName()), null)).orElse(null),
69+
createPacketForServer(packet, ssi));
70+
}
71+
5972
// pre-conditions: DomainPresenceInfo SPI
6073
// "principal"
6174
// "serverScan"

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ public ClusterStatus withReplicas(Integer replicas) {
104104
return this;
105105
}
106106

107-
Integer getReadyReplicas() {
107+
public Integer getReadyReplicas() {
108108
return readyReplicas;
109109
}
110110

0 commit comments

Comments
 (0)