From d8d50108562e1567164a8165daf984a742ff20c4 Mon Sep 17 00:00:00 2001 From: Ryan Eberhard Date: Fri, 16 May 2025 10:30:35 -0400 Subject: [PATCH 01/20] Prepare for next development iteration --- common/pom.xml | 2 +- domain-upgrader/pom.xml | 2 +- integration-tests/pom.xml | 2 +- json-schema-generator/pom.xml | 2 +- kubernetes/pom.xml | 2 +- operator-build-maven-plugin/pom.xml | 2 +- operator/pom.xml | 2 +- pom.xml | 2 +- swagger-generator/pom.xml | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/common/pom.xml b/common/pom.xml index 66404b494b4..4ab3b5ab4bc 100644 --- a/common/pom.xml +++ b/common/pom.xml @@ -6,7 +6,7 @@ oracle.kubernetes operator-parent - 4.2.17 + 4.2.18-SNAPSHOT common diff --git a/domain-upgrader/pom.xml b/domain-upgrader/pom.xml index 58fdafadd7d..c9dfc1b41b1 100644 --- a/domain-upgrader/pom.xml +++ b/domain-upgrader/pom.xml @@ -7,7 +7,7 @@ oracle.kubernetes operator-parent - 4.2.17 + 4.2.18-SNAPSHOT domain-upgrader diff --git a/integration-tests/pom.xml b/integration-tests/pom.xml index fb6b22a23f8..3ac1c089277 100644 --- a/integration-tests/pom.xml +++ b/integration-tests/pom.xml @@ -7,7 +7,7 @@ oracle.kubernetes operator-parent - 4.2.17 + 4.2.18-SNAPSHOT integration-tests diff --git a/json-schema-generator/pom.xml b/json-schema-generator/pom.xml index 831491b42f3..7d14cb4e7e0 100644 --- a/json-schema-generator/pom.xml +++ b/json-schema-generator/pom.xml @@ -7,7 +7,7 @@ operator-parent oracle.kubernetes - 4.2.17 + 4.2.18-SNAPSHOT json-schema diff --git a/kubernetes/pom.xml b/kubernetes/pom.xml index 94de2887069..0a3fe1d4eac 100644 --- a/kubernetes/pom.xml +++ b/kubernetes/pom.xml @@ -9,7 +9,7 @@ oracle.kubernetes operator-parent - 4.2.17 + 4.2.18-SNAPSHOT installation-tests diff --git a/operator-build-maven-plugin/pom.xml b/operator-build-maven-plugin/pom.xml index 19c96e1d9a4..8d6d3aac24f 100644 --- a/operator-build-maven-plugin/pom.xml +++ b/operator-build-maven-plugin/pom.xml @@ -7,7 +7,7 @@ operator-parent oracle.kubernetes - 4.2.17 + 4.2.18-SNAPSHOT operator-build-maven-plugin diff --git a/operator/pom.xml b/operator/pom.xml index 95a0b8f62b9..fad505d9f79 100644 --- a/operator/pom.xml +++ b/operator/pom.xml @@ -7,7 +7,7 @@ oracle.kubernetes operator-parent - 4.2.17 + 4.2.18-SNAPSHOT weblogic-kubernetes-operator diff --git a/pom.xml b/pom.xml index 20213ce46c9..4b5922ec585 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ oracle.kubernetes operator-parent - 4.2.17 + 4.2.18-SNAPSHOT operator diff --git a/swagger-generator/pom.xml b/swagger-generator/pom.xml index ce6738573b0..1c93d8c5d2f 100644 --- a/swagger-generator/pom.xml +++ b/swagger-generator/pom.xml @@ -7,7 +7,7 @@ oracle.kubernetes operator-parent - 4.2.17 + 4.2.18-SNAPSHOT operator-swagger From 7b036b726603d546ebb2ace658376405c1780be9 Mon Sep 17 00:00:00 2001 From: Ryan Eberhard Date: Sun, 18 May 2025 11:01:17 -0400 Subject: [PATCH 02/20] Check for job status FailureTarget --- .../main/java/oracle/kubernetes/operator/JobWatcher.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/operator/src/main/java/oracle/kubernetes/operator/JobWatcher.java b/operator/src/main/java/oracle/kubernetes/operator/JobWatcher.java index 1c2bd7b1d87..92b62300eba 100644 --- a/operator/src/main/java/oracle/kubernetes/operator/JobWatcher.java +++ b/operator/src/main/java/oracle/kubernetes/operator/JobWatcher.java @@ -165,7 +165,8 @@ private static List getJobConditions(@Nonnull V1Job job) { } private static boolean isJobConditionFailed(V1JobCondition jobCondition) { - return "Failed".equals(getType(jobCondition)) && getStatus(jobCondition).equals("True"); + return ("FailureTarget".equals(getType(jobCondition)) || "Failed".equals(getType(jobCondition))) + && getStatus(jobCondition).equals("True"); } private static String getType(V1JobCondition jobCondition) { @@ -185,7 +186,8 @@ public static String getFailedReason(V1Job job) { V1JobStatus status = job.getStatus(); if (status != null && status.getConditions() != null) { for (V1JobCondition cond : status.getConditions()) { - if ("Failed".equals(cond.getType()) && "True".equals(cond.getStatus())) { + if (("FailureTarget".equals(cond.getType()) || "Failed".equals(cond.getType())) + && "True".equals(cond.getStatus())) { return cond.getReason(); } } From 597020c09f2751fef67055d9bee7d2a95e4139a5 Mon Sep 17 00:00:00 2001 From: maggie_he Date: Thu, 22 May 2025 19:23:44 +0000 Subject: [PATCH 03/20] Backport ItRunAsUser to release/4.2 --- .../weblogic/kubernetes/ItRunAsUser.java | 419 ++++++++++++++++++ .../weblogic/kubernetes/TestConstants.java | 2 + .../impl/primitive/WebLogicImageTool.java | 8 +- .../extensions/InitializationTasks.java | 2 + 4 files changed, 430 insertions(+), 1 deletion(-) create mode 100644 integration-tests/src/test/java/oracle/weblogic/kubernetes/ItRunAsUser.java diff --git a/integration-tests/src/test/java/oracle/weblogic/kubernetes/ItRunAsUser.java b/integration-tests/src/test/java/oracle/weblogic/kubernetes/ItRunAsUser.java new file mode 100644 index 00000000000..567340f9a7c --- /dev/null +++ b/integration-tests/src/test/java/oracle/weblogic/kubernetes/ItRunAsUser.java @@ -0,0 +1,419 @@ +// Copyright (c) 2025, Oracle and/or its affiliates. +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +package oracle.weblogic.kubernetes; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.Callable; + +import io.kubernetes.client.openapi.models.V1EnvVar; +import io.kubernetes.client.openapi.models.V1LocalObjectReference; +import io.kubernetes.client.openapi.models.V1ObjectMeta; +import io.kubernetes.client.openapi.models.V1PodSecurityContext; +import io.kubernetes.client.openapi.models.V1ResourceRequirements; +import oracle.weblogic.domain.Configuration; +import oracle.weblogic.domain.DomainResource; +import oracle.weblogic.domain.DomainSpec; +import oracle.weblogic.domain.Model; +import oracle.weblogic.domain.ServerPod; +import oracle.weblogic.kubernetes.actions.impl.primitive.Command; +import oracle.weblogic.kubernetes.actions.impl.primitive.CommandParams; +import oracle.weblogic.kubernetes.annotations.IntegrationTest; +import oracle.weblogic.kubernetes.annotations.Namespaces; +import oracle.weblogic.kubernetes.logging.LoggingFacade; +import org.awaitility.core.ConditionFactory; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.DisabledIfEnvironmentVariable; + +import static java.util.concurrent.TimeUnit.MINUTES; +import static java.util.concurrent.TimeUnit.SECONDS; +import static oracle.weblogic.kubernetes.TestConstants.ADMIN_PASSWORD_DEFAULT; +import static oracle.weblogic.kubernetes.TestConstants.ADMIN_SERVER_NAME_BASE; +import static oracle.weblogic.kubernetes.TestConstants.ADMIN_USERNAME_DEFAULT; +import static oracle.weblogic.kubernetes.TestConstants.BASE_IMAGES_REPO; +import static oracle.weblogic.kubernetes.TestConstants.BASE_IMAGES_REPO_PASSWORD; +import static oracle.weblogic.kubernetes.TestConstants.BASE_IMAGES_REPO_USERNAME; +import static oracle.weblogic.kubernetes.TestConstants.DOMAIN_API_VERSION; +import static oracle.weblogic.kubernetes.TestConstants.DOMAIN_IMAGES_PREFIX; +import static oracle.weblogic.kubernetes.TestConstants.DOMAIN_IMAGES_REPO; +import static oracle.weblogic.kubernetes.TestConstants.IMAGE_PULL_POLICY; +import static oracle.weblogic.kubernetes.TestConstants.KIND_REPO; +import static oracle.weblogic.kubernetes.TestConstants.MANAGED_SERVER_NAME_BASE; +import static oracle.weblogic.kubernetes.TestConstants.MII_BASIC_APP_NAME; +import static oracle.weblogic.kubernetes.TestConstants.MII_BASIC_IMAGE_DOMAINTYPE; +import static oracle.weblogic.kubernetes.TestConstants.MII_BASIC_IMAGE_TAG; +import static oracle.weblogic.kubernetes.TestConstants.MII_BASIC_WDT_MODEL_FILE; +import static oracle.weblogic.kubernetes.TestConstants.OKD; +import static oracle.weblogic.kubernetes.TestConstants.SKIP_BUILD_IMAGES_IF_EXISTS; +import static oracle.weblogic.kubernetes.TestConstants.TEST_IMAGES_REPO_SECRET_NAME; +import static oracle.weblogic.kubernetes.TestConstants.WDT_BASIC_IMAGE_DOMAINHOME; +import static oracle.weblogic.kubernetes.TestConstants.WDT_BASIC_IMAGE_TAG; +import static oracle.weblogic.kubernetes.TestConstants.WEBLOGIC_IMAGE_NAME; +import static oracle.weblogic.kubernetes.TestConstants.WEBLOGIC_IMAGE_WLSADM_TAG; +import static oracle.weblogic.kubernetes.TestConstants.WLSIMG_BUILDER; +import static oracle.weblogic.kubernetes.TestConstants.WLS_DOMAIN_TYPE; +import static oracle.weblogic.kubernetes.actions.ActionConstants.ARCHIVE_DIR; +import static oracle.weblogic.kubernetes.actions.ActionConstants.MODEL_DIR; +import static oracle.weblogic.kubernetes.actions.ActionConstants.WDT_VERSION; +import static oracle.weblogic.kubernetes.actions.ActionConstants.WIT_BUILD_DIR; +import static oracle.weblogic.kubernetes.actions.ActionConstants.WIT_JAVA_HOME; +import static oracle.weblogic.kubernetes.actions.TestActions.buildAppArchive; +import static oracle.weblogic.kubernetes.actions.TestActions.createImage; +import static oracle.weblogic.kubernetes.actions.TestActions.defaultAppParams; +import static oracle.weblogic.kubernetes.actions.TestActions.defaultWitParams; +import static oracle.weblogic.kubernetes.actions.TestActions.imagePush; +import static oracle.weblogic.kubernetes.actions.TestActions.imageRepoLogin; +import static oracle.weblogic.kubernetes.assertions.TestAssertions.doesImageExist; +import static oracle.weblogic.kubernetes.assertions.TestAssertions.imageExists; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.checkServiceExists; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.testUntil; +import static oracle.weblogic.kubernetes.utils.DomainUtils.createDomainAndVerify; +import static oracle.weblogic.kubernetes.utils.FileUtils.checkDirectory; +import static oracle.weblogic.kubernetes.utils.ImageUtils.createTestRepoSecret; +import static oracle.weblogic.kubernetes.utils.OperatorUtils.installAndVerifyOperator; +import static oracle.weblogic.kubernetes.utils.PodUtils.checkPodExists; +import static oracle.weblogic.kubernetes.utils.PodUtils.checkPodReady; +import static oracle.weblogic.kubernetes.utils.PodUtils.setPodAntiAffinity; +import static oracle.weblogic.kubernetes.utils.SecretUtils.createSecretWithUsernamePassword; +import static oracle.weblogic.kubernetes.utils.ThreadSafeLogger.getLogger; +import static org.awaitility.Awaitility.with; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** + * Create a custom 14.1.2.0 WebLogic base image with added new user, wlsadm:root (with uid 12345). + * 1. Create a file called additionalBuildCommands + * [initial-build-commands] + * RUN useradd -u 12345 wlsadm -g root + * RUN chown -R wlsadm:root /u01 + * + * [final-build-commands] + * USER wlsadm + * 2. Create the custom image based on the default base Weblogic image + * imagetool create \ + * --fromImage phx.ocir.io/devweblogic/test-images/weblogic:14.1.2.0-generic-jdk17-ol8 \ + * --tag phx.ocir.io/devweblogic/test-images/weblogic:14.1.2.0-with-wlsadm-jdk17-ol8 \ + * --type WLS \ + * --version 14.1.2.0 \ + * --additionalBuildCommands pathto/additionalBuildCommands \ + * --chown wlsadm:root + * + * Push this image to the ocir with tag: 14.1.2.0-with-wlsadm-jdk17-ol8-org + * Using this custom WebLogic base image to create a mii domain with new user, wlsadm:root + * Set runAsUser > 10000(12345) and verify mii domain is up and running + */ +@DisplayName("Verify using custom WebLogic base image with added user, wlsadm: root, wko supports runAsUser > 10000") +@IntegrationTest +@Tag("kind-sequential") +class ItRunAsUser { + + private static String opNamespace; + private static String domainNamespace = null; + + // domain constants + private static final String domainUid = "domain1"; + private static final int replicaCount = 1; + private static final String adminServerPodName = domainUid + "-" + ADMIN_SERVER_NAME_BASE; + private static final String managedServerPrefix = domainUid + "-" + MANAGED_SERVER_NAME_BASE; + private static LoggingFacade logger = null; + + ConditionFactory withVeryLongRetryPolicy + = with().pollDelay(0, SECONDS) + .and().with().pollInterval(10, SECONDS) + .atMost(30, MINUTES).await(); + + + /** + * Get namespaces for operator and WebLogic domain. + * + * @param namespaces list of namespaces created by the IntegrationTestWatcher by the + * JUnit engine parameter resolution mechanism + */ + @BeforeAll + static void initAll(@Namespaces(2) List namespaces) { + logger = getLogger(); + // get a unique operator namespace + logger.info("Getting a unique namespace for operator"); + assertNotNull(namespaces.get(0), "Namespace list is null"); + opNamespace = namespaces.get(0); + + // get a unique domain namespace + logger.info("Getting a unique namespace for WebLogic domain"); + assertNotNull(namespaces.get(1), "Namespace list is null"); + domainNamespace = namespaces.get(1); + + // install and verify operator + installAndVerifyOperator(opNamespace, domainNamespace); + + } + + /** + * Create a WLS mii domain with user, wlsadmin:root. + * Set runAsUser as 12345. + * Verify Pod is ready and service exists for both admin server and managed servers. + */ + @Test + @DisabledIfEnvironmentVariable(named = "OKD", matches = "true") + @DisplayName("Verify a mii domain with runAsUser as 12345 is up and running") + void testRunAsUserOver10k() { + + String miiImageWlsadmName = DOMAIN_IMAGES_PREFIX + "mii-image-wlsadm"; + String miiImageWlsadm = miiImageWlsadmName + ":" + MII_BASIC_IMAGE_TAG; + + // create mii Image for this test with user wlsadm: root + createMiiImage(miiImageWlsadmName, miiImageWlsadm); + + // create registry secret to pull the image from registry + // this secret is used only for non-kind cluster + logger.info("Creating registry secret in namespace {0}", domainNamespace); + createTestRepoSecret(domainNamespace); + + // create secret for admin credentials + logger.info("Creating secret for admin credentials"); + String adminSecretName = "weblogic-credentials"; + createSecretWithUsernamePassword(adminSecretName, domainNamespace, ADMIN_USERNAME_DEFAULT, ADMIN_PASSWORD_DEFAULT); + + // create encryption secret + logger.info("Creating encryption secret"); + String encryptionSecretName = "encryptionsecret"; + createSecretWithUsernamePassword(encryptionSecretName, domainNamespace, "weblogicenc", "weblogicenc"); + + ServerPod srvrPod = new ServerPod() + .addEnvItem(new V1EnvVar() + .name("JAVA_OPTIONS") + .value("-Dweblogic.StdoutDebugEnabled=false")) + .addEnvItem(new V1EnvVar() + .name("USER_MEM_ARGS") + .value("-Djava.security.egd=file:/dev/./urandom ")) + .resources(new V1ResourceRequirements() + .limits(new HashMap<>()) + .requests(new HashMap<>())); + + if (!OKD) { + V1PodSecurityContext podSecCtxt = new V1PodSecurityContext() + .runAsUser(12345L); + srvrPod.podSecurityContext(podSecCtxt); + + } + + // create the domain CR + DomainResource domain = new DomainResource() + .apiVersion(DOMAIN_API_VERSION) + .kind("Domain") + .metadata(new V1ObjectMeta() + .name(domainUid) + .namespace(domainNamespace)) + .spec(new DomainSpec() + .domainUid(domainUid) + .domainHomeSourceType("FromModel") + .image(miiImageWlsadm) + .imagePullPolicy(IMAGE_PULL_POLICY) + .addImagePullSecretsItem(new V1LocalObjectReference() + .name(TEST_IMAGES_REPO_SECRET_NAME)) + .webLogicCredentialsSecret(new V1LocalObjectReference() + .name(adminSecretName)) + .includeServerOutInPodLog(true) + .serverStartPolicy("IfNeeded") + .serverPod(srvrPod) + .configuration(new Configuration() + .introspectorJobActiveDeadlineSeconds(3000L) + .model(new Model() + .domainType(WLS_DOMAIN_TYPE) + .runtimeEncryptionSecret(encryptionSecretName)))); + setPodAntiAffinity(domain); + // create model in image domain + logger.info("Creating model in image domain {0} in namespace {1} using image {2}", + domainUid, domainNamespace, miiImageWlsadm); + createDomainAndVerify(domain, domainNamespace); + + // check that admin server pod exists in the domain namespace + logger.info("Checking that admin server pod {0} exists in namespace {1}", + adminServerPodName, domainNamespace); + checkPodExists(adminServerPodName, domainUid, domainNamespace); + + logger.info("Checking that admin service {0} exists in namespace {1}", + adminServerPodName, domainNamespace); + checkServiceExists(adminServerPodName, domainNamespace); + + // check that admin server pod is ready + logger.info("Checking that admin server pod {0} is ready in namespace {1}", + adminServerPodName, domainNamespace); + checkPodReady(adminServerPodName, domainUid, domainNamespace); + + // check for managed server pods existence in the domain namespace + for (int i = 1; i <= replicaCount; i++) { + String managedServerPodName = managedServerPrefix + i; + + // check that the managed server pod exists in the domain namespace + logger.info("Checking that managed server pod {0} exists in namespace {1}", + managedServerPodName, domainNamespace); + checkPodExists(managedServerPodName, domainUid, domainNamespace); + + // check that the managed server service exists in the domain namespace + logger.info("Checking that managed server service {0} exists in namespace {1}", + managedServerPodName, domainNamespace); + checkServiceExists(managedServerPodName, domainNamespace); + + // check that the managed server pod is ready + logger.info("Checking that managed server pod {0} is ready in namespace {1}", + managedServerPodName, domainNamespace); + checkPodReady(managedServerPodName, domainUid, domainNamespace); + } + + } + + private void createMiiImage(String miiImageName, String miiImage) { + + // build MII basic image if does not exits + logger.info("Build/Check mii-basic-wlsadm image with tag {0}", MII_BASIC_IMAGE_TAG); + if (!imageExists(miiImageName, MII_BASIC_IMAGE_TAG)) { + logger.info("Building mii image with name {0}, tag {1}, image {2}", miiImageName, MII_BASIC_IMAGE_TAG, + miiImage); + testUntil( + withVeryLongRetryPolicy, + createBasicImage(miiImageName, MII_BASIC_IMAGE_TAG, MII_BASIC_WDT_MODEL_FILE, + null, MII_BASIC_APP_NAME, MII_BASIC_IMAGE_DOMAINTYPE), + logger, + "create to be successful"); + } else { + logger.info("!!!! domain image {0} exists !!!!", miiImage); + } + + assertTrue(doesImageExist(MII_BASIC_IMAGE_TAG), + String.format("Image %s doesn't exist", miiImage)); + + logger.info(WLSIMG_BUILDER + " login"); + testUntil(withVeryLongRetryPolicy, + () -> imageRepoLogin(BASE_IMAGES_REPO, BASE_IMAGES_REPO_USERNAME, BASE_IMAGES_REPO_PASSWORD), + logger, WLSIMG_BUILDER + " login to BASE_IMAGES_REPO to be successful"); + + // push the images to test images repository + if (!DOMAIN_IMAGES_REPO.isEmpty()) { + + List images = new ArrayList<>(); + + // add images only if SKIP_BUILD_IMAGES_IF_EXISTS is not set + if (!SKIP_BUILD_IMAGES_IF_EXISTS) { + images.add(miiImage); + + } + + for (String image : images) { + if (KIND_REPO != null) { + logger.info("kind load docker-image {0} --name kind", image); + } else { + logger.info(WLSIMG_BUILDER + " push image {0} to {1}", image, DOMAIN_IMAGES_REPO); + } + testUntil( + withVeryLongRetryPolicy, + () -> imagePush(image), + logger, + WLSIMG_BUILDER + " push to TEST_IMAGES_REPO/kind for image {0} to be successful", + image); + } + + // list images for Kind cluster + if (KIND_REPO != null) { + Command + .withParams(new CommandParams() + .command(WLSIMG_BUILDER + " exec kind-worker crictl images") + .verbose(true) + .saveResults(true)) + .execute(); + } + } + + } + + /** + * Create image with basic domain model yaml, variable file and sample application. + * + * @param imageName name of the image + * @param imageTag tag of the image + * @param modelFile model file to build the image + * @param varFile variable file to build the image + * @param appName name of the application to build the image + * @param domainType domain type to be built + * @return true if image is created successfully + */ + + private Callable createBasicImage(String imageName, String imageTag, String modelFile, String varFile, + String appName, String domainType) { + return (() -> { + LoggingFacade logger = getLogger(); + final String image = imageName + ":" + imageTag; + + // build the model file list + final List modelList = Collections.singletonList(MODEL_DIR + "/" + modelFile); + + // build an application archive using what is in resources/apps/APP_NAME + logger.info("Build an application archive using resources/apps/{0}", appName); + assertTrue(buildAppArchive(defaultAppParams() + .srcDirList(Collections.singletonList(appName))), + String.format("Failed to create app archive for %s", appName)); + + // build the archive list + String zipFile = String.format("%s/%s.zip", ARCHIVE_DIR, appName); + final List archiveList = Collections.singletonList(zipFile); + + // Set additional environment variables for WIT + checkDirectory(WIT_BUILD_DIR); + Map env = new HashMap<>(); + env.put("WLSIMG_BLDDIR", WIT_BUILD_DIR); + + if (WIT_JAVA_HOME != null) { + env.put("JAVA_HOME", WIT_JAVA_HOME); + } + + String witTarget = ((OKD) ? "OpenShift" : "Default"); + + // build an image using WebLogic Image Tool + boolean imageCreation = false; + logger.info("Create image {0} using model directory {1}", image, MODEL_DIR); + if (domainType.equalsIgnoreCase("wdt")) { + final List modelVarList = Collections.singletonList(MODEL_DIR + "/" + varFile); + imageCreation = createImage( + defaultWitParams() + .baseImageName(WEBLOGIC_IMAGE_NAME) + .baseImageTag(WEBLOGIC_IMAGE_WLSADM_TAG) + .modelImageName(imageName) + .modelImageTag(WDT_BASIC_IMAGE_TAG) + .modelFiles(modelList) + .modelArchiveFiles(archiveList) + .modelVariableFiles(modelVarList) + .domainHome(WDT_BASIC_IMAGE_DOMAINHOME) + .wdtOperation("CREATE") + .wdtVersion(WDT_VERSION) + .target(witTarget) + .env(env) + .useridGroupid("wlsadm:root") + .redirect(true)); + } else if (domainType.equalsIgnoreCase("mii")) { + imageCreation = createImage( + defaultWitParams() + .baseImageName(WEBLOGIC_IMAGE_NAME) + .baseImageTag(WEBLOGIC_IMAGE_WLSADM_TAG) + .modelImageName(imageName) + .modelImageTag(MII_BASIC_IMAGE_TAG) + .modelFiles(modelList) + .modelArchiveFiles(archiveList) + .wdtModelOnly(true) + .wdtVersion(WDT_VERSION) + .target(witTarget) + .env(env) + .useridGroupid("wlsadm:root") + .redirect(true)); + } + return imageCreation; + }); + } + +} + diff --git a/integration-tests/src/test/java/oracle/weblogic/kubernetes/TestConstants.java b/integration-tests/src/test/java/oracle/weblogic/kubernetes/TestConstants.java index b233ebb90fd..b7cabc0069f 100644 --- a/integration-tests/src/test/java/oracle/weblogic/kubernetes/TestConstants.java +++ b/integration-tests/src/test/java/oracle/weblogic/kubernetes/TestConstants.java @@ -136,6 +136,8 @@ public interface TestConstants { + getNonEmptySystemProperty("wko.it.weblogic.image.name", WEBLOGIC_IMAGE_NAME_DEFAULT); public static final String WEBLOGIC_IMAGE_TAG = getNonEmptySystemProperty("wko.it.weblogic.image.tag", WEBLOGIC_IMAGE_TAG_DEFAULT); + //WebLogic base image tag with added user "wlsadm" for 14.1.2.0-jdk17-ol8 + String WEBLOGIC_IMAGE_WLSADM_TAG = "14.1.2.0-with-wlsadm-jdk17-ol8"; // Get FMWINFRA_IMAGE_NAME/FMWINFRA_IMAGE_TAG from env var, if its not // provided and if base images repo is OCIR use OCIR default image values diff --git a/integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/primitive/WebLogicImageTool.java b/integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/primitive/WebLogicImageTool.java index 478846c6c79..883b7ed6880 100644 --- a/integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/primitive/WebLogicImageTool.java +++ b/integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/primitive/WebLogicImageTool.java @@ -167,7 +167,13 @@ private boolean downloadWdt(String version) { private String buildWitCommand() { LoggingFacade logger = getLogger(); - String ownership = " --chown oracle:root"; + String ownership = null; + + if (params.useridGroupid() == null) { + ownership = " --chown oracle:root"; + } else { + ownership = " --chown " + params.useridGroupid(); + } if (OKE_CLUSTER) { if (params.baseImageName().equals(FMWINFRA_IMAGE_NAME)) { String output = inspectImage(params.baseImageName(), params.baseImageTag()); diff --git a/integration-tests/src/test/java/oracle/weblogic/kubernetes/extensions/InitializationTasks.java b/integration-tests/src/test/java/oracle/weblogic/kubernetes/extensions/InitializationTasks.java index e3017335e90..afae13617a4 100644 --- a/integration-tests/src/test/java/oracle/weblogic/kubernetes/extensions/InitializationTasks.java +++ b/integration-tests/src/test/java/oracle/weblogic/kubernetes/extensions/InitializationTasks.java @@ -87,6 +87,7 @@ import static oracle.weblogic.kubernetes.TestConstants.WDT_BASIC_MODEL_PROPERTIES_FILE; import static oracle.weblogic.kubernetes.TestConstants.WEBLOGIC_IMAGE_NAME; import static oracle.weblogic.kubernetes.TestConstants.WEBLOGIC_IMAGE_TAG; +import static oracle.weblogic.kubernetes.TestConstants.WEBLOGIC_IMAGE_WLSADM_TAG; import static oracle.weblogic.kubernetes.TestConstants.WEBLOGIC_SHIPHOME; import static oracle.weblogic.kubernetes.TestConstants.WLSIMG_BUILDER; import static oracle.weblogic.kubernetes.actions.ActionConstants.ARCHIVE_DIR; @@ -210,6 +211,7 @@ public void beforeAll(ExtensionContext context) { Collection images = new ArrayList<>(); images.add(WEBLOGIC_IMAGE_NAME + ":" + WEBLOGIC_IMAGE_TAG); + images.add(WEBLOGIC_IMAGE_NAME + ":" + WEBLOGIC_IMAGE_WLSADM_TAG); images.add(FMWINFRA_IMAGE_NAME + ":" + FMWINFRA_IMAGE_TAG); images.add(DB_IMAGE_NAME + ":" + DB_IMAGE_TAG); images.add(LOCALE_IMAGE_NAME + ":" + LOCALE_IMAGE_TAG); From fecf06897e2f6c70ef966639b995416639d133cd Mon Sep 17 00:00:00 2001 From: Ryan Eberhard Date: Fri, 23 May 2025 16:07:47 +0000 Subject: [PATCH 04/20] Merge branch 'k8s132-doc' into 'main' Document certification of k8s 1.32 See merge request weblogic-cloud/weblogic-kubernetes-operator!4975 (cherry picked from commit 28949ff733333b0b5dc1ba55fce241c562534944) c05fd8c4 Document certification of k8s 1.32 a5baff91 Update additional minimum versions --- .../introduction/prerequisites/introduction.md | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/documentation/site/content/introduction/prerequisites/introduction.md b/documentation/site/content/introduction/prerequisites/introduction.md index 6b8ed53aded..11763834426 100644 --- a/documentation/site/content/introduction/prerequisites/introduction.md +++ b/documentation/site/content/introduction/prerequisites/introduction.md @@ -7,12 +7,16 @@ weight: 5 For the current production release {{< latestVersion >}}: -* Kubernetes 1.24.0+, 1.25.0+, 1.26.2+, 1.27.2+, 1.28.2+, 1.29.1+, 1.30.1+, and 1.31.1+ (check with `kubectl version`). -* Flannel networking v0.13.0-amd64 or later (check with `docker images | grep flannel`), Calico networking v3.16.1 or later, +{{% notice note %}} +Support for Kubernetes 1.32.1+ with Oracle WebLogic Server 12.2.1.4 or 14.1.1.0 requires that the WebLogic container images have patch 37788099. No patch is required when using Oracle WebLogic Server 14.1.2.0. +{{% /notice %}} + +* Kubernetes 1.26.2+, 1.27.2+, 1.28.2+, 1.29.1+, 1.30.1+, 1.31.1+, 1.32.1+ (check with `kubectl version`). +* Flannel networking v0.26.7 or later (check with `docker images | grep flannel`), Calico networking v3.29.4 or later, *or* OpenShift SDN on OpenShift 4.3 systems. -* Docker 19.03.1+ (check with `docker version`) *or* CRI-O 1.20.2+ (check with `crictl version | grep RuntimeVersion`). -* Helm 3.3.4+ (check with `helm version --client --short`). -* For domain home source type `Model in Image`, WebLogic Deploy Tooling 1.9.11+. +* Docker 25.0.10+ (check with `docker version`) *or* CRI-O 1.26.2+ (check with `crictl version | grep RuntimeVersion`). +* Helm 3.13.2+ (check with `helm version --client --short`). +* For domain home source type `Model in Image`, WebLogic Deploy Tooling 4.3.4+. * Oracle WebLogic Server 12.2.1.4.0, Oracle WebLogic Server 14.1.1.0.0, or Oracle WebLogic Server 14.1.2.0.0. * **NOTE**: From d2b5536896300fad1ef102b7b3b592c392b55339 Mon Sep 17 00:00:00 2001 From: Ryan Eberhard Date: Tue, 27 May 2025 19:27:17 -0400 Subject: [PATCH 05/20] Dependency updates --- .../weblogic/kubernetes/ItConfigDistributionStrategy.java | 2 +- .../weblogic/kubernetes/ItKubernetesDomainEvents.java | 8 ++++---- .../weblogic/kubernetes/utils/CommonLBTestUtils.java | 4 ++-- .../kubernetes/operator/wlsconfig/MacroSubstitutor.java | 6 +++--- pom.xml | 6 +++--- 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/integration-tests/src/test/java/oracle/weblogic/kubernetes/ItConfigDistributionStrategy.java b/integration-tests/src/test/java/oracle/weblogic/kubernetes/ItConfigDistributionStrategy.java index 71424109701..9e092b0bb77 100644 --- a/integration-tests/src/test/java/oracle/weblogic/kubernetes/ItConfigDistributionStrategy.java +++ b/integration-tests/src/test/java/oracle/weblogic/kubernetes/ItConfigDistributionStrategy.java @@ -1303,7 +1303,7 @@ private static String getHostAndPortOKE() { "Getting Nginx loadbalancer service node port failed"); hostAndPort = getServiceExtIPAddrtOke(nginxServiceName, nginxNamespace) != null - ? getServiceExtIPAddrtOke(nginxServiceName, nginxNamespace) : K8S_NODEPORT_HOST + ":" + nginxNodePort; + ? getServiceExtIPAddrtOke(nginxServiceName, nginxNamespace) : K8S_NODEPORT_HOST + ":" + nginxNodePort; return hostAndPort; } } diff --git a/integration-tests/src/test/java/oracle/weblogic/kubernetes/ItKubernetesDomainEvents.java b/integration-tests/src/test/java/oracle/weblogic/kubernetes/ItKubernetesDomainEvents.java index 1a68015b434..edb8936e273 100644 --- a/integration-tests/src/test/java/oracle/weblogic/kubernetes/ItKubernetesDomainEvents.java +++ b/integration-tests/src/test/java/oracle/weblogic/kubernetes/ItKubernetesDomainEvents.java @@ -265,10 +265,10 @@ void testDomainK8sEventsNonExistingManagedServer() { timestamp = now(); logger.info("patch the domain resource with non-existing managed server"); patchStr = "[{\"op\": \"add\",\"path\": \"" - + "/spec/managedServers/-\", \"value\": " - + "{\"serverName\" : \"nonexisting-ms\", " - + "\"serverStartPolicy\": \"IfNeeded\"}" - + "}]"; + + "/spec/managedServers/-\", \"value\": " + + "{\"serverName\" : \"nonexisting-ms\", " + + "\"serverStartPolicy\": \"IfNeeded\"}" + + "}]"; logger.info("Updating domain configuration using patch string: {0}\n", patchStr); patch = new V1Patch(patchStr); assertTrue(patchDomainCustomResource(domainUid, domainNamespace3, patch, V1Patch.PATCH_FORMAT_JSON_PATCH), diff --git a/integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/CommonLBTestUtils.java b/integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/CommonLBTestUtils.java index 82030246c36..62d1e662358 100644 --- a/integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/CommonLBTestUtils.java +++ b/integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/CommonLBTestUtils.java @@ -786,12 +786,12 @@ public static void verifyClusterLoadbalancing(String domainUid, if (hostRouting) { curlRequest = OKE_CLUSTER_PRIVATEIP ? String.format("curl -g --show-error -ks --noproxy '*' -v " + "-H 'host: %s' %s://%s/" + uri, ingressHostName, protocol, host) - : String.format("curl -g --show-error -ks --noproxy '*' " + : String.format("curl -g --show-error -ks --noproxy '*' " + "-H 'host: %s' %s://%s/" + uri, ingressHostName, protocol, getHostAndPort(host, lbPort)); } else { curlRequest = OKE_CLUSTER_PRIVATEIP ? String.format("curl -g --show-error -ks --noproxy '*' -v " + "%s://%s" + locationString + "/" + uri, protocol, host) - : String.format("curl -g --show-error -ks --noproxy '*' " + : String.format("curl -g --show-error -ks --noproxy '*' " + "%s://%s" + locationString + "/" + uri, protocol, getHostAndPort(host, lbPort)); } diff --git a/operator/src/main/java/oracle/kubernetes/operator/wlsconfig/MacroSubstitutor.java b/operator/src/main/java/oracle/kubernetes/operator/wlsconfig/MacroSubstitutor.java index 0c41dceab64..26b3123514d 100644 --- a/operator/src/main/java/oracle/kubernetes/operator/wlsconfig/MacroSubstitutor.java +++ b/operator/src/main/java/oracle/kubernetes/operator/wlsconfig/MacroSubstitutor.java @@ -1,4 +1,4 @@ -// Copyright (c) 2018, 2023, Oracle and/or its affiliates. +// Copyright (c) 2018, 2025, Oracle and/or its affiliates. // Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. package oracle.kubernetes.operator.wlsconfig; @@ -116,8 +116,8 @@ private String resolveMacroValue(String macro) { case "machineName" -> machineName; case "id" -> "" + id; default -> - // Look for macro in ConfigurationProperty or as system property - System.getProperty(macro); + // Look for macro in ConfigurationProperty or as system property + System.getProperty(macro); }; } } diff --git a/pom.xml b/pom.xml index 4b5922ec585..a354805e6af 100644 --- a/pom.xml +++ b/pom.xml @@ -708,7 +708,7 @@ 3.8.1 3.6.0 3.5.0 - 10.23.1 + 10.24.0 1.0 3.6.0 3.2.7 @@ -718,8 +718,8 @@ 2.0.1 1.0.39 1.9.0 - 1.5.6 - 1.4.0 + 1.5.7 + 1.5.0 1.18.0 1.7.3 0.1.0 From baf9cd578285182757b939a302ba2e25d1d0c9c2 Mon Sep 17 00:00:00 2001 From: maggie_he Date: Thu, 5 Jun 2025 14:29:41 +0000 Subject: [PATCH 06/20] Fix release/4.2 sequential nightly run not showing all test classes in the test report --- .../oracle/weblogic/kubernetes/ItWlsMiiLegacySample.java | 5 +++++ .../test/java/oracle/weblogic/kubernetes/ItWlsMiiSample.java | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/integration-tests/src/test/java/oracle/weblogic/kubernetes/ItWlsMiiLegacySample.java b/integration-tests/src/test/java/oracle/weblogic/kubernetes/ItWlsMiiLegacySample.java index a2260ea8056..bd9d8693e62 100644 --- a/integration-tests/src/test/java/oracle/weblogic/kubernetes/ItWlsMiiLegacySample.java +++ b/integration-tests/src/test/java/oracle/weblogic/kubernetes/ItWlsMiiLegacySample.java @@ -8,6 +8,7 @@ import java.util.List; import java.util.Map; +import oracle.weblogic.kubernetes.actions.impl.UniqueName; import oracle.weblogic.kubernetes.actions.impl.primitive.Command; import oracle.weblogic.kubernetes.actions.impl.primitive.CommandParams; import oracle.weblogic.kubernetes.annotations.IntegrationTest; @@ -50,7 +51,9 @@ import static oracle.weblogic.kubernetes.actions.TestActions.imagePull; import static oracle.weblogic.kubernetes.actions.TestActions.imagePush; import static oracle.weblogic.kubernetes.actions.TestActions.imageTag; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.backupReports; import static oracle.weblogic.kubernetes.utils.CommonTestUtils.getUniqueName; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.restoreReports; import static oracle.weblogic.kubernetes.utils.ImageUtils.createBaseRepoSecret; import static oracle.weblogic.kubernetes.utils.ImageUtils.createTestRepoSecret; import static oracle.weblogic.kubernetes.utils.ThreadSafeLogger.getLogger; @@ -174,7 +177,9 @@ public static void initAll(@Namespaces(3) List namespaces) { @Test @Order(1) public void testInstallOperator() { + String backupReports = backupReports(UniqueName.uniqueName(this.getClass().getSimpleName())); execTestScriptAndAssertSuccess("-oper", "Failed to run -oper"); + restoreReports(backupReports); } /** diff --git a/integration-tests/src/test/java/oracle/weblogic/kubernetes/ItWlsMiiSample.java b/integration-tests/src/test/java/oracle/weblogic/kubernetes/ItWlsMiiSample.java index 6c253f40b7a..3bcd88b966b 100644 --- a/integration-tests/src/test/java/oracle/weblogic/kubernetes/ItWlsMiiSample.java +++ b/integration-tests/src/test/java/oracle/weblogic/kubernetes/ItWlsMiiSample.java @@ -8,6 +8,7 @@ import java.util.List; import java.util.Map; +import oracle.weblogic.kubernetes.actions.impl.UniqueName; import oracle.weblogic.kubernetes.actions.impl.primitive.Command; import oracle.weblogic.kubernetes.actions.impl.primitive.CommandParams; import oracle.weblogic.kubernetes.annotations.IntegrationTest; @@ -51,7 +52,9 @@ import static oracle.weblogic.kubernetes.actions.TestActions.imagePull; import static oracle.weblogic.kubernetes.actions.TestActions.imagePush; import static oracle.weblogic.kubernetes.actions.TestActions.imageTag; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.backupReports; import static oracle.weblogic.kubernetes.utils.CommonTestUtils.getUniqueName; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.restoreReports; import static oracle.weblogic.kubernetes.utils.ImageUtils.createBaseRepoSecret; import static oracle.weblogic.kubernetes.utils.ImageUtils.createTestRepoSecret; import static oracle.weblogic.kubernetes.utils.ThreadSafeLogger.getLogger; @@ -162,7 +165,9 @@ public static void initAll(@Namespaces(3) List namespaces) { @Test @Order(1) public void testInstallOperator() { + String backupReports = backupReports(UniqueName.uniqueName(this.getClass().getSimpleName())); execTestScriptAndAssertSuccess("-oper", "Failed to run -oper"); + restoreReports(backupReports); } /** From c4bd72e0db8071f090789b37e2de1146f65a06e9 Mon Sep 17 00:00:00 2001 From: Sankar Periyathambi neelakandan Date: Fri, 6 Jun 2025 14:54:50 +0000 Subject: [PATCH 07/20] Add WDT helper utility class to add applications and more --- .../ItMiiCreateAuxImageWithImageTool.java | 19 +- .../kubernetes/actions/TestActions.java | 7 +- .../actions/impl/WDTArchiveHelper.java | 355 ++++++++++++++++++ 3 files changed, 371 insertions(+), 10 deletions(-) create mode 100644 integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/WDTArchiveHelper.java diff --git a/integration-tests/src/test/java/oracle/weblogic/kubernetes/ItMiiCreateAuxImageWithImageTool.java b/integration-tests/src/test/java/oracle/weblogic/kubernetes/ItMiiCreateAuxImageWithImageTool.java index abc1c256d8d..a5846f26264 100644 --- a/integration-tests/src/test/java/oracle/weblogic/kubernetes/ItMiiCreateAuxImageWithImageTool.java +++ b/integration-tests/src/test/java/oracle/weblogic/kubernetes/ItMiiCreateAuxImageWithImageTool.java @@ -3,12 +3,14 @@ package oracle.weblogic.kubernetes; +import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.List; import oracle.weblogic.domain.AuxiliaryImage; import oracle.weblogic.domain.DomainResource; +import oracle.weblogic.kubernetes.actions.impl.WDTArchiveHelper; import oracle.weblogic.kubernetes.actions.impl.primitive.Command; import oracle.weblogic.kubernetes.actions.impl.primitive.CommandParams; import oracle.weblogic.kubernetes.actions.impl.primitive.WitParams; @@ -43,7 +45,6 @@ import static oracle.weblogic.kubernetes.TestConstants.WLSIMG_BUILDER; import static oracle.weblogic.kubernetes.actions.ActionConstants.ARCHIVE_DIR; import static oracle.weblogic.kubernetes.actions.ActionConstants.MODEL_DIR; -import static oracle.weblogic.kubernetes.actions.TestActions.buildAppArchive; import static oracle.weblogic.kubernetes.actions.TestActions.defaultAppParams; import static oracle.weblogic.kubernetes.actions.TestActions.deleteImage; import static oracle.weblogic.kubernetes.assertions.TestAssertions.appAccessibleInPod; @@ -125,11 +126,17 @@ public static void initAll(@Namespaces(2) List namespaces) { createSecretWithUsernamePassword(encryptionSecretName, domainNamespace, ENCRYPION_USERNAME_DEFAULT, ENCRYPION_PASSWORD_DEFAULT); - // build app - assertTrue(buildAppArchive(defaultAppParams() - .srcDirList(Collections.singletonList(MII_BASIC_APP_NAME)) - .appName(MII_BASIC_APP_NAME)), - String.format("Failed to create app archive for %s", MII_BASIC_APP_NAME)); + try { + // createArchive app + assertTrue(WDTArchiveHelper + .withParams(defaultAppParams() + .srcDirList(Collections.singletonList(MII_BASIC_APP_NAME)) + .appName(MII_BASIC_APP_NAME)) + .createArchive(), + String.format("Failed to create app archive for %s", MII_BASIC_APP_NAME)); + } catch (IOException ex) { + getLogger().severe(ex.getLocalizedMessage()); + } } /** diff --git a/integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/TestActions.java b/integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/TestActions.java index 7e9f276804c..96ff4890a3f 100644 --- a/integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/TestActions.java +++ b/integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/TestActions.java @@ -1241,10 +1241,9 @@ public static AppParams defaultAppParams() { * @return true if the operation succeeds */ public static boolean buildAppArchive(AppParams params) { - return - AppBuilder - .withParams(params) - .build(); + return AppBuilder + .withParams(params) + .build(); } /** diff --git a/integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/WDTArchiveHelper.java b/integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/WDTArchiveHelper.java new file mode 100644 index 00000000000..01b86658516 --- /dev/null +++ b/integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/WDTArchiveHelper.java @@ -0,0 +1,355 @@ +// Copyright (c) 2025, Oracle and/or its affiliates. +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +package oracle.weblogic.kubernetes.actions.impl; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardCopyOption; +import java.util.List; + +import oracle.weblogic.kubernetes.actions.impl.primitive.Command; +import oracle.weblogic.kubernetes.actions.impl.primitive.CommandParams; +import oracle.weblogic.kubernetes.utils.FileUtils; +import oracle.weblogic.kubernetes.utils.OracleHttpClient; + +import static oracle.weblogic.kubernetes.actions.ActionConstants.APP_DIR; +import static oracle.weblogic.kubernetes.actions.ActionConstants.DOWNLOAD_DIR; +import static oracle.weblogic.kubernetes.actions.ActionConstants.WDT_DOWNLOAD_URL; +import static oracle.weblogic.kubernetes.actions.ActionConstants.WORK_DIR; +import static oracle.weblogic.kubernetes.actions.impl.primitive.Command.defaultCommandParams; +import static oracle.weblogic.kubernetes.utils.FileUtils.checkDirectory; +import static oracle.weblogic.kubernetes.utils.FileUtils.cleanupDirectory; +import static oracle.weblogic.kubernetes.utils.FileUtils.copyFolder; +import static oracle.weblogic.kubernetes.utils.ThreadSafeLogger.getLogger; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** + * Implementation of actions that createArchive an application archive file. + */ + +public class WDTArchiveHelper { + + private AppParams params; + + /** + * Create an AppParams instance with the default values. + * @return an AppParams instance + */ + public static AppParams defaultAppParams() { + return new AppParams().defaults(); + } + + /** + * Create an AppParams instance with the custom values. + * @return an AppParams instance + */ + public static AppParams customAppParams(List srcDirList) { + return new AppParams().srcDirList(srcDirList); + } + + /** + * Set up the AppBuilder with given parameters. + * + * @param params instance of {@link AppParams} that contains parameters to createArchive an application archive + * @return the AppBuilder instance + */ + public static WDTArchiveHelper withParams(AppParams params) { + return new WDTArchiveHelper().params(params); + } + + private WDTArchiveHelper params(AppParams params) { + this.params = params; + return this; + } + + /** + * Build an application archive using a pre-populated AppParams instance. + * + * @param structuredApplication true if the application is structured and exploded. + * @return true if the command succeeds + * @throws java.io.IOException when WDT download fails + */ + public boolean createArchive(boolean structuredApplication) throws IOException { + // check and install WDT + checkAndInstallWDT(); + String archiveSrcDir = params.appArchiveDir() + "/wlsdeploy/applications"; + // prepare the archive directory and copy over the app src + try { + cleanupDirectory(archiveSrcDir); + checkDirectory(archiveSrcDir); + for (String item : params.srcDirList()) { + copyFolder( + APP_DIR + "/" + item, + archiveSrcDir); + } + } catch (IOException ioe) { + getLogger().severe("Failed to get the directory " + archiveSrcDir + " ready", ioe); + return false; + } + + // make sure that we always have an app name + if (params.appName() == null) { + params.appName(params.srcDirList().get(0)); + } + boolean jarBuilt = true; + if (!structuredApplication) { + // createArchive the app archive + String jarPath = String.format("%s.ear", params.appName()); + jarBuilt = buildJarArchive(jarPath, archiveSrcDir); + } + + // createArchive a zip file that can be passed to WIT + String zipPath = String.format("%s/%s.zip", params.appArchiveDir(), params.appName()); + boolean zipBuilt = buildZipArchive(zipPath, params.appArchiveDir()); + + return jarBuilt && zipBuilt; + } + + /** + * Build an application archive using a pre-populated AppParams instance. + * + * @return true if the command succeeds + * @throws java.io.IOException when WDT download fails + */ + public boolean createArchive() throws IOException { + return createArchive(false); + } + + /** + * Add an application archive to an existing zip archive. + * + * @return true of adding to an archive succeeds + * @throws IOException when zip archive fails + */ + public boolean addToArchive() throws IOException { + String zipPath = String.format("%s/%s.zip", params.appArchiveDir(), params.appName()); + if (Files.exists(Path.of(zipPath))) { + return buildZipArchive(zipPath, params.appArchiveDir()); + } else { + return createArchive(); + } + } + + /** + * Build an application archive using a pre-populated AppParams instance. + * @return true if the command succeeds + * @throws java.io.IOException when WDT download fails + */ + public boolean createArchiveWithStructuredApplication() throws IOException { + return createArchive(true); + } + + + /** + * Build an application archive using a pre-populated AppParams instance. + * @return true if the command succeeds + */ + public boolean buildCoherence() { + // prepare the archive directory and copy over the app src + String archiveSrcDir = params.appArchiveDir() + "/wlsdeploy/applications"; + try { + cleanupDirectory(archiveSrcDir); + checkDirectory(archiveSrcDir); + for (String item : params.srcDirList()) { + copyFolder(APP_DIR + "/" + item, archiveSrcDir); + } + } catch (IOException ioe) { + getLogger().severe("Failed to get the directory " + archiveSrcDir + " ready", ioe); + return false; + } + + // make sure that we always have an app name + if (params.appName() == null) { + params.appName(params.srcDirList().get(0)); + } + + // createArchive the app archive + boolean jarBuilt = false; + if (params.appName().contains("coherence-proxy")) { + String jarPath = String.format("%s.gar", params.appName()); + jarBuilt = buildJarArchive(jarPath, archiveSrcDir); + } else if (params.appName().contains("CoherenceApp")) { + String [] appTypes = {"ear", "gar"}; + try { + for (String appType : appTypes) { + String appSrcDir = String.format("%s/%s/u01/application/builddir/%s.%s", + WORK_DIR, params.appName(), params.appName(), appType); + String appArchiveSrcDir = String.format("%s/%s.%s", archiveSrcDir, params.appName(), appType); + assertTrue(FileUtils.doesFileExist(appSrcDir), "File " + appSrcDir + " doesn't exist"); + assertTrue(FileUtils.doesDirExist(archiveSrcDir), "Dir " + archiveSrcDir + " doesn't exist"); + + FileUtils.copy(Paths.get(appSrcDir), Paths.get(appArchiveSrcDir)); + } + jarBuilt = true; + } catch (IOException ex) { + getLogger().severe("Failed to copy Coherence app ", ex.getMessage()); + ex.printStackTrace(); + return false; + } + } + + // createArchive a zip file that can be passed to WIT + String zipPath = String.format("%s/%s.zip", params.appArchiveDir(), params.appName()); + boolean zipBuilt = buildCoherenceZipArchive(zipPath, params.appArchiveDir()); + + return jarBuilt && zipBuilt; + } + + /** + * Build an archive that includes the contents in srcDir. + * + * @param jarPath Jar file path for the resulting archive + * @param srcDir source directory + */ + private boolean buildJarArchive( + String jarPath, + String srcDir + ) { + + String cmd = String.format("cd %s; jar -cfM %s . ", srcDir, jarPath); + + return Command.withParams( + defaultCommandParams() + .command(cmd) + .redirect(false)) + .execute(); + } + + /** + * Build a zip archive that includes an ear file in the srcDir. + * + * @param zipPath zip file path for the resulting archive + * @param srcDir source directory + */ + public boolean buildZipArchive( + String zipPath, + String srcDir + ) { + + // make sure that we always have an app name + if (params.appName() == null) { + params.appName(params.srcDirList().get(0)); + } + + String cmd = String.format( + "cd %s/wlsdeploy/applications; " + + archiveHelperScript + " add application" + + " -archive_file %s" + + " -source %s.ear ", + srcDir, + zipPath, + params.appName()); + + return Command.withParams( + defaultCommandParams() + .command(cmd) + .verbose(true) + .redirect(false)) + .execute(); + } + + /** + * Build a zip archive that includes coh-proxy-server.gar in the srcDir. + * + * @param zipPath zip file path for the resulting archive + * @param srcDir source directory + */ + public boolean buildCoherenceZipArchive(String zipPath, String srcDir) { + + // make sure that we always have an app name + if (params.appName() == null) { + params.appName(params.srcDirList().get(0)); + } + + String cmd = String.format( + "cd %s ; zip %s wlsdeploy/applications/%s.gar ", + srcDir, + zipPath, + params.appName()); + + if (params.appName().contains("CoherenceApp")) { + cmd = String.format( + "cd %s ; zip -r %s.zip wlsdeploy/applications ", + params.appArchiveDir(), + params.appName() + ); + } + + return Command.withParams( + defaultCommandParams() + .command(cmd) + .redirect(false)) + .execute(); + } + + /** + * Archive an application from provided ear or war file that can be used by WebLogic Image Tool + * to create an image with the application for a model-in-image use case. + * + * @return true if the operation succeeds + */ + public boolean archiveApp() { + List srcFiles = params.srcDirList(); + String srcFile = srcFiles.get(0); + String appName = srcFile.substring(srcFile.lastIndexOf("/") + 1, srcFile.lastIndexOf(".")); + params.appName(appName); + String archiveSrcDir = params.appArchiveDir() + "/wlsdeploy/applications"; + + try { + cleanupDirectory(archiveSrcDir); + checkDirectory(archiveSrcDir); + for (String appSrcFile : srcFiles) { + if (appSrcFile.length() > 0) { + getLogger().info("copy {0} to {1} ", appSrcFile, archiveSrcDir); + String fileName = appSrcFile.substring(appSrcFile.lastIndexOf("/") + 1); + Files.copy(Paths.get(appSrcFile), Paths.get(archiveSrcDir + "/" + fileName), + StandardCopyOption.REPLACE_EXISTING); + } + } + } catch (IOException ioe) { + getLogger().severe("Failed to get the directory " + archiveSrcDir + " ready", ioe); + return false; + } + + String cmd = String.format( + "cd %s ; zip -r %s.zip wlsdeploy/applications ", + params.appArchiveDir(), + appName + ); + + return Command.withParams( + defaultCommandParams() + .command(cmd) + .redirect(false)) + .execute(); + } + + static Path archiveHelperScript = Path.of(DOWNLOAD_DIR, "wdt", "weblogic-deploy", "bin", "archiveHelper.sh"); + + private static void downloadAndInstallWDT() throws IOException { + String wdtUrl = WDT_DOWNLOAD_URL + "/download/weblogic-deploy.zip"; + Path destLocation = Path.of(DOWNLOAD_DIR, "wdt", "weblogic-deploy.zip"); + if (!Files.exists(destLocation) && !Files.exists(archiveHelperScript)) { + getLogger().info("Downloading WDT to {0}", destLocation); + Files.createDirectories(destLocation.getParent()); + OracleHttpClient.downloadFile(wdtUrl, destLocation.toString(), null, null, 3); + String cmd = "cd " + destLocation.getParent() + ";unzip " + destLocation; + assertTrue(Command.withParams(new CommandParams().command(cmd)).execute(), "unzip command failed"); + } + assertTrue(Files.exists(archiveHelperScript), "could not find createDomain.sh script"); + } + + /** + * Check if WDT is installed if not download and install. + * + * @throws IOException when download fails + */ + public static void checkAndInstallWDT() throws IOException { + if (!Files.exists(archiveHelperScript)) { + downloadAndInstallWDT(); + } + } +} From a5f09172fe99478a89192d5bc31c183a32222cea Mon Sep 17 00:00:00 2001 From: maggie_he Date: Fri, 6 Jun 2025 16:52:39 +0000 Subject: [PATCH 08/20] Add more tests into openshift suite (part 1) --- .../java/oracle/weblogic/kubernetes/ItEvictedPodsCycling.java | 1 + .../weblogic/kubernetes/ItKubernetesNameSpaceWatchingEvents.java | 1 + .../test/java/oracle/weblogic/kubernetes/ItMaxConcurOptions.java | 1 + .../java/oracle/weblogic/kubernetes/ItRetryImprovementMisc.java | 1 + .../test/java/oracle/weblogic/kubernetes/ItWlsDomainOnPV.java | 1 + 5 files changed, 5 insertions(+) diff --git a/integration-tests/src/test/java/oracle/weblogic/kubernetes/ItEvictedPodsCycling.java b/integration-tests/src/test/java/oracle/weblogic/kubernetes/ItEvictedPodsCycling.java index acc7c24ce59..759e8f968b1 100644 --- a/integration-tests/src/test/java/oracle/weblogic/kubernetes/ItEvictedPodsCycling.java +++ b/integration-tests/src/test/java/oracle/weblogic/kubernetes/ItEvictedPodsCycling.java @@ -55,6 +55,7 @@ @Tag("olcne-mrg") @Tag("kind-parallel") @Tag("oke-parallel") +@Tag("okd-wls-mrg") @Tag("gate") class ItEvictedPodsCycling { diff --git a/integration-tests/src/test/java/oracle/weblogic/kubernetes/ItKubernetesNameSpaceWatchingEvents.java b/integration-tests/src/test/java/oracle/weblogic/kubernetes/ItKubernetesNameSpaceWatchingEvents.java index 16ae4816bfc..4a90b1af880 100644 --- a/integration-tests/src/test/java/oracle/weblogic/kubernetes/ItKubernetesNameSpaceWatchingEvents.java +++ b/integration-tests/src/test/java/oracle/weblogic/kubernetes/ItKubernetesNameSpaceWatchingEvents.java @@ -55,6 +55,7 @@ @Tag("kind-parallel") @Tag("oke-arm") @Tag("oke-parallel") +@Tag("okd-wls-mrg") class ItKubernetesNameSpaceWatchingEvents { private static final String newNSWithoutLabels = "ns-newnamespace1"; diff --git a/integration-tests/src/test/java/oracle/weblogic/kubernetes/ItMaxConcurOptions.java b/integration-tests/src/test/java/oracle/weblogic/kubernetes/ItMaxConcurOptions.java index e0982b8afd4..9012cb4f9d8 100644 --- a/integration-tests/src/test/java/oracle/weblogic/kubernetes/ItMaxConcurOptions.java +++ b/integration-tests/src/test/java/oracle/weblogic/kubernetes/ItMaxConcurOptions.java @@ -91,6 +91,7 @@ @IntegrationTest @Tag("kind-parallel") @Tag("olcne-sequential") +@Tag("okd-wls-mrg") class ItMaxConcurOptions { private static String opNamespace = null; diff --git a/integration-tests/src/test/java/oracle/weblogic/kubernetes/ItRetryImprovementMisc.java b/integration-tests/src/test/java/oracle/weblogic/kubernetes/ItRetryImprovementMisc.java index bd3a63dc7b6..0536dbde842 100644 --- a/integration-tests/src/test/java/oracle/weblogic/kubernetes/ItRetryImprovementMisc.java +++ b/integration-tests/src/test/java/oracle/weblogic/kubernetes/ItRetryImprovementMisc.java @@ -56,6 +56,7 @@ @IntegrationTest @Tag("kind-parallel") @Tag("olcne-mrg") +@Tag("okd-wls-mrg") class ItRetryImprovementMisc { private static String domainNamespace = null; diff --git a/integration-tests/src/test/java/oracle/weblogic/kubernetes/ItWlsDomainOnPV.java b/integration-tests/src/test/java/oracle/weblogic/kubernetes/ItWlsDomainOnPV.java index 4e5433ebe01..2f863f8b8d2 100644 --- a/integration-tests/src/test/java/oracle/weblogic/kubernetes/ItWlsDomainOnPV.java +++ b/integration-tests/src/test/java/oracle/weblogic/kubernetes/ItWlsDomainOnPV.java @@ -66,6 +66,7 @@ @Tag("kind-parallel") @Tag("olcne-mrg") @Tag("oke-parallel") +@Tag("okd-wls-mrg") class ItWlsDomainOnPV { private static String domainNamespace = null; From 8a0572aeba6b678d6be8bfb6dbbd26cf274b2202 Mon Sep 17 00:00:00 2001 From: maggie_he Date: Thu, 12 Jun 2025 17:30:16 +0000 Subject: [PATCH 09/20] Add test classes to the profile of the test run on openshift --- integration-tests/pom.xml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/integration-tests/pom.xml b/integration-tests/pom.xml index 3ac1c089277..21cf4d78010 100644 --- a/integration-tests/pom.xml +++ b/integration-tests/pom.xml @@ -572,11 +572,14 @@ **/ItDedicatedMode, **/ItExternalLbTunneling, **/ItExternalNodePortService, + **/ItEvictedPodsCycling, **/ItInitContainers, **/ItIntrospectVersion, + **/ItKubernetesNameSpaceWatchingEvents, **/ItLiftAndShiftFromOnPremDomain, **/ItLivenessProbeCustomization, **/ItManagedCoherence, + **/ItMaxConcurOptions, **/ItMiiDynamicUpdate*, **/ItMiiCustomSslStore, **/ItMiiSampleWlsAux, @@ -586,6 +589,7 @@ **/ItPodTemplates, **/ItProductionSecureMode, **/ItRemoteConsole, + **/ItRetryImprovementMisc, **/ItServerStartPolicy, **/ItServiceStartPolicyDynamicCluster, **/ItServerStartPolicyConfigCluster, @@ -594,7 +598,8 @@ **/ItSystemResOverrides, **/ItMonitoringExporterWebApp, **/ItMonitoringExporterSideCar, - **/ItMonitoringExporterSamples + **/ItMonitoringExporterSamples, + **/ItWlsDomainOnPV From 0b5b2c42fa3eb98f4376208c8a04f04516b4d395 Mon Sep 17 00:00:00 2001 From: Ryan Eberhard Date: Tue, 17 Jun 2025 17:30:56 -0400 Subject: [PATCH 10/20] Dependency updates --- pom.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/pom.xml b/pom.xml index a354805e6af..5958be0752b 100644 --- a/pom.xml +++ b/pom.xml @@ -693,7 +693,7 @@ 21 [3.8.1,) 3.5.0 - 3.4.1 + 3.5.0 3.14.0 3.1.4 3.1.4 @@ -707,8 +707,8 @@ 3.5.3 3.8.1 3.6.0 - 3.5.0 - 10.24.0 + 3.5.1 + 10.25.0 1.0 3.6.0 3.2.7 @@ -734,9 +734,9 @@ 3.0.1u2 2.1.21 4.12.0 - 3.11.0 + 3.13.0 1.80 - 5.12.2 + 5.13.0 5.7.1 1.7.0 1.3.2 @@ -753,7 +753,7 @@ 12.1.1 2.0.17 1.5.18 - 4.31.0 + 4.31.1 2.5.2 10.3 ${project.basedir}/src-generated-swagger From b236d39f481f5b513ea1fc8124b9f2c006b9c9cf Mon Sep 17 00:00:00 2001 From: Ryan Eberhard Date: Tue, 17 Jun 2025 17:44:15 -0400 Subject: [PATCH 11/20] Dependency updates --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 5958be0752b..3bd106ce7d2 100644 --- a/pom.xml +++ b/pom.xml @@ -736,7 +736,7 @@ 4.12.0 3.13.0 1.80 - 5.13.0 + 5.13.1 5.7.1 1.7.0 1.3.2 From 27fd75cd30e95cd7c6ab1fb74b7427a8835ee0f0 Mon Sep 17 00:00:00 2001 From: huiling_zhao Date: Wed, 18 Jun 2025 14:23:55 +0000 Subject: [PATCH 12/20] [wko-nightly] [4.2] [intermittent] ItServerStartPolicyConfigCluster fails --- .../ItServerStartPolicyConfigCluster.java | 18 ++++++---- .../utils/ServerStartPolicyUtils.java | 35 ++++++++++++++++--- 2 files changed, 42 insertions(+), 11 deletions(-) diff --git a/integration-tests/src/test/java/oracle/weblogic/kubernetes/ItServerStartPolicyConfigCluster.java b/integration-tests/src/test/java/oracle/weblogic/kubernetes/ItServerStartPolicyConfigCluster.java index ea9059db73e..f5a1b9b3ae9 100644 --- a/integration-tests/src/test/java/oracle/weblogic/kubernetes/ItServerStartPolicyConfigCluster.java +++ b/integration-tests/src/test/java/oracle/weblogic/kubernetes/ItServerStartPolicyConfigCluster.java @@ -23,6 +23,8 @@ import static oracle.weblogic.kubernetes.assertions.TestAssertions.isPodRestarted; import static oracle.weblogic.kubernetes.utils.CommonTestUtils.checkClusterReplicaCountMatches; import static oracle.weblogic.kubernetes.utils.CommonTestUtils.checkPodReadyAndServiceExists; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.testUntil; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.withLongRetryPolicy; import static oracle.weblogic.kubernetes.utils.PatchDomainUtils.patchServerStartPolicy; import static oracle.weblogic.kubernetes.utils.PodUtils.checkIsPodRestarted; import static oracle.weblogic.kubernetes.utils.PodUtils.checkPodDeleted; @@ -42,6 +44,7 @@ import static oracle.weblogic.kubernetes.utils.ServerStartPolicyUtils.STOP_SERVER_SCRIPT; import static oracle.weblogic.kubernetes.utils.ServerStartPolicyUtils.checkManagedServerConfiguration; import static oracle.weblogic.kubernetes.utils.ServerStartPolicyUtils.executeLifecycleScript; +import static oracle.weblogic.kubernetes.utils.ServerStartPolicyUtils.isManagedServerConfiguration; import static oracle.weblogic.kubernetes.utils.ServerStartPolicyUtils.managedServerNamePrefix; import static oracle.weblogic.kubernetes.utils.ServerStartPolicyUtils.prepare; import static oracle.weblogic.kubernetes.utils.ServerStartPolicyUtils.restoreEnv; @@ -125,14 +128,15 @@ public void beforeEach() { // Check configured cluster configuration is available String configServerPodName = domainUid + "-config-cluster-server1"; - checkPodReadyAndServiceExists(configServerPodName, - domainUid, domainNamespace); - boolean isServerConfigured = - checkManagedServerConfiguration("config-cluster-server1", domainNamespace, adminServerPodName); - assertTrue(isServerConfigured, - "Could not find managed server from configured cluster"); + checkPodReadyAndServiceExists(configServerPodName, domainUid, domainNamespace); + + testUntil( + withLongRetryPolicy, + isManagedServerConfiguration("config-cluster-server1", domainNamespace, adminServerPodName), + logger, + "Waiting until managed server from configured cluster found"); + logger.info("Found managed server from configured cluster"); - } /** diff --git a/integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/ServerStartPolicyUtils.java b/integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/ServerStartPolicyUtils.java index b9d196e4b3e..37becace50c 100644 --- a/integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/ServerStartPolicyUtils.java +++ b/integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/ServerStartPolicyUtils.java @@ -24,6 +24,7 @@ import oracle.weblogic.domain.DomainSpec; import oracle.weblogic.domain.ManagedServer; import oracle.weblogic.domain.Model; +import oracle.weblogic.domain.ProbeTuning; import oracle.weblogic.domain.ServerPod; import oracle.weblogic.kubernetes.actions.impl.primitive.Command; import oracle.weblogic.kubernetes.actions.impl.primitive.CommandParams; @@ -218,7 +219,7 @@ public static void createDomainResource( String encryptionSecretName, String configmapName) { List securityList = new ArrayList<>(); - + // create the domain CR DomainResource domain = new DomainResource() .apiVersion(DOMAIN_API_VERSION) @@ -240,10 +241,21 @@ public static void createDomainResource( .serverPod(new ServerPod() .addEnvItem(new V1EnvVar() .name("JAVA_OPTIONS") - .value("-Dweblogic.StdoutDebugEnabled=false")) + .value("-Dweblogic.security.SSL.ignoreHostnameVerification=true -Xms1024m -Xmx1024m")) .addEnvItem(new V1EnvVar() .name("USER_MEM_ARGS") - .value("-Djava.security.egd=file:/dev/./urandom "))) + .value("-Djava.security.egd=file:/dev/./urandom ")) + .addEnvItem(new V1EnvVar() + .name("MEM_ARGS") + .value("-Xms1024m -Xmx1024m")) + .livenessProbe(new ProbeTuning() + .initialDelaySeconds(300) + .periodSeconds(30) + .failureThreshold(3)) + .readinessProbe(new ProbeTuning() + .initialDelaySeconds(300) + .periodSeconds(30) + .failureThreshold(3))) .adminServer(new AdminServer() .adminService(new AdminService() .addChannelsItem(new Channel() @@ -286,6 +298,21 @@ public static void createDomainResource( + "for %s in namespace %s", domainUid, domNamespace)); } + /** + * Verify the server MBEAN configuration through rest API. + * @param managedServer name of the managed server + * @param domainNamespace domain namespace + * @param adminServerPodName name of the admin server + * @return true if MBEAN is found otherwise false + **/ + public static Callable isManagedServerConfiguration(String managedServer, + String domainNamespace, + String adminServerPodName) { + return () -> { + return checkManagedServerConfiguration(managedServer, domainNamespace, adminServerPodName); + }; + } + /** * Verify the server MBEAN configuration through rest API. * @param managedServer name of the managed server @@ -297,7 +324,7 @@ public static boolean checkManagedServerConfiguration(String managedServer, StringBuffer checkCluster = new StringBuffer(KUBERNETES_CLI + " exec -n " + domainNamespace + " " + adminServerPodName) .append(" -- /bin/bash -c \"") - .append("curl --user ") + .append("curl --connect-timeout 10 --max-time 20 --user ") .append(ADMIN_USERNAME_DEFAULT + ":" + ADMIN_PASSWORD_DEFAULT) .append(" http://" + adminServerPodName + ":7001") .append("/management/tenant-monitoring/servers/") From affffc8c585826098bf8d5cbaecd6447d52135d8 Mon Sep 17 00:00:00 2001 From: jshum Date: Mon, 23 Jun 2025 10:19:46 -0500 Subject: [PATCH 13/20] fix introspector initContainer not added for legacy domain on pv. --- .../operator/helpers/JobStepContext.java | 28 +++++++++++-------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/operator/src/main/java/oracle/kubernetes/operator/helpers/JobStepContext.java b/operator/src/main/java/oracle/kubernetes/operator/helpers/JobStepContext.java index 12313e8971b..4f1db19cab8 100644 --- a/operator/src/main/java/oracle/kubernetes/operator/helpers/JobStepContext.java +++ b/operator/src/main/java/oracle/kubernetes/operator/helpers/JobStepContext.java @@ -473,22 +473,28 @@ protected void addInitContainers(V1PodSpec podSpec) { getInitializeDomainOnPV().ifPresent(initializeDomainOnPV -> addInitDomainOnPVInitContainer(initContainers)); Optional.ofNullable(getAuxiliaryImages()).ifPresent(auxImages -> addInitContainers(initContainers, auxImages)); Optional.ofNullable(getDomainCreationImages()).ifPresent(dcrImages -> addInitContainers(initContainers, dcrImages)); - initContainers.addAll(getAdditionalInitContainers().stream() - .filter(container -> isAllowedInIntrospector(container.getName())) - .map(c -> c.env(createEnv(c)).envFrom(c.getEnvFrom()).resources(createResources())) - .toList()); + List introspectorInitContainers = getIntrospectorInitContainers(); + if (introspectorInitContainers.isEmpty()) { + initContainers.addAll(getAdditionalInitContainers().stream() + .filter(container -> isAllowedInIntrospector(container.getName())) + .map(c -> c.env(createEnv(c)).envFrom(c.getEnvFrom()).resources(createResources())) + .toList()); + } else { + for (V1Container initContainer : introspectorInitContainers) { + if (initContainers.stream().noneMatch( + container -> container.getName().equals(initContainer.getName()))) { + initContainer.securityContext(getInitContainerSecurityContext()); + initContainers.add(initContainer); + } + } + } podSpec.initContainers(initContainers); } private void addInitContainers(List initContainers, List auxiliaryImages) { IntStream.range(0, auxiliaryImages.size()).forEach(idx -> - initContainers.add(createInitContainerForAuxiliaryImage(auxiliaryImages.get(idx), idx, - isInitializeDomainOnPV()))); - List introspectorInitContainers = getIntrospectorInitContainers(); - for (V1Container initContainer : introspectorInitContainers) { - initContainer.securityContext(getInitContainerSecurityContext()); - initContainers.add(initContainer); - } + initContainers.add(createInitContainerForAuxiliaryImage(auxiliaryImages.get(idx), idx, + isInitializeDomainOnPV()))); } private Optional getInitializeDomainOnPV() { From 00dedb239f4a652eeba4c99a6862e88df98d7aa0 Mon Sep 17 00:00:00 2001 From: johnny_shum Date: Wed, 25 Jun 2025 20:19:15 +0000 Subject: [PATCH 14/20] Add support for persisting log files in WKO. --- deployment/scripts/logstash.properties | 2 +- deployment/scripts/operator.sh | 3 +- deployment/scripts/webhook.sh | 3 +- .../templates/_operator-dep.tpl | 45 ++++++++++++++++++- .../charts/weblogic-operator/values.yaml | 10 +++++ 5 files changed, 58 insertions(+), 5 deletions(-) diff --git a/deployment/scripts/logstash.properties b/deployment/scripts/logstash.properties index 545c5ac3588..6ace92dbf5b 100644 --- a/deployment/scripts/logstash.properties +++ b/deployment/scripts/logstash.properties @@ -5,6 +5,6 @@ java.util.logging.ConsoleHandler.level=INFO java.util.logging.ConsoleHandler.formatter=oracle.kubernetes.operator.logging.OperatorLoggingFormatter java.util.logging.FileHandler.level=INFO java.util.logging.FileHandler.formatter=oracle.kubernetes.operator.logging.OperatorLoggingFormatter -java.util.logging.FileHandler.pattern=/logs/operator%g.log +java.util.logging.FileHandler.pattern=LOGGING_DIR/operator%g.log java.util.logging.FileHandler.limit=JAVA_LOGGING_MAXSIZE java.util.logging.FileHandler.count=JAVA_LOGGING_COUNT \ No newline at end of file diff --git a/deployment/scripts/operator.sh b/deployment/scripts/operator.sh index 0df633fbb3a..9faffdba85f 100755 --- a/deployment/scripts/operator.sh +++ b/deployment/scripts/operator.sh @@ -70,13 +70,14 @@ fi sed -i -e "s|JAVA_LOGGING_MAXSIZE|${JAVA_LOGGING_MAXSIZE:-20000000}|g" $LOGGING_CONFIG sed -i -e "s|JAVA_LOGGING_COUNT|${JAVA_LOGGING_COUNT:-10}|g" $LOGGING_CONFIG +sed -i -e "s|LOGGING_DIR|${OPERATOR_LOGDIR:-/logs}|g" $LOGGING_CONFIG if [ "${MOCK_WLS}" == 'true' ]; then MOCKING_WLS="-DmockWLS=true" fi LOGGING="-Djava.util.logging.config.file=${LOGGING_CONFIG}" -mkdir -m 777 -p /logs +mkdir -m 777 -p ${OPERATOR_LOGDIR:-/logs} # assumption is that we have mounted a volume on /logs which is also visible to # the logstash container/pod. diff --git a/deployment/scripts/webhook.sh b/deployment/scripts/webhook.sh index 29722030225..059654ad4ec 100755 --- a/deployment/scripts/webhook.sh +++ b/deployment/scripts/webhook.sh @@ -66,11 +66,12 @@ fi sed -i -e "s|JAVA_LOGGING_MAXSIZE|${JAVA_LOGGING_MAXSIZE:-20000000}|g" $LOGGING_CONFIG sed -i -e "s|JAVA_LOGGING_COUNT|${JAVA_LOGGING_COUNT:-10}|g" $LOGGING_CONFIG +sed -i -e "s|LOGGING_DIR|${OPERATOR_LOGDIR:-/logs}|g" $LOGGING_CONFIG LOGGING="-Djava.util.logging.config.file=${LOGGING_CONFIG}" # assumption is that we have mounted a volume on /logs which is also visible to # the logstash container/pod. -mkdir -m 777 -p /logs +mkdir -m 777 -p ${OPERATOR_LOGDIR:-/logs} # Container memory optimization flags HEAP="-XshowSettings:vm" diff --git a/kubernetes/charts/weblogic-operator/templates/_operator-dep.tpl b/kubernetes/charts/weblogic-operator/templates/_operator-dep.tpl index 32363131213..797ae571868 100644 --- a/kubernetes/charts/weblogic-operator/templates/_operator-dep.tpl +++ b/kubernetes/charts/weblogic-operator/templates/_operator-dep.tpl @@ -2,6 +2,7 @@ # Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. {{- define "operator.operatorDeployment" }} + --- {{- if not .webhookOnly }} apiVersion: "apps/v1" @@ -91,6 +92,13 @@ spec: value: {{ .javaLoggingFileCount | default 10 | quote }} - name: "JVM_OPTIONS" value: {{ .jvmOptions | default "-XshowSettings:vm -XX:MaxRAMPercentage=70" | quote }} + {{- if and .operatorLogDir .operatorLogMount }} + {{- if not (hasPrefix (toString .operatorLogMount) (toString .operatorLogDir)) }} + {{- fail (printf "Error: Invalid Configuration: operatorLogDir %s must start with operatorlogMount %s" .operatorLogDir .operatorLogMount) }} + {{- end }} + - name: "OPERATOR_LOGDIR" + value: {{ .operatorLogDir | quote }} + {{- end }} {{- if .remoteDebugNodePortEnabled }} - name: "REMOTE_DEBUG_PORT" value: {{ .internalDebugHttpPort | quote }} @@ -133,10 +141,16 @@ spec: - name: "weblogic-operator-secrets-volume" mountPath: "/deployment/secrets" readOnly: true - {{- if .elkIntegrationEnabled }} + {{- if and .elkIntegrationEnabled .operatorLogPVC }} + {{- fail "Error: elkIntegrationEnabled and opeatorLogPVC cannot be set at the same time."}} + {{- else if .elkIntegrationEnabled }} - mountPath: "/logs" name: "log-dir" readOnly: false + {{- else if .operatorLogPVC }} + - mountPath: {{ .operatorLogMount | quote }} + name: "log-dir" + readOnly: false {{- end }} {{- if not .remoteDebugNodePortEnabled }} livenessProbe: @@ -207,6 +221,13 @@ spec: secret: secretName: "logstash-certs-secret" optional: true + {{- else if .operatorLogPVC }} + {{- if not (and .operatorLogMount .operatorLogDir) }} + {{- fail "Must provide operatorLogMount and operatorLogDir when using operatorLogPVC" }} + {{- end }} + - name: "log-dir" + persistentVolumeClaim: + claimName: {{ .operatorLogPVC }} {{- end }} {{- end }} --- @@ -318,6 +339,13 @@ spec: value: {{ int64 .javaLoggingFileSizeLimit | default 20000000 | quote }} - name: "JAVA_LOGGING_COUNT" value: {{ .javaLoggingFileCount | default 10 | quote }} + {{- if and .operatorLogDir .operatorLogMount }} + {{- if not (hasPrefix (toString .operatorLogMount) (toString .operatorLogDir)) }} + {{- fail (printf "Error: Invalid Configuration: operatorLogDir %s must start with operatorlogMount %s" .operatorLogDir .operatorLogMount) }} + {{- end }} + - name: "OPERATOR_LOGDIR" + value: {{ .operatorLogDir | quote }} + {{- end }} {{- if .remoteDebugNodePortEnabled }} - name: "REMOTE_DEBUG_PORT" value: {{ .webhookDebugHttpPort | quote }} @@ -354,10 +382,16 @@ spec: - name: "weblogic-webhook-secrets-volume" mountPath: "/deployment/secrets" readOnly: true - {{- if .elkIntegrationEnabled }} + {{- if and .elkIntegrationEnabled .operatorLogPVC }} + {{- fail "Error: elkIntegrationEnabled and opeatorLogPVC cannot be set at the same time."}} + {{- else if .elkIntegrationEnabled }} - mountPath: "/logs" name: "log-dir" readOnly: false + {{- else if .operatorLogPVC }} + - mountPath: {{ .operatorLogMount | quote }} + name: "log-dir" + readOnly: false {{- end }} {{- if not .remoteDebugNodePortEnabled }} livenessProbe: @@ -423,6 +457,13 @@ spec: secret: secretName: "logstash-certs-secret" optional: true + {{- else if .operatorLogPVC }} + {{- if not (and .operatorLogMount .operatorLogDir) }} + {{- fail "Must provide operatorLogMount and operatorLogDir when using operatorLogPVC" }} + {{- end }} + - name: "log-dir" + persistentVolumeClaim: + claimName: {{ .operatorLogPVC }} {{- end }} {{- end }} {{- end }} diff --git a/kubernetes/charts/weblogic-operator/values.yaml b/kubernetes/charts/weblogic-operator/values.yaml index 4ea032a1707..2ae38f008f4 100644 --- a/kubernetes/charts/weblogic-operator/values.yaml +++ b/kubernetes/charts/weblogic-operator/values.yaml @@ -278,3 +278,13 @@ clusterSizePaddingValidationEnabled: true # that will be allocated. #jvmOptions: -XshowSettings:vm -XX:MaxRAMPercentage=70 +# operatorLogPVC specifies the PVC name for persistent storage for operator log files. You must also specify +# operatorLogDir and operatorLogMount +#operatorLogPVC: + +# operatorLogDir specifies the operator logging directory. The operator will create the directory but the default uid +# (oracle:1000) must have permission to do so. It must be prefixed by operatorLogMount. +#operatorLogDir: + +# operatorLogMount specifies the operator logging volumeMount. The operator will mount this path with the operatorLogPVC +#operatorLogMount: From d979e91b5c4afc59232ce8c87327f15de1b858fb Mon Sep 17 00:00:00 2001 From: Ryan Eberhard Date: Thu, 26 Jun 2025 14:35:36 -0400 Subject: [PATCH 15/20] Dependency updates --- pom.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pom.xml b/pom.xml index 3bd106ce7d2..c11c9503093 100644 --- a/pom.xml +++ b/pom.xml @@ -725,7 +725,7 @@ 0.1.0 2.9.0 0.9.6 - 3.6.0 + 3.6.1 1.0.0 3.27.3 2.19.0 @@ -735,7 +735,7 @@ 2.1.21 4.12.0 3.13.0 - 1.80 + 1.81 5.13.1 5.7.1 1.7.0 @@ -746,11 +746,11 @@ 4.0.2 6.1.0 0.16.0 - 2.19.0 - 2.19.0 + 2.19.1 + 2.19.1 2.4 2.13.1 - 12.1.1 + 12.1.3 2.0.17 1.5.18 4.31.1 From e860c2b00b606b312a96ec336593363a0c37c8d8 Mon Sep 17 00:00:00 2001 From: "MARINA.KOGAN" Date: Fri, 27 Jun 2025 14:07:12 +0000 Subject: [PATCH 16/20] OWLS-130383 - OKE cluster creation via terraform failed, due changes in okemodule, need to update to newest version of oracle-terraform-modules/oke/oci, updated k8s to 1.33.1 for OKE cluster --- Jenkinsfile.oke | 7 +- .../resources/oke/terraform/okemodule/c1.tf | 9 +- .../oke/terraform/okemodule/template.tfvars | 108 ++++++++++-------- .../oke/terraform/okemodule/variables.tf | 1 + .../oke/terraform/okemodule/versions.tf | 7 +- 5 files changed, 75 insertions(+), 57 deletions(-) diff --git a/Jenkinsfile.oke b/Jenkinsfile.oke index 3392565b205..318f18c0ec7 100644 --- a/Jenkinsfile.oke +++ b/Jenkinsfile.oke @@ -83,14 +83,15 @@ pipeline { string(name: 'OKE_KUBE_VERSION', description: 'kube version for oke cluster', - defaultValue: '1.32.1' + defaultValue: '1.33.1' ) string(name: 'IMAGE_ID', description: 'oci image id for node pool, find image OCID for your region from https://docs.oracle.com/iaas/images/', //defaultValue OKE1.26.2: 'ocid1.image.oc1.phx.aaaaaaaaaizmtmozeudeeuq7o5ir7dkl2bkxbbb3tgomshqbqn6jpomrsjza' //1.27.2 oke defaultValue: 'ocid1.image.oc1.phx.aaaaaaaaypr5r5drojwytghw6e6mvpjsscrnkuwtmqlmvmix7kjb2zcnc7wa' //1.29.1 'ocid1.image.oc1.phx.aaaaaaaa22u45gr3ikxnc6rius2qil2kz5k3e7p476c4usr6qnvql4l5dxea' - defaultValue: 'ocid1.image.oc1.phx.aaaaaaaak36p3gcd7m5fypfs5j5flxaqxykon4dkjqd3j45zkq57cq52ovoq' + //defaultValue: 'ocid1.image.oc1.phx.aaaaaaaak36p3gcd7m5fypfs5j5flxaqxykon4dkjqd3j45zkq57cq52ovoq' + defaultValue: 'ocid1.image.oc1.phx.aaaaaaaa6fbid3anokvq3rjxt22globuvoi4j6adgbyroehadb4tc4tb6b2a' ) string(name: 'KUBECTL_VERSION', @@ -145,7 +146,7 @@ pipeline { ) string(name: 'NODE_SHAPE', description: '', - defaultValue: "VM.Standard.E5.Flex" + defaultValue: "VM.Standard.E3.Flex" ) string(name: 'MOUNT_TARGET_OCID', description: 'only for debug runs on wko-oke-dev', diff --git a/integration-tests/src/test/resources/oke/terraform/okemodule/c1.tf b/integration-tests/src/test/resources/oke/terraform/okemodule/c1.tf index ec0cbc6f86e..260e1df2566 100644 --- a/integration-tests/src/test/resources/oke/terraform/okemodule/c1.tf +++ b/integration-tests/src/test/resources/oke/terraform/okemodule/c1.tf @@ -93,12 +93,12 @@ locals { module "c1" { source = "oracle-terraform-modules/oke/oci" - version = "5.1.1" + version = "5.3.0" count = lookup(lookup(var.clusters, "c1"), "enabled") ? 1 : 0 home_region = lookup(local.regions, var.home_region) - + #region = lookup(local.regions, lookup(lookup(var.clusters, "c1"), "region")) region = lookup(local.regions, var.home_region) @@ -137,7 +137,7 @@ module "c1" { create_bastion = true # *true/false bastion_allowed_cidrs = [] # e.g. ["0.0.0.0/0"] to allow traffic from all sources bastion_availability_domain = null # Defaults to first available - bastion_image_id = null # Ignored when + bastion_image_id = null # Ignored when bastion_image_os = "Oracle Linux" # Ignored when bastion_image_type = "custom" bastion_image_os_version = "8" # Ignored when bastion_image_type = "custom" bastion_image_type = "platform" # platform/custom @@ -168,6 +168,7 @@ module "c1" { cluster_name = var.cluster_name cluster_type = var.cluster_type cni_type = var.preferred_cni + assign_public_ip_to_control_plane = true control_plane_is_public = true control_plane_allowed_cidrs = [local.anywhere] kubernetes_version = var.kubernetes_version @@ -197,6 +198,6 @@ module "c1" { resource "local_file" "test_kube_config_file" { - content = data.oci_containerengine_cluster_kube_config.kube_config.content + content = data.oci_containerengine_cluster_kube_config.kube_config.content filename = "${path.module}/${var.cluster_name}_kubeconfig" } diff --git a/integration-tests/src/test/resources/oke/terraform/okemodule/template.tfvars b/integration-tests/src/test/resources/oke/terraform/okemodule/template.tfvars index c9ec27a4094..222cc15d15c 100755 --- a/integration-tests/src/test/resources/oke/terraform/okemodule/template.tfvars +++ b/integration-tests/src/test/resources/oke/terraform/okemodule/template.tfvars @@ -1,56 +1,66 @@ # Copyright (c) 2024, Oracle and/or its affiliates. # Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. -# Template to generate TF variables file for cluster creation from property file oci.props -# -# User-specific vars - you can get these easily from the OCI console from your user page -# - -# provider - api_fingerprint = "@OCIAPIPUBKEYFINGERPRINT@" -# - api_private_key_path = "@OCIPRIVATEKEYPATH@" -# - home_region = "phoenix" # Use short form e.g. ashburn from location column https://docs.oracle.com/en-us/iaas/Content/General/Concepts/regions.htm -# - tenancy_id = "@TENANCYOCID@" -# - user_id = "@USEROCID@" -# - cluster_name="@OKECLUSTERNAME@" - compartment_id = "@COMPOCID@" - vcn_id = "@VCNOCID@" - control_plane_subnet_id = "@PUBSUBNETOCID@" - pub_lb_id = "@PUBSUBNETOCID@" - worker_subnet_id = "@PRIVATESUBNETOCID@" - -#MountTarget -mount_target_ocid="@MOUNTTARGETOCID@" -# -# # ssh - ssh_private_key_path = "@NODEPOOLSSHPK@" - ssh_public_key_path = "@NODEPOOLSSHPUBKEY@" -# -# # clusters -# ## For regions, # Use short form e.g. ashburn from location column https://docs.oracle.com/en-us/iaas/Content/General/Concepts/regions.htm -# ## VCN, Pods and services clusters must not overlap with each other and with those of other clusters. - clusters = { - c1 = { region = "@REGIONSHORT@", vcn = "10.1.0.0/16", pods = "10.201.0.0/16", services = "10.101.0.0/16", enabled = true } - } -# - kubernetes_version = "@OKEK8SVERSION@" -# - cluster_type = "basic" -# - oke_control_plane = "public" - node_shape = "@NODEPOOLSHAPE@" +# ============================================ +# User-specific provider configuration +# ============================================ + +api_fingerprint = "@OCIAPIPUBKEYFINGERPRINT@" +api_private_key_path = "@OCIPRIVATEKEYPATH@" +home_region = "phoenix" +tenancy_id = "@TENANCYOCID@" +user_id = "@USEROCID@" + +# ============================================ +# OKE Cluster configuration +# ============================================ + +cluster_name = "@OKECLUSTERNAME@" +compartment_id = "@COMPOCID@" +vcn_id = "@VCNOCID@" +control_plane_subnet_id = "@PUBSUBNETOCID@" +pub_lb_id = "@PUBSUBNETOCID@" +worker_subnet_id = "@PRIVATESUBNETOCID@" +mount_target_ocid = "@MOUNTTARGETOCID@" + +# SSH keys for node access +ssh_private_key_path = "@NODEPOOLSSHPK@" +ssh_public_key_path = "@NODEPOOLSSHPUBKEY@" + +# ============================================ +# Cluster network and CIDRs +# ============================================ + +clusters = { + c1 = { + region = "@REGIONSHORT@" + vcn = "10.1.0.0/16" + pods = "10.201.0.0/16" + services = "10.101.0.0/16" + enabled = true + } +} + +# ============================================ +# General cluster parameters +# ============================================ + +kubernetes_version = "@OKEK8SVERSION@" +cluster_type = "basic" +oke_control_plane = "public" +assign_public_ip_to_control_plane = true +node_shape = "@NODEPOOLSHAPE@" + +# ============================================ +# Node pool definition +# ============================================ + nodepools = { np1 = { - shape = "@NODEPOOLSHAPE@", - ocpus = 2, - memory = 64, - size = 2, - boot_volume_size = 150, + shape = "@NODEPOOLSHAPE@" + ocpus = 2 + memory = 64 + size = 2 + boot_volume_size = 150 } } - diff --git a/integration-tests/src/test/resources/oke/terraform/okemodule/variables.tf b/integration-tests/src/test/resources/oke/terraform/okemodule/variables.tf index 2553a2576b6..d9c9e133c77 100644 --- a/integration-tests/src/test/resources/oke/terraform/okemodule/variables.tf +++ b/integration-tests/src/test/resources/oke/terraform/okemodule/variables.tf @@ -184,3 +184,4 @@ variable "cluster_ca_cert" { } + diff --git a/integration-tests/src/test/resources/oke/terraform/okemodule/versions.tf b/integration-tests/src/test/resources/oke/terraform/okemodule/versions.tf index 1a71edf600b..b4f4deffcb8 100644 --- a/integration-tests/src/test/resources/oke/terraform/okemodule/versions.tf +++ b/integration-tests/src/test/resources/oke/terraform/okemodule/versions.tf @@ -7,6 +7,11 @@ terraform { oci = { source = "oracle/oci" } + helm = { + source = "hashicorp/helm" + version = ">= 2.7.1" + } } - required_version = ">= 1.0.0" + required_version = ">= 1.1.0" } + From ac98e748be99e3e195fadb0ba8f6ae764568d11e Mon Sep 17 00:00:00 2001 From: Ryan Eberhard Date: Fri, 27 Jun 2025 15:25:23 -0400 Subject: [PATCH 17/20] Dependency updates --- operator-build-maven-plugin/pom.xml | 2 +- pom.xml | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/operator-build-maven-plugin/pom.xml b/operator-build-maven-plugin/pom.xml index 8d6d3aac24f..788bc44824c 100644 --- a/operator-build-maven-plugin/pom.xml +++ b/operator-build-maven-plugin/pom.xml @@ -24,7 +24,7 @@ org.apache.maven maven-plugin-api - 3.9.9 + 3.9.10 provided diff --git a/pom.xml b/pom.xml index c11c9503093..9cd35892e18 100644 --- a/pom.xml +++ b/pom.xml @@ -708,7 +708,7 @@ 3.8.1 3.6.0 3.5.1 - 10.25.0 + 10.26.0 1.0 3.6.0 3.2.7 @@ -732,11 +732,11 @@ 4.3.0 19.0.2 3.0.1u2 - 2.1.21 + 2.2.0 4.12.0 3.13.0 1.81 - 5.13.1 + 5.13.2 5.7.1 1.7.0 1.3.2 From 8df28dc3b4d542c99fa401f410d41069a9d55b6f Mon Sep 17 00:00:00 2001 From: Ryan Eberhard Date: Fri, 27 Jun 2025 15:40:56 -0400 Subject: [PATCH 18/20] Use WME 2.3.2 --- documentation/domains/Domain.json | 4 ++-- documentation/domains/Domain.md | 2 +- kubernetes/crd/domain-crd.yaml | 6 +++--- .../oracle/kubernetes/operator/KubernetesConstants.java | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/documentation/domains/Domain.json b/documentation/domains/Domain.json index 9047d93540f..f58f63abd0f 100644 --- a/documentation/domains/Domain.json +++ b/documentation/domains/Domain.json @@ -891,8 +891,8 @@ "type": "object", "properties": { "image": { - "default": "ghcr.io/oracle/weblogic-monitoring-exporter:2.3.0", - "description": "The WebLogic Monitoring Exporter sidecar container image name. Defaults to ghcr.io/oracle/weblogic-monitoring-exporter:2.3.0", + "default": "ghcr.io/oracle/weblogic-monitoring-exporter:2.3.2", + "description": "The WebLogic Monitoring Exporter sidecar container image name. Defaults to ghcr.io/oracle/weblogic-monitoring-exporter:2.3.2", "type": "string" }, "imagePullPolicy": { diff --git a/documentation/domains/Domain.md b/documentation/domains/Domain.md index b931258e0a1..5a4720f0d8d 100644 --- a/documentation/domains/Domain.md +++ b/documentation/domains/Domain.md @@ -145,7 +145,7 @@ The current status of the operation of the WebLogic domain. Updated automaticall | Name | Type | Description | | --- | --- | --- | | `configuration` | Map | The configuration for the WebLogic Monitoring Exporter. If WebLogic Server instances are already running and have the monitoring exporter sidecar container, then changes to this field will be propagated to the exporter without requiring the restart of the WebLogic Server instances. | -| `image` | string | The WebLogic Monitoring Exporter sidecar container image name. Defaults to ghcr.io/oracle/weblogic-monitoring-exporter:2.3.0 | +| `image` | string | The WebLogic Monitoring Exporter sidecar container image name. Defaults to ghcr.io/oracle/weblogic-monitoring-exporter:2.3.2 | | `imagePullPolicy` | string | The image pull policy for the WebLogic Monitoring Exporter sidecar container image. Legal values are Always, Never, and IfNotPresent. Defaults to Always if image ends in :latest; IfNotPresent, otherwise. | | `port` | integer | The port exposed by the WebLogic Monitoring Exporter running in the sidecar container. Defaults to 8080. The port value must not conflict with a port used by any WebLogic Server instance, including the ports of built-in channels or network access points (NAPs). | | `resources` | [Resource Requirements](k8s1.28.2.md#resource-requirements) | Memory and CPU minimum requirements and limits for the Monitoring exporter sidecar. See `kubectl explain pods.spec.containers.resources`. | diff --git a/kubernetes/crd/domain-crd.yaml b/kubernetes/crd/domain-crd.yaml index cb69327ca2a..8a9e0ee8d66 100644 --- a/kubernetes/crd/domain-crd.yaml +++ b/kubernetes/crd/domain-crd.yaml @@ -5,7 +5,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - weblogic.sha256: d5781dca31795f836ae89e7139d88fce344b88395f61659d8c7c912467c70a98 + weblogic.sha256: b793961c174a30db8c360bc83cf40e214d5458ec61a963d6756c4fa38e0af449 name: domains.weblogic.oracle spec: group: weblogic.oracle @@ -47,9 +47,9 @@ spec: appropriate. See https://github.com/oracle/weblogic-monitoring-exporter. properties: image: - default: ghcr.io/oracle/weblogic-monitoring-exporter:2.3.0 + default: ghcr.io/oracle/weblogic-monitoring-exporter:2.3.2 description: The WebLogic Monitoring Exporter sidecar container - image name. Defaults to ghcr.io/oracle/weblogic-monitoring-exporter:2.3.0 + image name. Defaults to ghcr.io/oracle/weblogic-monitoring-exporter:2.3.2 type: string imagePullPolicy: description: The image pull policy for the WebLogic Monitoring diff --git a/operator/src/main/java/oracle/kubernetes/operator/KubernetesConstants.java b/operator/src/main/java/oracle/kubernetes/operator/KubernetesConstants.java index e3a0c3c6ba4..274af80e4b1 100644 --- a/operator/src/main/java/oracle/kubernetes/operator/KubernetesConstants.java +++ b/operator/src/main/java/oracle/kubernetes/operator/KubernetesConstants.java @@ -8,7 +8,7 @@ /** Kubernetes constants. */ public interface KubernetesConstants { String DEFAULT_IMAGE = "container-registry.oracle.com/middleware/weblogic:12.2.1.4"; - String DEFAULT_EXPORTER_IMAGE = "ghcr.io/oracle/weblogic-monitoring-exporter:2.3.0"; + String DEFAULT_EXPORTER_IMAGE = "ghcr.io/oracle/weblogic-monitoring-exporter:2.3.2"; String DEFAULT_FLUENTD_IMAGE = "fluent/fluentd-kubernetes-daemonset:v1.16.1-debian-elasticsearch7-1.2"; String EXPORTER_CONTAINER_NAME = "monitoring-exporter"; String LATEST_IMAGE_SUFFIX = ":latest"; From c960c12139f66babefdd0b3aba2b70326114728e Mon Sep 17 00:00:00 2001 From: Ryan Eberhard Date: Mon, 30 Jun 2025 07:13:41 -0400 Subject: [PATCH 19/20] Release WKO 4.2.18 --- common/pom.xml | 2 +- domain-upgrader/pom.xml | 2 +- integration-tests/pom.xml | 2 +- json-schema-generator/pom.xml | 2 +- kubernetes/pom.xml | 2 +- operator-build-maven-plugin/pom.xml | 2 +- operator/pom.xml | 2 +- pom.xml | 2 +- swagger-generator/pom.xml | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/common/pom.xml b/common/pom.xml index 4ab3b5ab4bc..e7f1a281575 100644 --- a/common/pom.xml +++ b/common/pom.xml @@ -6,7 +6,7 @@ oracle.kubernetes operator-parent - 4.2.18-SNAPSHOT + 4.2.18 common diff --git a/domain-upgrader/pom.xml b/domain-upgrader/pom.xml index c9dfc1b41b1..3a3fe374901 100644 --- a/domain-upgrader/pom.xml +++ b/domain-upgrader/pom.xml @@ -7,7 +7,7 @@ oracle.kubernetes operator-parent - 4.2.18-SNAPSHOT + 4.2.18 domain-upgrader diff --git a/integration-tests/pom.xml b/integration-tests/pom.xml index 21cf4d78010..181304821cb 100644 --- a/integration-tests/pom.xml +++ b/integration-tests/pom.xml @@ -7,7 +7,7 @@ oracle.kubernetes operator-parent - 4.2.18-SNAPSHOT + 4.2.18 integration-tests diff --git a/json-schema-generator/pom.xml b/json-schema-generator/pom.xml index 7d14cb4e7e0..bf2763f682b 100644 --- a/json-schema-generator/pom.xml +++ b/json-schema-generator/pom.xml @@ -7,7 +7,7 @@ operator-parent oracle.kubernetes - 4.2.18-SNAPSHOT + 4.2.18 json-schema diff --git a/kubernetes/pom.xml b/kubernetes/pom.xml index 0a3fe1d4eac..dfa20d8e0e2 100644 --- a/kubernetes/pom.xml +++ b/kubernetes/pom.xml @@ -9,7 +9,7 @@ oracle.kubernetes operator-parent - 4.2.18-SNAPSHOT + 4.2.18 installation-tests diff --git a/operator-build-maven-plugin/pom.xml b/operator-build-maven-plugin/pom.xml index 788bc44824c..e6b6ef2b565 100644 --- a/operator-build-maven-plugin/pom.xml +++ b/operator-build-maven-plugin/pom.xml @@ -7,7 +7,7 @@ operator-parent oracle.kubernetes - 4.2.18-SNAPSHOT + 4.2.18 operator-build-maven-plugin diff --git a/operator/pom.xml b/operator/pom.xml index fad505d9f79..53e3314768b 100644 --- a/operator/pom.xml +++ b/operator/pom.xml @@ -7,7 +7,7 @@ oracle.kubernetes operator-parent - 4.2.18-SNAPSHOT + 4.2.18 weblogic-kubernetes-operator diff --git a/pom.xml b/pom.xml index 9cd35892e18..6c07a67da60 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ oracle.kubernetes operator-parent - 4.2.18-SNAPSHOT + 4.2.18 operator diff --git a/swagger-generator/pom.xml b/swagger-generator/pom.xml index 1c93d8c5d2f..8f9f4aec0ce 100644 --- a/swagger-generator/pom.xml +++ b/swagger-generator/pom.xml @@ -7,7 +7,7 @@ oracle.kubernetes operator-parent - 4.2.18-SNAPSHOT + 4.2.18 operator-swagger From 3d33753fd6ed47837fa9b34acd0468396bf6813e Mon Sep 17 00:00:00 2001 From: Ryan Eberhard Date: Mon, 30 Jun 2025 08:24:03 -0400 Subject: [PATCH 20/20] Remove intermittently failing test --- .../kubernetes/operator/JobWatcherTest.java | 6 +----- .../kubernetes/operator/WatcherTestBase.java | 18 +----------------- 2 files changed, 2 insertions(+), 22 deletions(-) diff --git a/operator/src/test/java/oracle/kubernetes/operator/JobWatcherTest.java b/operator/src/test/java/oracle/kubernetes/operator/JobWatcherTest.java index e5c271f99dd..8a732d664c8 100644 --- a/operator/src/test/java/oracle/kubernetes/operator/JobWatcherTest.java +++ b/operator/src/test/java/oracle/kubernetes/operator/JobWatcherTest.java @@ -1,4 +1,4 @@ -// Copyright (c) 2018, 2023, Oracle and/or its affiliates. +// Copyright (c) 2018, 2025, Oracle and/or its affiliates. // Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. package oracle.kubernetes.operator; @@ -495,10 +495,6 @@ public void receivedEvents_areSentToListeners() { // Override as JobWatcher doesn't currently implement listener for callback } - public void receivedEvents_areNotSentToListenersWhenWatchersPaused() { - // Override as JobWatcher doesn't currently implement listener for callback - } - private static class JobAwaiterStepFactoryStub implements JobAwaiterStepFactory { @Override public Step waitForReady(V1Job job, Step next) { diff --git a/operator/src/test/java/oracle/kubernetes/operator/WatcherTestBase.java b/operator/src/test/java/oracle/kubernetes/operator/WatcherTestBase.java index f594e2bf203..9de12b3212f 100644 --- a/operator/src/test/java/oracle/kubernetes/operator/WatcherTestBase.java +++ b/operator/src/test/java/oracle/kubernetes/operator/WatcherTestBase.java @@ -1,4 +1,4 @@ -// Copyright (c) 2018, 2023, Oracle and/or its affiliates. +// Copyright (c) 2018, 2025, Oracle and/or its affiliates. // Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. package oracle.kubernetes.operator; @@ -31,7 +31,6 @@ import static oracle.kubernetes.operator.tuning.TuningParameters.WATCH_BACKSTOP_RECHECK_COUNT; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; -import static org.hamcrest.Matchers.empty; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.hasEntry; @@ -168,21 +167,6 @@ void receivedEvents_areSentToListeners() { assertThat(callBacks, contains(List.of(addEvent(object1), modifyEvent(object2)))); } - @Test - @SuppressWarnings("rawtypes") - void receivedEvents_areNotSentToListenersWhenWatchersPaused() { - Object object1 = createObjectWithMetaData(); - Object object2 = createObjectWithMetaData(); - StubWatchFactory.addCallResponses(createAddResponse(object1), createModifyResponse(object2)); - - Watcher watcher = createWatcher(NAMESPACE, stopping, INITIAL_RESOURCE_VERSION); - pauseWatcher(watcher); - assertThat(callBacks, empty()); - - resumeWatcher(watcher); - assertThat(callBacks, contains(List.of(addEvent(object1), modifyEvent(object2)))); - } - @SuppressWarnings("rawtypes") private void resumeWatcher(Watcher watcher1) { watcher1.start(this);