28
28
import io .kubernetes .client .models .V1ConfigMap ;
29
29
import io .kubernetes .client .models .V1DeleteOptions ;
30
30
import io .kubernetes .client .models .V1EnvVar ;
31
+ import io .kubernetes .client .models .V1Event ;
31
32
import io .kubernetes .client .models .V1ObjectMeta ;
33
+ import io .kubernetes .client .models .V1ObjectReference ;
32
34
import io .kubernetes .client .models .V1PersistentVolumeClaimList ;
33
35
import io .kubernetes .client .models .V1Pod ;
34
36
import io .kubernetes .client .models .V1PodList ;
58
60
import oracle .kubernetes .operator .helpers .ResponseStep ;
59
61
import oracle .kubernetes .operator .helpers .RollingHelper ;
60
62
import oracle .kubernetes .operator .helpers .ServerKubernetesObjects ;
63
+ import oracle .kubernetes .operator .helpers .ServerKubernetesObjectsFactory ;
61
64
import oracle .kubernetes .operator .helpers .ServiceHelper ;
62
65
import oracle .kubernetes .operator .logging .LoggingFacade ;
63
66
import oracle .kubernetes .operator .logging .LoggingFactory ;
64
67
import oracle .kubernetes .operator .logging .MessageKeys ;
65
68
import oracle .kubernetes .operator .rest .RestConfigImpl ;
66
69
import oracle .kubernetes .operator .rest .RestServer ;
70
+ import oracle .kubernetes .operator .utils .ConcurrentWeakHashMap ;
67
71
import oracle .kubernetes .operator .wlsconfig .NetworkAccessPoint ;
68
72
import oracle .kubernetes .operator .wlsconfig .WlsClusterConfig ;
69
73
import oracle .kubernetes .operator .wlsconfig .WlsRetriever ;
@@ -98,6 +102,8 @@ public class Main {
98
102
99
103
private static final LoggingFacade LOGGER = LoggingFactory .getLogger ("Operator" , "Operator" );
100
104
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 );
101
107
102
108
private static final TuningParameters tuningAndConfig ;
103
109
static {
@@ -117,8 +123,10 @@ public class Main {
117
123
static {
118
124
container .getComponents ().put (
119
125
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 ));
122
130
}
123
131
124
132
private static final Engine engine = new Engine (wrappedExecutorService );
@@ -133,6 +141,7 @@ public class Main {
133
141
private static Map <String , ConfigMapWatcher > configMapWatchers = new HashMap <>();
134
142
private static Map <String , DomainWatcher > domainWatchers = new HashMap <>();
135
143
private static Map <String , PodWatcher > podWatchers = new HashMap <>();
144
+ private static Map <String , EventWatcher > eventWatchers = new HashMap <>();
136
145
private static Map <String , ServiceWatcher > serviceWatchers = new HashMap <>();
137
146
private static Map <String , IngressWatcher > ingressWatchers = new HashMap <>();
138
147
private static KubernetesVersion version = null ;
@@ -304,9 +313,7 @@ public NextAction onSuccess(Packet packet, V1ServiceList result, int statusCode,
304
313
if (info == null ) {
305
314
info = created ;
306
315
}
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 );
310
317
if (channelName != null ) {
311
318
sko .getChannels ().put (channelName , service );
312
319
} else {
@@ -341,14 +348,13 @@ public NextAction onSuccess(Packet packet, V1PodList result, int statusCode,
341
348
if (info == null ) {
342
349
info = created ;
343
350
}
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 );
347
352
sko .getPod ().set (pod );
348
353
}
349
354
}
350
355
}
351
356
podWatchers .put (ns , createPodWatcher (ns , result != null ? result .getMetadata ().getResourceVersion () : "" ));
357
+ eventWatchers .put (ns , createEventWatcher (ns , "" ));
352
358
return doNext (packet );
353
359
}
354
360
})));
@@ -1527,6 +1533,40 @@ private static DomainWatcher createDomainWatcher(String namespace, String initia
1527
1533
initialResourceVersion , Main ::dispatchDomainWatch , stopping );
1528
1534
}
1529
1535
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
+
1530
1570
private static PodWatcher createPodWatcher (String namespace , String initialResourceVersion ) {
1531
1571
return PodWatcher .create (factory , namespace ,
1532
1572
initialResourceVersion , Main ::dispatchPodWatch , stopping );
@@ -1541,9 +1581,7 @@ private static void dispatchPodWatch(Watch.Response<V1Pod> item) {
1541
1581
if (domainUID != null ) {
1542
1582
DomainPresenceInfo info = domains .get (domainUID );
1543
1583
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 );
1547
1585
if (sko != null ) {
1548
1586
switch (item .type ) {
1549
1587
case "ADDED" :
@@ -1594,9 +1632,7 @@ private static void dispatchServiceWatch(Watch.Response<V1Service> item) {
1594
1632
ServerKubernetesObjects sko = null ;
1595
1633
if (info != null ) {
1596
1634
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 );
1600
1636
}
1601
1637
switch (item .type ) {
1602
1638
case "ADDED" :
0 commit comments