Skip to content

Commit 0618664

Browse files
authored
Backport support for K8s 1.24 (#3332)
1 parent 10d27a9 commit 0618664

File tree

9 files changed

+124
-111
lines changed

9 files changed

+124
-111
lines changed

Jenkinsfile

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,30 @@ def kind_k8s_map = [
2323
'1.21': 'kindest/node:v1.21.10@sha256:84709f09756ba4f863769bdcabe5edafc2ada72d3c8c44d6515fc581b66b029c',
2424
'1.20.15': 'kindest/node:v1.20.15@sha256:393bb9096c6c4d723bb17bceb0896407d7db581532d11ea2839c80b28e5d8deb',
2525
'1.20': 'kindest/node:v1.20.15@sha256:393bb9096c6c4d723bb17bceb0896407d7db581532d11ea2839c80b28e5d8deb'
26+
],
27+
'0.13.0': [
28+
'1.24.0': 'kindest/node:v1.24.0@sha256:406fd86d48eaf4c04c7280cd1d2ca1d61e7d0d61ddef0125cb097bc7b82ed6a1',
29+
'1.24': 'kindest/node:v1.24.0@sha256:406fd86d48eaf4c04c7280cd1d2ca1d61e7d0d61ddef0125cb097bc7b82ed6a1',
30+
'1.23.6': 'kindest/node:v1.23.6@sha256:1af0f1bee4c3c0fe9b07de5e5d3fafeb2eec7b4e1b268ae89fcab96ec67e8355',
31+
'1.23': 'kindest/node:v1.23.6@sha256:1af0f1bee4c3c0fe9b07de5e5d3fafeb2eec7b4e1b268ae89fcab96ec67e8355',
32+
'1.22.9': 'kindest/node:v1.22.9@sha256:6e57a6b0c493c7d7183a1151acff0bfa44bf37eb668826bf00da5637c55b6d5e',
33+
'1.22': 'kindest/node:v1.22.9@sha256:6e57a6b0c493c7d7183a1151acff0bfa44bf37eb668826bf00da5637c55b6d5e',
34+
'1.21.12': 'kindest/node:v1.21.12@sha256:ae05d44cc636ee961068399ea5123ae421790f472c309900c151a44ee35c3e3e',
35+
'1.21': 'kindest/node:v1.21.12@sha256:ae05d44cc636ee961068399ea5123ae421790f472c309900c151a44ee35c3e3e',
36+
'1.20.15': 'kindest/node:v1.20.15@sha256:a6ce604504db064c5e25921c6c0fffea64507109a1f2a512b1b562ac37d652f3',
37+
'1.20': 'kindest/node:v1.20.15@sha256:a6ce604504db064c5e25921c6c0fffea64507109a1f2a512b1b562ac37d652f3'
38+
],
39+
'0.14.0': [
40+
'1.24.0': 'kindest/node:v1.24.0@sha256:0866296e693efe1fed79d5e6c7af8df71fc73ae45e3679af05342239cdc5bc8e',
41+
'1.24': 'kindest/node:v1.24.0@sha256:0866296e693efe1fed79d5e6c7af8df71fc73ae45e3679af05342239cdc5bc8e',
42+
'1.23.6': 'kindest/node:v1.23.6@sha256:b1fa224cc6c7ff32455e0b1fd9cbfd3d3bc87ecaa8fcb06961ed1afb3db0f9ae',
43+
'1.23': 'kindest/node:v1.23.6@sha256:b1fa224cc6c7ff32455e0b1fd9cbfd3d3bc87ecaa8fcb06961ed1afb3db0f9ae',
44+
'1.22.9': 'kindest/node:v1.22.9@sha256:8135260b959dfe320206eb36b3aeda9cffcb262f4b44cda6b33f7bb73f453105',
45+
'1.22': 'kindest/node:v1.22.9@sha256:8135260b959dfe320206eb36b3aeda9cffcb262f4b44cda6b33f7bb73f453105',
46+
'1.21.12': 'kindest/node:v1.21.12@sha256:f316b33dd88f8196379f38feb80545ef3ed44d9197dca1bfd48bcb1583210207',
47+
'1.21': 'kindest/node:v1.21.12@sha256:f316b33dd88f8196379f38feb80545ef3ed44d9197dca1bfd48bcb1583210207',
48+
'1.20.15': 'kindest/node:v1.20.15@sha256:6f2d011dffe182bad80b85f6c00e8ca9d86b5b8922cdf433d53575c4c5212248',
49+
'1.20': 'kindest/node:v1.20.15@sha256:6f2d011dffe182bad80b85f6c00e8ca9d86b5b8922cdf433d53575c4c5212248'
2650
]
2751
]
2852
def _kind_image = null
@@ -87,21 +111,28 @@ pipeline {
87111
choice(name: 'KIND_VERSION',
88112
description: 'Kind version.',
89113
choices: [
114+
'0.14.0',
115+
'0.13.0',
90116
'0.12.0',
91117
'0.11.1'
92118
]
93119
)
94120
choice(name: 'KUBE_VERSION',
95-
description: 'Kubernetes version. Supported values depend on the Kind version. Kind 0.12.0: 1.23, 1.23.4, 1.22, 1.22.10, 1.21, 1.21.10, 1.20, 1.20.15. Kind 0.11.1: 1.23, 1.23.3, 1.22, 1.22.5, 1.21, 1.21.1, 1.20, 1.20.7, 1.19, 1.19.11.',
121+
description: 'Kubernetes version. Supported values depend on the Kind version. Kind 0.13.0 and 0.14.0: 1.24, 1.24.0, 1.23, 1.23.6, 1.22, 1.22.9, 1.21, 1.21.12, 1.20, 1.20.15, Kind 0.12.0: 1.23, 1.23.4, 1.22, 1.22.7, 1.21, 1.21.10, 1.20, 1.20.15. Kind 0.11.1: 1.23, 1.23.3, 1.22, 1.22.5, 1.21, 1.21.1, 1.20, 1.20.7, 1.19, 1.19.11.',
96122
choices: [
97123
// The first item in the list is the default value...
98-
'1.21.10',
124+
'1.21.12',
125+
'1.24',
126+
'1.24.0',
127+
'1.23.6',
99128
'1.23.4',
100129
'1.23.3',
101130
'1.23',
102-
'1.22.10',
131+
'1.22.9',
132+
'1.22.7',
103133
'1.22.5',
104134
'1.22',
135+
'1.21.10',
105136
'1.21.1',
106137
'1.21',
107138
'1.20.15',

documentation/3.4/content/userguide/prerequisites/introduction.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ weight: 2
77

88
For the current production release {{< latestVersion >}}:
99

10-
* Kubernetes 1.19.15+, 1.20.11+, 1.21.5+, 1.22.5+, and 1.23.4+ (check with `kubectl version`).
10+
* Kubernetes 1.19.15+, 1.20.11+, 1.21.5+, 1.22.5+, 1.23.4+, and 1.24.0+ (check with `kubectl version`).
1111
* Flannel networking v0.13.0-amd64 or later (check with `docker images | grep flannel`), Calico networking v3.16.1 or later,
1212
*or* OpenShift SDN on OpenShift 4.3 systems.
1313
* Docker 19.03.1+ (check with `docker version`) *or* CRI-O 1.20.2+ (check with `crictl version | grep RuntimeVersion`).

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -480,7 +480,7 @@ private boolean isOperatorFailedToScaleDomain(String opNamespace, String domainU
480480

481481
private static void setLabelToNamespace(String domainNS, Map<String, String> labels) {
482482
testUntil(() -> {
483-
V1Namespace namespaceObject = assertDoesNotThrow(() -> Kubernetes.getNamespaceAsObject(domainNS));
483+
V1Namespace namespaceObject = assertDoesNotThrow(() -> Kubernetes.getNamespace(domainNS));
484484
if (namespaceObject == null) {
485485
logger.info("namespace object is null");
486486
return false;
@@ -491,7 +491,7 @@ private static void setLabelToNamespace(String domainNS, Map<String, String> lab
491491
logger.info("Before replacing the namespace object\n {0}", Yaml.dump(namespaceObject));
492492
Kubernetes.replaceNamespace(namespaceObject);
493493
logger.info("After replacing the namespace object\n {0}",
494-
Yaml.dump(Kubernetes.getNamespaceAsObject(domainNS)));
494+
Yaml.dump(Kubernetes.getNamespace(domainNS)));
495495
} catch (ApiException e) {
496496
logger.warning(e.getResponseBody());
497497
return false;

integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/Secret.java

Lines changed: 54 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,24 @@
1-
// Copyright (c) 2020, 2021, Oracle and/or its affiliates.
1+
// Copyright (c) 2020, 2022, Oracle and/or its affiliates.
22
// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
33

44
package oracle.weblogic.kubernetes.actions.impl;
55

66
import java.util.ArrayList;
77
import java.util.Base64;
8+
import java.util.Collections;
89
import java.util.List;
9-
import java.util.concurrent.TimeUnit;
10+
import java.util.Map;
11+
import java.util.Optional;
1012

1113
import io.kubernetes.client.openapi.ApiException;
12-
import io.kubernetes.client.openapi.models.V1ObjectReference;
14+
import io.kubernetes.client.openapi.models.V1ObjectMeta;
1315
import io.kubernetes.client.openapi.models.V1Secret;
1416
import io.kubernetes.client.openapi.models.V1SecretList;
15-
import io.kubernetes.client.openapi.models.V1ServiceAccount;
16-
import io.kubernetes.client.openapi.models.V1ServiceAccountList;
1717
import oracle.weblogic.kubernetes.actions.impl.primitive.Kubernetes;
1818
import oracle.weblogic.kubernetes.logging.LoggingFacade;
1919

20-
import static oracle.weblogic.kubernetes.TestConstants.OKD;
21-
import static oracle.weblogic.kubernetes.actions.impl.primitive.Kubernetes.listServiceAccounts;
22-
import static oracle.weblogic.kubernetes.actions.impl.primitive.Kubernetes.readSecretByReference;
20+
import static oracle.weblogic.kubernetes.utils.CommonTestUtils.testUntil;
2321
import static oracle.weblogic.kubernetes.utils.ThreadSafeLogger.getLogger;
24-
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
2522

2623
public class Secret {
2724

@@ -56,52 +53,52 @@ public static boolean delete(String name, String namespace) {
5653
public static String getSecretOfServiceAccount(String namespace, String serviceAccountName) {
5754

5855
LoggingFacade logger = getLogger();
59-
List<V1Secret> v1Secrets = new ArrayList<>();
60-
List<V1ServiceAccount> v1ServiceAccounts = new ArrayList<>();
61-
List<V1Secret> v1SaSecrets = new ArrayList<>();
62-
String token = null;
63-
64-
if (!OKD) {
65-
V1SecretList secretList = listSecrets(namespace);
66-
if (secretList != null) {
67-
v1Secrets = secretList.getItems();
68-
}
6956

70-
for (V1Secret v1Secret : v1Secrets) {
71-
if (v1Secret.getMetadata() != null && v1Secret.getMetadata().getName() != null) {
72-
logger.info(" secret name = {0}", v1Secret.getMetadata().getName());
73-
if (v1Secret.getMetadata().getName().startsWith(serviceAccountName)) {
74-
return v1Secret.getMetadata().getName();
75-
}
76-
}
77-
}
78-
} else {
79-
logger.info("service account = {0}", serviceAccountName);
80-
logger.info("namespace = {0}", namespace);
81-
V1ServiceAccountList serviceAccountList = listServiceAccounts(namespace);
82-
if (serviceAccountList != null) {
83-
v1ServiceAccounts = serviceAccountList.getItems();
57+
logger.info("service account = {0}", serviceAccountName);
58+
logger.info("namespace = {0}", namespace);
59+
V1SecretList secretList = listSecrets(namespace);
60+
for (V1Secret v1Secret : secretList.getItems()) {
61+
V1ObjectMeta meta = Optional.ofNullable(v1Secret).map(V1Secret::getMetadata).orElse(new V1ObjectMeta());
62+
Map<String, String> annotations =
63+
Optional.of(meta).map(V1ObjectMeta::getAnnotations).orElse(Collections.emptyMap());
64+
String saName = annotations.get("kubernetes.io/service-account.name");
65+
if (serviceAccountName.equals(saName)) {
66+
logger.info("secret name = {0}", meta.getName());
67+
return meta.getName();
8468
}
69+
}
8570

86-
try {
87-
for (V1ServiceAccount v1ServiceAccount : v1ServiceAccounts) {
88-
if (v1ServiceAccount.getMetadata() != null && v1ServiceAccount.getMetadata().getName() != null) {
89-
if (v1ServiceAccount.getMetadata().getName().startsWith(serviceAccountName)) {
90-
List<V1ObjectReference> saSecretList = v1ServiceAccount.getSecrets();
91-
for (V1ObjectReference reference : saSecretList) {
92-
// Get the secret.
93-
V1Secret secret = readSecretByReference(reference, namespace);
94-
logger.info("secret token = {0}", secret.getMetadata().getName());
95-
return secret.getMetadata().getName();
96-
}
97-
}
98-
}
99-
}
100-
} catch (ApiException apie) {
101-
logger.info(" got ApiException");
102-
}
71+
logger.info("No secret found for service account; creating one");
72+
String saSecretName = serviceAccountName + "-" + "sa-token";
73+
V1Secret saSecret = new V1Secret()
74+
.type("kubernetes.io/service-account-token")
75+
.metadata(new V1ObjectMeta()
76+
.name(saSecretName)
77+
.namespace(namespace)
78+
.putAnnotationsItem("kubernetes.io/service-account.name", serviceAccountName));
79+
80+
try {
81+
Kubernetes.createSecret(saSecret);
82+
} catch (ApiException e) {
83+
logger.severe("failed to create secret for service account", e);
84+
return "";
10385
}
104-
return "";
86+
87+
testUntil(
88+
() -> hasToken(saSecretName, namespace),
89+
logger,
90+
"Waiting for token to be populated in secret");
91+
92+
return saSecretName;
93+
}
94+
95+
private static boolean hasToken(String saSecretName, String namespace) throws ApiException {
96+
V1Secret secret = Kubernetes.getSecret(saSecretName, namespace);
97+
if (secret != null) {
98+
Map<String, byte[]> data = Optional.of(secret).map(V1Secret::getData).orElse(Collections.emptyMap());
99+
return data.containsKey("token");
100+
}
101+
return false;
105102
}
106103

107104
/**
@@ -112,38 +109,26 @@ public static String getSecretOfServiceAccount(String namespace, String serviceA
112109
* @return the encoded token of the secret
113110
*/
114111
public static String getSecretEncodedToken(String namespace, String secretName) {
115-
LoggingFacade logger = getLogger();
116-
for (int i = 0; i < 10; i++) {
117-
String token = getToken(namespace, secretName);
118-
if (token != null) {
119-
logger.info("Got the token {0}", token);
120-
return token;
121-
}
122-
logger.info("Token is null, retrying after 5 seconds");
123-
assertDoesNotThrow(() -> TimeUnit.SECONDS.sleep(5));
124-
}
125-
logger.warning("Secret token is null");
126-
return null;
127-
}
128112

129-
private static String getToken(String namespace, String secretName) {
130-
String token = null;
131113
List<V1Secret> v1Secrets = new ArrayList<>();
114+
132115
V1SecretList secretList = listSecrets(namespace);
133116
if (secretList != null) {
134117
v1Secrets = secretList.getItems();
135118
}
119+
136120
for (V1Secret v1Secret : v1Secrets) {
137121
if (v1Secret.getMetadata() != null && v1Secret.getMetadata().getName() != null) {
138122
if (v1Secret.getMetadata().getName().equals(secretName)) {
139-
if (v1Secret.getData() != null && v1Secret.getData().get("token") != null) {
123+
if (v1Secret.getData() != null) {
140124
byte[] encodedToken = v1Secret.getData().get("token");
141-
token = Base64.getEncoder().encodeToString(encodedToken);
125+
return Base64.getEncoder().encodeToString(encodedToken);
142126
}
143127
}
144128
}
145129
}
146-
return token;
130+
131+
return "";
147132
}
148133

149134
/**

integration-tests/src/test/java/oracle/weblogic/kubernetes/actions/impl/primitive/Kubernetes.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -990,12 +990,12 @@ public static V1NamespaceList listNamespacesAsObjects() throws ApiException {
990990
}
991991

992992
/**
993-
* Return Namespace object for the given name from the Kubernetes cluster as V1Namespace object.
993+
* Gets namespace.
994994
* @name name of namespace.
995995
* @return V1Namespace Namespace object from the Kubernetes cluster
996996
* @throws ApiException if Kubernetes client API call fails
997997
*/
998-
public static V1Namespace getNamespaceAsObject(String name) throws ApiException {
998+
public static V1Namespace getNamespace(String name) throws ApiException {
999999
try {
10001000
V1NamespaceList namespaceList = coreV1Api.listNamespace(
10011001
PRETTY, // pretty print output
@@ -1633,6 +1633,18 @@ public static boolean createSecret(V1Secret secret) throws ApiException {
16331633
return true;
16341634
}
16351635

1636+
/**
1637+
* Gets a Kubernetes Secret.
1638+
*
1639+
* @param secretName Name of secret
1640+
* @param namespace Namespace
1641+
* @return secret, if found
1642+
* @throws ApiException if Kubernetes client API call fails
1643+
*/
1644+
public static V1Secret getSecret(String secretName, String namespace) throws ApiException {
1645+
return coreV1Api.readNamespacedSecret(secretName, namespace, PRETTY);
1646+
}
1647+
16361648
/**
16371649
* Delete a Kubernetes Secret.
16381650
*

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

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,12 @@
3030
import static oracle.weblogic.kubernetes.assertions.TestAssertions.podReady;
3131
import static oracle.weblogic.kubernetes.utils.CommonTestUtils.testUntil;
3232
import static oracle.weblogic.kubernetes.utils.ImageUtils.createBaseRepoSecret;
33-
import static oracle.weblogic.kubernetes.utils.SecretUtils.verifyDefaultTokenExists;
33+
import static oracle.weblogic.kubernetes.utils.SecretUtils.verifyNamespaceActive;
3434
import static oracle.weblogic.kubernetes.utils.ThreadSafeLogger.getLogger;
3535
import static org.apache.commons.io.FileUtils.copyDirectory;
3636
import static org.apache.commons.io.FileUtils.deleteDirectory;
3737
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
3838

39-
4039
/**
4140
* Utility class to build application.
4241
*/
@@ -233,7 +232,7 @@ public static Path buildApplication(
233232
*/
234233
public static V1Pod setupWebLogicPod(String namespace, V1Container container) {
235234
final LoggingFacade logger = getLogger();
236-
verifyDefaultTokenExists();
235+
verifyNamespaceActive();
237236

238237
//want to create a pod with a unique name
239238
//If a test calls buildApplication for 2 (or more) different applications

0 commit comments

Comments
 (0)