Skip to content

Commit d36daa4

Browse files
committed
Merge remote-tracking branch 'origin/develop' into OWLS-68700
2 parents c7e9a62 + 76ff080 commit d36daa4

File tree

8 files changed

+99
-47
lines changed

8 files changed

+99
-47
lines changed

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

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -577,8 +577,9 @@ private static void doCheckAndCreateDomainPresence(
577577
// Has the spec actually changed? We will get watch events for status updates
578578
Domain current = info.getDomain();
579579
if (existingDomain && current != null) {
580-
if (!explicitRecheck && !hasExplicitRestarts && spec.equals(current.getSpec())) {
581-
// nothing in the spec has changed
580+
if (isOlderResourceVersion(current, dom)
581+
|| (!explicitRecheck && !hasExplicitRestarts && spec.equals(current.getSpec()))) {
582+
// nothing in the spec has changed or we received an outdated watch event
582583
LOGGER.fine(MessageKeys.NOT_STARTING_DOMAINUID_THREAD, domainUID);
583584
return;
584585
}
@@ -660,6 +661,11 @@ public void onThrowable(Packet packet, Throwable throwable) {
660661
LOGGER.exiting();
661662
}
662663

664+
static boolean isOlderResourceVersion(Domain current, Domain dom) {
665+
return Integer.parseInt(dom.getMetadata().getResourceVersion())
666+
< Integer.parseInt(current.getMetadata().getResourceVersion());
667+
}
668+
663669
static Step.StepAndPacket createDomainUpPlan(DomainPresenceInfo info, String ns) {
664670
PodWatcher pw = podWatchers.get(ns);
665671
Step managedServerStrategy =

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,5 @@ public class Workarounds {
1515
// This breaks some K8s model comparisons.
1616

1717
// Reported to https://github.com/kubernetes-client/java as issue #282
18-
public static final boolean INTORSTRING_BAD_EQUALS = true;
18+
public static final boolean INTORSTRING_BAD_EQUALS = false;
1919
}

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -417,8 +417,10 @@ public Set<Entry<String, ServerKubernetesObjects>> entrySet() {
417417
@Override
418418
public ServerKubernetesObjects putIfAbsent(String key, ServerKubernetesObjects value) {
419419
ServerKubernetesObjects result = delegate.putIfAbsent(key, value);
420+
DomainPresenceMonitor.putIfAbsent(key, result);
420421
if (result == null) {
421422
Domain d = domain.get();
423+
DomainPresenceMonitor.putIfAbsentDomain(d);
422424
if (d != null) {
423425
ServerKubernetesObjectsManager.register(d.getSpec().getDomainUID(), key, value);
424426
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
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 oracle.kubernetes.weblogic.domain.v2.Domain;
8+
9+
class DomainPresenceMonitor {
10+
11+
private static String serverNameAsKey;
12+
private static ServerKubernetesObjects result;
13+
private static Domain domain;
14+
private static String registeredName;
15+
private static String unregisteredName;
16+
17+
static void clear() {
18+
serverNameAsKey = null;
19+
domain = null;
20+
registeredName = null;
21+
}
22+
23+
static String getExplanation() {
24+
StringBuilder sb = new StringBuilder();
25+
if (serverNameAsKey != null)
26+
format(sb, "putIfAbsent called with %s and returned %s", serverNameAsKey, result);
27+
if (domain != null) format(sb, "Domain was not null");
28+
if (registeredName != null) format(sb, "registered with key %s", registeredName);
29+
if (unregisteredName != null) format(sb, "unregistered with key %s", unregisteredName);
30+
31+
return sb.toString();
32+
}
33+
34+
private static void format(StringBuilder sb, String pattern, Object... values) {
35+
sb.append(String.format(pattern, values)).append("\n");
36+
}
37+
38+
static void putIfAbsent(String key, ServerKubernetesObjects result) {
39+
DomainPresenceMonitor.serverNameAsKey = key;
40+
DomainPresenceMonitor.result = result;
41+
}
42+
43+
static void putIfAbsentDomain(Domain domain) {
44+
DomainPresenceMonitor.domain = domain;
45+
}
46+
47+
static void registered(String registeredName) {
48+
DomainPresenceMonitor.registeredName = registeredName;
49+
}
50+
51+
static void unregistered(String unregisteredName) {
52+
DomainPresenceMonitor.unregisteredName = unregisteredName;
53+
}
54+
}

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

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
import static oracle.kubernetes.operator.LabelConstants.DOMAINUID_LABEL;
1313
import static oracle.kubernetes.operator.LabelConstants.RESOURCE_VERSION_LABEL;
1414
import static oracle.kubernetes.operator.VersionConstants.DEFAULT_DOMAIN_VERSION;
15-
import static oracle.kubernetes.operator.Workarounds.INTORSTRING_BAD_EQUALS;
1615

1716
import io.kubernetes.client.custom.IntOrString;
1817
import io.kubernetes.client.models.V1ObjectMeta;
@@ -31,7 +30,6 @@
3130
import oracle.kubernetes.operator.work.NextAction;
3231
import oracle.kubernetes.operator.work.Packet;
3332
import oracle.kubernetes.operator.work.Step;
34-
import org.yaml.snakeyaml.Yaml;
3533

3634
/** Helper class to add/remove server from Ingress. */
3735
public class IngressHelper {
@@ -123,21 +121,7 @@ Step replaceIngressStep(Step next) {
123121

124122
private boolean isCompatible(V1beta1Ingress result) {
125123
return VersionHelper.matchesResourceVersion(result.getMetadata(), DEFAULT_DOMAIN_VERSION)
126-
&& equalObjects(result.getSpec(), createIngressSpec());
127-
}
128-
129-
private boolean equalObjects(V1beta1IngressSpec object1, V1beta1IngressSpec object2) {
130-
return INTORSTRING_BAD_EQUALS
131-
? yamlEquals(object1, object2)
132-
: Objects.equals(object1, object2);
133-
}
134-
135-
private boolean yamlEquals(Object actual, Object expected) {
136-
return Objects.equals(objectToYaml(actual), objectToYaml(expected));
137-
}
138-
139-
private String objectToYaml(Object object) {
140-
return new Yaml().dump(object);
124+
&& Objects.equals(result.getSpec(), createIngressSpec());
141125
}
142126
}
143127

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@ public class ServerKubernetesObjectsManager {
1414

1515
private ServerKubernetesObjectsManager() {}
1616

17+
static void clear() {
18+
serverMap.clear();
19+
}
20+
1721
static ServerKubernetesObjects getOrCreate(DomainPresenceInfo info, String serverName) {
1822
return getOrCreate(info, info.getDomain().getSpec().getDomainUID(), serverName);
1923
}
@@ -30,10 +34,12 @@ public static ServerKubernetesObjects lookup(String serverLegalName) {
3034
}
3135

3236
static void register(String domainUID, String serverName, ServerKubernetesObjects sko) {
37+
DomainPresenceMonitor.registered(serverName);
3338
serverMap.put(LegalNames.toServerName(domainUID, serverName), sko);
3439
}
3540

3641
static void unregister(String domainUID, String serverName) {
42+
DomainPresenceMonitor.unregistered(serverName);
3743
serverMap.remove(LegalNames.toServerName(domainUID, serverName));
3844
}
3945

operator/src/test/java/oracle/kubernetes/operator/helpers/CallTestSupport.java

Lines changed: 1 addition & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,10 @@
44

55
package oracle.kubernetes.operator.helpers;
66

7-
import static oracle.kubernetes.operator.Workarounds.INTORSTRING_BAD_EQUALS;
8-
97
import com.meterware.simplestub.Memento;
108
import com.meterware.simplestub.StaticStubSupport;
119
import io.kubernetes.client.ApiClient;
1210
import io.kubernetes.client.ApiException;
13-
import io.kubernetes.client.models.V1beta1Ingress;
1411
import java.net.HttpURLConnection;
1512
import java.util.ArrayList;
1613
import java.util.Collections;
@@ -24,7 +21,6 @@
2421
import oracle.kubernetes.operator.calls.RequestParams;
2522
import oracle.kubernetes.operator.calls.SynchronousCallDispatcher;
2623
import oracle.kubernetes.operator.calls.SynchronousCallFactory;
27-
import oracle.kubernetes.operator.utils.YamlUtils;
2824

2925
/**
3026
* Support for writing unit tests that use CallBuilder to send requests that expect responses.
@@ -163,31 +159,10 @@ private boolean matches(RequestParams requestParams) {
163159

164160
private boolean matchesBody(Object actualBody, Object expectedBody) {
165161
return expectedBody instanceof BodyMatcher && ((BodyMatcher) expectedBody).matches(actualBody)
166-
|| equalBodies(actualBody, expectedBody)
162+
|| Objects.equals(actualBody, expectedBody)
167163
|| function != null;
168164
}
169165

170-
private static boolean equalBodies(Object actual, Object expected) {
171-
return useYamlComparison(actual)
172-
? yamlEquals(actual, expected)
173-
: Objects.equals(actual, expected);
174-
}
175-
176-
// This is a hack to get around a bug in the 1.0 K8s client code:
177-
// the IntOrString class does not define equals(), meaning that any classes which depend on
178-
// it require special handling.
179-
private static boolean useYamlComparison(Object actual) {
180-
return INTORSTRING_BAD_EQUALS && actual instanceof V1beta1Ingress;
181-
}
182-
183-
private static boolean yamlEquals(Object actual, Object expected) {
184-
return Objects.equals(objectToYaml(actual), objectToYaml(expected));
185-
}
186-
187-
private static String objectToYaml(Object object) {
188-
return YamlUtils.newYaml().dump(object);
189-
}
190-
191166
private boolean matches(AdditionalParams params) {
192167
return Objects.equals(params.fieldSelector, requestParamExpectations.get(FIELD_SELECTOR))
193168
&& Objects.equals(params.labelSelector, requestParamExpectations.get(LABEL_SELECTOR));

operator/src/test/java/oracle/kubernetes/operator/helpers/ServerKubernetesObjectsLookupTest.java

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,18 +16,41 @@
1616
import io.kubernetes.client.models.V1ObjectMeta;
1717
import java.util.ArrayList;
1818
import java.util.List;
19+
import java.util.Map;
1920
import java.util.concurrent.ConcurrentHashMap;
2021
import oracle.kubernetes.TestUtils;
2122
import oracle.kubernetes.weblogic.domain.v2.Domain;
2223
import oracle.kubernetes.weblogic.domain.v2.DomainSpec;
2324
import org.junit.After;
2425
import org.junit.Before;
26+
import org.junit.Rule;
2527
import org.junit.Test;
28+
import org.junit.rules.TestWatcher;
29+
import org.junit.runner.Description;
2630

2731
public class ServerKubernetesObjectsLookupTest {
2832

2933
private List<Memento> mementos = new ArrayList<>();
3034

35+
@Rule
36+
public TestWatcher watcher =
37+
new TestWatcher() {
38+
@Override
39+
protected void failed(Throwable e, Description description) {
40+
super.failed(e, description);
41+
System.out.println("Tell Russell\n" + DomainPresenceMonitor.getExplanation());
42+
try {
43+
Memento serverMap =
44+
StaticStubSupport.preserve(ServerKubernetesObjectsManager.class, "serverMap");
45+
Map<String, ServerKubernetesObjects> map = serverMap.getOriginalValue();
46+
System.out.println(" internal: " + map);
47+
System.out.println(
48+
" returned: " + ServerKubernetesObjectsManager.getServerKubernetesObjects());
49+
} catch (NoSuchFieldException ignored) {
50+
}
51+
}
52+
};
53+
3154
@Before
3255
public void setUp() throws Exception {
3356
mementos.add(TestUtils.silenceOperatorLogger());
@@ -37,10 +60,12 @@ public void setUp() throws Exception {
3760
mementos.add(
3861
StaticStubSupport.install(
3962
ServerKubernetesObjectsManager.class, "serverMap", new ConcurrentHashMap<>()));
63+
ServerKubernetesObjectsManager.clear();
64+
DomainPresenceMonitor.clear();
4065
}
4166

4267
@After
43-
public void tearDown() throws Exception {
68+
public void tearDown() {
4469
for (Memento memento : mementos) memento.revert();
4570
}
4671

0 commit comments

Comments
 (0)