Skip to content

Commit 6e0bb22

Browse files
committed
More hardening
1 parent aa695a7 commit 6e0bb22

File tree

6 files changed

+167
-67
lines changed

6 files changed

+167
-67
lines changed

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

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,6 @@ public NextAction apply(Packet packet) {
122122
unavailableClusters = new ArrayList<>();
123123
}
124124

125-
boolean clusterAvailable = false;
126125
boolean failedPod = false;
127126
if (isDelete) {
128127
madeChange = availableServers.remove(serverName) || madeChange;
@@ -144,6 +143,7 @@ public NextAction apply(Packet packet) {
144143
}
145144
}
146145
if (clusterName != null) {
146+
boolean clusterAvailable = false;
147147
WlsDomainConfig scan = info.getScan();
148148
if (scan != null) {
149149
WlsClusterConfig clusterConfig = scan.getClusterConfig(clusterName);
@@ -193,18 +193,18 @@ public NextAction apply(Packet packet) {
193193
}
194194
}
195195
}
196-
}
197-
if (clusterAvailable) {
198-
if (!availableClusters.contains(clusterName)) {
199-
availableClusters.add(clusterName);
200-
madeChange = true;
201-
}
202-
madeChange = unavailableClusters.remove(clusterName) || madeChange;
203-
} else {
204-
madeChange = availableClusters.remove(clusterName) || madeChange;
205-
if (!unavailableClusters.contains(clusterName)) {
206-
unavailableClusters.add(clusterName);
207-
madeChange = true;
196+
if (clusterAvailable) {
197+
if (!availableClusters.contains(clusterName)) {
198+
availableClusters.add(clusterName);
199+
madeChange = true;
200+
}
201+
madeChange = unavailableClusters.remove(clusterName) || madeChange;
202+
} else {
203+
madeChange = availableClusters.remove(clusterName) || madeChange;
204+
if (!unavailableClusters.contains(clusterName)) {
205+
unavailableClusters.add(clusterName);
206+
madeChange = true;
207+
}
208208
}
209209
}
210210

@@ -287,7 +287,7 @@ public NextAction apply(Packet packet) {
287287
conditions.add(dc);
288288
madeChange = true;
289289
}
290-
} else if (!availableServers.isEmpty() && unavailableServers.isEmpty() && unavailableClusters.isEmpty()) {
290+
} else if (!availableServers.isEmpty() && unavailableServers.isEmpty()) {
291291
Collection<ServerStartupInfo> ssic = info.getServerStartupInfo();
292292
if (ssic != null) {
293293
boolean allServersAvailable = true;

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

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -985,7 +985,7 @@ private static Step scaleDownIfNecessary(DomainPresenceInfo info, Collection<Str
985985
}
986986

987987
if (!serversToStop.isEmpty()) {
988-
return new ManagedServerDownIteratorStep(serversToStop, next);
988+
return new ServerDownIteratorStep(serversToStop, next);
989989
}
990990

991991
return next;
@@ -1040,52 +1040,52 @@ public NextAction apply(Packet packet) {
10401040
}
10411041
}
10421042

1043-
private static class ManagedServerDownIteratorStep extends Step {
1043+
private static class ServerDownIteratorStep extends Step {
10441044
private final Iterator<Map.Entry<String, ServerKubernetesObjects>> it;
10451045

1046-
public ManagedServerDownIteratorStep(Collection<Map.Entry<String, ServerKubernetesObjects>> serversToStop, Step next) {
1046+
public ServerDownIteratorStep(Collection<Map.Entry<String, ServerKubernetesObjects>> serversToStop, Step next) {
10471047
super(next);
10481048
this.it = serversToStop.iterator();
10491049
}
10501050

10511051
@Override
10521052
public NextAction apply(Packet packet) {
1053-
if (it.hasNext()) {
1053+
Collection<StepAndPacket> startDetails = new ArrayList<>();
1054+
1055+
while (it.hasNext()) {
10541056
Map.Entry<String, ServerKubernetesObjects> entry = it.next();
1055-
return doNext(new ManagedServerDownStep(entry.getKey(), entry.getValue(), this), packet);
1057+
startDetails.add(new StepAndPacket(new ServerDownStep(entry.getKey(), entry.getValue(), null), packet));
10561058
}
10571059

1058-
return doNext(packet);
1060+
if (startDetails.isEmpty()) {
1061+
return doNext(packet);
1062+
}
1063+
return doForkJoin(next, packet, startDetails);
10591064
}
10601065
}
10611066

1062-
private static class ManagedServerDownStep extends Step {
1067+
private static class ServerDownStep extends Step {
10631068
private final String serverName;
10641069
private final ServerKubernetesObjects sko;
10651070

1066-
public ManagedServerDownStep(String serverName, ServerKubernetesObjects sko, Step next) {
1071+
public ServerDownStep(String serverName, ServerKubernetesObjects sko, Step next) {
10671072
super(next);
10681073
this.serverName = serverName;
10691074
this.sko = sko;
10701075
}
10711076

10721077
@Override
10731078
public NextAction apply(Packet packet) {
1074-
List<V1Service> services = new ArrayList<V1Service>();
1075-
services.add(sko.getService().get());
1076-
services.addAll(sko.getChannels().values());
1077-
1078-
return doNext(IngressHelper.createRemoveServerStep(serverName, sko.getService().get(),
1079-
new DeleteServiceListStep(services,
1080-
PodHelper.deletePodStep(sko, serverName,
1081-
new ManagedServerDownFinalizeStep(serverName, next)))), packet);
1079+
return doNext(IngressHelper.createRemoveServerStep(serverName,
1080+
ServiceHelper.deleteServicesStep(sko,
1081+
PodHelper.deletePodStep(sko, new ServerDownFinalizeStep(serverName, next)))), packet);
10821082
}
10831083
}
10841084

1085-
private static class ManagedServerDownFinalizeStep extends Step {
1085+
private static class ServerDownFinalizeStep extends Step {
10861086
private final String serverName;
10871087

1088-
public ManagedServerDownFinalizeStep(String serverName, Step next) {
1088+
public ServerDownFinalizeStep(String serverName, Step next) {
10891089
super(next);
10901090
this.serverName = serverName;
10911091
}

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

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -173,35 +173,35 @@ public NextAction onSuccess(Packet packet, V1beta1Ingress result, int statusCode
173173
* Creates asynchronous step to update an ingress registration to remove a server or delete the ingress
174174
* entirely if this was the last server in the cluster
175175
* @param serverName Server name
176-
* @param service Service
177176
* @param next Next processing step
178177
* @return Step to update or delete the ingress
179178
*/
180-
public static Step createRemoveServerStep(String serverName, V1Service service, Step next) {
181-
return new RemoveServerStep(serverName, service, next);
179+
public static Step createRemoveServerStep(String serverName, Step next) {
180+
return new RemoveServerStep(serverName, next);
182181
}
183182

184183
private static class RemoveServerStep extends Step {
185184
private final String serverName;
186-
private final V1Service service;
187185

188-
private RemoveServerStep(String serverName, V1Service service, Step next) {
186+
private RemoveServerStep(String serverName, Step next) {
189187
super(next);
190188
this.serverName = serverName;
191-
this.service = service;
192189
}
193190

194191
@Override
195192
public NextAction apply(Packet packet) {
196193
DomainPresenceInfo info = packet.getSPI(DomainPresenceInfo.class);
197194
String clusterName = (String) packet.get(ProcessingConstants.CLUSTER_NAME);
198-
V1ObjectMeta meta = service.getMetadata();
195+
String namespace = info.getDomain().getMetadata().getNamespace();
199196

197+
String domainUID = info.getDomain().getSpec().getDomainUID();
200198
String ingressName= CallBuilder.toDNS1123LegalName(
201-
info.getDomain().getSpec().getDomainUID() + "-" + clusterName);
199+
domainUID + "-" + clusterName);
200+
String serviceName = CallBuilder.toDNS1123LegalName(domainUID + "-" + serverName);
201+
202202
if (ingressName != null) {
203203
return doNext(CallBuilder.create().readIngressAsync(
204-
ingressName, meta.getNamespace(), new ResponseStep<V1beta1Ingress>(next) {
204+
ingressName, namespace, new ResponseStep<V1beta1Ingress>(next) {
205205
@Override
206206
public NextAction onFailure(Packet packet, ApiException e, int statusCode,
207207
Map<String, List<String>> responseHeaders) {
@@ -223,14 +223,14 @@ public NextAction onSuccess(Packet packet, V1beta1Ingress result, int statusCode
223223
while (itr.hasNext()) {
224224
V1beta1HTTPIngressPath v1beta1HTTPIngressPath = itr.next();
225225
V1beta1IngressBackend v1beta1IngressBackend = v1beta1HTTPIngressPath.getBackend();
226-
if (meta.getName().equals(v1beta1IngressBackend.getServiceName())) {
226+
if (serviceName.equals(v1beta1IngressBackend.getServiceName())) {
227227
itr.remove();
228228
}
229229
}
230230
v1beta1HTTPIngressPaths = v1beta1HTTPIngressRuleValue.getPaths();
231231
if (v1beta1HTTPIngressPaths.isEmpty()) {
232232
info.getIngresses().remove(clusterName);
233-
return doNext(CallBuilder.create().deleteIngressAsync(result.getMetadata().getName(), meta.getNamespace(), new V1DeleteOptions(), new ResponseStep<V1Status>(next) {
233+
return doNext(CallBuilder.create().deleteIngressAsync(result.getMetadata().getName(), namespace, new V1DeleteOptions(), new ResponseStep<V1Status>(next) {
234234
@Override
235235
public NextAction onFailure(Packet packet, ApiException e, int statusCode,
236236
Map<String, List<String>> responseHeaders) {
@@ -244,7 +244,7 @@ public NextAction onSuccess(Packet packet, V1Status result, int statusCode,
244244
}
245245
}), packet);
246246
} else {
247-
return doNext(CallBuilder.create().replaceIngressAsync(ingressName, meta.getNamespace(), result, new ResponseStep<V1beta1Ingress>(next) {
247+
return doNext(CallBuilder.create().replaceIngressAsync(ingressName, namespace, result, new ResponseStep<V1beta1Ingress>(next) {
248248
@Override
249249
public NextAction onFailure(Packet packet, ApiException e, int statusCode,
250250
Map<String, List<String>> responseHeaders) {

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

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -623,22 +623,19 @@ private static void addEnvVar(V1Container container, String name, String value)
623623
/**
624624
* Factory for {@link Step} that deletes server pod
625625
* @param sko Server Kubernetes Objects
626-
* @param serverName Server name
627626
* @param next Next processing step
628627
* @return Step for deleting server pod
629628
*/
630-
public static Step deletePodStep(ServerKubernetesObjects sko, String serverName, Step next) {
631-
return new DeletePodStep(sko, serverName, next);
629+
public static Step deletePodStep(ServerKubernetesObjects sko, Step next) {
630+
return new DeletePodStep(sko, next);
632631
}
633632

634633
private static class DeletePodStep extends Step {
635634
private final ServerKubernetesObjects sko;
636-
private final String serverName;
637635

638-
public DeletePodStep(ServerKubernetesObjects sko, String serverName, Step next) {
636+
public DeletePodStep(ServerKubernetesObjects sko, Step next) {
639637
super(next);
640638
this.sko = sko;
641-
this.serverName = serverName;
642639
}
643640

644641
@Override
@@ -651,23 +648,26 @@ public NextAction apply(Packet packet) {
651648

652649
V1DeleteOptions deleteOptions = new V1DeleteOptions();
653650
// Set pod to null so that watcher doesn't try to recreate pod
654-
sko.getPod().set(null);
655-
return doNext(CallBuilder.create().deletePodAsync(serverName, namespace, deleteOptions, new ResponseStep<V1Status>(next) {
656-
@Override
657-
public NextAction onFailure(Packet packet, ApiException e, int statusCode,
658-
Map<String, List<String>> responseHeaders) {
659-
if (statusCode == CallBuilder.NOT_FOUND) {
660-
return onSuccess(packet, null, statusCode, responseHeaders);
651+
V1Pod oldPod = sko.getPod().getAndSet(null);
652+
if (oldPod != null) {
653+
return doNext(CallBuilder.create().deletePodAsync(oldPod.getMetadata().getName(), namespace, deleteOptions, new ResponseStep<V1Status>(next) {
654+
@Override
655+
public NextAction onFailure(Packet packet, ApiException e, int statusCode,
656+
Map<String, List<String>> responseHeaders) {
657+
if (statusCode == CallBuilder.NOT_FOUND) {
658+
return onSuccess(packet, null, statusCode, responseHeaders);
659+
}
660+
return super.onFailure(packet, e, statusCode, responseHeaders);
661661
}
662-
return super.onFailure(packet, e, statusCode, responseHeaders);
663-
}
664-
665-
@Override
666-
public NextAction onSuccess(Packet packet, V1Status result, int statusCode,
667-
Map<String, List<String>> responseHeaders) {
668-
return doNext(next, packet);
669-
}
670-
}), packet);
662+
663+
@Override
664+
public NextAction onSuccess(Packet packet, V1Status result, int statusCode,
665+
Map<String, List<String>> responseHeaders) {
666+
return doNext(next, packet);
667+
}
668+
}), packet);
669+
}
670+
return doNext(packet);
671671
}
672672
}
673673
}

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

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
import java.util.ArrayList;
2222
import java.util.HashMap;
23+
import java.util.Iterator;
2324
import java.util.List;
2425
import java.util.Map;
2526

@@ -363,4 +364,103 @@ public NextAction onSuccess(Packet packet, V1Service result, int statusCode,
363364
return doNext(read, packet);
364365
}
365366
}
367+
368+
/**
369+
* Factory for {@link Step} that deletes server pod
370+
* @param sko Server Kubernetes Objects
371+
* @param serverName Server name
372+
* @param next Next processing step
373+
* @return Step for deleting server pod
374+
*/
375+
public static Step deleteServicesStep(ServerKubernetesObjects sko, Step next) {
376+
return new DeleteServicesStep(sko, new DeleteChannelsIteratorStep(sko, next));
377+
}
378+
379+
private static class DeleteServicesStep extends Step {
380+
private final ServerKubernetesObjects sko;
381+
382+
public DeleteServicesStep(ServerKubernetesObjects sko, Step next) {
383+
super(next);
384+
this.sko = sko;
385+
}
386+
387+
@Override
388+
public NextAction apply(Packet packet) {
389+
DomainPresenceInfo info = packet.getSPI(DomainPresenceInfo.class);
390+
391+
Domain dom = info.getDomain();
392+
V1ObjectMeta meta = dom.getMetadata();
393+
String namespace = meta.getNamespace();
394+
395+
// Set service to null so that watcher doesn't try to recreate service
396+
V1Service oldService = sko.getService().getAndSet(null);
397+
if (oldService != null) {
398+
return doNext(CallBuilder.create().deleteServiceAsync(oldService.getMetadata().getName(), namespace, new ResponseStep<V1Status>(next) {
399+
@Override
400+
public NextAction onFailure(Packet packet, ApiException e, int statusCode,
401+
Map<String, List<String>> responseHeaders) {
402+
if (statusCode == CallBuilder.NOT_FOUND) {
403+
return onSuccess(packet, null, statusCode, responseHeaders);
404+
}
405+
return super.onFailure(packet, e, statusCode, responseHeaders);
406+
}
407+
408+
@Override
409+
public NextAction onSuccess(Packet packet, V1Status result, int statusCode,
410+
Map<String, List<String>> responseHeaders) {
411+
return doNext(next, packet);
412+
}
413+
}), packet);
414+
}
415+
return doNext(packet);
416+
}
417+
}
418+
419+
private static class DeleteChannelsIteratorStep extends Step {
420+
private final ServerKubernetesObjects sko;
421+
private final Iterator<Map.Entry<String, V1Service>> it;
422+
423+
public DeleteChannelsIteratorStep(ServerKubernetesObjects sko, Step next) {
424+
super(next);
425+
this.sko = sko;
426+
this.it = sko.getChannels().entrySet().iterator();
427+
}
428+
429+
@Override
430+
public NextAction apply(Packet packet) {
431+
if (it.hasNext()) {
432+
Map.Entry<String, V1Service> entry = it.next();
433+
434+
DomainPresenceInfo info = packet.getSPI(DomainPresenceInfo.class);
435+
436+
Domain dom = info.getDomain();
437+
V1ObjectMeta meta = dom.getMetadata();
438+
String namespace = meta.getNamespace();
439+
440+
// Set service to null so that watcher doesn't try to recreate service
441+
V1Service oldService = sko.getChannels().remove(entry.getKey());
442+
if (oldService != null) {
443+
return doNext(CallBuilder.create().deleteServiceAsync(oldService.getMetadata().getName(), namespace, new ResponseStep<V1Status>(this) {
444+
@Override
445+
public NextAction onFailure(Packet packet, ApiException e, int statusCode,
446+
Map<String, List<String>> responseHeaders) {
447+
if (statusCode == CallBuilder.NOT_FOUND) {
448+
return onSuccess(packet, null, statusCode, responseHeaders);
449+
}
450+
return super.onFailure(packet, e, statusCode, responseHeaders);
451+
}
452+
453+
@Override
454+
public NextAction onSuccess(Packet packet, V1Status result, int statusCode,
455+
Map<String, List<String>> responseHeaders) {
456+
return doNext(this, packet);
457+
}
458+
}), packet);
459+
}
460+
return doNext(this, packet);
461+
}
462+
463+
return doNext(packet);
464+
}
465+
}
366466
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,7 @@ public void onThrowable(Packet packet, Throwable throwable) {
220220
p.put(ProcessingConstants.CLUSTER_SCAN, info.getScan().getClusterConfig(clusterName));
221221

222222
f = engine.createFiber();
223-
Step r = IngressHelper.createRemoveServerStep(server1Name, info.getServers().get(server1Name).getService().get(), null);
223+
Step r = IngressHelper.createRemoveServerStep(server1Name, null);
224224
f.start(r, p, new CompletionCallback() {
225225
@Override
226226
public void onCompletion(Packet packet) {

0 commit comments

Comments
 (0)