99import java .util .HashSet ;
1010import java .util .List ;
1111import java .util .Map ;
12- import java .util .Objects ;
1312import java .util .Optional ;
1413import java .util .Set ;
1514import java .util .concurrent .ConcurrentHashMap ;
2827import io .kubernetes .client .openapi .models .V1ServiceList ;
2928import oracle .kubernetes .operator .helpers .ClusterPresenceInfo ;
3029import oracle .kubernetes .operator .helpers .DomainPresenceInfo ;
31- import oracle .kubernetes .operator .helpers .EventHelper ;
3230import oracle .kubernetes .operator .helpers .EventHelper .EventData ;
3331import oracle .kubernetes .operator .helpers .EventHelper .EventItem ;
3432import oracle .kubernetes .operator .helpers .PodDisruptionBudgetHelper ;
3937import oracle .kubernetes .weblogic .domain .model .ClusterResource ;
4038import oracle .kubernetes .weblogic .domain .model .DomainList ;
4139import 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 ;
4445import static oracle .kubernetes .operator .helpers .EventHelper .EventItem .DOMAIN_CHANGED ;
4546import 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}
0 commit comments