Skip to content

Commit 799c65b

Browse files
authored
Merge pull request #1012 from oracle/isolate_pod_presence
Eliminate duplicate logic by moving all ServerKubernetesObjects acces…
2 parents f193e52 + b44229f commit 799c65b

37 files changed

+1464
-807
lines changed

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

Lines changed: 35 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import java.util.ArrayList;
1717
import java.util.List;
1818
import java.util.Map;
19+
import java.util.Optional;
1920
import java.util.concurrent.ConcurrentHashMap;
2021
import java.util.concurrent.ConcurrentMap;
2122
import java.util.concurrent.ScheduledFuture;
@@ -31,7 +32,6 @@
3132
import oracle.kubernetes.operator.helpers.KubernetesUtils;
3233
import oracle.kubernetes.operator.helpers.PodHelper;
3334
import oracle.kubernetes.operator.helpers.ResponseStep;
34-
import oracle.kubernetes.operator.helpers.ServerKubernetesObjects;
3535
import oracle.kubernetes.operator.helpers.ServiceHelper;
3636
import oracle.kubernetes.operator.logging.LoggingFacade;
3737
import oracle.kubernetes.operator.logging.LoggingFactory;
@@ -135,66 +135,22 @@ public void stopNamespace(String ns) {
135135
}
136136

