Skip to content

Commit 3734e90

Browse files
authored
OWLS-81272 - Fix domain status for 'desired state' (#1613)
* maintain ordering in servers and clusters in setters * update ServerStatus desiredState description * desiredStatus value also depends on ServerStartupInfos. Add update status call to ManagedServerUpIteratorStep. * remove local variable from getDesiredState * minor cleanup * server status for configured cluster * fix bug where health of configured servers in cluster is not read * add ReadHealthStep tests for dynamic servers and configured servers * remove getServerConfig(String) that is no longer used
1 parent 5c281a6 commit 3734e90

File tree

16 files changed

+446
-74
lines changed

16 files changed

+446
-74
lines changed

docs/domains/Domain.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -725,7 +725,7 @@
725725
"type": "string"
726726
},
727727
"desiredState": {
728-
"description": "Desired state of this WebLogic Server.",
728+
"description": "Desired state of this WebLogic Server. Values are RUNNING, ADMIN, or SHUTDOWN.",
729729
"type": "string"
730730
},
731731
"clusterName": {

docs/domains/Domain.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ ServerPod describes the configuration for a Kubernetes pod for a server.
181181
| Name | Type | Description |
182182
| --- | --- | --- |
183183
| `clusterName` | string | WebLogic cluster name, if the server is part of a cluster. |
184-
| `desiredState` | string | Desired state of this WebLogic Server. |
184+
| `desiredState` | string | Desired state of this WebLogic Server. Values are RUNNING, ADMIN, or SHUTDOWN. |
185185
| `health` | [Server Health](#server-health) | Current status and health of a specific WebLogic Server. |
186186
| `nodeName` | string | Name of node that is hosting the Pod containing this WebLogic Server. |
187187
| `serverName` | string | WebLogic Server name. Required. |

docs/domains/index.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1645,7 +1645,7 @@
16451645
"type": "string"
16461646
},
16471647
"desiredState": {
1648-
"description": "Desired state of this WebLogic Server.",
1648+
"description": "Desired state of this WebLogic Server. Values are RUNNING, ADMIN, or SHUTDOWN.",
16491649
"type": "string"
16501650
},
16511651
"clusterName": {

kubernetes/crd/domain-crd.yaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21131,7 +21131,8 @@ spec:
2113121131
this WebLogic Server.
2113221132
type: string
2113321133
desiredState:
21134-
description: Desired state of this WebLogic Server.
21134+
description: Desired state of this WebLogic Server. Values are
21135+
RUNNING, ADMIN, or SHUTDOWN.
2113521136
type: string
2113621137
clusterName:
2113721138
description: WebLogic cluster name, if the server is part of

kubernetes/crd/domain-v1beta1-crd.yaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20709,7 +20709,8 @@ spec:
2070920709
WebLogic Server.
2071020710
type: string
2071120711
desiredState:
20712-
description: Desired state of this WebLogic Server.
20712+
description: Desired state of this WebLogic Server. Values are
20713+
RUNNING, ADMIN, or SHUTDOWN.
2071320714
type: string
2071420715
clusterName:
2071520716
description: WebLogic cluster name, if the server is part of a

operator/src/main/java/oracle/kubernetes/operator/DomainStatusUpdater.java

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ private DomainStatusUpdater() {
7878
* @param next the next step
7979
* @return the new step
8080
*/
81-
static Step createStatusUpdateStep(Step next) {
81+
public static Step createStatusUpdateStep(Step next) {
8282
return new StatusUpdateStep(next);
8383
}
8484

@@ -399,27 +399,38 @@ private boolean hasReadyServerPod(String serverName) {
399399
Map<String, ServerStatus> getServerStatuses(final String adminServerName) {
400400
return getServerNames().stream()
401401
.collect(Collectors.toMap(Function.identity(),
402-
s -> createServerStatus(s,adminServerName)));
402+
s -> createServerStatus(s, Objects.equals(s, adminServerName))));
403403
}
404404

405-
private ServerStatus createServerStatus(String serverName, String adminServerName) {
405+
private ServerStatus createServerStatus(String serverName, boolean isAdminServer) {
406406
String clusterName = getClusterName(serverName);
407407
return new ServerStatus()
408408
.withServerName(serverName)
409409
.withState(getRunningState(serverName))
410-
.withDesiredState(getDesiredState(serverName, clusterName))
411-
.withHealth(serverHealth.get(serverName))
410+
.withDesiredState(getDesiredState(serverName, clusterName, isAdminServer))
411+
.withHealth(serverHealth == null ? null : serverHealth.get(serverName))
412412
.withClusterName(clusterName)
413413
.withNodeName(getNodeName(serverName))
414-
.withIsAdminServer(serverName.equals(adminServerName));
414+
.withIsAdminServer(isAdminServer);
415415
}
416416

417417
private String getRunningState(String serverName) {
418-
return serverState.getOrDefault(serverName, SHUTDOWN_STATE);
418+
if (serverState != null) {
419+
return serverState.getOrDefault(serverName, SHUTDOWN_STATE);
420+
}
421+
return SHUTDOWN_STATE;
422+
}
423+
424+
private String getDesiredState(String serverName, String clusterName, boolean isAdminServer) {
425+
return isAdminServer | shouldStart(serverName)
426+
? getDomain().getServer(serverName, clusterName).getDesiredState()
427+
: SHUTDOWN_STATE;
419428
}
420429

421-
private String getDesiredState(String serverName, String clusterName) {
422-
return getDomain().getServer(serverName, clusterName).getDesiredState();
430+
private boolean shouldStart(final String serverName) {
431+
return getServerStartupInfos()
432+
.filter(s -> Objects.equals(serverName, s.getServerName()))
433+
.anyMatch(s -> !s.isServiceOnly());
423434
}
424435

425436
Integer getReplicaSetting() {
@@ -494,6 +505,8 @@ private Collection<String> getServerNames() {
494505
Optional.ofNullable(cluster.getDynamicServersConfig())
495506
.flatMap(dynamicConfig -> Optional.ofNullable(dynamicConfig.getServerConfigs()))
496507
.ifPresent(servers -> servers.forEach(item -> result.add(item.getName())));
508+
Optional.ofNullable(cluster.getServerConfigs())
509+
.ifPresent(servers -> servers.forEach(item -> result.add(item.getName())));
497510
}
498511
});
499512
return result;

operator/src/main/java/oracle/kubernetes/operator/steps/ManagedServerUpIteratorStep.java

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import java.util.Map;
1010
import java.util.concurrent.ConcurrentHashMap;
1111

12+
import oracle.kubernetes.operator.DomainStatusUpdater;
1213
import oracle.kubernetes.operator.ProcessingConstants;
1314
import oracle.kubernetes.operator.helpers.DomainPresenceInfo;
1415
import oracle.kubernetes.operator.helpers.DomainPresenceInfo.ServerStartupInfo;
@@ -88,6 +89,24 @@ public NextAction apply(Packet packet) {
8889
if (startDetails.isEmpty()) {
8990
return doNext(packet);
9091
}
91-
return doForkJoin(new ManagedServerUpAfterStep(getNext()), packet, startDetails);
92+
return doNext(
93+
DomainStatusUpdater.createStatusUpdateStep(
94+
new StartManagedServersStep(startDetails, getNext())),
95+
packet);
9296
}
97+
98+
static class StartManagedServersStep extends Step {
99+
final Collection<StepAndPacket> startDetails;
100+
101+
StartManagedServersStep(Collection<StepAndPacket> startDetails, Step next) {
102+
super(next);
103+
this.startDetails = startDetails;
104+
}
105+
106+
@Override
107+
public NextAction apply(Packet packet) {
108+
return doForkJoin(new ManagedServerUpAfterStep(getNext()), packet, startDetails);
109+
}
110+
}
111+
93112
}

operator/src/main/java/oracle/kubernetes/operator/steps/ReadHealthStep.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import java.util.ArrayList;
88
import java.util.Iterator;
99
import java.util.List;
10+
import java.util.Objects;
1011
import java.util.concurrent.ConcurrentMap;
1112
import java.util.concurrent.atomic.AtomicInteger;
1213

@@ -117,13 +118,14 @@ public NextAction apply(Packet packet) {
117118
domainConfig = scan.getWlsDomainConfig();
118119
}
119120
String serverName = (String) packet.get(ProcessingConstants.SERVER_NAME);
121+
// standalone server that does not belong to any cluster
120122
WlsServerConfig serverConfig = domainConfig.getServerConfig(serverName);
121123

122124
if (serverConfig == null) {
123-
// dynamic server
125+
// dynamic or configured server in a cluster
124126
String clusterName = service.getMetadata().getLabels().get(CLUSTERNAME_LABEL);
125127
WlsClusterConfig cluster = domainConfig.getClusterConfig(clusterName);
126-
serverConfig = cluster.getDynamicServersConfig().getServerConfig(serverName);
128+
serverConfig = findServerConfig(cluster, serverName);
127129
}
128130

129131
if (httpClient == null) {
@@ -181,6 +183,16 @@ public NextAction apply(Packet packet) {
181183
}
182184
}
183185

186+
187+
private WlsServerConfig findServerConfig(WlsClusterConfig wlsClusterConfig, String serverName) {
188+
for (WlsServerConfig serverConfig: wlsClusterConfig.getServerConfigs()) {
189+
if (Objects.equals(serverName, serverConfig.getName())) {
190+
return serverConfig;
191+
}
192+
}
193+
return null;
194+
}
195+
184196
private Pair<String, ServerHealth> createServerHealthFromResult(Result restResult)
185197
throws IOException {
186198
if (restResult.isSuccessful()) {

operator/src/main/java/oracle/kubernetes/operator/utils/WlsDomainConfigSupport.java

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
import oracle.kubernetes.operator.wlsconfig.WlsClusterConfig;
1313
import oracle.kubernetes.operator.wlsconfig.WlsDomainConfig;
14+
import oracle.kubernetes.operator.wlsconfig.WlsDynamicServersConfig;
1415
import oracle.kubernetes.operator.wlsconfig.WlsMachineConfig;
1516
import oracle.kubernetes.operator.wlsconfig.WlsServerConfig;
1617

@@ -35,6 +36,16 @@ public WlsDomainConfigSupport withWlsServer(String serverName, Integer listenPor
3536
return this;
3637
}
3738

39+
public WlsDomainConfigSupport withWlsCluster(String clusterName, String... serverNames) {
40+
addWlsCluster(clusterName, serverNames);
41+
return this;
42+
}
43+
44+
public WlsDomainConfigSupport withDynamicWlsCluster(String clusterName, String... serverNames) {
45+
addDynamicWlsCluster(clusterName, serverNames);
46+
return this;
47+
}
48+
3849
public WlsDomainConfigSupport withAdminServerName(String adminServerName) {
3950
setAdminServerName(adminServerName);
4051
return this;
@@ -124,6 +135,20 @@ public WlsClusterConfig getWlsCluster(String clusterName) {
124135
return wlsClusters.get(clusterName);
125136
}
126137

138+
/**
139+
* Adds a dynamic WLS cluster to the configuration, including its member servers.
140+
*
141+
* @param clusterName the name of the cluster
142+
* @param serverNames the names of the servers
143+
*/
144+
public void addDynamicWlsCluster(String clusterName, String... serverNames) {
145+
ClusterConfigBuilder builder = new DynamicClusterConfigBuilder(clusterName);
146+
for (String serverName : serverNames) {
147+
builder.addServer(serverName);
148+
}
149+
wlsClusters.put(clusterName, builder.build());
150+
}
151+
127152
/**
128153
* Creates a domain configuration, based on the defined servers and clusters.
129154
*
@@ -172,6 +197,10 @@ static class ClusterConfigBuilder {
172197
this.name = name;
173198
}
174199

200+
String getName() {
201+
return name;
202+
}
203+
175204
void addServer(String serverName) {
176205
addServer(serverName, null);
177206
}
@@ -188,4 +217,18 @@ WlsClusterConfig build() {
188217
return wlsClusterConfig;
189218
}
190219
}
220+
221+
static class DynamicClusterConfigBuilder extends ClusterConfigBuilder {
222+
DynamicClusterConfigBuilder(String name) {
223+
super(name);
224+
}
225+
226+
WlsClusterConfig build() {
227+
WlsDynamicServersConfig wlsDynamicServersConfig = new WlsDynamicServersConfig();
228+
wlsDynamicServersConfig.setServerConfigs(serverConfigs);
229+
wlsDynamicServersConfig.setDynamicClusterSize(serverConfigs.size());
230+
WlsClusterConfig wlsClusterConfig = new WlsClusterConfig(getName(), wlsDynamicServersConfig);
231+
return wlsClusterConfig;
232+
}
233+
}
191234
}

operator/src/main/java/oracle/kubernetes/operator/wlsconfig/WlsDynamicServersConfig.java

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -272,26 +272,6 @@ public void setServerConfigs(List<WlsServerConfig> serverConfigs) {
272272
this.serverConfigs = serverConfigs;
273273
}
274274

275-
/**
276-
* Returns the configuration for the dynamic WLS server with the given name.
277-
*
278-
* @param serverName name of the WLS server
279-
* @return The WlsServerConfig object containing configuration of the WLS server with the given
280-
* name. This methods return null if no WLS configuration is found for the given server name.
281-
*/
282-
public synchronized WlsServerConfig getServerConfig(String serverName) {
283-
WlsServerConfig result = null;
284-
if (serverName != null && serverConfigs != null) {
285-
for (WlsServerConfig serverConfig : serverConfigs) {
286-
if (serverConfig.getName().equals(serverName)) {
287-
result = serverConfig;
288-
break;
289-
}
290-
}
291-
}
292-
return result;
293-
}
294-
295275
/**
296276
* Return the server template associated with this dynamic servers configuration.
297277
*

0 commit comments

Comments
 (0)