2828import io .kubernetes .client .models .V1ConfigMap ;
2929import io .kubernetes .client .models .V1DeleteOptions ;
3030import io .kubernetes .client .models .V1EnvVar ;
31+ import io .kubernetes .client .models .V1Event ;
3132import io .kubernetes .client .models .V1ObjectMeta ;
33+ import io .kubernetes .client .models .V1ObjectReference ;
3234import io .kubernetes .client .models .V1PersistentVolumeClaimList ;
3335import io .kubernetes .client .models .V1Pod ;
3436import io .kubernetes .client .models .V1PodList ;
5860import oracle .kubernetes .operator .helpers .ResponseStep ;
5961import oracle .kubernetes .operator .helpers .RollingHelper ;
6062import oracle .kubernetes .operator .helpers .ServerKubernetesObjects ;
63+ import oracle .kubernetes .operator .helpers .ServerKubernetesObjectsFactory ;
6164import oracle .kubernetes .operator .helpers .ServiceHelper ;
6265import oracle .kubernetes .operator .logging .LoggingFacade ;
6366import oracle .kubernetes .operator .logging .LoggingFactory ;
6467import oracle .kubernetes .operator .logging .MessageKeys ;
6568import oracle .kubernetes .operator .rest .RestConfigImpl ;
6669import oracle .kubernetes .operator .rest .RestServer ;
70+ import oracle .kubernetes .operator .utils .ConcurrentWeakHashMap ;
6771import oracle .kubernetes .operator .wlsconfig .NetworkAccessPoint ;
6872import oracle .kubernetes .operator .wlsconfig .WlsClusterConfig ;
6973import oracle .kubernetes .operator .wlsconfig .WlsRetriever ;
@@ -98,6 +102,8 @@ public class Main {
98102
99103 private static final LoggingFacade LOGGER = LoggingFactory .getLogger ("Operator" , "Operator" );
100104 private static final ConcurrentMap <String , DomainPresenceInfo > domains = new ConcurrentHashMap <String , DomainPresenceInfo >();
105+ private static final ConcurrentMap <String , ServerKubernetesObjects > servers = new ConcurrentWeakHashMap <String , ServerKubernetesObjects >();
106+ private static final ServerKubernetesObjectsFactory skoFactory = new ServerKubernetesObjectsFactory (servers );
101107
102108 private static final TuningParameters tuningAndConfig ;
103109 static {
@@ -117,8 +123,10 @@ public class Main {
117123 static {
118124 container .getComponents ().put (
119125 ProcessingConstants .MAIN_COMPONENT_NAME ,
120- Component .createFor (ScheduledExecutorService .class , wrappedExecutorService ,
121- TuningParameters .class , tuningAndConfig , callBuilderFactory ));
126+ Component .createFor (
127+ ScheduledExecutorService .class , wrappedExecutorService ,
128+ TuningParameters .class , tuningAndConfig ,
129+ callBuilderFactory , skoFactory ));
122130 }
123131
124132 private static final Engine engine = new Engine (wrappedExecutorService );
@@ -133,6 +141,7 @@ public class Main {
133141 private static Map <String , ConfigMapWatcher > configMapWatchers = new HashMap <>();
134142 private static Map <String , DomainWatcher > domainWatchers = new HashMap <>();
135143 private static Map <String , PodWatcher > podWatchers = new HashMap <>();
144+ private static Map <String , EventWatcher > eventWatchers = new HashMap <>();
136145 private static Map <String , ServiceWatcher > serviceWatchers = new HashMap <>();
137146 private static Map <String , IngressWatcher > ingressWatchers = new HashMap <>();
138147 private static KubernetesVersion version = null ;
@@ -304,9 +313,7 @@ public NextAction onSuccess(Packet packet, V1ServiceList result, int statusCode,
304313 if (info == null ) {
305314 info = created ;
306315 }
307- ServerKubernetesObjects csko = new ServerKubernetesObjects ();
308- ServerKubernetesObjects current = info .getServers ().putIfAbsent (serverName , csko );
309- ServerKubernetesObjects sko = current != null ? current : csko ;
316+ ServerKubernetesObjects sko = skoFactory .getOrCreate (info , serverName );
310317 if (channelName != null ) {
311318 sko .getChannels ().put (channelName , service );
312319 } else {
@@ -341,14 +348,13 @@ public NextAction onSuccess(Packet packet, V1PodList result, int statusCode,
341348 if (info == null ) {
342349 info = created ;
343350 }
344- ServerKubernetesObjects csko = new ServerKubernetesObjects ();
345- ServerKubernetesObjects current = info .getServers ().putIfAbsent (serverName , csko );
346- ServerKubernetesObjects sko = current != null ? current : csko ;
351+ ServerKubernetesObjects sko = skoFactory .getOrCreate (info , serverName );
347352 sko .getPod ().set (pod );
348353 }
349354 }
350355 }
351356 podWatchers .put (ns , createPodWatcher (ns , result != null ? result .getMetadata ().getResourceVersion () : "" ));
357+ eventWatchers .put (ns , createEventWatcher (ns , "" ));
352358 return doNext (packet );
353359 }
354360 })));
@@ -1527,6 +1533,40 @@ private static DomainWatcher createDomainWatcher(String namespace, String initia
15271533 initialResourceVersion , Main ::dispatchDomainWatch , stopping );
15281534 }
15291535
1536+ private static EventWatcher createEventWatcher (String namespace , String initialResourceVersion ) {
1537+ return EventWatcher .create (factory , namespace ,
1538+ "reason=Unhealthy,type=Warning,involvedObject.fieldPath=spec.containers{weblogic-server}" ,
1539+ initialResourceVersion , Main ::dispatchEventWatch , stopping );
1540+ }
1541+
1542+ private static void dispatchEventWatch (Watch .Response <V1Event > item ) {
1543+ V1Event e = item .object ;
1544+ if (e != null ) {
1545+ switch (item .type ) {
1546+ case "ADDED" :
1547+ case "MODIFIED" :
1548+ V1ObjectReference ref = e .getInvolvedObject ();
1549+ if (ref != null ) {
1550+ String name = ref .getName ();
1551+ String message = e .getMessage ();
1552+ if (message != null ) {
1553+ int idx = message .indexOf ("Not ready: Server state=" );
1554+ if (idx > 0 ) {
1555+ ServerKubernetesObjects sko = servers .get (name );
1556+ if (sko != null ) {
1557+ sko .getLastKnownStatus ().set (message .substring (idx + 24 ));
1558+ }
1559+ }
1560+ }
1561+ }
1562+ break ;
1563+ case "DELETED" :
1564+ case "ERROR" :
1565+ default :
1566+ }
1567+ }
1568+ }
1569+
15301570 private static PodWatcher createPodWatcher (String namespace , String initialResourceVersion ) {
15311571 return PodWatcher .create (factory , namespace ,
15321572 initialResourceVersion , Main ::dispatchPodWatch , stopping );
@@ -1541,9 +1581,7 @@ private static void dispatchPodWatch(Watch.Response<V1Pod> item) {
15411581 if (domainUID != null ) {
15421582 DomainPresenceInfo info = domains .get (domainUID );
15431583 if (info != null && serverName != null ) {
1544- ServerKubernetesObjects created = new ServerKubernetesObjects ();
1545- ServerKubernetesObjects current = info .getServers ().putIfAbsent (serverName , created );
1546- ServerKubernetesObjects sko = current != null ? current : created ;
1584+ ServerKubernetesObjects sko = skoFactory .getOrCreate (info , serverName );
15471585 if (sko != null ) {
15481586 switch (item .type ) {
15491587 case "ADDED" :
@@ -1594,9 +1632,7 @@ private static void dispatchServiceWatch(Watch.Response<V1Service> item) {
15941632 ServerKubernetesObjects sko = null ;
15951633 if (info != null ) {
15961634 if (serverName != null ) {
1597- ServerKubernetesObjects created = new ServerKubernetesObjects ();
1598- ServerKubernetesObjects current = info .getServers ().putIfAbsent (serverName , created );
1599- sko = current != null ? current : created ;
1635+ sko = skoFactory .getOrCreate (info , serverName );
16001636 }
16011637 switch (item .type ) {
16021638 case "ADDED" :
0 commit comments