Skip to content

Commit 4c26b1d

Browse files
authored
Add test to verify the restarted operator would detect the existing introspector and wait for the job to complete (#2482)
* Add test to verify the restarted operator would detect the existing introspector and wait for the job to complete
1 parent 0d5ec13 commit 4c26b1d

File tree

3 files changed

+109
-0
lines changed

3 files changed

+109
-0
lines changed

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

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import io.kubernetes.client.custom.V1Patch;
1212
import oracle.weblogic.domain.Domain;
1313
import oracle.weblogic.kubernetes.actions.impl.primitive.Command;
14+
import oracle.weblogic.kubernetes.actions.impl.primitive.Kubernetes;
1415
import oracle.weblogic.kubernetes.annotations.IntegrationTest;
1516
import oracle.weblogic.kubernetes.annotations.Namespaces;
1617
import oracle.weblogic.kubernetes.logging.LoggingFacade;
@@ -33,17 +34,21 @@
3334
import static oracle.weblogic.kubernetes.TestConstants.OCIR_SECRET_NAME;
3435
import static oracle.weblogic.kubernetes.actions.ActionConstants.MODEL_DIR;
3536
import static oracle.weblogic.kubernetes.actions.ActionConstants.RESOURCE_DIR;
37+
import static oracle.weblogic.kubernetes.actions.TestActions.getCurrentIntrospectVersion;
3638
import static oracle.weblogic.kubernetes.actions.TestActions.patchDomainCustomResource;
3739
import static oracle.weblogic.kubernetes.actions.impl.primitive.Command.defaultCommandParams;
3840
import static oracle.weblogic.kubernetes.utils.CommonMiiTestUtils.verifyUpdateWebLogicCredential;
41+
import static oracle.weblogic.kubernetes.utils.CommonOperatorUtils.restartOperator;
3942
import static oracle.weblogic.kubernetes.utils.CommonTestUtils.checkPodDeleted;
43+
import static oracle.weblogic.kubernetes.utils.CommonTestUtils.checkPodExists;
4044
import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createDomainAndVerify;
4145
import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createMiiImageAndVerify;
4246
import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createOcirRepoSecret;
4347
import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createOpsswalletpasswordSecret;
4448
import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createRcuAccessSecret;
4549
import static oracle.weblogic.kubernetes.utils.CommonTestUtils.createSecretWithUsernamePassword;
4650
import static oracle.weblogic.kubernetes.utils.CommonTestUtils.dockerLoginAndPushImageToRegistry;
51+
import static oracle.weblogic.kubernetes.utils.CommonTestUtils.getIntrospectJobName;
4752
import static oracle.weblogic.kubernetes.utils.CommonTestUtils.installAndVerifyOperator;
4853
import static oracle.weblogic.kubernetes.utils.CommonTestUtils.patchServerStartPolicy;
4954
import static oracle.weblogic.kubernetes.utils.CommonTestUtils.updateRcuAccessSecret;
@@ -54,6 +59,7 @@
5459
import static oracle.weblogic.kubernetes.utils.ThreadSafeLogger.getLogger;
5560
import static org.awaitility.Awaitility.with;
5661
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
62+
import static org.junit.jupiter.api.Assertions.assertEquals;
5763
import static org.junit.jupiter.api.Assertions.assertNotNull;
5864
import static org.junit.jupiter.api.Assertions.assertTrue;
5965

@@ -140,6 +146,10 @@ RCUSCHEMAPREFIX, dbNamespace, getNextFreePort(), dbUrl),
140146

141147
/**
142148
* Create a basic FMW model in image domain.
149+
* Create the FMW domain with introspectVersion
150+
* After domain is created and introspector exists restart the operator.
151+
* Verify the restarted operator can find the existing introspector and wait for it to complete
152+
* rather than replacing a new introspector.
143153
* Verify Pod is ready and service exists for both admin server and managed servers.
144154
* Verify EM console is accessible.
145155
*/
@@ -213,6 +223,31 @@ public void testFmwModelInImage() {
213223
fmwMiiImage);
214224

215225
createDomainAndVerify(domain, fmwDomainNamespace);
226+
227+
//verify the introspector pod is created and runs
228+
logger.info("Verifying introspector pod is created, runs");
229+
String introspectPodNameBase = getIntrospectJobName(domainUid);
230+
logger.info("Checking introspector pod exists and introspect version");
231+
checkPodExists(introspectPodNameBase, domainUid, fmwDomainNamespace);
232+
String introspectPodName = assertDoesNotThrow(() -> Kubernetes.listPods(fmwDomainNamespace, null)
233+
.getItems().get(0).getMetadata().getName(),
234+
String.format("Get intrspector pod name failed with ApiException in namespace %s", fmwDomainNamespace));
235+
String introspectVersion1 =
236+
assertDoesNotThrow(() -> getCurrentIntrospectVersion(domainUid, fmwDomainNamespace));
237+
logger.info("Before restarting operator introspector pod name is: {0}, introspectVersion is: {1}",
238+
introspectPodName, introspectVersion1);
239+
240+
logger.info("Restarting operator in the namespace: " + opNamespace);
241+
restartOperator(opNamespace);
242+
//verify the exact same introspector pod exists and Version does not change
243+
logger.info("Checking the exact same introspector pod {0} exists in the namespace {1}",
244+
introspectPodName, fmwDomainNamespace);
245+
checkPodExists(introspectPodName, domainUid, fmwDomainNamespace);
246+
String introspectVersion2 =
247+
assertDoesNotThrow(() -> getCurrentIntrospectVersion(domainUid, fmwDomainNamespace));
248+
logger.info("After operator restart introspectVersion is: " + introspectVersion2);
249+
assertEquals(introspectVersion1, introspectVersion2, "introspectVersion changes after operator restart");
250+
216251
verifyDomainReady(fmwDomainNamespace, domainUid, replicaCount);
217252
}
218253