137137
public void dispatchPodWatch(Watch.Response<V1Pod> item) {
138-
V1Pod p = item.object;
139-
if (p != null) {
140-
V1ObjectMeta metadata = p.getMetadata();
138+
V1Pod pod = item.object;
139+
if (pod != null) {
140+
V1ObjectMeta metadata = pod.getMetadata();
141141
String domainUID = metadata.getLabels().get(LabelConstants.DOMAINUID_LABEL);
142142
String serverName = metadata.getLabels().get(LabelConstants.SERVERNAME_LABEL);
143143
if (domainUID != null && serverName != null) {
144144
DomainPresenceInfo info = getExistingDomainPresenceInfo(metadata.getNamespace(), domainUID);
145145
if (info != null) {
146-
ServerKubernetesObjects sko =
147-
info.getServers().computeIfAbsent(serverName, k -> new ServerKubernetesObjects());
148146
switch (item.type) {
149147
case "ADDED":
150-
sko.getPod()
151-
.accumulateAndGet(
152-
p,
153-
(current, ob) -> {
154-
if (current != null) {
155-
if (KubernetesUtils.isFirstNewer(current.getMetadata(), metadata)) {
156-
return current;
157-
}
158-
}
159-
return ob;
160-
});
161-
break;
162148
case "MODIFIED":
163-
if (PodWatcher.isReady(p)) {
164-
sko.getLastKnownStatus().set(WebLogicConstants.RUNNING_STATE);
165-
} else {
166-
sko.getLastKnownStatus().compareAndSet(WebLogicConstants.RUNNING_STATE, null);
167-
}
168-
sko.getPod()
169-
.accumulateAndGet(
170-
p,
171-
(current, ob) -> {
172-
if (current != null) {
173-
if (!KubernetesUtils.isFirstNewer(current.getMetadata(), metadata)) {
174-
return ob;
175-
}
176-
}
177-
// If the skoPod is null then the operator deleted this pod
178-
// and modifications are to the terminating pod
179-
return current;
180-
});
149+
info.setServerPodFromEvent(serverName, pod);
181150
break;
182151
case "DELETED":
183-
V1Pod oldPod =
184-
sko.getPod()
185-
.getAndAccumulate(
186-
p,
187-
(current, ob) -> {
188-
if (current != null) {
189-
if (!KubernetesUtils.isFirstNewer(current.getMetadata(), metadata)) {
190-
sko.getLastKnownStatus().set(WebLogicConstants.SHUTDOWN_STATE);
191-
return null;
192-
}
193-
}
194-
return current;
195-
});
196-
if (oldPod != null && info.isNotDeleting()) {
197-
// Pod was deleted, but sko still contained a non-null entry
152+
boolean removed = info.deleteServerPodFromEvent(serverName, pod);
153+
if (removed && info.isNotDeleting()) {
198154
LOGGER.info(
199155
MessageKeys.POD_DELETED, domainUID, metadata.getNamespace(), serverName);
200156
makeRightDomainPresence(info, true, false, true);
@@ -209,6 +165,14 @@ public void dispatchPodWatch(Watch.Response<V1Pod> item) {
209165
}
210166
}
211167

168+
private V1Pod getNewerPod(V1Pod first, V1Pod second) {
169+
return KubernetesUtils.isFirstNewer(getMetadata(first), getMetadata(second)) ? first : second;
170+
}
171+
172+
private V1ObjectMeta getMetadata(V1Pod pod) {
173+
return pod == null ? null : pod.getMetadata();
174+
}
175+
212176
public void dispatchServiceWatch(Watch.Response<V1Service> item) {
213177
V1Service service = item.object;
214178
String domainUID = ServiceHelper.getServiceDomainUID(service);
@@ -265,30 +229,24 @@ public void dispatchEventWatch(Watch.Response<V1Event> item) {
265229

266230
private static void onEvent(V1Event event) {
267231
V1ObjectReference ref = event.getInvolvedObject();
268-
if (ref != null) {
269-
String name = ref.getName();
270-
String message = event.getMessage();
271-
if (message != null) {
272-
if (message.contains(WebLogicConstants.READINESS_PROBE_NOT_READY_STATE)) {
273-
String ns = event.getMetadata().getNamespace();
274-
Map<String, DomainPresenceInfo> map = DOMAINS.get(ns);
275-
if (map != null) {
276-
for (DomainPresenceInfo d : map.values()) {
277-
String domainUIDPlusDash = d.getDomainUID() + "-";
278-
if (name.startsWith(domainUIDPlusDash)) {
279-
String serverName = name.substring(domainUIDPlusDash.length());
280-
ServerKubernetesObjects sko = d.getServers().get(serverName);
281-
if (sko != null) {
282-
int idx = message.lastIndexOf(':');
283-
sko.getLastKnownStatus().set(message.substring(idx + 1).trim());
284-
break;
285-
}
286-
}
287-
}
288-
}
289-
}
290-
}
291-
}
232+
if (ref == null) return;
233+
234+
String[] domainAndServer = ref.getName().split("-");
235+
String domainUid = domainAndServer[0];
236+
String serverName = domainAndServer[1];
237+
String status = getReadinessStatus(event);
238+
if (status == null) return;
239+
240+
Optional.ofNullable(DOMAINS.get(event.getMetadata().getNamespace()))
241+
.map(m -> m.get(domainUid))
242+
.ifPresent(info -> info.setLastKnownServerStatus(serverName, status));
243+
}
244+
245+
private static String getReadinessStatus(V1Event event) {
246+
return Optional.ofNullable(event.getMessage())
247+
.filter(m -> m.contains(WebLogicConstants.READINESS_PROBE_NOT_READY_STATE))
248+
.map(m -> m.substring(m.lastIndexOf(':') + 1).trim())
249+
.orElse(null);
292250
}
293251

294252
/**
@@ -542,11 +500,9 @@ public NextAction onSuccess(Packet packet, CallResponse<V1PodList> callResponse)
542500
V1PodList result = callResponse.getResult();
543501
if (result != null) {
544502
for (V1Pod pod : result.getItems()) {
545-
String serverName = PodWatcher.getPodServerName(pod);
503+
String serverName = PodHelper.getPodServerName(pod);
546504
if (serverName != null) {
547-
ServerKubernetesObjects sko =
548-
info.getServers().computeIfAbsent(serverName, k -> new ServerKubernetesObjects());
549-
sko.getPod().set(pod);
505+
info.setServerPod(serverName, pod);
550506
}
551507
}
552508
}

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

Lines changed: 7 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
import static oracle.kubernetes.weblogic.domain.model.DomainConditionType.Progressing;
1616

1717
import io.kubernetes.client.models.V1ObjectMeta;
18-
import io.kubernetes.client.models.V1Pod;
1918
import java.util.ArrayList;
2019
import java.util.Collection;
2120
import java.util.HashSet;
@@ -31,7 +30,7 @@
3130
import oracle.kubernetes.operator.helpers.CallBuilder;
3231
import oracle.kubernetes.operator.helpers.DomainPresenceInfo;
3332
import oracle.kubernetes.operator.helpers.DomainPresenceInfo.ServerStartupInfo;
34-
import oracle.kubernetes.operator.helpers.ServerKubernetesObjects;
33+
import oracle.kubernetes.operator.helpers.PodHelper;
3534
import oracle.kubernetes.operator.logging.LoggingFacade;
3635
import oracle.kubernetes.operator.logging.LoggingFactory;
3736
import oracle.kubernetes.operator.logging.MessageKeys;
@@ -195,11 +194,7 @@ private boolean isNotRunning(@Nonnull String serverName) {
195194
}
196195

197196
private boolean isHasFailedPod() {
198-
return getServers().values().stream().anyMatch(this::isPodFailed);
199-
}
200-
201-
private boolean isPodFailed(ServerKubernetesObjects sko) {
202-
return Optional.ofNullable(sko.getPod().get()).map(PodWatcher::isFailed).orElse(false);
197+
return getInfo().getServerPods().anyMatch(PodHelper::isFailed);
203198
}
204199

205200
Map<String, ServerStatus> getServerStatuses() {
@@ -237,11 +232,9 @@ private Map<String, Long> getClusterCounts() {
237232
}
238233

239234
private String getNodeName(String serverName) {
240-
return getPod(serverName).map(p -> p.getSpec().getNodeName()).orElse(null);
241-
}
242-
243-
private Optional<V1Pod> getPod(String serverName) {
244-
return Optional.ofNullable(getServers().get(serverName)).map(s -> s.getPod().get());
235+
return Optional.ofNullable(getInfo().getServerPod(serverName))
236+
.map(p -> p.getSpec().getNodeName())
237+
.orElse(null);
245238
}
246239

247240
private String getClusterName(String serverName) {
@@ -251,22 +244,18 @@ private String getClusterName(String serverName) {
251244
}
252245

253246
private String getClusterNameFromPod(String serverName) {
254-
return getPod(serverName)
247+
return Optional.ofNullable(getInfo().getServerPod(serverName))
255248
.map(p -> p.getMetadata().getLabels().get(CLUSTERNAME_LABEL))
256249
.orElse(null);
257250
}
258251

259252
private Collection<String> getServerNames() {
260-
Set<String> result = new HashSet<>(getServers().keySet());
253+
Set<String> result = new HashSet<>(getInfo().getServerNames());
261254
if (config != null) {
262255
result.addAll(config.getServerConfigs().keySet());
263256
}
264257
return result;
265258
}
266-
267-
private Map<String, ServerKubernetesObjects> getServers() {
268-
return getInfo().getServers();
269-
}
270259
}
271260
}
272261

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

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,8 @@
4141
import oracle.kubernetes.operator.helpers.DomainPresenceInfo;
4242
import oracle.kubernetes.operator.helpers.HealthCheckHelper;
4343
import oracle.kubernetes.operator.helpers.KubernetesVersion;
44+
import oracle.kubernetes.operator.helpers.PodHelper;
4445
import oracle.kubernetes.operator.helpers.ResponseStep;
45-
import oracle.kubernetes.operator.helpers.ServerKubernetesObjects;
4646
import oracle.kubernetes.operator.helpers.ServiceHelper;
4747
import oracle.kubernetes.operator.logging.LoggingFacade;
4848
import oracle.kubernetes.operator.logging.LoggingFactory;
@@ -658,14 +658,12 @@ public NextAction onSuccess(Packet packet, CallResponse<V1PodList> callResponse)
658658

659659
if (result != null) {
660660
for (V1Pod pod : result.getItems()) {
661-
String domainUID = PodWatcher.getPodDomainUID(pod);
662-
String serverName = PodWatcher.getPodServerName(pod);
661+
String domainUID = PodHelper.getPodDomainUID(pod);
662+
String serverName = PodHelper.getPodServerName(pod);
663663
if (domainUID != null && serverName != null) {
664664
DomainPresenceInfo info =
665665
dpis.computeIfAbsent(domainUID, k -> new DomainPresenceInfo(ns, domainUID));
666-
ServerKubernetesObjects sko =
667-
info.getServers().computeIfAbsent(serverName, k -> new ServerKubernetesObjects());
668-
sko.getPod().set(pod);
666+
info.setServerPod(serverName, pod);
669667
}
670668
}
671669
}

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

Lines changed: 4 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@
77
import io.kubernetes.client.ApiException;
88
import io.kubernetes.client.models.V1ObjectMeta;
99
import io.kubernetes.client.models.V1Pod;
10-
import io.kubernetes.client.models.V1PodCondition;
11-
import io.kubernetes.client.models.V1PodStatus;
1210
import io.kubernetes.client.util.Watch;
1311
import java.util.List;
1412
import java.util.Map;
@@ -21,6 +19,7 @@
2119
import oracle.kubernetes.operator.builders.WatchI;
2220
import oracle.kubernetes.operator.helpers.CallBuilder;
2321
import oracle.kubernetes.operator.helpers.CallBuilderFactory;
22+
import oracle.kubernetes.operator.helpers.PodHelper;
2423
import oracle.kubernetes.operator.helpers.ResponseStep;
2524
import oracle.kubernetes.operator.logging.LoggingFacade;
2625
import oracle.kubernetes.operator.logging.LoggingFactory;
@@ -92,7 +91,7 @@ public void receivedResponse(Watch.Response<V1Pod> item) {
9291
case "ADDED":
9392
case "MODIFIED":
9493
V1Pod pod = item.object;
95-
Boolean isReady = isReady(pod);
94+
Boolean isReady = PodHelper.isReady(pod);
9695
String podName = pod.getMetadata().getName();
9796
if (isReady) {
9897
OnReady ready = readyCallbackRegistrations.remove(podName);
@@ -111,67 +110,6 @@ public void receivedResponse(Watch.Response<V1Pod> item) {
111110
LOGGER.exiting();
112111
}
113112

114-
static boolean isTerminating(V1Pod pod) {
115-
return pod.getMetadata().getDeletionTimestamp() != null
116-
|| pod.getMetadata().getDeletionGracePeriodSeconds() != null;
117-
}
118-
119-
static boolean isReady(V1Pod pod) {
120-
boolean ready = getReadyStatus(pod);
121-
if (ready) {
122-
LOGGER.info(MessageKeys.POD_IS_READY, pod.getMetadata().getName());
123-
}
124-
return ready;
125-
}
126-
127-
static boolean getReadyStatus(V1Pod pod) {
128-
V1PodStatus status = pod.getStatus();
129-
if (status != null) {
130-
if ("Running".equals(status.getPhase())) {
131-
List<V1PodCondition> conds = status.getConditions();
132-
if (conds != null) {
133-
for (V1PodCondition cond : conds) {
134-
if ("Ready".equals(cond.getType())) {
135-
if ("True".equals(cond.getStatus())) {
136-
return true;
137-
}
138-
}
139-
}
140-
}
141-
}
142-
}
143-
return false;
144-
}
145-
146-
static boolean isFailed(V1Pod pod) {
147-
V1PodStatus status = pod.getStatus();
148-
if (status != null) {
149-
if ("Failed".equals(status.getPhase())) {
150-
LOGGER.severe(MessageKeys.POD_IS_FAILED, pod.getMetadata().getName());
151-
return true;
152-
}
153-
}
154-
return false;
155-
}
156-
157-
static String getPodDomainUID(V1Pod pod) {
158-
V1ObjectMeta meta = pod.getMetadata();
159-
Map<String, String> labels = meta.getLabels();
160-
if (labels != null) {
161-
return labels.get(LabelConstants.DOMAINUID_LABEL);
162-
}
163-
return null;
164-
}
165-
166-
static String getPodServerName(V1Pod pod) {
167-
V1ObjectMeta meta = pod.getMetadata();
168-
Map<String, String> labels = meta.getLabels();
169-
if (labels != null) {
170-
return labels.get(LabelConstants.SERVERNAME_LABEL);
171-
}
172-
return null;
173-
}
174-
175113
/**
176114
* Waits until the Pod is Ready.
177115
*
@@ -193,7 +131,7 @@ private WaitForPodReadyStep(V1Pod pod, Step next) {
193131

194132
@Override
195133
public NextAction apply(Packet packet) {
196-
if (isReady(pod)) {
134+
if (PodHelper.isReady(pod)) {
197135
return doNext(packet);
198136
}
199137

@@ -242,7 +180,7 @@ public NextAction onSuccess(
242180
V1Pod result,
243181
int statusCode,
244182
Map<String, List<String>> responseHeaders) {
245-
if (result != null && isReady(result)) {
183+
if (result != null && PodHelper.isReady(result)) {
246184
if (didResume.compareAndSet(false, true)) {
247185
readyCallbackRegistrations.remove(metadata.getName(), ready);
248186
fiber.resume(packet);

0 commit comments

Comments
 (0)