Skip to content

Commit 7e23a5f

Browse files
authored
Owls 107255 generate ClusterCreated/Changed events in recheck (#4052)
* Generate ClusterCreated and ClusterChanged events in recheck
1 parent d861067 commit 7e23a5f

16 files changed

+290
-57
lines changed

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33

44
package oracle.kubernetes.operator;
55

6+
import java.util.Collections;
7+
import java.util.List;
68
import java.util.Map;
79
import java.util.concurrent.ConcurrentHashMap;
810

@@ -136,4 +138,8 @@ default Map<String, Map<String, ClusterPresenceInfo>> getClusterPresenceInfoMap
136138
DomainPresenceInfo getExistingDomainPresenceInfo(String namespace, String domainUid);
137139

138140
void updateDomainStatus(V1Pod pod, DomainPresenceInfo info);
141+
142+
default List<DomainPresenceInfo> getExistingDomainPresenceInfoForCluster(String namespace, String clusterName) {
143+
return Collections.emptyList();
144+
}
139145
}

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

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@
3333
import oracle.kubernetes.operator.helpers.ClusterPresenceInfo;
3434
import oracle.kubernetes.operator.helpers.ConfigMapHelper;
3535
import oracle.kubernetes.operator.helpers.DomainPresenceInfo;
36-
import oracle.kubernetes.operator.helpers.EventHelper;
3736
import oracle.kubernetes.operator.helpers.EventHelper.EventData;
3837
import oracle.kubernetes.operator.helpers.EventHelper.EventItem;
3938
import oracle.kubernetes.operator.helpers.KubernetesEventObjects;
@@ -69,8 +68,11 @@
6968
import static oracle.kubernetes.operator.DomainStatusUpdater.createIntrospectionFailureSteps;
7069
import static oracle.kubernetes.operator.ProcessingConstants.SERVER_HEALTH_MAP;
7170
import static oracle.kubernetes.operator.ProcessingConstants.SERVER_STATE_MAP;
71+
import static oracle.kubernetes.operator.helpers.EventHelper.EventItem.CLUSTER_CHANGED;
72+
import static oracle.kubernetes.operator.helpers.EventHelper.EventItem.CLUSTER_CREATED;
7273
import static oracle.kubernetes.operator.helpers.EventHelper.EventItem.DOMAIN_CHANGED;
7374
import static oracle.kubernetes.operator.helpers.EventHelper.EventItem.DOMAIN_CREATED;
75+
import static oracle.kubernetes.operator.helpers.EventHelper.createClusterResourceEventData;
7476
import static oracle.kubernetes.operator.helpers.PodHelper.getPodDomainUid;
7577
import static oracle.kubernetes.operator.helpers.PodHelper.getPodName;
7678
import static oracle.kubernetes.operator.helpers.PodHelper.getPodNamespace;
@@ -169,7 +171,8 @@ public Map<String, FiberGate> getMakeRightFiberGateMap() {
169171
return makeRightFiberGates;
170172
}
171173

