Skip to content

Commit 7402601

Browse files
authored
Owls88611 make sure REST calls are made using the expected port and protocol (#2301)
* choose correct port and protocol * add validation for no port to use cases
1 parent 3be3298 commit 7402601

File tree

11 files changed

+360
-107
lines changed

11 files changed

+360
-107
lines changed

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

Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
import java.util.Map;
1010
import java.util.Objects;
1111
import java.util.Optional;
12-
import java.util.stream.Stream;
1312
import javax.annotation.Nonnull;
1413
import javax.annotation.Nullable;
1514

@@ -568,21 +567,7 @@ List<V1EnvVar> getConfiguredEnvVars(TuningParameters tuningParameters) {
568567

569568
abstract class ExporterContext {
570569
int getWebLogicRestPort() {
571-
return selectPortByProtocolName().orElse(selectPortFromList());
572-
}
573-
574-
private Optional<Integer> selectPortByProtocolName() {
575-
return getContainerPorts().stream()
576-
.filter(p -> Objects.equals(scan.getAdminProtocolChannelName(), p.getName()))
577-
.findFirst()
578-
.map(V1ContainerPort::getContainerPort);
579-
}
580-
581-
private int selectPortFromList() {
582-
return Stream.of(getAdminPort(), getListenPort(), getSslListenPort())
583-
.filter(Objects::nonNull)
584-
.findFirst()
585-
.orElseThrow(() -> new RuntimeException("No ports defined for this server"));
570+
return scan.getLocalAdminProtocolChannelPort();
586571
}
587572

588573
boolean isWebLogicSecure() {

operator/src/main/java/oracle/kubernetes/operator/logging/MessageKeys.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,7 @@ public class MessageKeys {
162162
public static final String ILLEGAL_SERVER_SERVICE_NAME_LENGTH = "WLSDO-0018";
163163
public static final String ILLEGAL_EXTERNAL_SERVICE_NAME_LENGTH = "WLSDO-0019";
164164
public static final String MII_DOMAIN_UPDATED_POD_RESTART_REQUIRED = "WLSDO-0020";
165+
public static final String NO_AVAILABLE_PORT_TO_USE_FOR_REST = "WLSDO-0021";
165166

166167
private MessageKeys() {
167168
}

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

Lines changed: 14 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
import java.time.OffsetDateTime;
1111
import java.time.ZoneId;
1212
import java.util.ArrayList;
13-
import java.util.Collection;
1413
import java.util.Iterator;
1514
import java.util.List;
1615
import java.util.Map;
@@ -21,10 +20,9 @@
2120

2221
import com.fasterxml.jackson.databind.JsonNode;
2322
import com.fasterxml.jackson.databind.ObjectMapper;
23+
import io.kubernetes.client.openapi.models.V1ObjectMeta;
2424
import io.kubernetes.client.openapi.models.V1Pod;
2525
import io.kubernetes.client.openapi.models.V1Service;
26-
import io.kubernetes.client.openapi.models.V1ServicePort;
27-
import io.kubernetes.client.openapi.models.V1ServiceSpec;
2826
import oracle.kubernetes.operator.Pair;
2927
import oracle.kubernetes.operator.ProcessingConstants;
3028
import oracle.kubernetes.operator.WebLogicConstants;
@@ -108,6 +106,7 @@ static final class ReadHealthProcessing extends HttpRequestProcessing {
108106
}
109107

110108
private HttpRequest createRequest() {
109+
LOGGER.finer("Create REST request to service URL: " + getRequestUrl());
111110
return createRequestBuilder(getRequestUrl())
112111
.POST(HttpRequest.BodyPublishers.ofString(getRetrieveHealthSearchPayload()))
113112
.build();
@@ -118,55 +117,35 @@ private String getRequestUrl() {
118117
}
119118

120119
protected PortDetails getPortDetails() {
121-
Integer port = getPort();
120+
Integer port = getWlsServerAdminProtocolPort();
122121
return new PortDetails(port, !port.equals(getWlsServerConfig().getListenPort()));
123122
}
124123

125-
private Integer getPort() {
126-
return Optional.ofNullable(getService().getSpec())
127-
.map(this::getServicePort)
128-
.map(V1ServicePort::getPort)
129-
.orElse(-1);
124+
private Integer getWlsServerAdminProtocolPort() {
125+
return getWlsServerConfig().getLocalAdminProtocolChannelPort();
130126
}
131127

132-
private V1ServicePort getServicePort(V1ServiceSpec spec) {
133-
return getAdminProtocolPort(spec).orElse(getFirstPort(spec));
134-
}
135-
136-
private Optional<V1ServicePort> getAdminProtocolPort(V1ServiceSpec spec) {
137-
return Optional.ofNullable(spec.getPorts())
138-
.stream()
139-
.flatMap(Collection::stream)
140-
.filter(this::isAdminProtocolPort)
141-
.findFirst();
142-
}
143-
144-
private boolean isAdminProtocolPort(V1ServicePort port) {
145-
return Optional.ofNullable(getAdminProtocolChannelName()).map(n -> n.equals(port.getName())).orElse(false);
146-
}
147-
148-
private V1ServicePort getFirstPort(V1ServiceSpec spec) {
149-
return Optional.ofNullable(spec).map(V1ServiceSpec::getPorts).map(l -> l.get(0)).orElse(null);
150-
}
151-
152-
private String getAdminProtocolChannelName() {
153-
return getWlsServerConfig().getAdminProtocolChannelName();
154-
}
155-
156-
157128
private WlsServerConfig getWlsServerConfig() {
158129
// standalone server that does not belong to any cluster
159130
WlsServerConfig serverConfig = getWlsDomainConfig().getServerConfig(getServerName());
160131

161132
if (serverConfig == null) {
162133
// dynamic or configured server in a cluster
163-
String clusterName = getService().getMetadata().getLabels().get(CLUSTERNAME_LABEL);
134+
String clusterName = getClusterNameFromServiceLabel();
164135
WlsClusterConfig cluster = getWlsDomainConfig().getClusterConfig(clusterName);
165136
serverConfig = findServerConfig(cluster);
166137
}
167138
return serverConfig;
168139
}
169140

141+
private String getClusterNameFromServiceLabel() {
142+
return Optional.of(getService())
143+
.map(V1Service::getMetadata)
144+
.map(V1ObjectMeta::getLabels)
145+
.map(m -> m.get(CLUSTERNAME_LABEL))
146+
.orElse(null);
147+
}
148+
170149
private WlsServerConfig findServerConfig(WlsClusterConfig wlsClusterConfig) {
171150
for (WlsServerConfig serverConfig : wlsClusterConfig.getServerConfigs()) {
172151
if (Objects.equals(getServerName(), serverConfig.getName())) {

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

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,14 @@
55

66
public class PortDetails {
77

8-
final int portNum;
9-
final boolean portSecure;
8+
private final int portNum;
9+
private final boolean portSecure;
1010

1111
public PortDetails(int portNum, boolean portSecure) {
1212
this.portNum = portNum;
1313
this.portSecure = portSecure;
1414
}
1515

16-
public int getPortNum() {
17-
return portNum;
18-
}
19-
20-
public boolean isPortSecure() {
21-
return portSecure;
22-
}
23-
2416
public String toHttpUrl(String host) {
2517
return String.format("http%s://%s:%d", (portSecure ? "s" : ""), host, portNum);
2618
}

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

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,14 @@
1515

1616
/** Contains configuration of a WebLogic server. */
1717
public class WlsServerConfig {
18-
String name;
19-
Integer listenPort;
20-
String listenAddress;
21-
String clusterName;
22-
Integer sslListenPort;
23-
String machineName;
24-
Integer adminPort;
25-
List<NetworkAccessPoint> networkAccessPoints;
18+
private String name;
19+
private Integer listenPort;
20+
private String listenAddress;
21+
private String clusterName;
22+
private Integer sslListenPort;
23+
private String machineName;
24+
private Integer adminPort;
25+
private List<NetworkAccessPoint> networkAccessPoints;
2626

2727
public WlsServerConfig() {
2828
}
@@ -140,7 +140,7 @@ static String getClusterNameFromJsonMap(Map<String, Object> serverMap) {
140140
* @param serverMap Map containing parsed Json "servers" or "serverTemplates" element
141141
* @return Machine name contained in the Json element
142142
*/
143-
static String getMachineNameFromJsonMap(Map<String, Object> serverMap) {
143+
private static String getMachineNameFromJsonMap(Map<String, Object> serverMap) {
144144
// serverMap contains a "machine" entry from the REST call which is in the form: "machine":
145145
// ["machines", "domain1-machine1"]
146146
@SuppressWarnings({"unchecked", "rawtypes"})
@@ -317,7 +317,7 @@ public WlsServerConfig setAdminPort(int adminPort) {
317317
}
318318

319319
public String getClusterName() {
320-
return this.clusterName;
320+
return clusterName;
321321
}
322322

323323
public boolean isAdminPortEnabled() {
@@ -405,7 +405,6 @@ public boolean isLocalAdminProtocolChannelSecure() {
405405
adminProtocolPortSecure = false;
406406
}
407407
}
408-
409408
return adminProtocolPortSecure;
410409
}
411410

operator/src/main/java/oracle/kubernetes/weblogic/domain/model/Domain.java

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -803,6 +803,32 @@ private void verifyIntrospectorJobName() {
803803
}
804804
}
805805

806+
807+
private void verifyServerPorts(WlsDomainConfig wlsDomainConfig) {
808+
// domain level serverConfigs do not contain servers in dynamic clusters
809+
wlsDomainConfig.getServerConfigs()
810+
.values()
811+
.stream()
812+
.forEach(server -> checkServerPorts(server));
813+
wlsDomainConfig.getClusterConfigs()
814+
.values()
815+
.iterator()
816+
.forEachRemaining(wlsClusterConfig
817+
// serverConfigs contains configured and dynamic servers in the cluster
818+
-> wlsClusterConfig.getServerConfigs().forEach(wlsServerConfig
819+
-> this.checkServerPorts(wlsServerConfig)));
820+
}
821+
822+
private void checkServerPorts(WlsServerConfig wlsServerConfig) {
823+
if (noAvailablePort(wlsServerConfig)) {
824+
failures.add(DomainValidationMessages.noAvailablePortToUse(getDomainUid(), wlsServerConfig.getName()));
825+
}
826+
}
827+
828+
private boolean noAvailablePort(WlsServerConfig wlsServerConfig) {
829+
return wlsServerConfig.getAdminProtocolChannelName() == null;
830+
}
831+
806832
private void verifyGeneratedResourceNames(WlsDomainConfig wlsDomainConfig) {
807833
checkGeneratedServerServiceName(wlsDomainConfig.getAdminServerName(), -1);
808834
if (isExternalServiceConfigured(getSpec())) {
@@ -1033,7 +1059,9 @@ private void addReservedEnvironmentVariables() {
10331059
}
10341060

10351061
List<String> getAfterIntrospectValidationFailures(Packet packet) {
1036-
verifyGeneratedResourceNames((WlsDomainConfig) packet.get(ProcessingConstants.DOMAIN_TOPOLOGY));
1062+
WlsDomainConfig wlsDomainConfig = (WlsDomainConfig) packet.get(ProcessingConstants.DOMAIN_TOPOLOGY);
1063+
verifyGeneratedResourceNames(wlsDomainConfig);
1064+
verifyServerPorts(wlsDomainConfig);
10371065
return failures;
10381066
}
10391067

operator/src/main/java/oracle/kubernetes/weblogic/domain/model/DomainValidationMessages.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,4 +131,8 @@ public static String exceedMaxExternalServiceName(
131131
String domainUid, String adminServerName, String result, int limit) {
132132
return getMessage(MessageKeys.ILLEGAL_EXTERNAL_SERVICE_NAME_LENGTH, domainUid, adminServerName, result, limit);
133133
}
134+
135+
public static String noAvailablePortToUse(String domainUid, String serverName) {
136+
return getMessage(MessageKeys.NO_AVAILABLE_PORT_TO_USE_FOR_REST, domainUid, serverName);
137+
}
134138
}

operator/src/main/resources/Operator.properties

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,9 +167,11 @@ WLSDO-0019=DomainUID ''{0}'' and admin server name ''{1}'' combination ''{2}'' e
167167
WLSDO-0020=Online WebLogic configuration updates complete \
168168
but there are pending non-dynamic changes that require \
169169
pod restarts to take effect. The changes are:
170-
170+
WLSDO-0021=DomainUID ''{0}'' server ''{1}'' does not have a port available for the operator to send REST calls. \
171+
The default listen port and SSL port are disabled, the admin port is not configured and there is no channel with admin privileges.\
171172
172173
oneEnvVar=variable
173174
multipleEnvVars=variables
174175
singularToBe=is
175176
pluralToBe=are
177+

0 commit comments

Comments
 (0)