1- // Copyright (c) 2018, 2022 , Oracle and/or its affiliates.
1+ // Copyright (c) 2018, 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
44package oracle .kubernetes .operator ;
3636import oracle .kubernetes .operator .helpers .ConfigMapHelper ;
3737import oracle .kubernetes .operator .helpers .DomainPresenceInfo ;
3838import oracle .kubernetes .operator .helpers .EventHelper ;
39- import oracle .kubernetes .operator .helpers .EventHelper .ClusterResourceEventData ;
4039import oracle .kubernetes .operator .helpers .EventHelper .EventData ;
4140import oracle .kubernetes .operator .helpers .EventHelper .EventItem ;
4241import oracle .kubernetes .operator .helpers .KubernetesEventObjects ;
@@ -141,6 +140,14 @@ private static DomainPresenceInfo getExistingDomainPresenceInfo(DomainPresenceIn
141140 return getExistingDomainPresenceInfo (newPresence .getNamespace (), newPresence .getDomainUid ());
142141 }
143142
143+ private static ClusterPresenceInfo getExistingClusterPresenceInfo (String ns , String clusterName ) {
144+ return clusters .computeIfAbsent (ns , k -> new ConcurrentHashMap <>()).get (clusterName );
145+ }
146+
147+ private static ClusterPresenceInfo getExistingClusterPresenceInfo (ClusterPresenceInfo newPresence ) {
148+ return getExistingClusterPresenceInfo (newPresence .getNamespace (), newPresence .getResourceName ());
149+ }
150+
144151 @ Override
145152 public Map <String , Map <String ,DomainPresenceInfo >> getDomainPresenceInfoMap () {
146153 return domains ;
@@ -374,7 +381,9 @@ public void runMakeRight(MakeRightClusterOperation operation) {
374381 final ClusterPresenceInfo liveInfo = operation .getPresenceInfo ();
375382 if (delegate .isNamespaceRunning (liveInfo .getNamespace ())) {
376383 try (ThreadLoggingContext ignored = setThreadContext ().presenceInfo (liveInfo )) {
377- new ClusterPlan (operation , delegate ).execute ();
384+ if (shouldContinue (operation , liveInfo )) {
385+ new ClusterPlan (operation , delegate ).execute ();
386+ }
378387 }
379388 }
380389 }
@@ -394,10 +403,38 @@ private boolean shouldContinue(MakeRightDomainOperation operation, DomainPresenc
394403 }
395404 }
396405
406+ private boolean shouldContinue (MakeRightClusterOperation operation , ClusterPresenceInfo liveInfo ) {
407+ final ClusterPresenceInfo cachedInfo = getExistingClusterPresenceInfo (liveInfo );
408+ if (hasDeletedClusterEventData (operation )) {
409+ return findClusterPresenceInfo (liveInfo .getNamespace (), liveInfo .getResourceName ());
410+ } else if (isNewCluster (cachedInfo )) {
411+ return true ;
412+ } else if (liveInfo .isFromOutOfDateEvent (operation , cachedInfo )) {
413+ return false ;
414+ } else if (liveInfo .isClusterGenerationChanged (cachedInfo )) {
415+ return true ;
416+ } else {
417+ cachedInfo .setCluster (liveInfo .getCluster ());
418+ return false ;
419+ }
420+ }
421+
397422 private boolean isNewDomain (DomainPresenceInfo cachedInfo ) {
398423 return Optional .ofNullable (cachedInfo ).map (DomainPresenceInfo ::getDomain ).orElse (null ) == null ;
399424 }
400425
426+ private boolean isNewCluster (ClusterPresenceInfo cachedInfo ) {
427+ return Optional .ofNullable (cachedInfo ).map (ClusterPresenceInfo ::getCluster ).orElse (null ) == null ;
428+ }
429+
430+ private boolean findClusterPresenceInfo (String namespace , String clusterName ) {
431+ return Optional .ofNullable (clusters .get (namespace )).orElse (Collections .emptyMap ()).get (clusterName ) != null ;
432+ }
433+
434+ private boolean hasDeletedClusterEventData (MakeRightClusterOperation operation ) {
435+ return operation .getEventData () != null && operation .getEventData ().getItem ().name ().equals ("CLUSTER_DELETED" );
436+ }
437+
401438 private void logStartingDomain (DomainPresenceInfo presenceInfo ) {
402439 LOGGER .fine (MessageKeys .PROCESSING_DOMAIN , presenceInfo .getDomainUid ());
403440 }
@@ -430,12 +467,24 @@ public void registerDomainPresenceInfo(DomainPresenceInfo info) {
430467 .put (info .getDomainUid (), info );
431468 }
432469
470+ @ Override
471+ public void registerClusterPresenceInfo (ClusterPresenceInfo info ) {
472+ clusters
473+ .computeIfAbsent (info .getNamespace (), k -> new ConcurrentHashMap <>())
474+ .put (info .getResourceName (), info );
475+ }
476+
433477 @ Override
434478 public void unregisterDomainPresenceInfo (DomainPresenceInfo info ) {
435479 unregisterPresenceInfo (info .getNamespace (), info .getDomainUid ());
436480 unregisterEventK8SObject (info .getNamespace (), info .getDomainUid ());
437481 }
438482
483+ @ Override
484+ public void unregisterClusterPresenceInfo (ClusterPresenceInfo info ) {
485+ unregisterPresenceInfoForCluster (info .getNamespace (), info .getResourceName ());
486+ }
487+
439488 private static void unregisterEventK8SObject (String ns , String domainUid ) {
440489 Optional .ofNullable (domainEventK8SObjects .get (ns )).ifPresent (m -> m .remove (domainUid ));
441490 }
@@ -444,6 +493,10 @@ private static void unregisterPresenceInfo(String ns, String domainUid) {
444493 Optional .ofNullable (domains .get (ns )).ifPresent (m -> m .remove (domainUid ));
445494 }
446495
496+ private static void unregisterPresenceInfoForCluster (String ns , String clusterName ) {
497+ Optional .ofNullable (clusters .get (ns )).ifPresent (m -> m .remove (clusterName ));
498+ }
499+
447500 @ Override
448501 public void endScheduledDomainStatusUpdates (DomainPresenceInfo info ) {
449502 Map <String , ScheduledFuture <?>> map = statusUpdaters .get (info .getNamespace ());
@@ -727,14 +780,15 @@ public void dispatchClusterWatch(Watch.Response<ClusterResource> item) {
727780 }
728781
729782 private void handleAddedCluster (ClusterResource cluster ) {
730- createMakeRightOperationForClusterEvent (EventItem .CLUSTER_CREATED , cluster ).execute ();
731783 List <DomainPresenceInfo > hostingDomains =
732784 getExistingDomainPresenceInfoForCluster (cluster .getNamespace (), cluster .getMetadata ().getName ());
733785 if (hostingDomains .isEmpty ()) {
734786 LOGGER .info (MessageKeys .WATCH_CLUSTER_WITHOUT_DOMAIN , cluster .getMetadata ().getName ());
787+ createMakeRightOperationForClusterEvent (EventItem .CLUSTER_CREATED , cluster , null ).execute ();
735788 } else {
736789 hostingDomains .forEach (info -> {
737790 LOGGER .info (MessageKeys .WATCH_CLUSTER , cluster .getMetadata ().getName (), info .getDomainUid ());
791+ createMakeRightOperationForClusterEvent (EventItem .CLUSTER_CREATED , cluster , info .getDomainUid ()).execute ();
738792 createMakeRightOperation (info )
739793 .interrupt ()
740794 .withExplicitRecheck ()
@@ -744,11 +798,11 @@ private void handleAddedCluster(ClusterResource cluster) {
744798 }
745799
746800 private void handleModifiedCluster (ClusterResource cluster ) {
747- createMakeRightOperationForClusterEvent (EventItem .CLUSTER_CHANGED , cluster ).execute ();
748801 List <DomainPresenceInfo > hostingDomains =
749802 getExistingDomainPresenceInfoForCluster (cluster .getNamespace (), cluster .getMetadata ().getName ());
750803 if (hostingDomains .isEmpty ()) {
751804 LOGGER .info (MessageKeys .WATCH_CLUSTER_WITHOUT_DOMAIN , cluster .getMetadata ().getName ());
805+ createMakeRightOperationForClusterEvent (EventItem .CLUSTER_CHANGED , cluster , null ).execute ();
752806 } else {
753807 hostingDomains .forEach (info -> {
754808 ClusterResource cachedResource = info .getClusterResource (cluster .getClusterName ());
@@ -757,6 +811,7 @@ private void handleModifiedCluster(ClusterResource cluster) {
757811 }
758812
759813 LOGGER .fine (MessageKeys .WATCH_CLUSTER , cluster .getMetadata ().getName (), info .getDomainUid ());
814+ createMakeRightOperationForClusterEvent (EventItem .CLUSTER_CHANGED , cluster , info .getDomainUid ()).execute ();
760815 createMakeRightOperation (info )
761816 .interrupt ()
762817 .withExplicitRecheck ()
@@ -766,14 +821,15 @@ private void handleModifiedCluster(ClusterResource cluster) {
766821 }
767822
768823 private void handleDeletedCluster (ClusterResource cluster ) {
769- createMakeRightOperationForClusterEvent (EventItem .CLUSTER_DELETED , cluster ).execute ();
770824 List <DomainPresenceInfo > hostingDomains =
771825 getExistingDomainPresenceInfoForCluster (cluster .getNamespace (), cluster .getMetadata ().getName ());
772826 if (hostingDomains .isEmpty ()) {
773827 LOGGER .info (MessageKeys .WATCH_CLUSTER_WITHOUT_DOMAIN , cluster .getMetadata ().getName ());
828+ createMakeRightOperationForClusterEvent (EventItem .CLUSTER_DELETED , cluster , null ).execute ();
774829 } else {
775830 hostingDomains .forEach (info -> {
776831 LOGGER .info (MessageKeys .WATCH_CLUSTER_DELETED , cluster .getMetadata ().getName (), info .getDomainUid ());
832+ createMakeRightOperationForClusterEvent (EventItem .CLUSTER_DELETED , cluster , info .getDomainUid ()).execute ();
777833 info .removeClusterResource (cluster .getClusterName ());
778834 createMakeRightOperation (info )
779835 .interrupt ()
@@ -785,14 +841,16 @@ private void handleDeletedCluster(ClusterResource cluster) {
785841
786842 @ Override
787843 public MakeRightClusterOperation createMakeRightOperationForClusterEvent (
788- EventItem clusterEvent , ClusterResource cluster ) {
844+ EventItem clusterEvent , ClusterResource cluster , String domainUid ) {
789845 return delegate .createMakeRightOperation (this , createInfoForClusterEventOnly (cluster ))
790846 .interrupt ()
791- .withEventData (createClusterResourceEventData (clusterEvent , cluster ));
847+ .withEventData (EventHelper . createClusterResourceEventData (clusterEvent , cluster , domainUid ));
792848 }
793849
794- private ClusterResourceEventData createClusterResourceEventData (EventItem clusterEvent , ClusterResource cluster ) {
795- return new ClusterResourceEventData (clusterEvent , cluster );
850+ @ Override
851+ public MakeRightClusterOperation createMakeRightOperationForClusterEvent (
852+ EventItem clusterEvent , ClusterResource cluster ) {
853+ return createMakeRightOperationForClusterEvent (clusterEvent , cluster , null );
796854 }
797855
798856 @ NotNull
@@ -913,17 +971,12 @@ private void addServerToMaps(Map<String, ServerHealth> serverHealthMap,
913971
914972 }
915973
916- private class DomainPlan extends Plan <MakeRightDomainOperation > {
974+ private static class DomainPlan extends Plan <MakeRightDomainOperation > {
917975
918976 public DomainPlan (MakeRightDomainOperation operation , DomainProcessorDelegate delegate ) {
919977 super (operation , delegate );
920978 }
921979
922- @ Override
923- protected void cacheResourcePresenceInfo (ResourcePresenceInfo presenceInfo ) {
924- //No-op.
925- }
926-
927980 @ Override
928981 public CompletionCallback createCompletionCallback () {
929982 return new DomainPlanCompletionCallback ();
@@ -1001,32 +1054,20 @@ private long delayUntilNextRetry(@Nonnull DomainPresenceInfo domainPresenceInfo)
10011054 return interval .getSeconds ();
10021055
10031056 }
1004-
10051057 }
10061058
1007- private class ClusterPlan extends Plan <MakeRightClusterOperation > {
1059+ private static class ClusterPlan extends Plan <MakeRightClusterOperation > {
10081060
10091061 public ClusterPlan (MakeRightClusterOperation operation , DomainProcessorDelegate delegate ) {
10101062 super (operation , delegate );
10111063 }
10121064
1013- @ Override
1014- protected void cacheResourcePresenceInfo (ResourcePresenceInfo presenceInfo ) {
1015- if (operation .getEventData ().getItem () == EventHelper .EventItem .CLUSTER_DELETED ) {
1016- Optional .ofNullable (clusters .get (presenceInfo .getNamespace ()))
1017- .ifPresent (m -> m .remove (presenceInfo .getResourceName ()));
1018- } else {
1019- clusters .computeIfAbsent (presenceInfo .getNamespace (), c -> new ConcurrentHashMap <>())
1020- .computeIfAbsent (presenceInfo .getResourceName (), k -> (ClusterPresenceInfo ) presenceInfo );
1021- }
1022- }
1023-
10241065 @ Override
10251066 public CompletionCallback createCompletionCallback () {
10261067 return new ClusterPlanCompletionCallback ();
10271068 }
10281069
1029- class ClusterPlanCompletionCallback implements CompletionCallback {
1070+ static class ClusterPlanCompletionCallback implements CompletionCallback {
10301071
10311072 @ Override
10321073 public void onCompletion (Packet packet ) {
@@ -1044,7 +1085,7 @@ private void reportFailure(Throwable throwable) {
10441085 }
10451086 }
10461087
1047- private abstract class Plan <T extends MakeRightOperation > {
1088+ private abstract static class Plan <T extends MakeRightOperation > {
10481089
10491090 final T operation ;
10501091 protected final ResourcePresenceInfo presenceInfo ;
@@ -1059,11 +1100,8 @@ public Plan(T operation, DomainProcessorDelegate delegate) {
10591100 this .firstStep = operation .createSteps ();
10601101 this .packet = operation .createPacket ();
10611102 this .gate = getMakeRightFiberGate (delegate , this .presenceInfo .getNamespace ());
1062- cacheResourcePresenceInfo (presenceInfo );
10631103 }
10641104
1065- protected abstract void cacheResourcePresenceInfo (ResourcePresenceInfo presenceInfo );
1066-
10671105 private FiberGate getMakeRightFiberGate (DomainProcessorDelegate delegate , String ns ) {
10681106 return makeRightFiberGates .computeIfAbsent (ns , k -> delegate .createFiberGate ());
10691107 }
0 commit comments