From 2f40cda2c0e4dd4cca94c6feac230ff9e254490e Mon Sep 17 00:00:00 2001 From: "MAGGIE.HE@ORACLE.COM" Date: Thu, 22 Jul 2021 19:27:14 +0000 Subject: [PATCH 1/5] initial version --- .../weblogic/kubernetes/ItFmwMiiDomain.java | 59 +++++++++++++++++++ .../weblogic/kubernetes/utils/FmwUtils.java | 3 + 2 files changed, 62 insertions(+) diff --git a/integration-tests/src/test/java/oracle/weblogic/kubernetes/ItFmwMiiDomain.java b/integration-tests/src/test/java/oracle/weblogic/kubernetes/ItFmwMiiDomain.java index b1b00d70ae2..6a90da843ac 100644 --- a/integration-tests/src/test/java/oracle/weblogic/kubernetes/ItFmwMiiDomain.java +++ b/integration-tests/src/test/java/oracle/weblogic/kubernetes/ItFmwMiiDomain.java @@ -31,12 +31,20 @@ import static oracle.weblogic.kubernetes.TestConstants.FMWINFRA_IMAGE_TO_USE_IN_SPEC; import static oracle.weblogic.kubernetes.TestConstants.MII_BASIC_APP_NAME; import static oracle.weblogic.kubernetes.TestConstants.OCIR_SECRET_NAME; +import static oracle.weblogic.kubernetes.TestConstants.OPERATOR_RELEASE_NAME; import static oracle.weblogic.kubernetes.actions.ActionConstants.MODEL_DIR; import static oracle.weblogic.kubernetes.actions.ActionConstants.RESOURCE_DIR; +import static oracle.weblogic.kubernetes.actions.TestActions.getCurrentIntrospectVersion; +import static oracle.weblogic.kubernetes.actions.TestActions.getOperatorPodName; import static oracle.weblogic.kubernetes.actions.TestActions.patchDomainCustomResource; +import static oracle.weblogic.kubernetes.actions.TestActions.startOperator; +import static oracle.weblogic.kubernetes.actions.TestActions.stopOperator; import static oracle.weblogic.kubernetes.actions.impl.primitive.Command.defaultCommandParams; +import static oracle.weblogic.kubernetes.assertions.TestAssertions.operatorIsReady; import static oracle.weblogic.kubernetes.utils.CommonMiiTestUtils.verifyUpdateWebLogicCredential; import static oracle.weblogic.kubernetes.utils.CommonTestUtils.checkPodDeleted; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.checkPodDoesNotExist; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.checkPodExists; import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createDomainAndVerify; import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createMiiImageAndVerify; import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createOcirRepoSecret; @@ -44,6 +52,7 @@ import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createRcuAccessSecret; import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createSecretWithUsernamePassword; import static oracle.weblogic.kubernetes.utils.CommonTestUtils.dockerLoginAndPushImageToRegistry; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.getIntrospectJobName; import static oracle.weblogic.kubernetes.utils.CommonTestUtils.installAndVerifyOperator; import static oracle.weblogic.kubernetes.utils.CommonTestUtils.patchServerStartPolicy; import static oracle.weblogic.kubernetes.utils.CommonTestUtils.updateRcuAccessSecret; @@ -54,6 +63,7 @@ import static oracle.weblogic.kubernetes.utils.ThreadSafeLogger.getLogger; import static org.awaitility.Awaitility.with; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -213,6 +223,22 @@ public void testFmwModelInImage() { fmwMiiImage); createDomainAndVerify(domain, fmwDomainNamespace); + //verify the introspector pod is created and runs + logger.info("Verifying introspector pod is created, runs"); + String introspectPodNameBase = getIntrospectJobName(domainUid); + logger.info("Checking introspector pod exists and introspect version"); + checkPodExists(introspectPodNameBase, domainUid, fmwDomainNamespace); + String introspectVersion1 = + assertDoesNotThrow(() -> getCurrentIntrospectVersion(domainUid, fmwDomainNamespace)); + logger.info("Before restarting operator introspectVersion is: " + introspectVersion1); + + logger.info("Is going to restart operator in the namespace: " + opNamespace); + restartOperator(opNamespace); + checkPodExists(introspectPodNameBase, domainUid, fmwDomainNamespace); + String introspectVersion2 = + assertDoesNotThrow(() -> getCurrentIntrospectVersion(domainUid, fmwDomainNamespace)); + logger.info("After operator restart introspectVersion is: " + introspectVersion2); + assertEquals(introspectVersion1, introspectVersion2, "introspectVersion changes after operator restart"); verifyDomainReady(fmwDomainNamespace, domainUid, replicaCount); } @@ -358,4 +384,37 @@ private boolean patchDomainWithWalletFileSecret(String opssWalletFileSecretName) return patchDomainCustomResource(domainUid, fmwDomainNamespace, patch, V1Patch.PATCH_FORMAT_JSON_PATCH); } + + private void restartOperator(String opNamespace) { + + // get operator pod name + String operatorPodName = assertDoesNotThrow( + () -> getOperatorPodName(OPERATOR_RELEASE_NAME, opNamespace)); + assertNotNull(operatorPodName, "Operator pod name returned is null"); + logger.info("Operator pod name {0}", operatorPodName); + + // stop operator by changing replica to 0 in operator deployment + assertTrue(stopOperator(opNamespace), "Couldn't stop the Operator"); + + // check operator pod is not running + checkPodDoesNotExist(operatorPodName, null, opNamespace); + + // start operator by changing replica to 1 in operator deployment + assertTrue(startOperator(opNamespace), "Couldn't start the Operator"); + + // check operator is running + logger.info("Check Operator pod is running in namespace {0}", opNamespace); + withStandardRetryPolicy + .conditionEvaluationListener( + condition -> logger.info("Waiting for operator to be running in namespace {0} " + + "(elapsed time {1}ms, remaining time {2}ms)", + opNamespace, + condition.getElapsedTimeInMS(), + condition.getRemainingTimeInMS())) + .until(operatorIsReady(opNamespace)); + + logger.info("Operator pod is restarted in namespace {0}", opNamespace); + + } + } diff --git a/integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/FmwUtils.java b/integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/FmwUtils.java index 90313d9e06a..8892eb416a5 100644 --- a/integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/FmwUtils.java +++ b/integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/FmwUtils.java @@ -28,11 +28,13 @@ import static oracle.weblogic.kubernetes.TestConstants.DOMAIN_API_VERSION; import static oracle.weblogic.kubernetes.TestConstants.FMWINFRA_IMAGE_TO_USE_IN_SPEC; import static oracle.weblogic.kubernetes.TestConstants.K8S_NODEPORT_HOST; +//import static oracle.weblogic.kubernetes.actions.TestActions.getNextIntrospectVersion; import static oracle.weblogic.kubernetes.actions.TestActions.getServiceNodePort; import static oracle.weblogic.kubernetes.utils.CommonTestUtils.checkPodReadyAndServiceExists; import static oracle.weblogic.kubernetes.utils.CommonTestUtils.getExternalServicePodName; import static oracle.weblogic.kubernetes.utils.TestUtils.callWebAppAndWaitTillReady; import static oracle.weblogic.kubernetes.utils.ThreadSafeLogger.getLogger; +//import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertTrue; /** @@ -75,6 +77,7 @@ public static Domain createDomainResource( .namespace(domNamespace)) .includeServerOutInPodLog(true) .serverStartPolicy("IF_NEEDED") + .introspectVersion("1") .serverPod(new ServerPod() .addEnvItem(new V1EnvVar() .name("JAVA_OPTIONS") From 9145d9bc8c399194f023cfb978a6018ef6e16ac8 Mon Sep 17 00:00:00 2001 From: "MAGGIE.HE@ORACLE.COM" Date: Mon, 26 Jul 2021 16:03:37 +0000 Subject: [PATCH 2/5] minor java doc editing --- .../java/oracle/weblogic/kubernetes/ItFmwMiiDomain.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/integration-tests/src/test/java/oracle/weblogic/kubernetes/ItFmwMiiDomain.java b/integration-tests/src/test/java/oracle/weblogic/kubernetes/ItFmwMiiDomain.java index 6a90da843ac..8b25d4c0d88 100644 --- a/integration-tests/src/test/java/oracle/weblogic/kubernetes/ItFmwMiiDomain.java +++ b/integration-tests/src/test/java/oracle/weblogic/kubernetes/ItFmwMiiDomain.java @@ -150,6 +150,10 @@ RCUSCHEMAPREFIX, dbNamespace, getNextFreePort(), dbUrl), /** * Create a basic FMW model in image domain. + * Create the FMW domain with introspectVersion + * After domain is created and introspector exists restart the operator. + * Verify the restarted operator can find the existing introspector and wait for it to complete + * rather than replacing a new introspector. * Verify Pod is ready and service exists for both admin server and managed servers. * Verify EM console is accessible. */ @@ -223,6 +227,7 @@ public void testFmwModelInImage() { fmwMiiImage); createDomainAndVerify(domain, fmwDomainNamespace); + //verify the introspector pod is created and runs logger.info("Verifying introspector pod is created, runs"); String introspectPodNameBase = getIntrospectJobName(domainUid); @@ -234,11 +239,13 @@ public void testFmwModelInImage() { logger.info("Is going to restart operator in the namespace: " + opNamespace); restartOperator(opNamespace); + //verify introspectorVersion does not change checkPodExists(introspectPodNameBase, domainUid, fmwDomainNamespace); String introspectVersion2 = assertDoesNotThrow(() -> getCurrentIntrospectVersion(domainUid, fmwDomainNamespace)); logger.info("After operator restart introspectVersion is: " + introspectVersion2); assertEquals(introspectVersion1, introspectVersion2, "introspectVersion changes after operator restart"); + verifyDomainReady(fmwDomainNamespace, domainUid, replicaCount); } From 89d9cde9e0066e8c549db14751e41f412bc249f5 Mon Sep 17 00:00:00 2001 From: "MAGGIE.HE@ORACLE.COM" Date: Mon, 26 Jul 2021 17:45:35 +0000 Subject: [PATCH 3/5] addressing the review comments --- .../test/java/oracle/weblogic/kubernetes/ItFmwMiiDomain.java | 2 +- .../test/java/oracle/weblogic/kubernetes/utils/FmwUtils.java | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/integration-tests/src/test/java/oracle/weblogic/kubernetes/ItFmwMiiDomain.java b/integration-tests/src/test/java/oracle/weblogic/kubernetes/ItFmwMiiDomain.java index 8b25d4c0d88..cbebfcba5d8 100644 --- a/integration-tests/src/test/java/oracle/weblogic/kubernetes/ItFmwMiiDomain.java +++ b/integration-tests/src/test/java/oracle/weblogic/kubernetes/ItFmwMiiDomain.java @@ -237,7 +237,7 @@ public void testFmwModelInImage() { assertDoesNotThrow(() -> getCurrentIntrospectVersion(domainUid, fmwDomainNamespace)); logger.info("Before restarting operator introspectVersion is: " + introspectVersion1); - logger.info("Is going to restart operator in the namespace: " + opNamespace); + logger.info("Restarting operator in the namespace: " + opNamespace); restartOperator(opNamespace); //verify introspectorVersion does not change checkPodExists(introspectPodNameBase, domainUid, fmwDomainNamespace); diff --git a/integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/FmwUtils.java b/integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/FmwUtils.java index 8892eb416a5..749290ba2e3 100644 --- a/integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/FmwUtils.java +++ b/integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/FmwUtils.java @@ -28,13 +28,11 @@ import static oracle.weblogic.kubernetes.TestConstants.DOMAIN_API_VERSION; import static oracle.weblogic.kubernetes.TestConstants.FMWINFRA_IMAGE_TO_USE_IN_SPEC; import static oracle.weblogic.kubernetes.TestConstants.K8S_NODEPORT_HOST; -//import static oracle.weblogic.kubernetes.actions.TestActions.getNextIntrospectVersion; import static oracle.weblogic.kubernetes.actions.TestActions.getServiceNodePort; import static oracle.weblogic.kubernetes.utils.CommonTestUtils.checkPodReadyAndServiceExists; import static oracle.weblogic.kubernetes.utils.CommonTestUtils.getExternalServicePodName; import static oracle.weblogic.kubernetes.utils.TestUtils.callWebAppAndWaitTillReady; import static oracle.weblogic.kubernetes.utils.ThreadSafeLogger.getLogger; -//import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertTrue; /** From 523f251dd187fcf89658d4f8d42fd58cc03005eb Mon Sep 17 00:00:00 2001 From: "MAGGIE.HE@ORACLE.COM" Date: Mon, 26 Jul 2021 21:48:38 +0000 Subject: [PATCH 4/5] adding the review comments --- .../oracle/weblogic/kubernetes/ItFmwMiiDomain.java | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/integration-tests/src/test/java/oracle/weblogic/kubernetes/ItFmwMiiDomain.java b/integration-tests/src/test/java/oracle/weblogic/kubernetes/ItFmwMiiDomain.java index cbebfcba5d8..e464cf99b42 100644 --- a/integration-tests/src/test/java/oracle/weblogic/kubernetes/ItFmwMiiDomain.java +++ b/integration-tests/src/test/java/oracle/weblogic/kubernetes/ItFmwMiiDomain.java @@ -11,6 +11,7 @@ import io.kubernetes.client.custom.V1Patch; import oracle.weblogic.domain.Domain; import oracle.weblogic.kubernetes.actions.impl.primitive.Command; +import oracle.weblogic.kubernetes.actions.impl.primitive.Kubernetes; import oracle.weblogic.kubernetes.annotations.IntegrationTest; import oracle.weblogic.kubernetes.annotations.Namespaces; import oracle.weblogic.kubernetes.logging.LoggingFacade; @@ -233,14 +234,20 @@ public void testFmwModelInImage() { String introspectPodNameBase = getIntrospectJobName(domainUid); logger.info("Checking introspector pod exists and introspect version"); checkPodExists(introspectPodNameBase, domainUid, fmwDomainNamespace); + String introspectPodName = assertDoesNotThrow(() -> Kubernetes.listPods(fmwDomainNamespace, null) + .getItems().get(0).getMetadata().getName(), + String.format("Get intrspector pod name failed with ApiException in namespace %s", fmwDomainNamespace)); String introspectVersion1 = assertDoesNotThrow(() -> getCurrentIntrospectVersion(domainUid, fmwDomainNamespace)); - logger.info("Before restarting operator introspectVersion is: " + introspectVersion1); + logger.info("Before restarting operator introspector pod name is: {0}, introspectVersion is: {1}", + introspectPodName, introspectVersion1); logger.info("Restarting operator in the namespace: " + opNamespace); restartOperator(opNamespace); - //verify introspectorVersion does not change - checkPodExists(introspectPodNameBase, domainUid, fmwDomainNamespace); + //verify the exact same introspector pod exists and Version does not change + logger.info("Checking the exact same introspector pod {0} exists in the namespace {1}", + introspectPodName, fmwDomainNamespace); + checkPodExists(introspectPodName, domainUid, fmwDomainNamespace); String introspectVersion2 = assertDoesNotThrow(() -> getCurrentIntrospectVersion(domainUid, fmwDomainNamespace)); logger.info("After operator restart introspectVersion is: " + introspectVersion2); From 4cb3cb0f51df44ebb761ce85318bf739ed26d95c Mon Sep 17 00:00:00 2001 From: "MAGGIE.HE@ORACLE.COM" Date: Wed, 28 Jul 2021 16:06:17 +0000 Subject: [PATCH 5/5] refactor the code --- .../weblogic/kubernetes/ItFmwMiiDomain.java | 41 +---------- .../kubernetes/utils/CommonOperatorUtils.java | 72 +++++++++++++++++++ 2 files changed, 74 insertions(+), 39 deletions(-) create mode 100644 integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/CommonOperatorUtils.java diff --git a/integration-tests/src/test/java/oracle/weblogic/kubernetes/ItFmwMiiDomain.java b/integration-tests/src/test/java/oracle/weblogic/kubernetes/ItFmwMiiDomain.java index e464cf99b42..ad6c67a8a07 100644 --- a/integration-tests/src/test/java/oracle/weblogic/kubernetes/ItFmwMiiDomain.java +++ b/integration-tests/src/test/java/oracle/weblogic/kubernetes/ItFmwMiiDomain.java @@ -32,19 +32,14 @@ import static oracle.weblogic.kubernetes.TestConstants.FMWINFRA_IMAGE_TO_USE_IN_SPEC; import static oracle.weblogic.kubernetes.TestConstants.MII_BASIC_APP_NAME; import static oracle.weblogic.kubernetes.TestConstants.OCIR_SECRET_NAME; -import static oracle.weblogic.kubernetes.TestConstants.OPERATOR_RELEASE_NAME; import static oracle.weblogic.kubernetes.actions.ActionConstants.MODEL_DIR; import static oracle.weblogic.kubernetes.actions.ActionConstants.RESOURCE_DIR; import static oracle.weblogic.kubernetes.actions.TestActions.getCurrentIntrospectVersion; -import static oracle.weblogic.kubernetes.actions.TestActions.getOperatorPodName; import static oracle.weblogic.kubernetes.actions.TestActions.patchDomainCustomResource; -import static oracle.weblogic.kubernetes.actions.TestActions.startOperator; -import static oracle.weblogic.kubernetes.actions.TestActions.stopOperator; import static oracle.weblogic.kubernetes.actions.impl.primitive.Command.defaultCommandParams; -import static oracle.weblogic.kubernetes.assertions.TestAssertions.operatorIsReady; import static oracle.weblogic.kubernetes.utils.CommonMiiTestUtils.verifyUpdateWebLogicCredential; +import static oracle.weblogic.kubernetes.utils.CommonOperatorUtils.restartOperator; import static oracle.weblogic.kubernetes.utils.CommonTestUtils.checkPodDeleted; -import static oracle.weblogic.kubernetes.utils.CommonTestUtils.checkPodDoesNotExist; import static oracle.weblogic.kubernetes.utils.CommonTestUtils.checkPodExists; import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createDomainAndVerify; import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createMiiImageAndVerify; @@ -398,37 +393,5 @@ private boolean patchDomainWithWalletFileSecret(String opssWalletFileSecretName) return patchDomainCustomResource(domainUid, fmwDomainNamespace, patch, V1Patch.PATCH_FORMAT_JSON_PATCH); } - - private void restartOperator(String opNamespace) { - - // get operator pod name - String operatorPodName = assertDoesNotThrow( - () -> getOperatorPodName(OPERATOR_RELEASE_NAME, opNamespace)); - assertNotNull(operatorPodName, "Operator pod name returned is null"); - logger.info("Operator pod name {0}", operatorPodName); - - // stop operator by changing replica to 0 in operator deployment - assertTrue(stopOperator(opNamespace), "Couldn't stop the Operator"); - - // check operator pod is not running - checkPodDoesNotExist(operatorPodName, null, opNamespace); - - // start operator by changing replica to 1 in operator deployment - assertTrue(startOperator(opNamespace), "Couldn't start the Operator"); - - // check operator is running - logger.info("Check Operator pod is running in namespace {0}", opNamespace); - withStandardRetryPolicy - .conditionEvaluationListener( - condition -> logger.info("Waiting for operator to be running in namespace {0} " - + "(elapsed time {1}ms, remaining time {2}ms)", - opNamespace, - condition.getElapsedTimeInMS(), - condition.getRemainingTimeInMS())) - .until(operatorIsReady(opNamespace)); - - logger.info("Operator pod is restarted in namespace {0}", opNamespace); - - } - + } diff --git a/integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/CommonOperatorUtils.java b/integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/CommonOperatorUtils.java new file mode 100644 index 00000000000..c10e22f2b78 --- /dev/null +++ b/integration-tests/src/test/java/oracle/weblogic/kubernetes/utils/CommonOperatorUtils.java @@ -0,0 +1,72 @@ +// Copyright (c) 2021, 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.utils; + +import oracle.weblogic.kubernetes.logging.LoggingFacade; +import org.awaitility.core.ConditionFactory; + +import static java.util.concurrent.TimeUnit.MINUTES; +import static java.util.concurrent.TimeUnit.SECONDS; +import static oracle.weblogic.kubernetes.TestConstants.OPERATOR_RELEASE_NAME; +import static oracle.weblogic.kubernetes.actions.TestActions.getOperatorPodName; +import static oracle.weblogic.kubernetes.actions.TestActions.startOperator; +import static oracle.weblogic.kubernetes.actions.TestActions.stopOperator; +import static oracle.weblogic.kubernetes.assertions.TestAssertions.operatorIsReady; +import static oracle.weblogic.kubernetes.utils.CommonTestUtils.checkPodDoesNotExist; +import static oracle.weblogic.kubernetes.utils.ThreadSafeLogger.getLogger; +import static org.awaitility.Awaitility.with; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + + +/** + * The common utility class for Operator. + */ +public class CommonOperatorUtils { + + private static final ConditionFactory withStandardRetryPolicy + = with().pollDelay(2, SECONDS) + .and().with().pollInterval(10, SECONDS) + .atMost(5, MINUTES).await(); + + + /** + * Restart Operator by changing replica to 0 in operator deployment to stop Operator + * and changing replica back to 1 to start Operator. + * @param opNamespace namespace where Operator exists + */ + public static void restartOperator(String opNamespace) { + LoggingFacade logger = getLogger(); + // get operator pod name + String operatorPodName = assertDoesNotThrow( + () -> getOperatorPodName(OPERATOR_RELEASE_NAME, opNamespace)); + assertNotNull(operatorPodName, "Operator pod name returned is null"); + logger.info("Operator pod name {0}", operatorPodName); + + // stop operator by changing replica to 0 in operator deployment + assertTrue(stopOperator(opNamespace), "Couldn't stop the Operator"); + + // check operator pod is not running + checkPodDoesNotExist(operatorPodName, null, opNamespace); + + // start operator by changing replica to 1 in operator deployment + assertTrue(startOperator(opNamespace), "Couldn't start the Operator"); + + // check operator is running + logger.info("Check Operator pod is running in namespace {0}", opNamespace); + withStandardRetryPolicy + .conditionEvaluationListener( + condition -> logger.info("Waiting for operator to be running in namespace {0} " + + "(elapsed time {1}ms, remaining time {2}ms)", + opNamespace, + condition.getElapsedTimeInMS(), + condition.getRemainingTimeInMS())) + .until(operatorIsReady(opNamespace)); + + logger.info("Operator pod is restarted in namespace {0}", opNamespace); + + } + +}