@@ -358,4 +393,5 @@ private boolean patchDomainWithWalletFileSecret(String opssWalletFileSecretName)
358393

359394
return patchDomainCustomResource(domainUid, fmwDomainNamespace, patch, V1Patch.PATCH_FORMAT_JSON_PATCH);
360395
}
396+
361397
}
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
// Copyright (c) 2021, Oracle and/or its affiliates.
2+
// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
3+
4+
package oracle.weblogic.kubernetes.utils;
5+
6+
import oracle.weblogic.kubernetes.logging.LoggingFacade;
7+
import org.awaitility.core.ConditionFactory;
8+
9+
import static java.util.concurrent.TimeUnit.MINUTES;
10+
import static java.util.concurrent.TimeUnit.SECONDS;
11+
import static oracle.weblogic.kubernetes.TestConstants.OPERATOR_RELEASE_NAME;
12+
import static oracle.weblogic.kubernetes.actions.TestActions.getOperatorPodName;
13+
import static oracle.weblogic.kubernetes.actions.TestActions.startOperator;
14+
import static oracle.weblogic.kubernetes.actions.TestActions.stopOperator;
15+
import static oracle.weblogic.kubernetes.assertions.TestAssertions.operatorIsReady;
16+
import static oracle.weblogic.kubernetes.utils.CommonTestUtils.checkPodDoesNotExist;
17+
import static oracle.weblogic.kubernetes.utils.ThreadSafeLogger.getLogger;
18+
import static org.awaitility.Awaitility.with;
19+
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
20+
import static org.junit.jupiter.api.Assertions.assertNotNull;
21+
import static org.junit.jupiter.api.Assertions.assertTrue;
22+
23+
24+
/**
25+
* The common utility class for Operator.
26+
*/
27+
public class CommonOperatorUtils {
28+
29+
private static final ConditionFactory withStandardRetryPolicy
30+
= with().pollDelay(2, SECONDS)
31+
.and().with().pollInterval(10, SECONDS)
32+
.atMost(5, MINUTES).await();
33+
34+
35+
/**
36+
* Restart Operator by changing replica to 0 in operator deployment to stop Operator
37+
* and changing replica back to 1 to start Operator.
38+
* @param opNamespace namespace where Operator exists
39+
*/
40+
public static void restartOperator(String opNamespace) {
41+
LoggingFacade logger = getLogger();
42+
// get operator pod name
43+
String operatorPodName = assertDoesNotThrow(
44+
() -> getOperatorPodName(OPERATOR_RELEASE_NAME, opNamespace));
45+
assertNotNull(operatorPodName, "Operator pod name returned is null");
46+
logger.info("Operator pod name {0}", operatorPodName);
47+
48+
// stop operator by changing replica to 0 in operator deployment
49+
assertTrue(stopOperator(opNamespace), "Couldn't stop the Operator");
50+
51+
// check operator pod is not running
52+
checkPodDoesNotExist(operatorPodName, null, opNamespace);
53+
54+
// start operator by changing replica to 1 in operator deployment
55+
assertTrue(startOperator(opNamespace), "Couldn't start the Operator");
56+
57+
// check operator is running
58+
logger.info("Check Operator pod is running in namespace {0}", opNamespace);
59+
withStandardRetryPolicy
60+
.conditionEvaluationListener(
61+
condition -> logger.info("Waiting for operator to be running in namespace {0} "
62+
+ "(elapsed time {1}ms, remaining time {2}ms)",
63+
opNamespace,
64+
condition.getElapsedTimeInMS(),
65+
condition.getRemainingTimeInMS()))
66+
.until(operatorIsReady(opNamespace));
67+
68+
logger.info("Operator pod is restarted in namespace {0}", opNamespace);
69+
70+
}
71+
72+
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ public static Domain createDomainResource(
7575
.namespace(domNamespace))
7676
.includeServerOutInPodLog(true)
7777
.serverStartPolicy("IF_NEEDED")
78+
.introspectVersion("1")
7879
.serverPod(new ServerPod()
7980
.addEnvItem(new V1EnvVar()
8081
.name("JAVA_OPTIONS")

0 commit comments

Comments
 (0)