172-
private static List<DomainPresenceInfo> getExistingDomainPresenceInfoForCluster(String ns, String cluster) {
174+
@Override
175+
public List<DomainPresenceInfo> getExistingDomainPresenceInfoForCluster(String ns, String cluster) {
173176
List<DomainPresenceInfo> referencingDomains = new ArrayList<>();
174177
Optional.ofNullable(domains.get(ns)).ifPresent(d -> d.values().stream()
175178
.filter(info -> info.doesReferenceCluster(cluster)).forEach(referencingDomains::add));
@@ -395,7 +398,7 @@ private boolean shouldContinue(MakeRightClusterOperation operation, ClusterPrese
395398
return true;
396399
} else if (liveInfo.isFromOutOfDateEvent(operation, cachedInfo)) {
397400
return false;
398-
} else if (liveInfo.isClusterGenerationChanged(cachedInfo)) {
401+
} else if (operation.isExplicitRecheck() || liveInfo.isClusterGenerationChanged(cachedInfo)) {
399402
return true;
400403
} else {
401404
cachedInfo.setCluster(liveInfo.getCluster());
@@ -779,11 +782,11 @@ private void handleAddedCluster(ClusterResource cluster) {
779782
getExistingDomainPresenceInfoForCluster(cluster.getNamespace(), cluster.getMetadata().getName());
780783
if (hostingDomains.isEmpty()) {
781784
LOGGER.info(MessageKeys.WATCH_CLUSTER_WITHOUT_DOMAIN, cluster.getMetadata().getName());
782-
createMakeRightOperationForClusterEvent(EventItem.CLUSTER_CREATED, cluster, null).execute();
785+
createMakeRightOperationForClusterEvent(CLUSTER_CREATED, cluster, null).execute();
783786
} else {
784787
hostingDomains.forEach(info -> {
785788
LOGGER.info(MessageKeys.WATCH_CLUSTER, cluster.getMetadata().getName(), info.getDomainUid());
786-
createMakeRightOperationForClusterEvent(EventItem.CLUSTER_CREATED, cluster, info.getDomainUid()).execute();
789+
createMakeRightOperationForClusterEvent(CLUSTER_CREATED, cluster, info.getDomainUid()).execute();
787790
createMakeRightOperation(info)
788791
.interrupt()
789792
.withExplicitRecheck()
@@ -797,7 +800,7 @@ private void handleModifiedCluster(ClusterResource cluster) {
797800
getExistingDomainPresenceInfoForCluster(cluster.getNamespace(), cluster.getMetadata().getName());
798801
if (hostingDomains.isEmpty()) {
799802
LOGGER.info(MessageKeys.WATCH_CLUSTER_WITHOUT_DOMAIN, cluster.getMetadata().getName());
800-
createMakeRightOperationForClusterEvent(EventItem.CLUSTER_CHANGED, cluster, null).execute();
803+
createMakeRightOperationForClusterEvent(CLUSTER_CHANGED, cluster, null).execute();
801804
} else {
802805
hostingDomains.forEach(info -> {
803806
ClusterResource cachedResource = info.getClusterResource(cluster.getClusterName());
@@ -806,7 +809,7 @@ private void handleModifiedCluster(ClusterResource cluster) {
806809
}
807810

808811
LOGGER.fine(MessageKeys.WATCH_CLUSTER, cluster.getMetadata().getName(), info.getDomainUid());
809-
createMakeRightOperationForClusterEvent(EventItem.CLUSTER_CHANGED, cluster, info.getDomainUid()).execute();
812+
createMakeRightOperationForClusterEvent(CLUSTER_CHANGED, cluster, info.getDomainUid()).execute();
810813
createMakeRightOperation(info)
811814
.interrupt()
812815
.withExplicitRecheck()
@@ -839,7 +842,7 @@ public MakeRightClusterOperation createMakeRightOperationForClusterEvent(
839842
EventItem clusterEvent, ClusterResource cluster, String domainUid) {
840843
return delegate.createMakeRightOperation(this, createInfoForClusterEventOnly(cluster))
841844
.interrupt()
842-
.withEventData(EventHelper.createClusterResourceEventData(clusterEvent, cluster, domainUid));
845+
.withEventData(createClusterResourceEventData(clusterEvent, cluster, domainUid));
843846
}
844847

845848
@Override
@@ -850,7 +853,7 @@ public MakeRightClusterOperation createMakeRightOperationForClusterEvent(
850853

851854
@NotNull
852855
private ClusterPresenceInfo createInfoForClusterEventOnly(ClusterResource cluster) {
853-
return new ClusterPresenceInfo(cluster.getNamespace(), cluster);
856+
return new ClusterPresenceInfo(cluster);
854857
}
855858

856859
/**

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

Lines changed: 52 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
import java.util.HashSet;
1010
import java.util.List;
1111
import java.util.Map;
12-
import java.util.Objects;
1312
import java.util.Optional;
1413
import java.util.Set;
1514
import java.util.concurrent.ConcurrentHashMap;
@@ -28,7 +27,6 @@
2827
import io.kubernetes.client.openapi.models.V1ServiceList;
2928
import oracle.kubernetes.operator.helpers.ClusterPresenceInfo;
3029
import oracle.kubernetes.operator.helpers.DomainPresenceInfo;
31-
import oracle.kubernetes.operator.helpers.EventHelper;
3230
import oracle.kubernetes.operator.helpers.EventHelper.EventData;
3331
import oracle.kubernetes.operator.helpers.EventHelper.EventItem;
3432
import oracle.kubernetes.operator.helpers.PodDisruptionBudgetHelper;
@@ -39,8 +37,11 @@
3937
import oracle.kubernetes.weblogic.domain.model.ClusterResource;
4038
import oracle.kubernetes.weblogic.domain.model.DomainList;
4139
import oracle.kubernetes.weblogic.domain.model.DomainResource;
42-
import org.jetbrains.annotations.Nullable;
40+
import org.jetbrains.annotations.NotNull;
4341

42+
import static oracle.kubernetes.operator.helpers.EventHelper.EventItem.CLUSTER_CHANGED;
43+
import static oracle.kubernetes.operator.helpers.EventHelper.EventItem.CLUSTER_CREATED;
44+
import static oracle.kubernetes.operator.helpers.EventHelper.EventItem.CLUSTER_DELETED;
4445
import static oracle.kubernetes.operator.helpers.EventHelper.EventItem.DOMAIN_CHANGED;
4546
import static oracle.kubernetes.operator.helpers.EventHelper.EventItem.DOMAIN_CREATED;
4647

@@ -53,6 +54,8 @@ class DomainResourcesValidation {
5354
private final String namespace;
5455
private final DomainProcessor processor;
5556
private ClusterList activeClusterResources;
57+
private final Set<String> modifiedClusterNames = new HashSet<>();
58+
private final Set<String> newClusterNames = new HashSet<>();
5659
private final Set<String> modifiedDomainNames = new HashSet<>();
5760
private final Set<String> newDomainNames = new HashSet<>();
5861

@@ -99,19 +102,25 @@ public void completeProcessing(Packet packet) {
99102
getStrandedDomainPresenceInfos(dp).forEach(info -> removeStrandedDomainPresenceInfo(dp, info));
100103
Optional.ofNullable(activeClusterResources).ifPresent(c -> getActiveDomainPresenceInfos()
101104
.forEach(info -> adjustClusterResources(c, info)));
102-
executeMakeRightForDeletedClusters(dp);
105+
executeMakeRightForClusterEvents(dp);
103106
getActiveDomainPresenceInfos().forEach(info -> activateDomain(dp, info));
104107
}
105108
};
106109
}
107110

108-
private void executeMakeRightForDeletedClusters(DomainProcessor dp) {
109-
List<String> clusterNamesFromList = Optional.ofNullable(activeClusterResources).map(ClusterList::getItems)
110-
.orElse(new ArrayList<>()).stream().map(ClusterResource::getMetadata).map(V1ObjectMeta::getName)
111+
private void executeMakeRightForClusterEvents(DomainProcessor dp) {
112+
List<String> clusterNamesFromList =
113+
getActiveClusterResources().stream().map(ClusterResource::getMetadata).map(V1ObjectMeta::getName)
111114
.collect(Collectors.toList());
112115
getClusterPresenceInfoMap().values().stream()
113116
.filter(cpi -> !clusterNamesFromList.contains(cpi.getResourceName())).collect(Collectors.toList())
114-
.forEach(info -> deActivateCluster(dp, info));
117+
.forEach(info -> updateCluster(dp, info.getCluster(), CLUSTER_DELETED));
118+
getActiveClusterResources().forEach(cluster -> updateCluster(dp, cluster, getEventItem(cluster)));
119+
}
120+
121+
@NotNull
122+
private List<ClusterResource> getActiveClusterResources() {
123+
return Optional.ofNullable(activeClusterResources).map(ClusterList::getItems).orElse(new ArrayList<>());
115124
}
116125

117126
private void adjustClusterResources(ClusterList clusters, DomainPresenceInfo info) {
@@ -222,7 +231,7 @@ private void addDomain(DomainResource domain) {
222231
DomainPresenceInfo cachedInfo = getDomainPresenceInfoMap().get(domain.getDomainUid());
223232
if (cachedInfo == null) {
224233
newDomainNames.add(domain.getDomainUid());
225-
} else if (generationChanged(cachedInfo, domain)) {
234+
} else if (domain.isGenerationChanged(cachedInfo.getDomain())) {
226235
modifiedDomainNames.add(domain.getDomainUid());
227236
}
228237
getOrComputeDomainPresenceInfo(domain.getDomainUid()).setDomain(domain);
@@ -234,7 +243,14 @@ private void addClusterList(ClusterList list) {
234243
}
235244

236245
private void addCluster(ClusterResource cluster) {
237-
getClusterPresenceInfoMap().put(cluster.getClusterName(), new ClusterPresenceInfo(cluster.getNamespace(), cluster));
246+
ClusterPresenceInfo cachedInfo = getClusterPresenceInfoMap().get(cluster.getClusterName());
247+
if (cachedInfo == null) {
248+
newClusterNames.add(cluster.getClusterName());
249+
} else if (cluster.isGenerationChanged(cachedInfo.getCluster())) {
250+
modifiedClusterNames.add(cluster.getClusterName());
251+
}
252+
253+
getClusterPresenceInfoMap().put(cluster.getClusterName(), new ClusterPresenceInfo(cluster));
238254
}
239255

240256
private Stream<DomainPresenceInfo> getStrandedDomainPresenceInfos(DomainProcessor dp) {
@@ -288,21 +304,35 @@ private EventItem getEventItem(DomainPresenceInfo info) {
288304
return null;
289305
}
290306

291-
private boolean generationChanged(DomainPresenceInfo cachedInfo, DomainResource domain) {
292-
return !Objects.equals(getGeneration(cachedInfo), domain.getMetadata().getGeneration());
307+
private EventItem getEventItem(ClusterResource cluster) {
308+
if (newClusterNames.contains(cluster.getClusterName()) || cluster.getStatus() == null) {
309+
return CLUSTER_CREATED;
310+
}
311+
if (modifiedClusterNames.contains(cluster.getClusterName())) {
312+
return CLUSTER_CHANGED;
313+
}
314+
return null;
293315
}
294316

295-
@Nullable
296-
private Long getGeneration(DomainPresenceInfo cachedInfo) {
297-
return Optional.ofNullable(cachedInfo)
298-
.map(DomainPresenceInfo::getDomain)
299-
.map(DomainResource::getMetadata)
300-
.map(V1ObjectMeta::getGeneration)
301-
.orElse(null);
317+
private void updateCluster(DomainProcessor dp, ClusterResource cluster, EventItem eventItem) {
318+
List<DomainPresenceInfo> list =
319+
dp.getExistingDomainPresenceInfoForCluster(cluster.getNamespace(), cluster.getClusterName());
320+
if (list.isEmpty()) {
321+
createAndExecuteMakeRightOperation(dp, cluster, eventItem, null);
322+
} else {
323+
for (DomainPresenceInfo info : list) {
324+
createAndExecuteMakeRightOperation(dp, cluster, eventItem, info.getDomainUid());
325+
}
326+
}
302327
}
303328

304-
private void deActivateCluster(DomainProcessor dp, ClusterPresenceInfo info) {
305-
dp.createMakeRightOperationForClusterEvent(EventHelper.EventItem.CLUSTER_DELETED, info.getCluster()).execute();
329+
private void createAndExecuteMakeRightOperation(
330+
DomainProcessor dp, ClusterResource cluster, EventItem eventItem, String domainUid) {
331+
MakeRightClusterOperation makeRight = dp.createMakeRightOperationForClusterEvent(
332+
eventItem, cluster, domainUid).withExplicitRecheck();
333+
if (eventItem != null) {
334+
makeRight.interrupt();
335+
}
336+
makeRight.execute();
306337
}
307-
308338
}

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright (c) 2022, Oracle and/or its affiliates.
1+
// Copyright (c) 2022, 2023, 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;
@@ -25,11 +25,12 @@ public interface MakeRightClusterOperation extends MakeRightOperation<ClusterPre
2525
*/
2626
MakeRightClusterOperation interrupt();
2727

28+
MakeRightClusterOperation withExplicitRecheck();
29+
2830
/**
2931
* Get the event data associated with this make-right operation.
3032
*
3133
* @return the event data.
3234
*/
3335
EventHelper.EventData getEventData();
34-
3536
}

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

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,6 @@ public interface MakeRightDomainOperation extends MakeRightOperation<DomainPrese
4646

4747
boolean isDeleting();
4848

49-
boolean isExplicitRecheck();
50-
5149
void setInspectionRun();
5250

5351
void setLiveInfo(@Nonnull DomainPresenceInfo info);

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,6 @@ public interface MakeRightOperation<T extends ResourcePresenceInfo> extends Pack
2727
T getPresenceInfo();
2828

2929
boolean hasEventData();
30+
31+
boolean isExplicitRecheck();
3032
}

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,11 @@ public class ClusterPresenceInfo extends ResourcePresenceInfo {
2121

2222
/**
2323
* Create presence for a cluster resource.
24-
* @param namespace Namespace
2524
*
25+
* @param cluster the cluster resource that the to be created presence info contains
2626
*/
27-
public ClusterPresenceInfo(String namespace, ClusterResource cluster) {
28-
super(namespace);
27+
public ClusterPresenceInfo(ClusterResource cluster) {
28+
super(cluster.getNamespace());
2929
this.cluster = cluster;
3030
}
3131

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1280,7 +1280,7 @@ public NextAction onSuccess(Packet packet, CallResponse<CoreV1Event> callRespons
12801280

12811281
public static ClusterResourceEventData createClusterResourceEventData(
12821282
EventItem clusterEvent, ClusterResource cluster, String domainUid) {
1283-
return new ClusterResourceEventData(clusterEvent, cluster, domainUid);
1283+
return clusterEvent == null ? null : new ClusterResourceEventData(clusterEvent, cluster, domainUid);
12841284
}
12851285

12861286
public static class ClusterResourceEventData extends EventData {

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

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,17 @@ public MakeRightClusterOperationImpl(
3838
this.liveInfo = liveInfo;
3939
}
4040

41+
/**
42+
* Modifies the factory to run even if the domain spec is unchanged.
43+
*
44+
* @return the updated factory
45+
*/
46+
@Override
47+
public MakeRightClusterOperation withExplicitRecheck() {
48+
explicitRecheck = true;
49+
return this;
50+
}
51+
4152
/**
4253
* Set the event data that is associated with this operation.
4354
*
@@ -90,7 +101,11 @@ private StartPlanStep getStartPlanStep() {
90101
}
91102

92103
private boolean isDeleting() {
93-
return getEventData().getItem() == EventHelper.EventItem.CLUSTER_DELETED;
104+
return getEventItem() == EventHelper.EventItem.CLUSTER_DELETED;
105+
}
106+
107+
private EventHelper.EventItem getEventItem() {
108+
return Optional.ofNullable(getEventData()).map(EventHelper.EventData::getItem).orElse(null);
94109
}
95110

96111
@Override
@@ -103,6 +118,11 @@ public ClusterPresenceInfo getPresenceInfo() {
103118
return liveInfo;
104119
}
105120

121+
@Override
122+
public boolean isExplicitRecheck() {
123+
return explicitRecheck;
124+
}
125+
106126
@Override
107127
public EventHelper.EventData getEventData() {
108128
return eventData;

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,6 @@
6565
public class MakeRightDomainOperationImpl extends MakeRightOperationImpl<DomainPresenceInfo>
6666
implements MakeRightDomainOperation {
6767

68-
private boolean explicitRecheck;
6968
private boolean deleting;
7069
private boolean inspectionRun;
7170

0 commit comments

Comments
 (0)