Skip to content

Commit 0f73d3d

Browse files
authored
Merge pull request #561 from oracle/OWLS-69878_introspector_channel
OWLS-69878: Have the introspector return info about all of the enabled channels of all the servers
2 parents 5e3f232 + a519c55 commit 0f73d3d

File tree

11 files changed

+221
-28
lines changed

11 files changed

+221
-28
lines changed

operator/src/main/java/oracle/kubernetes/operator/helpers/ConfigMapHelper.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import java.io.IOException;
1616
import java.io.StringReader;
1717
import java.util.HashMap;
18+
import java.util.List;
1819
import java.util.Map;
1920
import oracle.kubernetes.operator.KubernetesConstants;
2021
import oracle.kubernetes.operator.LabelConstants;
@@ -569,6 +570,7 @@ public static DomainTopology parseDomainTopologyYaml(String topologyYaml) {
569570
public static class DomainTopology {
570571
private boolean domainValid;
571572
private WlsDomainConfig domain;
573+
private List<String> validationErrors;
572574

573575
public boolean getDomainValid() {
574576
return this.domainValid;
@@ -586,5 +588,13 @@ public WlsDomainConfig getDomain() {
586588
public void setDomain(WlsDomainConfig domain) {
587589
this.domain = domain;
588590
}
591+
592+
public List<String> getValidationErrors() {
593+
return validationErrors;
594+
}
595+
596+
public void setValidationErrors(List<String> validationErrors) {
597+
this.validationErrors = validationErrors;
598+
}
589599
}
590600
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ static class ServerConfigBuilder {
126126
}
127127

128128
WlsServerConfig build() {
129-
return new WlsServerConfig(name, listenPort, null, null, false, null, null);
129+
return new WlsServerConfig(name, listenPort, null, null, false, null, null, null, false);
130130
}
131131
}
132132

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,9 @@ private WlsDynamicServerConfig(
104104
sslListenPort,
105105
sslPortEnabled,
106106
machineName,
107-
networkAccessPoints);
107+
networkAccessPoints,
108+
null,
109+
false);
108110
}
109111

110112
/**

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

Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ public class WlsServerConfig {
2020
Integer sslListenPort;
2121
boolean sslPortEnabled;
2222
String machineName;
23+
Integer adminPort;
24+
boolean adminPortEnabled;
2325
List<NetworkAccessPoint> networkAccessPoints;
2426

2527
public WlsServerConfig() {}
@@ -66,7 +68,7 @@ public Integer getSslListenPort() {
6668
* @return True if the SSL listen port should be enabled, false otherwise
6769
*/
6870
public boolean isSslPortEnabled() {
69-
return sslPortEnabled;
71+
return sslListenPort != null;
7072
}
7173

