1
- // Copyright (c) 2018, 2022 , Oracle and/or its affiliates.
1
+ // Copyright (c) 2018, 2023 , Oracle and/or its affiliates.
2
2
// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
3
3
4
4
package oracle .kubernetes .operator ;
36
36
import oracle .kubernetes .operator .helpers .ConfigMapHelper ;
37
37
import oracle .kubernetes .operator .helpers .DomainPresenceInfo ;
38
38
import oracle .kubernetes .operator .helpers .EventHelper ;
39
- import oracle .kubernetes .operator .helpers .EventHelper .ClusterResourceEventData ;
40
39
import oracle .kubernetes .operator .helpers .EventHelper .EventData ;
41
40
import oracle .kubernetes .operator .helpers .EventHelper .EventItem ;
42
41
import oracle .kubernetes .operator .helpers .KubernetesEventObjects ;
@@ -141,6 +140,14 @@ private static DomainPresenceInfo getExistingDomainPresenceInfo(DomainPresenceIn
141
140
return getExistingDomainPresenceInfo (newPresence .getNamespace (), newPresence .getDomainUid ());
142
141
}
143
142
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
+
144
151
@ Override
145
152
public Map <String , Map <String ,DomainPresenceInfo >> getDomainPresenceInfoMap () {
146
153
return domains ;
@@ -374,7 +381,9 @@ public void runMakeRight(MakeRightClusterOperation operation) {
374
381
final ClusterPresenceInfo liveInfo = operation .getPresenceInfo ();
375
382
if (delegate .isNamespaceRunning (liveInfo .getNamespace ())) {
376
383
try (ThreadLoggingContext ignored = setThreadContext ().presenceInfo (liveInfo )) {
377
- new ClusterPlan (operation , delegate ).execute ();
384
+ if (shouldContinue (operation , liveInfo )) {
385
+ new ClusterPlan (operation , delegate ).execute ();
386
+ }
378
387
}
379
388
}
380
389
}
@@ -394,10 +403,38 @@ private boolean shouldContinue(MakeRightDomainOperation operation, DomainPresenc
394
403
}
395
404
}
396
405
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
+
397
422
private boolean isNewDomain (DomainPresenceInfo cachedInfo ) {
398
423
return Optional .ofNullable (cachedInfo ).map (DomainPresenceInfo ::getDomain ).orElse (null ) == null ;
399
424
}
400
425
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
+
401
438
private void logStartingDomain (DomainPresenceInfo presenceInfo ) {
402
439
LOGGER .fine (MessageKeys .PROCESSING_DOMAIN , presenceInfo .getDomainUid ());
403
440
}
@@ -430,12 +467,24 @@ public void registerDomainPresenceInfo(DomainPresenceInfo info) {
430
467
.put (info .getDomainUid (), info );
431
468
}
432
469
470
+ @ Override
471
+ public void registerClusterPresenceInfo (ClusterPresenceInfo info ) {
472
+ clusters
473
+ .computeIfAbsent (info .getNamespace (), k -> new ConcurrentHashMap <>())
474
+ .put (info .getResourceName (), info );
475
+ }
476
+
433
477
@ Override
434
478
public void unregisterDomainPresenceInfo (DomainPresenceInfo info ) {
435
479
unregisterPresenceInfo (info .getNamespace (), info .getDomainUid ());
436
480
unregisterEventK8SObject (info .getNamespace (), info .getDomainUid ());
437
481
}
438
482
483
+ @ Override
484
+ public void unregisterClusterPresenceInfo (ClusterPresenceInfo info ) {
485
+ unregisterPresenceInfoForCluster (info .getNamespace (), info .getResourceName ());
486
+ }
487
+
439
488
private static void unregisterEventK8SObject (String ns , String domainUid ) {
440
489
Optional .ofNullable (domainEventK8SObjects .get (ns )).ifPresent (m -> m .remove (domainUid ));
441
490
}
@@ -444,6 +493,10 @@ private static void unregisterPresenceInfo(String ns, String domainUid) {
444
493
Optional .ofNullable (domains .get (ns )).ifPresent (m -> m .remove (domainUid ));
445
494
}
446
495
496
+ private static void unregisterPresenceInfoForCluster (String ns , String clusterName ) {
497
+ Optional .ofNullable (clusters .get (ns )).ifPresent (m -> m .remove (clusterName ));
498
+ }
499
+
447
500
@ Override
448
501
public void endScheduledDomainStatusUpdates (DomainPresenceInfo info ) {
449
502
Map <String , ScheduledFuture <?>> map = statusUpdaters .get (info .getNamespace ());
@@ -727,14 +780,15 @@ public void dispatchClusterWatch(Watch.Response<ClusterResource> item) {
727
780
}
728
781
729
782
private void handleAddedCluster (ClusterResource cluster ) {
730
- createMakeRightOperationForClusterEvent (EventItem .CLUSTER_CREATED , cluster ).execute ();
731
783
List <DomainPresenceInfo > hostingDomains =
732
784
getExistingDomainPresenceInfoForCluster (cluster .getNamespace (), cluster .getMetadata ().getName ());
733
785
if (hostingDomains .isEmpty ()) {
734
786
LOGGER .info (MessageKeys .WATCH_CLUSTER_WITHOUT_DOMAIN , cluster .getMetadata ().getName ());
787
+ createMakeRightOperationForClusterEvent (EventItem .CLUSTER_CREATED , cluster , null ).execute ();
735
788
} else {
736
789
hostingDomains .forEach (info -> {
737
790
LOGGER .info (MessageKeys .WATCH_CLUSTER , cluster .getMetadata ().getName (), info .getDomainUid ());
791
+ createMakeRightOperationForClusterEvent (EventItem .CLUSTER_CREATED , cluster , info .getDomainUid ()).execute ();
738
792
createMakeRightOperation (info )
739
793
.interrupt ()
740
794
.withExplicitRecheck ()
@@ -744,11 +798,11 @@ private void handleAddedCluster(ClusterResource cluster) {
744
798
}
745
799
746
800
private void handleModifiedCluster (ClusterResource cluster ) {
747
- createMakeRightOperationForClusterEvent (EventItem .CLUSTER_CHANGED , cluster ).execute ();
748
801
List <DomainPresenceInfo > hostingDomains =
749
802
getExistingDomainPresenceInfoForCluster (cluster .getNamespace (), cluster .getMetadata ().getName ());
750
803
if (hostingDomains .isEmpty ()) {
751
804
LOGGER .info (MessageKeys .WATCH_CLUSTER_WITHOUT_DOMAIN , cluster .getMetadata ().getName ());
805
+ createMakeRightOperationForClusterEvent (EventItem .CLUSTER_CHANGED , cluster , null ).execute ();
752
806
} else {
753
807
hostingDomains .forEach (info -> {
754
808
ClusterResource cachedResource = info .getClusterResource (cluster .getClusterName ());
@@ -757,6 +811,7 @@ private void handleModifiedCluster(ClusterResource cluster) {
757
811
}
758
812
759
813
LOGGER .fine (MessageKeys .WATCH_CLUSTER , cluster .getMetadata ().getName (), info .getDomainUid ());
814
+ createMakeRightOperationForClusterEvent (EventItem .CLUSTER_CHANGED , cluster , info .getDomainUid ()).execute ();
760
815
createMakeRightOperation (info )
761
816
.interrupt ()
762
817
.withExplicitRecheck ()
@@ -766,14 +821,15 @@ private void handleModifiedCluster(ClusterResource cluster) {
766
821
}
767
822
768
823
private void handleDeletedCluster (ClusterResource cluster ) {
769
- createMakeRightOperationForClusterEvent (EventItem .CLUSTER_DELETED , cluster ).execute ();
770
824
List <DomainPresenceInfo > hostingDomains =
771
825
getExistingDomainPresenceInfoForCluster (cluster .getNamespace (), cluster .getMetadata ().getName ());
772
826
if (hostingDomains .isEmpty ()) {
773
827
LOGGER .info (MessageKeys .WATCH_CLUSTER_WITHOUT_DOMAIN , cluster .getMetadata ().getName ());
828
+ createMakeRightOperationForClusterEvent (EventItem .CLUSTER_DELETED , cluster , null ).execute ();
774
829
} else {
775
830
hostingDomains .forEach (info -> {
776
831
LOGGER .info (MessageKeys .WATCH_CLUSTER_DELETED , cluster .getMetadata ().getName (), info .getDomainUid ());
832
+ createMakeRightOperationForClusterEvent (EventItem .CLUSTER_DELETED , cluster , info .getDomainUid ()).execute ();
777
833
info .removeClusterResource (cluster .getClusterName ());
778
834
createMakeRightOperation (info )
779
835
.interrupt ()
@@ -785,14 +841,16 @@ private void handleDeletedCluster(ClusterResource cluster) {
785
841
786
842
@ Override
787
843
public MakeRightClusterOperation createMakeRightOperationForClusterEvent (
788
- EventItem clusterEvent , ClusterResource cluster ) {
844
+ EventItem clusterEvent , ClusterResource cluster , String domainUid ) {
789
845
return delegate .createMakeRightOperation (this , createInfoForClusterEventOnly (cluster ))
790
846
.interrupt ()
791
- .withEventData (createClusterResourceEventData (clusterEvent , cluster ));
847
+ .withEventData (EventHelper . createClusterResourceEventData (clusterEvent , cluster , domainUid ));
792
848
}
793
849
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 );
796
854
}
797
855
798
856
@ NotNull
@@ -913,17 +971,12 @@ private void addServerToMaps(Map<String, ServerHealth> serverHealthMap,
913
971
914
972
}
915
973
916
- private class DomainPlan extends Plan <MakeRightDomainOperation > {
974
+ private static class DomainPlan extends Plan <MakeRightDomainOperation > {
917
975
918
976
public DomainPlan (MakeRightDomainOperation operation , DomainProcessorDelegate delegate ) {
919
977
super (operation , delegate );
920
978
}
921
979
922
- @ Override
923
- protected void cacheResourcePresenceInfo (ResourcePresenceInfo presenceInfo ) {
924
- //No-op.
925
- }
926
-
927
980
@ Override
928
981
public CompletionCallback createCompletionCallback () {
929
982
return new DomainPlanCompletionCallback ();
@@ -1001,32 +1054,20 @@ private long delayUntilNextRetry(@Nonnull DomainPresenceInfo domainPresenceInfo)
1001
1054
return interval .getSeconds ();
1002
1055
1003
1056
}
1004
-
1005
1057
}
1006
1058
1007
- private class ClusterPlan extends Plan <MakeRightClusterOperation > {
1059
+ private static class ClusterPlan extends Plan <MakeRightClusterOperation > {
1008
1060
1009
1061
public ClusterPlan (MakeRightClusterOperation operation , DomainProcessorDelegate delegate ) {
1010
1062
super (operation , delegate );
1011
1063
}
1012
1064
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
-
1024
1065
@ Override
1025
1066
public CompletionCallback createCompletionCallback () {
1026
1067
return new ClusterPlanCompletionCallback ();
1027
1068
}
1028
1069
1029
- class ClusterPlanCompletionCallback implements CompletionCallback {
1070
+ static class ClusterPlanCompletionCallback implements CompletionCallback {
1030
1071
1031
1072
@ Override
1032
1073
public void onCompletion (Packet packet ) {
@@ -1044,7 +1085,7 @@ private void reportFailure(Throwable throwable) {
1044
1085
}
1045
1086
}
1046
1087
1047
- private abstract class Plan <T extends MakeRightOperation > {
1088
+ private abstract static class Plan <T extends MakeRightOperation > {
1048
1089
1049
1090
final T operation ;
1050
1091
protected final ResourcePresenceInfo presenceInfo ;
@@ -1059,11 +1100,8 @@ public Plan(T operation, DomainProcessorDelegate delegate) {
1059
1100
this .firstStep = operation .createSteps ();
1060
1101
this .packet = operation .createPacket ();
1061
1102
this .gate = getMakeRightFiberGate (delegate , this .presenceInfo .getNamespace ());
1062
- cacheResourcePresenceInfo (presenceInfo );
1063
1103
}
1064
1104
1065
- protected abstract void cacheResourcePresenceInfo (ResourcePresenceInfo presenceInfo );
1066
-
1067
1105
private FiberGate getMakeRightFiberGate (DomainProcessorDelegate delegate , String ns ) {
1068
1106
return makeRightFiberGates .computeIfAbsent (ns , k -> delegate .createFiberGate ());
1069
1107
}
0 commit comments