Skip to content

Commit e646b03

Browse files
sankarpnrjeberhard
authored andcommitted
changes to ItProductionSecureMode class to run in podman
1 parent 5a1ea8e commit e646b03

File tree

5 files changed

+200
-68
lines changed

5 files changed

+200
-68
lines changed

integration-tests/src/test/java/oracle/weblogic/kubernetes/ItProductionSecureMode.java

Lines changed: 85 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33

44
package oracle.weblogic.kubernetes;
55

6+
import java.io.IOException;
7+
import java.nio.charset.StandardCharsets;
68
import java.nio.file.Files;
79
import java.nio.file.Path;
810
import java.nio.file.Paths;
@@ -23,10 +25,13 @@
2325
import oracle.weblogic.domain.Model;
2426
import oracle.weblogic.domain.OnlineUpdate;
2527
import oracle.weblogic.domain.ServerPod;
28+
import oracle.weblogic.kubernetes.actions.ActionConstants;
2629
import oracle.weblogic.kubernetes.annotations.IntegrationTest;
2730
import oracle.weblogic.kubernetes.annotations.Namespaces;
2831
import oracle.weblogic.kubernetes.logging.LoggingFacade;
32+
import oracle.weblogic.kubernetes.utils.ExecCommand;
2933
import oracle.weblogic.kubernetes.utils.ExecResult;
34+
import org.junit.jupiter.api.AfterAll;
3035
import org.junit.jupiter.api.BeforeAll;
3136
import org.junit.jupiter.api.BeforeEach;
3237
import org.junit.jupiter.api.DisplayName;
@@ -38,14 +43,14 @@
3843
import static oracle.weblogic.kubernetes.TestConstants.DOMAIN_API_VERSION;
3944
import static oracle.weblogic.kubernetes.TestConstants.DOMAIN_VERSION;
4045
import static oracle.weblogic.kubernetes.TestConstants.IMAGE_PULL_POLICY;
46+
import static oracle.weblogic.kubernetes.TestConstants.KUBERNETES_CLI;
4147
import static oracle.weblogic.kubernetes.TestConstants.MANAGED_SERVER_NAME_BASE;
4248
import static oracle.weblogic.kubernetes.TestConstants.MII_BASIC_APP_DEPLOYMENT_NAME;
4349
import static oracle.weblogic.kubernetes.TestConstants.MII_BASIC_IMAGE_NAME;
4450
import static oracle.weblogic.kubernetes.TestConstants.MII_BASIC_IMAGE_TAG;
4551
import static oracle.weblogic.kubernetes.TestConstants.OKE_CLUSTER;
4652
import static oracle.weblogic.kubernetes.TestConstants.SSL_PROPERTIES;
4753
import static oracle.weblogic.kubernetes.TestConstants.TEST_IMAGES_REPO_SECRET_NAME;
48-
import static oracle.weblogic.kubernetes.TestConstants.WEBLOGIC_SLIM;
4954
import static oracle.weblogic.kubernetes.actions.ActionConstants.MODEL_DIR;
5055
import static oracle.weblogic.kubernetes.actions.ActionConstants.WORK_DIR;
5156
import static oracle.weblogic.kubernetes.actions.TestActions.createDomainCustomResource;
@@ -187,6 +192,25 @@ public static void initAll(@Namespaces(2) List<String> namespaces) {
187192
domainNamespace);
188193
}
189194