7274
/**
@@ -97,6 +99,18 @@ public void setClusterName(String clusterName) {
9799
this.clusterName = clusterName;
98100
}
99101

102+
public Integer getAdminPort() {
103+
return adminPort;
104+
}
105+
106+
public void setAdminPort(Integer adminPort) {
107+
this.adminPort = adminPort;
108+
}
109+
110+
public boolean isAdminPortEnabled() {
111+
return adminPort != null;
112+
}
113+
100114
/**
101115
* Creates a WLSServerConfig object using an "servers" or "serverTemplates" item parsed from JSON
102116
* result from WLS REST call
@@ -125,7 +139,11 @@ static WlsServerConfig create(Map<String, Object> serverConfigMap) {
125139
// parse the SSL configuration
126140
Map<String, Object> sslMap = (Map<String, Object>) serverConfigMap.get("SSL");
127141
Integer sslListenPort = (sslMap == null) ? null : (Integer) sslMap.get("listenPort");
128-
boolean sslPortEnabled = (sslMap == null) ? false : (boolean) sslMap.get("enabled");
142+
boolean sslPortEnabled = (sslMap != null && sslMap.get("listenPort") != null) ? true : false;
143+
144+
// parse the administration port
145+
Integer adminPort = (Integer) serverConfigMap.get("adminPort");
146+
boolean adminPortEnabled = (adminPort != null);
129147

130148
return new WlsServerConfig(
131149
(String) serverConfigMap.get("name"),
@@ -134,7 +152,9 @@ static WlsServerConfig create(Map<String, Object> serverConfigMap) {
134152
sslListenPort,
135153
sslPortEnabled,
136154
getMachineNameFromJsonMap(serverConfigMap),
137-
networkAccessPoints);
155+
networkAccessPoints,
156+
adminPort,
157+
adminPortEnabled);
138158
}
139159

140160
/**
@@ -147,7 +167,8 @@ static WlsServerConfig create(Map<String, Object> serverConfigMap) {
147167
* @param sslPortEnabled boolean indicating whether the SSL listen port should be enabled
148168
* @param machineName Configured machine name for this WLS server
149169
* @param networkAccessPoints List of NetworkAccessPoint containing channels configured for this
150-
* WLS server
170+
* @param adminPort Configured domain wide administration port
171+
* @param adminPortEnabled boolean indicating whether administration port should be enabled
151172
*/
152173
public WlsServerConfig(
153174
String name,
@@ -156,13 +177,17 @@ public WlsServerConfig(
156177
Integer sslListenPort,
157178
boolean sslPortEnabled,
158179
String machineName,
159-
List<NetworkAccessPoint> networkAccessPoints) {
180+
List<NetworkAccessPoint> networkAccessPoints,
181+
Integer adminPort,
182+
boolean adminPortEnabled) {
160183
this.name = name;
161184
this.listenPort = listenPort;
162185
this.listenAddress = listenAddress;
163186
this.networkAccessPoints = networkAccessPoints;
164187
this.sslListenPort = sslListenPort;
165188
this.sslPortEnabled = sslPortEnabled;
189+
this.adminPort = adminPort;
190+
this.adminPortEnabled = adminPortEnabled;
166191
this.machineName = machineName;
167192
}
168193

@@ -284,6 +309,8 @@ public boolean equals(Object o) {
284309
.append(listenPort, that.listenPort)
285310
.append(listenAddress, that.listenAddress)
286311
.append(sslListenPort, that.sslListenPort)
312+
.append(adminPort, that.adminPort)
313+
.append(adminPortEnabled, that.adminPortEnabled)
287314
.append(machineName, that.machineName)
288315
.append(networkAccessPoints, that.networkAccessPoints)
289316
.isEquals();
@@ -297,6 +324,8 @@ public int hashCode() {
297324
.append(listenAddress)
298325
.append(sslListenPort)
299326
.append(sslPortEnabled)
327+
.append(adminPort)
328+
.append(adminPortEnabled)
300329
.append(machineName)
301330
.append(networkAccessPoints)
302331
.toHashCode();
@@ -310,6 +339,8 @@ public String toString() {
310339
.append("listenAddress", listenAddress)
311340
.append("sslListenPort", sslListenPort)
312341
.append("sslPortEnabled", sslPortEnabled)
342+
.append("adminPort", adminPort)
343+
.append("adminPortEnabled", adminPortEnabled)
313344
.append("machineName", machineName)
314345
.append("networkAccessPoints", networkAccessPoints)
315346
.toString();

operator/src/main/resources/scripts/introspectDomain.py

Lines changed: 130 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,7 @@ def __init__(self, env):
280280
def validate(self):
281281
self.validateAdminServer()
282282
self.validateClusters()
283+
self.validateServerCustomChannelName()
283284
return self.isValid()
284285

285286
def generate(self):
@@ -340,6 +341,7 @@ def validateNonDynamicCluster(self, cluster):
340341
self.validateNonDynamicClusterReferencedByAtLeastOneServer(cluster)
341342
self.validateNonDynamicClusterNotReferencedByAnyServerTemplates(cluster)
342343
self.validateNonDynamicClusterServersHaveSameListenPort(cluster)
344+
self.validateNonDynamicClusterServerHaveSameCustomChannels(cluster)
343345

344346
def validateNonDynamicClusterReferencedByAtLeastOneServer(self, cluster):
345347
for server in self.env.getDomain().getServers():
@@ -352,20 +354,112 @@ def validateNonDynamicClusterNotReferencedByAnyServerTemplates(self, cluster):
352354
if template.getCluster() is cluster:
353355
self.addError("The non-dynamic cluster " + self.name(cluster) + " is referenced by the server template " + self.name(template) + ".")
354356

357+
LISTEN_PORT = 'listen port'
358+
LISTEN_PORT_ENABLED = 'listen port enabled'
359+
SSL_LISTEN_PORT = 'ssl listen port'
360+
SSL_LISTEN_PORT_ENABLED = 'ssl listen port enabled'
361+
ADMIN_LISTEN_PORT = 'admin listen port'
362+
ADMIN_LISTEN_PORT_ENABLED = 'admin listen port enabled'
363+
364+
def getServerClusterPortPropertyValue(server, clusterListenPortProperty):
365+
sslListenPort = None
366+
if server.getSSL() != None:
367+
sslListenPort = server.getSSL().getListenPort()
368+
sslListenPortEnabled = None
369+
if server.getSSL()!= None:
370+
sslListenPortEnabled = server.getSSL().isListenPortEnabled()
371+
return {
372+
LISTEN_PORT: server.getListenPort(),
373+
LISTEN_PORT_ENABLED: server.isListenPortEnabled(),
374+
SSL_LISTEN_PORT: sslListenPort,
375+
SSL_LISTEN_PORT_ENABLED: sslListenPortEnabled,
376+
ADMIN_LISTEN_PORT: server.getAdministrationPort(),
377+
ADMIN_LISTEN_PORT_ENABLED: server.isAdministrationPortEnabled()
378+
}[clusterListenPortProperty]
379+
355380
def validateNonDynamicClusterServersHaveSameListenPort(self, cluster):
356381
firstServer = None
357-
firstPort = None
382+
firstListenPort = None
383+
firstListenPortEnabled = None
384+
firstSslListenPort = None
385+
firstSslListenPortEnabled = None
386+
firstAdminPort = None
387+
firstAdminPortEnabled = None
388+
for server in self.env.getDomain().getServers():
389+
if cluster is server.getCluster():
390+
listenPort = server.getListenPort()
391+
listenPortEnabled = server.isListenPortEnabled()
392+
ssl = server.getSSL()
393+
sslListenPort = None
394+
sslListenPortEnabled = None
395+
if ssl is not None:
396+
sslListenPort = ssl.getListenPort()
397+
sslListenPortEnabled = ssl.isEnabled()
398+
adminPort = server.getAdministrationPort()
399+
adminPortEnabled = server.isAdministrationPortEnabled()
400+
if firstServer is None:
401+
firstServer = server
402+
firstListenPort = listenPort
403+
firstListenPortEnabled = listenPortEnabled
404+
firstSslListenPort = sslListenPort
405+
firstSslListenPortEnabled = sslListenPortEnabled
406+
firstAdminPort = adminPort
407+
firstAdminPortEnabled = adminPortEnabled
408+
else:
409+
if listenPort != firstListenPort:
410+
self.addError("The non-dynamic cluster " + self.name(cluster) + "'s server " + self.name(firstServer) + "'s listen port is " + str(firstListenPort) + " but its server " + self.name(server) + "'s listen port is " + str(listenPort) + ". All ports for the same channel in a cluster must be the same.")
411+
if listenPortEnabled != firstListenPortEnabled:
412+
self.addError("The non-dynamic cluster " + self.name(cluster) + "'s server " + self.name(firstServer) + " has listen port enabled: " + self.booleanToString(firstListenPortEnabled) + " but its server " + self.name(server) + "'s listen port enabled: " + self.booleanToString(listenPortEnabled) + ". Channels in a cluster must be either all enabled or disabled.")
413+
if sslListenPort != firstSslListenPort:
414+
self.addError("The non-dynamic cluster " + self.name(cluster) + "'s server " + self.name(firstServer) + "'s ssl listen port is " + str(firstSslListenPort) + " but its server " + self.name(server) + "'s ssl listen port is " + str(sslListenPort) + ". All ports for the same channel in a cluster must be the same.")
415+
if sslListenPortEnabled != firstSslListenPortEnabled:
416+
self.addError("The non-dynamic cluster " + self.name(cluster) + "'s server " + self.name(firstServer) + " has ssl listen port enabled: " + self.booleanToString(firstSslListenPortEnabled) + " but its server " + self.name(server) + "'s ssl listen port enabled: " + self.booleanToString(sslListenPortEnabled) + ". Channels in a cluster must be either all enabled or disabled.")
417+
if adminPort != firstAdminPort:
418+
self.addError("The non-dynamic cluster " + self.name(cluster) + "'s server " + self.name(firstServer) + "'s ssl listen port is " + str(firstAdminPort) + " but its server " + self.name(server) + "'s ssl listen port is " + str(adminPort) + ". All ports for the same channel in a cluster must be the same.")
419+
if adminPortEnabled != firstAdminPortEnabled:
420+
self.addError("The non-dynamic cluster " + self.name(cluster) + "'s server " + self.name(firstServer) + " has ssl listen port enabled: " + self.booleanToString(firstAdminPortEnabled) + " but its server " + self.name(server) + "'s ssl listen port enabled: " + self.booleanToString(adminPortEnabled) + ". Channels in a cluster must be either all enabled or disabled.")
421+
422+
423+
424+
def validateClusterServersListenPortProperty(self, cluster, errorMsg, clusterListenPortProperty):
425+
firstServer = None
426+
firstListenPortProperty = None
358427
for server in self.env.getDomain().getServers():
359428
if cluster is server.getCluster():
360-
port = server.getListenPort()
429+
listenPortProperty = getServerClusterPortPropertyValue(server, clusterListenPortProperty)
361430
if firstServer is None:
362431
firstServer = server
363-
firstPort = port
432+
firstListenPortProperty = listenPortProperty
364433
else:
365-
if port != firstPort:
366-
self.addError("The non-dynamic cluster " + self.name(cluster) + "'s server " + self.name(firstServer) + "'s listen port is " + str(firstPort) + " but its server " + self.name(server) + "'s listen port is " + str(port) + ". All ports for the same channel in a cluster must be the same, including the default channel and the default SSL channel.")
434+
if listenPortProperty != firstListenPortProperty:
435+
self.addError(errorMsg.substitute(cluster=self.name(cluster), server1=self.name(firstServer), property=clusterListenPortProperty, value1=str(firstListenPortProperty), server2=self.name(server), value2=str(firstListenPortProperty)))
367436
return
368437

438+
def validateNonDynamicClusterServerHaveSameCustomChannels(self, cluster):
439+
firstServer = None
440+
serverNap = {}
441+
for server in self.env.getDomain().getServers():
442+
if cluster is server.getCluster():
443+
if firstServer is None:
444+
for nap in server.getNetworkAccessPoints():
445+
serverNap[nap.getName()] = nap.getProtocol() + "~" + str(nap.getListenPort());
446+
firstServer = server
447+
else:
448+
naps = server.getNetworkAccessPoints()
449+
if len(naps) != len(serverNap):
450+
self.addError("The non-dynamic cluster " + self.name(cluster) + " has mismatched number of network access points in servers " + self.name(firstServer) + " and " + self.name(server) + ". All network access points in a cluster must be the same.")
451+
return
452+
else:
453+
for nap in naps:
454+
if nap.getName() in serverNap:
455+
if serverNap[nap.getName()] != nap.getProtocol() + "~" + str(nap.getListenPort()):
456+
self.addError("The non-dynamic cluster " + self.name(cluster) + " has mismatched network access point " + self.name(nap) + " in servers " + self.name(firstServer) + " and " + self.name(server) + ". All network access points in a cluster must be the same.")
457+
return
458+
else:
459+
self.addError("The non-dynamic cluster " + self.name(cluster) + " has mismatched network access point " + self.name(nap) + " in servers " + self.name(firstServer) + " and " + self.name(server) + ". All network access points in a cluster must be the same.")
460+
return
461+
462+
369463
def validateDynamicCluster(self, cluster):
370464
self.validateDynamicClusterReferencedByOneServerTemplate(cluster)
371465
self.validateDynamicClusterDynamicServersDoNotUseCalculatedListenPorts(cluster)
@@ -393,6 +487,14 @@ def validateDynamicClusterDynamicServersDoNotUseCalculatedListenPorts(self, clus
393487
if cluster.getDynamicServers().isCalculatedListenPorts() == True:
394488
self.addError("The dynamic cluster " + self.name(cluster) + "'s dynamic servers use calculated listen ports.")
395489

490+
def validateServerCustomChannelName(self):
491+
reservedNames = ['default','defaultSecure','defaultAdmin']
492+
for server in self.env.getDomain().getServers():
493+
naps = server.getNetworkAccessPoints()
494+
for nap in naps:
495+
if nap.getName() in reservedNames:
496+
self.addError("The custom channel " + self.name(nap) + " is a reserved name.")
497+
396498
def isValid(self):
397499
return len(self.env.getErrors()) == 0
398500

@@ -475,10 +577,21 @@ def getClusteredServers(self, cluster):
475577
def addClusteredServer(self, cluster, server):
476578
name=self.name(server)
477579
self.writeln("- name: " + name)
478-
self.writeln(" listenPort: " + str(server.getListenPort()))
580+
if server.isListenPortEnabled():
581+
self.writeln(" listenPort: " + str(server.getListenPort()))
479582
self.writeln(" listenAddress: " + self.quote(self.env.toDNS1123Legal(self.env.getDomainUID() + "-" + server.getName())))
583+
if server.isAdministrationPortEnabled():
584+
self.writeln(" adminPort: " + str(server.getAdministrationPort()))
585+
self.addSSL(server)
480586
self.addNetworkAccessPoints(server)
481587

588+
def addSSL(self, server):
589+
ssl = server.getSSL()
590+
if ssl is not None and ssl.isEnabled():
591+
self.indent()
592+
self.writeln("sslListenPort: " + str(ssl.getListenPort()))
593+
self.undent()
594+
482595
def addServerTemplates(self):
483596
serverTemplates = self.env.getDomain().getServerTemplates()
484597
if len(serverTemplates) == 0:
@@ -492,7 +605,8 @@ def addServerTemplates(self):
492605
def addServerTemplate(self, serverTemplate):
493606
name=self.name(serverTemplate)
494607
self.writeln("- name: " + name)
495-
self.writeln(" listenPort: " + str(serverTemplate.getListenPort()))
608+
if serverTemplate.isListenPortEnabled():
609+
self.writeln(" listenPort: " + str(serverTemplate.getListenPort()))
496610
self.writeln(" clusterName: " + self.quote(serverTemplate.getCluster().getName()))
497611
listenAddress=serverTemplate.getListenAddress()
498612
if listenAddress is not None:
@@ -546,8 +660,12 @@ def addNonClusteredServers(self):
546660
def addNonClusteredServer(self, server):
547661
name=self.name(server)
548662
self.writeln("- name: " + name)
549-
self.writeln(" listenPort: " + str(server.getListenPort()))
663+
if server.isListenPortEnabled():
664+
self.writeln(" listenPort: " + str(server.getListenPort()))
550665
self.writeln(" listenAddress: " + self.quote(self.env.toDNS1123Legal(self.env.getDomainUID() + "-" + server.getName())))
666+
if server.isAdministrationPortEnabled():
667+
self.writeln(" adminPort: " + str(server.getAdministrationPort()))
668+
self.addSSL(server)
551669
self.addNetworkAccessPoints(server)
552670

553671
def addNetworkAccessPoints(self, server):
@@ -567,6 +685,10 @@ def addNetworkAccessPoint(self, nap):
567685
self.writeln(" listenPort: " + str(nap.getListenPort()))
568686
self.writeln(" publicPort: " + str(nap.getPublicPort()))
569687

688+
def booleanToString(self, bool):
689+
if bool == 0:
690+
return "false"
691+
return "true"
570692

571693
class BootPropertiesGenerator(Generator):
572694

0 commit comments

Comments
 (0)