Skip to content

Commit aeb3e2c

Browse files
authored
Merge pull request #586 from oracle/update_min_ks8_version
Update min ks8 version
2 parents 0c81825 + 73beb91 commit aeb3e2c

File tree

11 files changed

+352
-235
lines changed

11 files changed

+352
-235
lines changed

operator/src/main/java/oracle/kubernetes/operator/Main.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
import oracle.kubernetes.operator.helpers.ConfigMapHelper;
3535
import oracle.kubernetes.operator.helpers.DomainPresenceInfo;
3636
import oracle.kubernetes.operator.helpers.HealthCheckHelper;
37-
import oracle.kubernetes.operator.helpers.HealthCheckHelper.KubernetesVersion;
37+
import oracle.kubernetes.operator.helpers.KubernetesVersion;
3838
import oracle.kubernetes.operator.helpers.ResponseStep;
3939
import oracle.kubernetes.operator.helpers.ServerKubernetesObjects;
4040
import oracle.kubernetes.operator.logging.LoggingFacade;

operator/src/main/java/oracle/kubernetes/operator/helpers/HealthCheckHelper.java

Lines changed: 16 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
import java.util.HashMap;
1313
import java.util.List;
1414
import java.util.Map;
15-
import java.util.Objects;
1615
import oracle.kubernetes.operator.logging.LoggingFacade;
1716
import oracle.kubernetes.operator.logging.LoggingFactory;
1817
import oracle.kubernetes.operator.logging.MessageKeys;
@@ -66,8 +65,6 @@ public final class HealthCheckHelper {
6665
// default namespace or svc account name
6766
private static final String DEFAULT_NAMESPACE = "default";
6867

69-
private static final String MINIMUM_K8S_VERSION = "v1.7.5";
70-
7168
static {
7269
// CRUD resources
7370
namespaceAccessChecks.put(AuthorizationProxy.Resource.PODS, crudOperations);
@@ -121,7 +118,7 @@ public static void performSecurityChecks(
121118
AuthorizationProxy ap = new AuthorizationProxy();
122119
LOGGER.info(MessageKeys.VERIFY_ACCESS_START);
123120

124-
if (version.major > 1 || version.minor >= 8) {
121+
if (version.isRulesReviewSupported()) {
125122
boolean rulesReviewSuccessful = true;
126123
V1SelfSubjectRulesReview review = ap.review(ns);
127124
if (review == null) {
@@ -198,94 +195,33 @@ private static boolean apiGroupMatch(List<String> ruleApiGroups, String apiGroup
198195
return ruleApiGroups != null && ruleApiGroups.contains(apiGroup);
199196
}
200197

201-
/** Major and minor version of Kubernetes API Server */
202-
public static class KubernetesVersion {
203-
final int major;
204-
final int minor;
205-
206-
public KubernetesVersion(int major, int minor) {
207-
this.major = major;
208-
this.minor = minor;
209-
}
210-
211-
boolean isPublishNotReadyAddressesSupported() {
212-
return this.major > 1 || (this.major == 1 && this.minor >= 8);
213-
}
214-
215-
@Override
216-
public boolean equals(Object o) {
217-
return this == o || o instanceof KubernetesVersion && equals((KubernetesVersion) o);
218-
}
219-
220-
private boolean equals(KubernetesVersion o) {
221-
return major == o.major && minor == o.minor;
222-
}
223-
224-
@Override
225-
public int hashCode() {
226-
return Objects.hash(major, minor);
227-
}
228-
229-
@Override
230-
public String toString() {
231-
return "KubernetesVersion{" + "major=" + major + ", minor=" + minor + '}';
232-
}
233-
}
234-
235198
/**
236199
* Verify the k8s version.
237200
*
238201
* @return Major and minor version information
239202
*/
240203
public static KubernetesVersion performK8sVersionCheck() {
241-
242-
// k8s version must be 1.7.5 or greater
243204
LOGGER.info(MessageKeys.VERIFY_K8S_MIN_VERSION);
244-
boolean k8sMinVersion = true;
245-
VersionInfo info;
246205

247-
int major = 0;
248-
int minor = 0;
249206
try {
250-
info = new CallBuilder().readVersionCode();
251-
252-
String gitVersion = info.getGitVersion();
253-
major = Integer.parseInt(info.getMajor());
254-
if (major < 1) {
255-
k8sMinVersion = false;
256-
} else if (major == 1) {
257-
// The Minor version can be also 8+
258-
String minor_string = info.getMinor();
259-
// It will check if it is a number.
260-
// If not it will remove the last part of the string in order to have just a number
261-
while (!minor_string.chars().allMatch(Character::isDigit)) {
262-
minor_string = minor_string.substring(0, minor_string.length() - 1);
263-
}
264-
minor = Integer.parseInt(minor_string);
265-
if (minor < 7) {
266-
k8sMinVersion = false;
267-
} else if (minor == 7) {
268-
// git version is of the form v1.7.5
269-
// Check the 3rd part of the version.
270-
String[] splitVersion = gitVersion.split("\\.");
271-
// issue-36: gitVersion can be not just "v1.7.9" but also values like "v1.7.9+coreos.0"
272-
splitVersion = splitVersion[2].split("\\+");
273-
if (Integer.parseInt(splitVersion[0]) < 5) {
274-
k8sMinVersion = false;
275-
}
276-
}
277-
}
278-
279-
// Minimum k8s version not satisfied.
280-
if (!k8sMinVersion) {
281-
LOGGER.warning(MessageKeys.K8S_MIN_VERSION_CHECK_FAILED, MINIMUM_K8S_VERSION, gitVersion);
282-
} else {
283-
LOGGER.info(MessageKeys.K8S_VERSION_CHECK, gitVersion);
284-
}
207+
return createAndValidateKubernetesVersion(new CallBuilder().readVersionCode());
285208
} catch (ApiException ae) {
286209
LOGGER.warning(MessageKeys.K8S_VERSION_CHECK_FAILURE, ae);
210+
return KubernetesVersion.UNREADABLE;
287211
}
212+
}
213+
214+
private static KubernetesVersion createAndValidateKubernetesVersion(VersionInfo info) {
215+
KubernetesVersion kubernetesVersion = new KubernetesVersion(info);
288216

289-
return new KubernetesVersion(major, minor);
217+
if (!kubernetesVersion.isCompatible()) {
218+
LOGGER.warning(
219+
MessageKeys.K8S_VERSION_TOO_LOW,
220+
KubernetesVersion.getSupportedVersions(),
221+
kubernetesVersion.asDisplayString());
222+
} else {
223+
LOGGER.info(MessageKeys.K8S_VERSION_CHECK, kubernetesVersion.asDisplayString());
224+
}
225+
return kubernetesVersion;
290226
}
291227
}
Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
// Copyright 2018 Oracle Corporation and/or its affiliates. All rights reserved.
2+
// Licensed under the Universal Permissive License v 1.0 as shown at
3+
// http://oss.oracle.com/licenses/upl.
4+
5+
package oracle.kubernetes.operator.helpers;
6+
7+
import io.kubernetes.client.models.VersionInfo;
8+
import java.util.Objects;
9+
10+
/** Major and minor version of Kubernetes API Server */
11+
public class KubernetesVersion {
12+
static KubernetesVersion UNREADABLE = new KubernetesVersion(0, 0);
13+
private static final String[] MINIMUM_K8S_VERSIONS = {"1.10.11", "1.11.5", "1.12.3"};
14+
15+
private final int major;
16+
private final int minor;
17+
private final int revision;
18+
private final String version;
19+
20+
KubernetesVersion(int major, int minor) {
21+
this.major = major;
22+
this.minor = minor;
23+
revision = 0;
24+
version = String.format("%d.%d.0", major, minor);
25+
}
26+
27+
KubernetesVersion(VersionInfo info) {
28+
major = Integer.parseInt(info.getMajor());
29+
minor = getNumericPortion(info.getMinor());
30+
version = info.getGitVersion();
31+
revision = getRevision(asDisplayString());
32+
}
33+
34+
int getMajor() {
35+
return major;
36+
}
37+
38+
int getMinor() {
39+
return minor;
40+
}
41+
42+
String asDisplayString() {
43+
return version;
44+
}
45+
46+
static String getSupportedVersions() {
47+
return String.join("+,", MINIMUM_K8S_VERSIONS) + "+";
48+
}
49+
50+
// version is a string like 1.2.3[+abcd]
51+
private static int getRevision(String version) {
52+
String[] splitVersion = version.split("\\.");
53+
return splitVersion.length > 2 ? getNumericPortion(splitVersion[2]) : 0;
54+
}
55+
56+
private static int getNumericPortion(String numericString) {
57+
while (!numericString.chars().allMatch(Character::isDigit)) {
58+
numericString = numericString.substring(0, numericString.length() - 1);
59+
}
60+
return numericString.length() == 0 ? 0 : Integer.parseInt(numericString);
61+
}
62+
63+
enum Compatibility {
64+
REVISION_OK,
65+
REVISION_TOO_LOW,
66+
VERSION_HIGHER,
67+
VERSION_LOWER
68+
}
69+
70+
boolean isCompatible() {
71+
int numHigher = 0;
72+
for (String minimumVersion : MINIMUM_K8S_VERSIONS) {
73+
switch (getCompatibilityWith(minimumVersion)) {
74+
case REVISION_OK:
75+
return true;
76+
case REVISION_TOO_LOW:
77+
return false;
78+
case VERSION_HIGHER:
79+
numHigher++;
80+
}
81+
}
82+
83+
return numHigher == MINIMUM_K8S_VERSIONS.length;
84+
}
85+
86+
private Compatibility getCompatibilityWith(String minimumVersion) {
87+
String[] parts = minimumVersion.split("\\.");
88+
int allowedMajor = asInteger(parts[0]);
89+
if (major < allowedMajor) return Compatibility.VERSION_LOWER;
90+
if (major > allowedMajor) return Compatibility.VERSION_HIGHER;
91+
92+
int allowedMinor = asInteger(parts[1]);
93+
if (minor < allowedMinor) return Compatibility.VERSION_LOWER;
94+
if (minor > allowedMinor) return Compatibility.VERSION_HIGHER;
95+
96+
int allowedRevision = asInteger(parts[2]);
97+
return (revision >= allowedRevision)
98+
? Compatibility.REVISION_OK
99+
: Compatibility.REVISION_TOO_LOW;
100+
}
101+
102+
private int asInteger(String intString) {
103+
return Integer.parseInt(intString);
104+
}
105+
106+
boolean isPublishNotReadyAddressesSupported() {
107+
return this.major > 1 || (this.major == 1 && this.minor >= 8);
108+
}
109+
110+
boolean isRulesReviewSupported() {
111+
return this.major > 1 || (this.major == 1 && this.minor >= 8);
112+
}
113+
114+
@Override
115+
public boolean equals(Object o) {
116+
return this == o || o instanceof KubernetesVersion && equals((KubernetesVersion) o);
117+
}
118+
119+
private boolean equals(KubernetesVersion o) {
120+
return major == o.major && minor == o.minor;
121+
}
122+
123+
@Override
124+
public int hashCode() {
125+
return Objects.hash(major, minor);
126+
}
127+
128+
@Override
129+
public String toString() {
130+
return "KubernetesVersion{" + "major=" + major + ", minor=" + minor + '}';
131+
}
132+
}

operator/src/main/java/oracle/kubernetes/operator/helpers/ServiceHelper.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@
3131
import oracle.kubernetes.operator.ProcessingConstants;
3232
import oracle.kubernetes.operator.VersionConstants;
3333
import oracle.kubernetes.operator.calls.CallResponse;
34-
import oracle.kubernetes.operator.helpers.HealthCheckHelper.KubernetesVersion;
3534
import oracle.kubernetes.operator.logging.LoggingFacade;
3635
import oracle.kubernetes.operator.logging.LoggingFactory;
3736
import oracle.kubernetes.operator.steps.DefaultResponseStep;

operator/src/main/java/oracle/kubernetes/operator/logging/MessageKeys.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ private MessageKeys() {}
8080
public static final String APIEXCEPTION_FROM_SUBJECT_ACCESS_REVIEW = "WLSKO-0069";
8181
public static final String SUBJECT_ACCESS_REVIEW = "WLSKO-0070";
8282
public static final String REPLICA_MORE_THAN_WLS_SERVERS = "WLSKO-0071";
83-
public static final String K8S_MIN_VERSION_CHECK_FAILED = "WLSKO-0073";
83+
public static final String K8S_VERSION_TOO_LOW = "WLSKO-0073";
8484
public static final String VERIFY_K8S_MIN_VERSION = "WLSKO-0074";
8585
public static final String DOMAIN_UID_UNIQUENESS_FAILED = "WLSKO-0076";
8686
public static final String PV_NOT_FOUND_FOR_DOMAIN_UID = "WLSKO-0077";

operator/src/main/resources/Operator.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ WLSKO-0069=ApiException from SubjectAccessReview: {0}
7171
WLSKO-0070=SubjectAccessReview: {0}
7272
WLSKO-0071=Replicas in {0} for cluster {1} is specified with a value of {2} which is larger than the number of configured WLS servers in the cluster: {3}
7373
WLSKO-0072=
74-
WLSKO-0073=Kubernetes minimum version check failed. Required minimum version is {0}, but found version {1}
74+
WLSKO-0073=Kubernetes minimum version check failed. Supported versions are {0}, but found version {1}
7575
WLSKO-0074=Verifying Kubernetes minimum version
7676
WLSKO-0075=
7777
WLSKO-0076=WebLogic domain UID uniqueness check failed. Domain UID {0} exists in domains named {1} and {2}

operator/src/test/java/oracle/kubernetes/operator/ClientFactoryStub.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@
1010
import oracle.kubernetes.operator.helpers.ClientFactory;
1111
import oracle.kubernetes.operator.helpers.ClientPool;
1212

13-
class ClientFactoryStub implements ClientFactory {
13+
public class ClientFactoryStub implements ClientFactory {
1414

15-
static Memento install() throws NoSuchFieldException {
15+
public static Memento install() throws NoSuchFieldException {
1616
return StaticStubSupport.install(ClientPool.class, "FACTORY", new ClientFactoryStub());
1717
}
1818

0 commit comments

Comments
 (0)