195+
@AfterAll
196+
public static void cleanup() {
197+
Path dstFile = Paths.get(TestConstants.RESULTS_ROOT, "traefik/traefik-ingress-rules-tcp.yaml");
198+
assertDoesNotThrow(() -> {
199+
String command = KUBERNETES_CLI + " delete -f " + dstFile;
200+
logger.info("Running {0}", command);
201+
ExecResult result;
202+
try {
203+
result = ExecCommand.exec(command, true);
204+
String response = result.stdout().trim();
205+
logger.info("exitCode: {0}, \nstdout: {1}, \nstderr: {2}",
206+
result.exitValue(), response, result.stderr());
207+
assertEquals(0, result.exitValue(), "Command didn't succeed");
208+
} catch (IOException | InterruptedException ex) {
209+
logger.severe(ex.getMessage());
210+
}
211+
});
212+
}
213+
190214
/**
191215
* Verify all server pods are running.
192216
* Verify all k8s services for all servers are created.
@@ -251,49 +275,36 @@ void testVerifyProductionSecureMode() {
251275
logger.info("The hostAndPort is {0}", hostAndPort);
252276

253277
String resourcePath = "/weblogic/ready";
254-
if (!WEBLOGIC_SLIM) {
255-
if (OKE_CLUSTER) {
256-
ExecResult result = exeAppInServerPod(domainNamespace, adminServerPodName,7002, resourcePath);
257-
logger.info("result in OKE_CLUSTER is {0}", result.toString());
258-
assertEquals(0, result.exitValue(), "Failed to access WebLogic readyapp");
259-
} else {
260-
String curlCmd = "curl -g -sk --show-error --noproxy '*' "
261-
+ " https://" + hostAndPort
262-
+ "/weblogic/ready --write-out %{http_code} "
263-
+ " -o /dev/null";
264-
logger.info("Executing default-admin nodeport curl command {0}", curlCmd);
265-
assertTrue(callWebAppAndWaitTillReady(curlCmd, 10));
266-
}
267-
logger.info("WebLogic readyapp is accessible thru default-admin service");
268-
269-
String localhost = "localhost";
270-
String forwardPort = startPortForwardProcess(localhost, domainNamespace, domainUid, 9002);
271-
assertNotNull(forwardPort, "port-forward fails to assign local port");
272-
logger.info("Forwarded admin-port is {0}", forwardPort);
273-
String curlCmd = "curl -sk --show-error --noproxy '*' "
274-
+ " https://" + localhost + ":" + forwardPort
275-
+ "/weblogic/ready --write-out %{http_code} "
276-
+ " -o /dev/null";
277-
logger.info("Executing default-admin port-fwd curl command {0}", curlCmd);
278-
assertTrue(callWebAppAndWaitTillReady(curlCmd, 10));
279-
logger.info("WebLogic readyapp is accessible thru admin port forwarding");
280-
281-
// When port-forwarding is happening on admin-port, port-forwarding will
282-
// not work for SSL port i.e. 7002
283-
forwardPort = startPortForwardProcess(localhost, domainNamespace, domainUid, 7002);
284-
assertNotNull(forwardPort, "port-forward fails to assign local port");
285-
logger.info("Forwarded ssl port is {0}", forwardPort);
286-
curlCmd = "curl -g -sk --show-error --noproxy '*' "
287-
+ " https://" + localhost + ":" + forwardPort
288-
+ "/weblogic/ready --write-out %{http_code} "
289-
+ " -o /dev/null";
290-
logger.info("Executing default-admin port-fwd curl command {0}", curlCmd);
291-
assertFalse(callWebAppAndWaitTillReady(curlCmd, 10));
292-
logger.info("WebLogic readyapp should not be accessible thru ssl port forwarding");
293-
stopPortForwardProcess(domainNamespace);
294-
} else {
295-
logger.info("Skipping WebLogic reeadyapp check in WebLogic slim image");
296-
}
278+
ExecResult result = exeAppInServerPod(domainNamespace, adminServerPodName, 7002, resourcePath);
279+
logger.info("result in OKE_CLUSTER is {0}", result.toString());
280+
assertEquals(0, result.exitValue(), "Failed to access WebLogic readyapp");
281+
logger.info("WebLogic readyapp is accessible thru default-admin service");
282+
283+
String localhost = "localhost";
284+
String forwardPort = startPortForwardProcess(localhost, domainNamespace, domainUid, 9002);
285+
assertNotNull(forwardPort, "port-forward fails to assign local port");
286+
logger.info("Forwarded admin-port is {0}", forwardPort);
287+
String curlCmd = "curl -sk --show-error --noproxy '*' "
288+
+ " https://" + localhost + ":" + forwardPort
289+
+ "/weblogic/ready --write-out %{http_code} "
290+
+ " -o /dev/null";
291+
logger.info("Executing default-admin port-fwd curl command {0}", curlCmd);
292+
assertTrue(callWebAppAndWaitTillReady(curlCmd, 10));
293+
logger.info("WebLogic readyapp is accessible thru admin port forwarding");
294+
295+
// When port-forwarding is happening on admin-port, port-forwarding will
296+
// not work for SSL port i.e. 7002
297+
forwardPort = startPortForwardProcess(localhost, domainNamespace, domainUid, 7002);
298+
assertNotNull(forwardPort, "port-forward fails to assign local port");
299+
logger.info("Forwarded ssl port is {0}", forwardPort);
300+
curlCmd = "curl -g -sk --show-error --noproxy '*' "
301+
+ " https://" + localhost + ":" + forwardPort
302+
+ "/weblogic/ready --write-out %{http_code} "
303+
+ " -o /dev/null";
304+
logger.info("Executing default-admin port-fwd curl command {0}", curlCmd);
305+
assertFalse(callWebAppAndWaitTillReady(curlCmd, 10));
306+
logger.info("WebLogic readyapp should not be accessible thru ssl port forwarding");
307+
stopPortForwardProcess(domainNamespace);
297308

298309
int nodePort = getServiceNodePort(
299310
domainNamespace, getExternalServicePodName(adminServerPodName), "default");
@@ -337,6 +348,11 @@ void testMiiDynamicChangeWithSSLEnabled() {
337348
String introspectVersion = patchDomainResourceWithNewIntrospectVersion(domainUid, domainNamespace);
338349

339350
verifyIntrospectorRuns(domainUid, domainNamespace);
351+
String sslChannelName = "default-admin";
352+
if (TestConstants.KIND_CLUSTER
353+
&& !TestConstants.WLSIMG_BUILDER.equals(TestConstants.WLSIMG_BUILDER_DEFAULT)) {
354+
createTraefikIngressRoutingRules(domainNamespace);
355+
}
340356

341357
String resourcePath = "/management/weblogic/latest/domainRuntime/serverRuntimes/"
342358
+ MANAGED_SERVER_NAME_BASE + "1"
@@ -356,7 +372,7 @@ void testMiiDynamicChangeWithSSLEnabled() {
356372
+ MANAGED_SERVER_NAME_BASE + "1"
357373
+ "/applicationRuntimes/" + MII_BASIC_APP_DEPLOYMENT_NAME
358374
+ "/workManagerRuntimes/newWM",
359-
"200", true, "default-admin"),
375+
"200", true, sslChannelName),
360376
logger, "work manager configuration to be updated.");
361377
}
362378

@@ -423,4 +439,28 @@ private static void createDomainResource(
423439
assertTrue(domCreated, String.format("Create domain custom resource failed with ApiException "
424440
+ "for %s in namespace %s", domainUid, domNamespace));
425441
}
442+
443+
private static void createTraefikIngressRoutingRules(String domainNamespace) {
444+
logger.info("Creating ingress rules for domain traffic routing");
445+
Path srcFile = Paths.get(ActionConstants.RESOURCE_DIR, "traefik/traefik-ingress-rules-tcp.yaml");
446+
Path dstFile = Paths.get(TestConstants.RESULTS_ROOT, "traefik/traefik-ingress-rules-tcp.yaml");
447+
assertDoesNotThrow(() -> {
448+
Files.deleteIfExists(dstFile);
449+
Files.createDirectories(dstFile.getParent());
450+
Files.write(dstFile, Files.readString(srcFile).replaceAll("@NS@", domainNamespace)
451+
.getBytes(StandardCharsets.UTF_8));
452+
});
453+
String command = KUBERNETES_CLI + " create -f " + dstFile;
454+
logger.info("Running {0}", command);
455+
ExecResult result;
456+
try {
457+
result = ExecCommand.exec(command, true);
458+
String response = result.stdout().trim();
459+
logger.info("exitCode: {0}, \nstdout: {1}, \nstderr: {2}",
460+
result.exitValue(), response, result.stderr());
461+
assertEquals(0, result.exitValue(), "Command didn't succeed");
462+
} catch (IOException | InterruptedException ex) {
463+
logger.severe(ex.getMessage());
464+
}
465+
}
426466
}

integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/CommonMiiTestUtils.java

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
package oracle.weblogic.kubernetes.utils;
55

66
import java.io.IOException;
7+
import java.net.InetAddress;
78
import java.net.http.HttpResponse;
89
import java.time.OffsetDateTime;
910
import java.util.ArrayList;
@@ -18,6 +19,7 @@
1819

1920
import io.kubernetes.client.custom.Quantity;
2021
import io.kubernetes.client.custom.V1Patch;
22+
import io.kubernetes.client.openapi.ApiException;
2123
import io.kubernetes.client.openapi.models.V1ConfigMap;
2224
import io.kubernetes.client.openapi.models.V1EnvVar;
2325
import io.kubernetes.client.openapi.models.V1Job;
@@ -70,6 +72,7 @@
7072
import static oracle.weblogic.kubernetes.TestConstants.OKD;
7173
import static oracle.weblogic.kubernetes.TestConstants.OKE_CLUSTER_PRIVATEIP;
7274
import static oracle.weblogic.kubernetes.TestConstants.TEST_IMAGES_REPO_SECRET_NAME;
75+
import static oracle.weblogic.kubernetes.TestConstants.TRAEFIK_INGRESS_HTTPS_HOSTPORT;
7376
import static oracle.weblogic.kubernetes.TestConstants.TRAEFIK_INGRESS_HTTP_HOSTPORT;
7477
import static oracle.weblogic.kubernetes.TestConstants.WEBLOGIC_IMAGE_NAME;
7578
import static oracle.weblogic.kubernetes.TestConstants.WEBLOGIC_IMAGE_TAG;
@@ -96,6 +99,7 @@
9699
import static oracle.weblogic.kubernetes.utils.CommonTestUtils.checkPodReadyAndServiceExists;
97100
import static oracle.weblogic.kubernetes.utils.CommonTestUtils.checkServiceExists;
98101
import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createIngressHostRouting;
102+
import static oracle.weblogic.kubernetes.utils.CommonTestUtils.formatIPv6Host;
99103
import static oracle.weblogic.kubernetes.utils.CommonTestUtils.testUntil;
100104
import static oracle.weblogic.kubernetes.utils.CommonTestUtils.verifyCredentials;
101105
import static oracle.weblogic.kubernetes.utils.ConfigMapUtils.createConfigMapAndVerify;
@@ -1245,15 +1249,16 @@ public static boolean checkWeblogicMBean(String adminSvcExtHost,
12451249
}
12461250

12471251
String host = K8S_NODEPORT_HOST;
1248-
if (host.contains(":")) {
1249-
host = "[" + host + "]";
1250-
}
1252+
formatIPv6Host(host);
1253+
12511254
String hostAndPort = (OKD) ? adminSvcExtHost : host + ":" + adminServiceNodePort;
12521255
logger.info("hostAndPort = {0} ", hostAndPort);
12531256

12541257
if (TestConstants.KIND_CLUSTER
12551258
&& !TestConstants.WLSIMG_BUILDER.equals(TestConstants.WLSIMG_BUILDER_DEFAULT)) {
1256-
int port = getServicePort(domainNamespace, adminServerPodName, "internal-t3");
1259+
String channel = "internal-t3";
1260+
int port = getServicePort(domainNamespace, getExternalServicePodName(adminServerPodName),
1261+
sslChannelName.isEmpty() ? channel : sslChannelName);
12571262
String domainName = adminServerPodName.split("-" + ADMIN_SERVER_NAME_BASE)[0];
12581263
String serviceName = ADMIN_SERVER_NAME_BASE;
12591264
String ingressName = domainNamespace + "-" + domainName + "-" + serviceName + "-" + port;
@@ -1262,19 +1267,21 @@ public static boolean checkWeblogicMBean(String adminSvcExtHost,
12621267
try {
12631268
List<String> ingresses = TestActions.listIngresses(domainNamespace);
12641269
ingressFound = ingresses.stream().filter(ingress -> ingress.equals(ingressName)).findAny();
1265-
if (ingressFound.isEmpty()) {
1270+
if (ingressFound.isEmpty() && sslChannelName.isEmpty()) {
12661271
createIngressHostRouting(domainNamespace, domainName, serviceName, port);
12671272
} else {
1268-
logger.info("Ingress {0} found, skipping ingress resource creation...", ingressFound);
1273+
logger.info("Ingress {0} found or secure channel , skipping ingress resource creation...", ingressFound);
12691274
}
1270-
} catch (Exception ex) {
1275+
} catch (ApiException ex) {
12711276
logger.severe(ex.getMessage());
12721277
}
1273-
hostAndPort = "localhost:" + TRAEFIK_INGRESS_HTTP_HOSTPORT;
1278+
hostAndPort = assertDoesNotThrow(()
1279+
-> formatIPv6Host(InetAddress.getLocalHost().getHostAddress()) + ":"
1280+
+ (isSecureMode ? TRAEFIK_INGRESS_HTTPS_HOSTPORT : TRAEFIK_INGRESS_HTTP_HOSTPORT));
12741281
Map<String, String> headers = new HashMap<>();
12751282
headers.put("host", hostHeader);
12761283
headers.put("Authorization", ADMIN_USERNAME_DEFAULT + ":" + ADMIN_PASSWORD_DEFAULT);
1277-
String url = "http://" + hostAndPort + resourcePath;
1284+
String url = (isSecureMode ? "https" : "http") + "://" + hostAndPort + resourcePath;
12781285
HttpResponse<String> response;
12791286
try {
12801287
response = OracleHttpClient.get(url, headers, true);

integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/CommonTestUtils.java

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import java.util.Date;
2424
import java.util.HashMap;
2525
import java.util.List;
26+
import java.util.Map;
2627
import java.util.Optional;
2728
import java.util.Properties;
2829
import java.util.Random;
@@ -37,6 +38,7 @@
3738
import io.kubernetes.client.openapi.models.V1IngressBackend;
3839
import io.kubernetes.client.openapi.models.V1IngressRule;
3940
import io.kubernetes.client.openapi.models.V1IngressServiceBackend;
41+
import io.kubernetes.client.openapi.models.V1IngressTLS;
4042
import io.kubernetes.client.openapi.models.V1ServiceBackendPort;
4143
import oracle.weblogic.domain.ClusterSpec;
4244
import oracle.weblogic.domain.DomainCondition;
@@ -2356,10 +2358,26 @@ public static Callable<Boolean> isAppInServerPodReady(String domainNamespace,
23562358
* @param domainUid domain resource name
23572359
* @param serviceName name of the service for which to create ingress routing
23582360
* @param port container port of the service
2359-
* @return hostheader
2361+
* @return hostheader host header
23602362
*/
23612363
public static String createIngressHostRouting(String domainNamespace, String domainUid,
23622364
String serviceName, int port) {
2365+
return createIngressHostRouting(domainNamespace, domainUid, serviceName, port, null, null, false);
2366+
}
2367+
2368+
/**
2369+
* Create ingress resource for a single service.
2370+
*
2371+
* @param domainNamespace namespace in which the service exists
2372+
* @param domainUid domain resource name
2373+
* @param serviceName name of the service for which to create ingress routing
2374+
* @param port container port of the service
2375+
* @param annoations ingress annotations
2376+
* @param tlsList list of tls secrets
2377+
* @return hostheader host header
2378+
*/
2379+
public static String createIngressHostRouting(String domainNamespace, String domainUid,
2380+
String serviceName, int port, Map<String, String> annoations, List<V1IngressTLS> tlsList, boolean isSecureMode) {
23632381
// create an ingress in domain namespace
23642382
// set the ingress rule host
23652383
String ingressHost = domainNamespace + "." + domainUid + "." + serviceName;
@@ -2383,17 +2401,18 @@ public static String createIngressHostRouting(String domainNamespace, String dom
23832401
ingressRules.add(ingressRule);
23842402

23852403
String ingressName = domainNamespace + "-" + domainUid + "-" + serviceName + "-" + port;
2386-
assertDoesNotThrow(() -> createIngress(ingressName, domainNamespace, null,
2387-
Files.readString(INGRESS_CLASS_FILE_NAME), ingressRules, null));
2404+
assertDoesNotThrow(() -> createIngress(ingressName, domainNamespace, annoations,
2405+
Files.readString(INGRESS_CLASS_FILE_NAME), ingressRules, tlsList));
23882406

23892407
// check the ingress was found in the domain namespace
23902408
assertThat(assertDoesNotThrow(() -> listIngresses(domainNamespace)))
23912409
.as(String.format("Test ingress %s was found in namespace %s", ingressName, domainNamespace))
23922410
.withFailMessage(String.format("Ingress %s was not found in namespace %s", ingressName, domainNamespace))
23932411
.contains(ingressName);
2394-
String curlCmd = "curl -g --silent --show-error --noproxy '*' -H 'host: " + ingressHost
2395-
+ "' http://localhost:" + TRAEFIK_INGRESS_HTTP_HOSTPORT
2396-
+ "/weblogic/ready --write-out %{http_code} -o /dev/null";
2412+
String curlCmd = assertDoesNotThrow(() -> "curl -g -k --silent --show-error --noproxy '*' -H 'host: "
2413+
+ ingressHost + "' " + (isSecureMode ? "https" : "http") + "://"
2414+
+ formatIPv6Host(InetAddress.getLocalHost().getHostAddress()) + ":" + +TRAEFIK_INGRESS_HTTP_HOSTPORT
2415+
+ "/weblogic/ready --write-out %{http_code} -o /dev/null");
23972416
getLogger().info("Executing curl command {0}", curlCmd);
23982417
assertTrue(callWebAppAndWaitTillReady(curlCmd, 60));
23992418

0 commit comments

Comments
 (0)