From ddaaa3b2a8ace784973a25d921408c9941632d6c Mon Sep 17 00:00:00 2001 From: Anil Kedia Date: Wed, 22 Sep 2021 03:08:35 +0000 Subject: [PATCH 1/4] Changes for OWLS-91563 to validate container port name and truncate generated long names. --- .../operator/helpers/LegalNames.java | 3 ++ .../operator/helpers/PodStepContext.java | 22 ++++++++- .../operator/logging/MessageKeys.java | 1 + .../operator/wlsconfig/WlsDomainConfig.java | 14 ++++++ .../weblogic/domain/model/Domain.java | 31 +++++++++++++ .../model/DomainValidationMessages.java | 5 +++ .../src/main/resources/Operator.properties | 1 + .../operator/helpers/PodHelperTestBase.java | 45 +++++++++++++++++++ .../domain/model/DomainValidationTest.java | 38 ++++++++++++++++ 9 files changed, 159 insertions(+), 1 deletion(-) diff --git a/operator/src/main/java/oracle/kubernetes/operator/helpers/LegalNames.java b/operator/src/main/java/oracle/kubernetes/operator/helpers/LegalNames.java index 0239141dbb6..55beb539fba 100644 --- a/operator/src/main/java/oracle/kubernetes/operator/helpers/LegalNames.java +++ b/operator/src/main/java/oracle/kubernetes/operator/helpers/LegalNames.java @@ -54,6 +54,9 @@ public class LegalNames { // The maximum length of a legal DNS label name public static final int LEGAL_DNS_LABEL_NAME_MAX_LENGTH = 63; + // The maximum length of a container port name + public static final int LEGAL_CONTAINER_PORT_MAX_LENGTH = 15; + private static final String DNS_NAME_REGEXP = "[a-z0-9]([-a-z0-9]*[a-z0-9])?"; private static final Pattern DNS_NAME_PATTERN = Pattern.compile(DNS_NAME_REGEXP); diff --git a/operator/src/main/java/oracle/kubernetes/operator/helpers/PodStepContext.java b/operator/src/main/java/oracle/kubernetes/operator/helpers/PodStepContext.java index 53904b4b8c3..48e85456870 100644 --- a/operator/src/main/java/oracle/kubernetes/operator/helpers/PodStepContext.java +++ b/operator/src/main/java/oracle/kubernetes/operator/helpers/PodStepContext.java @@ -295,7 +295,7 @@ private boolean isSipProtocol(NetworkAccessPoint nap) { } private void addContainerPort(List ports, NetworkAccessPoint nap) { - String name = LegalNames.toDns1123LegalName(nap.getName()); + String name = createContainerPortName(ports, LegalNames.toDns1123LegalName(nap.getName())); addContainerPort(ports, name, nap.getListenPort(), "TCP"); if (isSipProtocol(nap)) { @@ -306,10 +306,30 @@ private void addContainerPort(List ports, NetworkAccessPoint na private void addContainerPort(List ports, String name, @Nullable Integer listenPort, String protocol) { if (listenPort != null) { + name = createContainerPortName(ports, name); ports.add(new V1ContainerPort().name(name).containerPort(listenPort).protocol(protocol)); } } + private String createContainerPortName(List ports, String name) { + //Container port names can be a maximum of 15 characters in length + if (name.length() > LegalNames.LEGAL_CONTAINER_PORT_MAX_LENGTH) { + // Extract the first 12 characters to use since there is a 15 character + // limit to the container port name + String cpName = name.substring(0, 12); + // Find ports with the name having the same first 12 characters + List containerPortsWithSamePrefix = ports.stream().filter(port -> + port.getName().substring(0, 12).equals(cpName)).collect(Collectors.toList()); + int index = containerPortsWithSamePrefix.size() + 1; + String indexStr = String.valueOf(index); + if (index < 10) { + indexStr = "0" + index; + } + name = cpName + "-" + indexStr; + } + return name; + } + Integer getListenPort() { return Optional.ofNullable(scan).map(WlsServerConfig::getListenPort).orElse(null); } diff --git a/operator/src/main/java/oracle/kubernetes/operator/logging/MessageKeys.java b/operator/src/main/java/oracle/kubernetes/operator/logging/MessageKeys.java index 8b600f1b4ab..05a38ca9a68 100644 --- a/operator/src/main/java/oracle/kubernetes/operator/logging/MessageKeys.java +++ b/operator/src/main/java/oracle/kubernetes/operator/logging/MessageKeys.java @@ -176,6 +176,7 @@ public class MessageKeys { public static final String MONITORING_EXPORTER_CONFLICT_DYNAMIC_CLUSTER = "WLSDO-0028"; public static final String INVALID_LIVENESS_PROBE_SUCCESS_THRESHOLD_VALUE = "WLSDO-0029"; public static final String RESERVED_CONTAINER_NAME = "WLSDO-0030"; + public static final String ILLEGAL_CONTAINER_PORT_NAME_LENGTH = "WLSDO-0031"; private MessageKeys() { } diff --git a/operator/src/main/java/oracle/kubernetes/operator/wlsconfig/WlsDomainConfig.java b/operator/src/main/java/oracle/kubernetes/operator/wlsconfig/WlsDomainConfig.java index 9dc9aa82c62..6ea988534fa 100644 --- a/operator/src/main/java/oracle/kubernetes/operator/wlsconfig/WlsDomainConfig.java +++ b/operator/src/main/java/oracle/kubernetes/operator/wlsconfig/WlsDomainConfig.java @@ -407,6 +407,20 @@ public WlsDomainConfig withAdminServer(String adminServerName, String listenAddr return this; } + /** + * Build the domain config with a WLS server. + * @param server WLS server configuration + * @param isAdmin Specifies if the server is Admin or managed server. + * @return domain config + */ + public WlsDomainConfig withServer(WlsServerConfig server, boolean isAdmin) { + if (isAdmin) { + setAdminServerName(server.getName()); + } + getServers().add(server); + return this; + } + public WlsDomainConfig addWlsServer(String name, String listenAddress, int port) { getServers().add(new WlsServerConfig(name, listenAddress, port)); return this; diff --git a/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/Domain.java b/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/Domain.java index 8aed82f1adb..157a83d0e2c 100644 --- a/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/Domain.java +++ b/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/Domain.java @@ -21,6 +21,7 @@ import com.google.gson.annotations.SerializedName; import io.kubernetes.client.common.KubernetesObject; import io.kubernetes.client.openapi.models.V1Container; +import io.kubernetes.client.openapi.models.V1ContainerPort; import io.kubernetes.client.openapi.models.V1EnvVar; import io.kubernetes.client.openapi.models.V1LocalObjectReference; import io.kubernetes.client.openapi.models.V1ObjectMeta; @@ -833,6 +834,7 @@ List getValidationFailures(KubernetesResourceLookup kubernetesResources) addDuplicateAuxiliaryImageVolumeNames(); verifyLivenessProbeSuccessThreshold(); verifyContainerNameValidInPodSpec(); + verifyContainerPortNameValidInPodSpec(); return failures; } @@ -1118,6 +1120,35 @@ private void isContainerNameReserved(V1Container container, String prefix) { } } + private void verifyContainerPortNameValidInPodSpec() { + getAdminServerSpec().getContainers().forEach(container -> + areContainerPortNamesValid(container, ADMIN_SERVER_POD_SPEC_PREFIX + ".containers")); + getSpec().getClusters().forEach(cluster -> + cluster.getContainers().forEach(container -> + areContainerPortNamesValid(container, CLUSTER_SPEC_PREFIX + "[" + cluster.getClusterName() + + "].serverPod.containers"))); + getSpec().getManagedServers().forEach(managedServer -> + managedServer.getContainers().forEach(container -> + areContainerPortNamesValid(container, MS_SPEC_PREFIX + "[" + managedServer.getServerName() + + "].serverPod.containers"))); + } + + private void areContainerPortNamesValid(V1Container container, String prefix) { + Optional.ofNullable(container.getPorts()).ifPresent(portList -> + portList.forEach(port -> checkPortNameLength(port, container.getName(), prefix))); + } + + private void checkPortNameLength(V1ContainerPort port, String name, String prefix) { + int limit = LegalNames.LEGAL_CONTAINER_PORT_MAX_LENGTH; + if (port.getName().length() > limit) { + failures.add(DomainValidationMessages.exceedMaxContainerPortName( + getDomainUid(), + prefix + "." + name, + port.getName(), + limit)); + } + } + @Nonnull private Set getEnvNames() { return Optional.ofNullable(spec.getEnv()).stream() diff --git a/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/DomainValidationMessages.java b/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/DomainValidationMessages.java index b0b95f0d501..551faeeb7e3 100644 --- a/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/DomainValidationMessages.java +++ b/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/DomainValidationMessages.java @@ -174,4 +174,9 @@ public static String invalidLivenessProbeSuccessThresholdValue(int value, String public static String reservedContainerName(String name, String prefix) { return getMessage(MessageKeys.RESERVED_CONTAINER_NAME, name, prefix); } + + public static String exceedMaxContainerPortName(String domainUid, String containerName, String portName, int limit) { + return getMessage(MessageKeys.ILLEGAL_CONTAINER_PORT_NAME_LENGTH, domainUid, containerName, portName, limit); + } + } diff --git a/operator/src/main/resources/Operator.properties b/operator/src/main/resources/Operator.properties index 3dce5d3da63..37e0bc972a6 100644 --- a/operator/src/main/resources/Operator.properties +++ b/operator/src/main/resources/Operator.properties @@ -184,6 +184,7 @@ WLSDO-0027=The Monitoring Exporter port ''{0}'' specified by ''spec.monitoringEx WLSDO-0028=The Monitoring Exporter port ''{0}'' specified by ''spec.monitoringExporter.port'' conflicts with Cluster ''{1}'' dynamic server template port ''{2}'' WLSDO-0029=Invalid value ''{0}'' for the liveness probe success threshold under ''{1}''. The liveness probe successThreshold value must be 1. WLSDO-0030=The container name ''{0}'' specified under ''{1}'' is reserved for use by the operator. +WLSDO-0031=Container port name ''{2}'' for domain with domainUID ''{0}'' and container name ''{1}'' exceeds maximum allowed length ''{3}''. oneEnvVar=variable multipleEnvVars=variables diff --git a/operator/src/test/java/oracle/kubernetes/operator/helpers/PodHelperTestBase.java b/operator/src/test/java/oracle/kubernetes/operator/helpers/PodHelperTestBase.java index 14ab4297adb..9075f07c69f 100644 --- a/operator/src/test/java/oracle/kubernetes/operator/helpers/PodHelperTestBase.java +++ b/operator/src/test/java/oracle/kubernetes/operator/helpers/PodHelperTestBase.java @@ -201,6 +201,8 @@ public abstract class PodHelperTestBase extends DomainValidationBaseTest { private static final int READ_AND_EXECUTE_MODE = 0555; private static final String TEST_PRODUCT_VERSION = "unit-test"; private static final String NOOP_EXPORTER_CONFIG = "queries:\n"; + public static final String LONG_CHANNEL_NAME = "Very_Long_Channel_Name"; + public static final String TRUNCATED_PORT_NAME_PREFIX = "very-long-ch"; final TerminalStep terminalStep = new TerminalStep(); private final Domain domain = createDomain(); @@ -378,6 +380,49 @@ void whenPodCreatedWithAdminNap_prometheusAnnotationsSpecifyPlainTextPort() { hasEntry("prometheus.io/scrape", "true"))); } + @Test + void whenPodCreatedWithAdminNapNameExceedingMaxPortNameLength_podContainerCreatedWithTruncatedPortName() { + getServerTopology().addNetworkAccessPoint(new NetworkAccessPoint(LONG_CHANNEL_NAME, "admin", 8001, 8001)); + assertThat( + getContainerPorts(), + hasItem(createContainerPort(TRUNCATED_PORT_NAME_PREFIX + "-01"))); + } + + private List getContainerPorts() { + return getCreatedPod().getSpec().getContainers().stream() + .filter(c -> c.getName().equals(WLS_CONTAINER_NAME)).findFirst().map(c -> c.getPorts()).orElse(null); + } + + private V1ContainerPort createContainerPort(String portName) { + return new V1ContainerPort().name(portName).containerPort(8001).protocol("TCP"); + } + + @Test + void whenPodCreatedWithMultipleNapsWithNamesExceedingMaxPortNameLength_podContainerCreatedWithTruncatedPortNames() { + getServerTopology().addNetworkAccessPoint(new NetworkAccessPoint(LONG_CHANNEL_NAME + "1", "admin", 8001, 8001)); + getServerTopology().addNetworkAccessPoint(new NetworkAccessPoint(LONG_CHANNEL_NAME + "11", "admin", 8001, 8001)); + assertThat( + getContainerPorts(), + hasItem(createContainerPort(TRUNCATED_PORT_NAME_PREFIX + "-01"))); + + assertThat( + getContainerPorts(), + hasItem(createContainerPort(TRUNCATED_PORT_NAME_PREFIX + "-02"))); + } + + @Test + void whenPodCreatedWithMultipleNapsSomeWithNamesExceedingMaxPortNameLength_podContainerCreatedWithMixedPortNames() { + getServerTopology().addNetworkAccessPoint(new NetworkAccessPoint(LONG_CHANNEL_NAME, "admin", 8001, 8001)); + getServerTopology().addNetworkAccessPoint(new NetworkAccessPoint("My_Channel_Name", "admin", 8001, 8001)); + assertThat( + getContainerPorts(), + hasItem(createContainerPort(TRUNCATED_PORT_NAME_PREFIX + "-01"))); + + assertThat( + getContainerPorts(), + hasItem(createContainerPort("my-channel-name"))); + } + protected DomainConfigurator defineExporterConfiguration() { return configureDomain() .withMonitoringExporterConfiguration(NOOP_EXPORTER_CONFIG) diff --git a/operator/src/test/java/oracle/kubernetes/weblogic/domain/model/DomainValidationTest.java b/operator/src/test/java/oracle/kubernetes/weblogic/domain/model/DomainValidationTest.java index 875bffa9930..efbc2d4fab7 100644 --- a/operator/src/test/java/oracle/kubernetes/weblogic/domain/model/DomainValidationTest.java +++ b/operator/src/test/java/oracle/kubernetes/weblogic/domain/model/DomainValidationTest.java @@ -4,11 +4,13 @@ package oracle.kubernetes.weblogic.domain.model; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.List; import com.meterware.simplestub.Memento; import io.kubernetes.client.openapi.models.V1Container; +import io.kubernetes.client.openapi.models.V1ContainerPort; import io.kubernetes.client.openapi.models.V1LocalObjectReference; import oracle.kubernetes.operator.TuningParameters; import oracle.kubernetes.operator.helpers.KubernetesTestSupport; @@ -50,6 +52,7 @@ class DomainValidationTest extends DomainValidationBaseTest { private static final String BAD_MOUNT_PATH_3 = "$()DOMAIN_HOME/servers/SERVER_NAME"; public static final String TEST_VOLUME_NAME = "test"; public static final String WRONG_VOLUME_NAME = "BadVolume"; + public static final String LONG_CONTAINER_PORT_NAME = "long-container-port-name"; private final Domain domain = createTestDomain(); private final KubernetesTestSupport testSupport = new KubernetesTestSupport(); @@ -530,6 +533,41 @@ void whenReservedContainerNameUsedForManagedServer_reportError() { "is reserved", "operator"))); } + @Test + void whenContainerPortNameExceedsMaxLength_ForAdminServerContainer_reportError() { + configureDomain(domain) + .withContainer(new V1Container().name("Test") + .ports(Arrays.asList(new V1ContainerPort().name(LONG_CONTAINER_PORT_NAME)))); + + assertThat(domain.getValidationFailures(resourceLookup), contains(stringContainsInOrder( + "Container port name ", LONG_CONTAINER_PORT_NAME, "domainUID", UID, "adminServer", "Test", + "exceeds maximum allowed length '15'"))); + } + + @Test + void whenContainerPortNameExceedsMaxLength_ForClusteredServerContainer_reportError() { + configureDomain(domain) + .configureCluster("cluster-1") + .withContainer(new V1Container().name("Test") + .ports(Arrays.asList(new V1ContainerPort().name(LONG_CONTAINER_PORT_NAME)))); + + assertThat(domain.getValidationFailures(resourceLookup), contains(stringContainsInOrder( + "Container port name ", LONG_CONTAINER_PORT_NAME, "domainUID", UID, "cluster-1", "Test", + "exceeds maximum allowed length '15'"))); + } + + @Test + void whenContainerPortNameExceedsMaxLength_ForManagedServerContainer_reportError() { + configureDomain(domain) + .configureServer("managed-server1") + .withContainer(new V1Container().name("Test") + .ports(Arrays.asList(new V1ContainerPort().name(LONG_CONTAINER_PORT_NAME)))); + + assertThat(domain.getValidationFailures(resourceLookup), contains(stringContainsInOrder( + "Container port name ", LONG_CONTAINER_PORT_NAME, "domainUID", UID, "managed-server1", "Test", + "exceeds maximum allowed length '15'"))); + } + @Test void whenWebLogicCredentialsSecretNameNotFound_reportError() { resourceLookup.undefineResource(SECRET_NAME, KubernetesResourceType.Secret, NS); From da34f213686b39a362d67bf40622d3f3ce9fad2c Mon Sep 17 00:00:00 2001 From: Anil Kedia Date: Wed, 22 Sep 2021 15:58:51 +0000 Subject: [PATCH 2/4] Minor changes. --- .../operator/helpers/LegalNames.java | 2 +- .../operator/helpers/PodStepContext.java | 18 ++++++++++++------ .../weblogic/domain/model/Domain.java | 6 ++---- .../domain/model/DomainValidationMessages.java | 7 +++++-- .../operator/helpers/PodHelperTestBase.java | 15 +++++---------- 5 files changed, 25 insertions(+), 23 deletions(-) diff --git a/operator/src/main/java/oracle/kubernetes/operator/helpers/LegalNames.java b/operator/src/main/java/oracle/kubernetes/operator/helpers/LegalNames.java index 55beb539fba..d9259a5e85a 100644 --- a/operator/src/main/java/oracle/kubernetes/operator/helpers/LegalNames.java +++ b/operator/src/main/java/oracle/kubernetes/operator/helpers/LegalNames.java @@ -55,7 +55,7 @@ public class LegalNames { public static final int LEGAL_DNS_LABEL_NAME_MAX_LENGTH = 63; // The maximum length of a container port name - public static final int LEGAL_CONTAINER_PORT_MAX_LENGTH = 15; + public static final int LEGAL_CONTAINER_PORT_NAME_MAX_LENGTH = 15; private static final String DNS_NAME_REGEXP = "[a-z0-9]([-a-z0-9]*[a-z0-9])?"; private static final Pattern DNS_NAME_PATTERN = Pattern.compile(DNS_NAME_REGEXP); diff --git a/operator/src/main/java/oracle/kubernetes/operator/helpers/PodStepContext.java b/operator/src/main/java/oracle/kubernetes/operator/helpers/PodStepContext.java index 48e85456870..f4a58a51b2b 100644 --- a/operator/src/main/java/oracle/kubernetes/operator/helpers/PodStepContext.java +++ b/operator/src/main/java/oracle/kubernetes/operator/helpers/PodStepContext.java @@ -73,6 +73,7 @@ import oracle.kubernetes.weblogic.domain.model.ServerSpec; import oracle.kubernetes.weblogic.domain.model.Shutdown; import org.apache.commons.lang3.builder.EqualsBuilder; +import org.jetbrains.annotations.NotNull; import static oracle.kubernetes.operator.EventConstants.ROLL_REASON_DOMAIN_RESOURCE_CHANGED; import static oracle.kubernetes.operator.EventConstants.ROLL_REASON_WEBLOGIC_CONFIGURATION_CHANGED; @@ -313,23 +314,28 @@ private void addContainerPort(List ports, String name, private String createContainerPortName(List ports, String name) { //Container port names can be a maximum of 15 characters in length - if (name.length() > LegalNames.LEGAL_CONTAINER_PORT_MAX_LENGTH) { - // Extract the first 12 characters to use since there is a 15 character - // limit to the container port name - String cpName = name.substring(0, 12); + if (name.length() > LegalNames.LEGAL_CONTAINER_PORT_NAME_MAX_LENGTH) { + String portNamePrefix = getPortNamePrefix(name); // Find ports with the name having the same first 12 characters List containerPortsWithSamePrefix = ports.stream().filter(port -> - port.getName().substring(0, 12).equals(cpName)).collect(Collectors.toList()); + portNamePrefix.equals(getPortNamePrefix(port.getName()))).collect(Collectors.toList()); int index = containerPortsWithSamePrefix.size() + 1; String indexStr = String.valueOf(index); + // zero fill to the left for single digit index (e.g. 01) if (index < 10) { indexStr = "0" + index; } - name = cpName + "-" + indexStr; + name = getPortNamePrefix(name) + "-" + indexStr; } return name; } + @NotNull + private String getPortNamePrefix(String name) { + // Use first 12 characters of port name as prefix due to 15 character port name limit + return name.substring(0, 12); + } + Integer getListenPort() { return Optional.ofNullable(scan).map(WlsServerConfig::getListenPort).orElse(null); } diff --git a/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/Domain.java b/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/Domain.java index 157a83d0e2c..37b35858031 100644 --- a/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/Domain.java +++ b/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/Domain.java @@ -1139,13 +1139,11 @@ private void areContainerPortNamesValid(V1Container container, String prefix) { } private void checkPortNameLength(V1ContainerPort port, String name, String prefix) { - int limit = LegalNames.LEGAL_CONTAINER_PORT_MAX_LENGTH; - if (port.getName().length() > limit) { + if (port.getName().length() > LegalNames.LEGAL_CONTAINER_PORT_NAME_MAX_LENGTH) { failures.add(DomainValidationMessages.exceedMaxContainerPortName( getDomainUid(), prefix + "." + name, - port.getName(), - limit)); + port.getName())); } } diff --git a/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/DomainValidationMessages.java b/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/DomainValidationMessages.java index 551faeeb7e3..9c5bb1d58ce 100644 --- a/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/DomainValidationMessages.java +++ b/operator/src/main/java/oracle/kubernetes/weblogic/domain/model/DomainValidationMessages.java @@ -15,6 +15,8 @@ import oracle.kubernetes.operator.logging.MessageKeys; import oracle.kubernetes.utils.OperatorUtils; +import static oracle.kubernetes.operator.helpers.LegalNames.LEGAL_CONTAINER_PORT_NAME_MAX_LENGTH; + class DomainValidationMessages { /** @@ -175,8 +177,9 @@ public static String reservedContainerName(String name, String prefix) { return getMessage(MessageKeys.RESERVED_CONTAINER_NAME, name, prefix); } - public static String exceedMaxContainerPortName(String domainUid, String containerName, String portName, int limit) { - return getMessage(MessageKeys.ILLEGAL_CONTAINER_PORT_NAME_LENGTH, domainUid, containerName, portName, limit); + public static String exceedMaxContainerPortName(String domainUid, String containerName, String portName) { + return getMessage(MessageKeys.ILLEGAL_CONTAINER_PORT_NAME_LENGTH, domainUid, containerName, portName, + LEGAL_CONTAINER_PORT_NAME_MAX_LENGTH); } } diff --git a/operator/src/test/java/oracle/kubernetes/operator/helpers/PodHelperTestBase.java b/operator/src/test/java/oracle/kubernetes/operator/helpers/PodHelperTestBase.java index 9075f07c69f..d816da5898d 100644 --- a/operator/src/test/java/oracle/kubernetes/operator/helpers/PodHelperTestBase.java +++ b/operator/src/test/java/oracle/kubernetes/operator/helpers/PodHelperTestBase.java @@ -161,6 +161,7 @@ import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.hasEntry; import static org.hamcrest.Matchers.hasItem; +import static org.hamcrest.Matchers.hasItems; import static org.hamcrest.Matchers.hasKey; import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.is; @@ -403,11 +404,8 @@ void whenPodCreatedWithMultipleNapsWithNamesExceedingMaxPortNameLength_podContai getServerTopology().addNetworkAccessPoint(new NetworkAccessPoint(LONG_CHANNEL_NAME + "11", "admin", 8001, 8001)); assertThat( getContainerPorts(), - hasItem(createContainerPort(TRUNCATED_PORT_NAME_PREFIX + "-01"))); - - assertThat( - getContainerPorts(), - hasItem(createContainerPort(TRUNCATED_PORT_NAME_PREFIX + "-02"))); + hasItems(createContainerPort(TRUNCATED_PORT_NAME_PREFIX + "-01"), + createContainerPort(TRUNCATED_PORT_NAME_PREFIX + "-02"))); } @Test @@ -416,11 +414,8 @@ void whenPodCreatedWithMultipleNapsSomeWithNamesExceedingMaxPortNameLength_podCo getServerTopology().addNetworkAccessPoint(new NetworkAccessPoint("My_Channel_Name", "admin", 8001, 8001)); assertThat( getContainerPorts(), - hasItem(createContainerPort(TRUNCATED_PORT_NAME_PREFIX + "-01"))); - - assertThat( - getContainerPorts(), - hasItem(createContainerPort("my-channel-name"))); + hasItems(createContainerPort(TRUNCATED_PORT_NAME_PREFIX + "-01"), + createContainerPort("my-channel-name"))); } protected DomainConfigurator defineExporterConfiguration() { From a3cae56422494ca397075585c50926d49ba07d51 Mon Sep 17 00:00:00 2001 From: Anil Kedia Date: Wed, 22 Sep 2021 16:17:22 +0000 Subject: [PATCH 3/4] Use existing portNamePrefix variable. --- .../java/oracle/kubernetes/operator/helpers/PodStepContext.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/operator/src/main/java/oracle/kubernetes/operator/helpers/PodStepContext.java b/operator/src/main/java/oracle/kubernetes/operator/helpers/PodStepContext.java index f4a58a51b2b..d8fb0546ced 100644 --- a/operator/src/main/java/oracle/kubernetes/operator/helpers/PodStepContext.java +++ b/operator/src/main/java/oracle/kubernetes/operator/helpers/PodStepContext.java @@ -325,7 +325,7 @@ private String createContainerPortName(List ports, String name) if (index < 10) { indexStr = "0" + index; } - name = getPortNamePrefix(name) + "-" + indexStr; + name = portNamePrefix + "-" + indexStr; } return name; } From f9d576a09e5665ee4167158da5a415aaf6b7208f Mon Sep 17 00:00:00 2001 From: Anil Kedia Date: Thu, 23 Sep 2021 13:27:42 +0000 Subject: [PATCH 4/4] Added validation error message for illegal channel name length as per Ryan's PR review comment. --- .../oracle/kubernetes/operator/helpers/PodStepContext.java | 7 ++++++- .../oracle/kubernetes/operator/logging/MessageKeys.java | 2 +- operator/src/main/resources/Operator.properties | 2 ++ 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/operator/src/main/java/oracle/kubernetes/operator/helpers/PodStepContext.java b/operator/src/main/java/oracle/kubernetes/operator/helpers/PodStepContext.java index d8fb0546ced..0899a02db57 100644 --- a/operator/src/main/java/oracle/kubernetes/operator/helpers/PodStepContext.java +++ b/operator/src/main/java/oracle/kubernetes/operator/helpers/PodStepContext.java @@ -92,6 +92,7 @@ import static oracle.kubernetes.operator.helpers.CompatibilityCheck.CompatibilityScope.UNKNOWN; import static oracle.kubernetes.operator.helpers.EventHelper.EventItem.DOMAIN_ROLL_STARTING; import static oracle.kubernetes.operator.helpers.EventHelper.EventItem.POD_CYCLE_STARTING; +import static oracle.kubernetes.operator.helpers.LegalNames.LEGAL_CONTAINER_PORT_NAME_MAX_LENGTH; public abstract class PodStepContext extends BasePodStepContext { @@ -314,7 +315,7 @@ private void addContainerPort(List ports, String name, private String createContainerPortName(List ports, String name) { //Container port names can be a maximum of 15 characters in length - if (name.length() > LegalNames.LEGAL_CONTAINER_PORT_NAME_MAX_LENGTH) { + if (name.length() > LEGAL_CONTAINER_PORT_NAME_MAX_LENGTH) { String portNamePrefix = getPortNamePrefix(name); // Find ports with the name having the same first 12 characters List containerPortsWithSamePrefix = ports.stream().filter(port -> @@ -324,6 +325,10 @@ private String createContainerPortName(List ports, String name) // zero fill to the left for single digit index (e.g. 01) if (index < 10) { indexStr = "0" + index; + } else if (index >= 100) { + LOGGER.severe(MessageKeys.ILLEGAL_NETWORK_CHANNEL_NAME_LENGTH, getDomainUid(), getServerName(), + name, LEGAL_CONTAINER_PORT_NAME_MAX_LENGTH); + return name; } name = portNamePrefix + "-" + indexStr; } diff --git a/operator/src/main/java/oracle/kubernetes/operator/logging/MessageKeys.java b/operator/src/main/java/oracle/kubernetes/operator/logging/MessageKeys.java index 05a38ca9a68..7c04955a76e 100644 --- a/operator/src/main/java/oracle/kubernetes/operator/logging/MessageKeys.java +++ b/operator/src/main/java/oracle/kubernetes/operator/logging/MessageKeys.java @@ -144,7 +144,6 @@ public class MessageKeys { public static final String LOG_WAITING_COUNT = "WLSKO-0193"; public static final String INTERNAL_IDENTITY_INITIALIZATION_FAILED = "WLSKO-0194"; - // domain status messages public static final String DUPLICATE_SERVER_NAME_FOUND = "WLSDO-0001"; public static final String DUPLICATE_CLUSTER_NAME_FOUND = "WLSDO-0002"; @@ -177,6 +176,7 @@ public class MessageKeys { public static final String INVALID_LIVENESS_PROBE_SUCCESS_THRESHOLD_VALUE = "WLSDO-0029"; public static final String RESERVED_CONTAINER_NAME = "WLSDO-0030"; public static final String ILLEGAL_CONTAINER_PORT_NAME_LENGTH = "WLSDO-0031"; + public static final String ILLEGAL_NETWORK_CHANNEL_NAME_LENGTH = "WLSDO-0032"; private MessageKeys() { } diff --git a/operator/src/main/resources/Operator.properties b/operator/src/main/resources/Operator.properties index 37e0bc972a6..d0a46ef3fb3 100644 --- a/operator/src/main/resources/Operator.properties +++ b/operator/src/main/resources/Operator.properties @@ -185,6 +185,8 @@ WLSDO-0028=The Monitoring Exporter port ''{0}'' specified by ''spec.monitoringEx WLSDO-0029=Invalid value ''{0}'' for the liveness probe success threshold under ''{1}''. The liveness probe successThreshold value must be 1. WLSDO-0030=The container name ''{0}'' specified under ''{1}'' is reserved for use by the operator. WLSDO-0031=Container port name ''{2}'' for domain with domainUID ''{0}'' and container name ''{1}'' exceeds maximum allowed length ''{3}''. +WLSDO-0032=Network channel name ''{2}'' for domain with domainUID ''{0}'' and server with \ + name ''{1}'' exceeds maximum allowed length ''{3}''. Please specify a shorter channel name. oneEnvVar=variable multipleEnvVars=variables