Skip to content

Commit a18e70f

Browse files
authored
Merge pull request #909 from oracle/improve-k8s-testing
Add Kubernetes stub-style testing
2 parents bef8def + 5a72d5d commit a18e70f

File tree

10 files changed

+847
-76
lines changed

10 files changed

+847
-76
lines changed

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

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -887,7 +887,13 @@ static Step createDomainUpPlan(DomainPresenceInfo info) {
887887
Step strategy =
888888
Step.chain(
889889
domainIntrospectionSteps(
890-
info, new DomainStatusStep(info, bringAdminServerUp(info, managedServerStrategy))));
890+
info,
891+
new DomainStatusStep(
892+
info,
893+
bringAdminServerUp(
894+
info,
895+
getPodAwaiterStepFactory(info.getNamespace()),
896+
managedServerStrategy))));
891897

892898
strategy =
893899
DomainStatusUpdater.createProgressingStep(
@@ -901,6 +907,10 @@ static Step createDomainUpPlan(DomainPresenceInfo info) {
901907
strategy);
902908
}
903909

910+
private static PodAwaiterStepFactory getPodAwaiterStepFactory(String namespace) {
911+
return Main.podWatchers.get(namespace);
912+
}
913+
904914
static Step createDomainDownPlan(DomainPresenceInfo info) {
905915
String ns = info.getNamespace();
906916
String domainUID = info.getDomainUID();
@@ -924,7 +934,7 @@ public UpHeadStep(DomainPresenceInfo info, Step next) {
924934

925935
@Override
926936
public NextAction apply(Packet packet) {
927-
PodWatcher pw = Main.podWatchers.get(info.getNamespace());
937+
PodWatcher pw = (PodWatcher) Main.podWatchers.get(info.getNamespace());
928938
info.setDeleting(false);
929939
packet
930940
.getComponents()
@@ -969,7 +979,7 @@ public DownHeadStep(DomainPresenceInfo info, String ns, Step next) {
969979
public NextAction apply(Packet packet) {
970980
info.setDeleting(true);
971981
unregisterStatusUpdater(ns, info.getDomainUID());
972-
PodWatcher pw = Main.podWatchers.get(ns);
982+
PodWatcher pw = (PodWatcher) Main.podWatchers.get(ns);
973983
packet
974984
.getComponents()
975985
.put(
@@ -991,8 +1001,9 @@ public NextAction apply(Packet packet) {
9911001

9921002
// pre-conditions: DomainPresenceInfo SPI
9931003
// "principal"
994-
private static Step bringAdminServerUp(DomainPresenceInfo info, Step next) {
995-
return Step.chain(bringAdminServerUpSteps(info, next));
1004+
static Step bringAdminServerUp(
1005+
DomainPresenceInfo info, PodAwaiterStepFactory podAwaiterStepFactory, Step next) {
1006+
return Step.chain(bringAdminServerUpSteps(info, podAwaiterStepFactory, next));
9961007
}
9971008

9981009
private static Step[] domainIntrospectionSteps(DomainPresenceInfo info, Step next) {
@@ -1007,10 +1018,11 @@ private static Step[] domainIntrospectionSteps(DomainPresenceInfo info, Step nex
10071018
next,
10081019
jws,
10091020
Main.isNamespaceStopping(dom.getMetadata().getNamespace())));
1010-
return resources.toArray(new Step[resources.size()]);
1021+
return resources.toArray(new Step[0]);
10111022
}
10121023

1013-
private static Step[] bringAdminServerUpSteps(DomainPresenceInfo info, Step next) {
1024+
private static Step[] bringAdminServerUpSteps(
1025+
DomainPresenceInfo info, PodAwaiterStepFactory podAwaiterStepFactory, Step next) {
10141026
List<Step> resources = new ArrayList<>();
10151027
resources.add(new BeforeAdminServiceStep(null));
10161028
resources.add(PodHelper.createAdminPodStep(null));
@@ -1024,8 +1036,8 @@ private static Step[] bringAdminServerUpSteps(DomainPresenceInfo info, Step next
10241036
}
10251037

10261038
resources.add(ServiceHelper.createForServerStep(null));
1027-
resources.add(new WatchPodReadyAdminStep(Main.podWatchers, next));
1028-
return resources.toArray(new Step[resources.size()]);
1039+
resources.add(new WatchPodReadyAdminStep(podAwaiterStepFactory, next));
1040+
return resources.toArray(new Step[0]);
10291041
}
10301042

10311043
private static Step bringManagedServersUp(Step next) {

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

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,12 @@
1919
import oracle.kubernetes.operator.TuningParameters.WatchTuning;
2020
import oracle.kubernetes.operator.builders.WatchBuilder;
2121
import oracle.kubernetes.operator.builders.WatchI;
22-
import oracle.kubernetes.operator.helpers.CallBuilderFactory;
22+
import oracle.kubernetes.operator.helpers.CallBuilder;
2323
import oracle.kubernetes.operator.helpers.ResponseStep;
2424
import oracle.kubernetes.operator.logging.LoggingFacade;
2525
import oracle.kubernetes.operator.logging.LoggingFactory;
2626
import oracle.kubernetes.operator.logging.MessageKeys;
2727
import oracle.kubernetes.operator.watcher.WatchListener;
28-
import oracle.kubernetes.operator.work.ContainerResolver;
2928
import oracle.kubernetes.operator.work.NextAction;
3029
import oracle.kubernetes.operator.work.Packet;
3130
import oracle.kubernetes.operator.work.Step;
@@ -184,13 +183,10 @@ public NextAction apply(Packet packet) {
184183
completeCallbackRegistrations.put(metadata.getName(), complete);
185184

186185
// Timing window -- job may have come ready before registration for callback
187-
CallBuilderFactory factory =
188-
ContainerResolver.getInstance().getContainer().getSPI(CallBuilderFactory.class);
189186
fiber
190187
.createChildFiber()
191188
.start(
192-
factory
193-
.create()
189+
new CallBuilder()
194190
.readJobAsync(
195191
metadata.getName(),
196192
metadata.getNamespace(),

operator/src/main/java/oracle/kubernetes/operator/steps/WatchPodReadyAdminStep.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,7 @@
55
package oracle.kubernetes.operator.steps;
66

77
import io.kubernetes.client.models.V1Pod;
8-
import java.util.Map;
98
import oracle.kubernetes.operator.PodAwaiterStepFactory;
10-
import oracle.kubernetes.operator.PodWatcher;
119
import oracle.kubernetes.operator.ProcessingConstants;
1210
import oracle.kubernetes.operator.helpers.DomainPresenceInfo;
1311
import oracle.kubernetes.operator.wlsconfig.WlsDomainConfig;
@@ -17,11 +15,12 @@
1715
import oracle.kubernetes.operator.work.Step;
1816

1917
public class WatchPodReadyAdminStep extends Step {
20-
private final Map<String, PodWatcher> podWatchers;
2118

22-
public WatchPodReadyAdminStep(Map<String, PodWatcher> podWatchers, Step next) {
19+
private final PodAwaiterStepFactory podAwaiterStepFactory;
20+
21+
public WatchPodReadyAdminStep(PodAwaiterStepFactory podAwaiterStepFactory, Step next) {
2322
super(next);
24-
this.podWatchers = podWatchers;
23+
this.podAwaiterStepFactory = podAwaiterStepFactory;
2524
}
2625

2726
@Override
@@ -31,7 +30,7 @@ public NextAction apply(Packet packet) {
3130
(WlsDomainConfig) packet.get(ProcessingConstants.DOMAIN_TOPOLOGY);
3231
V1Pod adminPod = info.getServers().get(domainTopology.getAdminServerName()).getPod().get();
3332

34-
PodWatcher pw = podWatchers.get(adminPod.getMetadata().getNamespace());
33+
PodAwaiterStepFactory pw = podAwaiterStepFactory;
3534
packet
3635
.getComponents()
3736
.put(

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

Lines changed: 78 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,32 @@
44

55
package oracle.kubernetes.operator;
66

7+
import static oracle.kubernetes.operator.DomainUpPlanTest.ContainerPortMatcher.hasContainerPort;
78
import static oracle.kubernetes.operator.DomainUpPlanTest.StepChainMatcher.hasChainWithStep;
89
import static oracle.kubernetes.operator.DomainUpPlanTest.StepChainMatcher.hasChainWithStepsInOrder;
10+
import static oracle.kubernetes.operator.ProcessingConstants.DOMAIN_TOPOLOGY;
11+
import static oracle.kubernetes.operator.helpers.KubernetesTestSupport.POD;
912
import static org.hamcrest.MatcherAssert.assertThat;
1013
import static org.hamcrest.Matchers.both;
1114
import static org.hamcrest.Matchers.is;
1215
import static org.hamcrest.Matchers.not;
1316

1417
import com.meterware.simplestub.Memento;
18+
import io.kubernetes.client.models.V1ContainerPort;
1519
import io.kubernetes.client.models.V1ObjectMeta;
20+
import io.kubernetes.client.models.V1Pod;
21+
import io.kubernetes.client.models.V1SecretReference;
1622
import java.util.ArrayList;
23+
import java.util.Collections;
1724
import java.util.List;
25+
import java.util.Optional;
1826
import oracle.kubernetes.TestUtils;
1927
import oracle.kubernetes.operator.helpers.DomainPresenceInfo;
28+
import oracle.kubernetes.operator.helpers.KubernetesTestSupport;
29+
import oracle.kubernetes.operator.helpers.TuningParametersStub;
30+
import oracle.kubernetes.operator.helpers.UnitTestHash;
2031
import oracle.kubernetes.operator.steps.DomainPresenceStep;
21-
import oracle.kubernetes.operator.work.FiberTestSupport;
32+
import oracle.kubernetes.operator.utils.WlsDomainConfigSupport;
2233
import oracle.kubernetes.operator.work.Step;
2334
import oracle.kubernetes.operator.work.TerminalStep;
2435
import oracle.kubernetes.weblogic.domain.DomainConfigurator;
@@ -32,12 +43,16 @@
3243

3344
public class DomainUpPlanTest {
3445
private static final String NS = "namespace";
35-
private FiberTestSupport testSupport = new FiberTestSupport();
46+
private static final String UID = "test-uid";
47+
private static final V1SecretReference SECRET = new V1SecretReference().name("secret");
48+
private KubernetesTestSupport testSupport = new KubernetesTestSupport();
3649
private List<Memento> mementos = new ArrayList<>();
3750
private final TerminalStep adminStep = new TerminalStep();
3851
private final TerminalStep managedServersStep = new TerminalStep();
3952
private Domain domain =
40-
new Domain().withMetadata(new V1ObjectMeta().namespace(NS)).withSpec(new DomainSpec());
53+
new Domain()
54+
.withMetadata(new V1ObjectMeta().namespace(NS))
55+
.withSpec(new DomainSpec().withDomainUID(UID).withWebLogicCredentialsSecret(SECRET));
4156
private DomainConfigurator configurator = DomainConfiguratorFactory.forDomain(domain);
4257
private DomainPresenceInfo domainPresenceInfo = new DomainPresenceInfo(domain);
4358

@@ -48,6 +63,7 @@ private DomainPresenceStep getDomainPresenceStep() {
4863
@Before
4964
public void setUp() {
5065
mementos.add(TestUtils.silenceOperatorLogger());
66+
mementos.add(testSupport.install());
5167

5268
testSupport.addDomainPresenceInfo(domainPresenceInfo);
5369
}
@@ -131,6 +147,65 @@ public void useSequenceBeforeAdminServerStep() {
131147
"EndProgressingStep"));
132148
}
133149

150+
@Test
151+
public void whenAdminPodCreated_hasListenPort() throws NoSuchFieldException {
152+
mementos.add(TuningParametersStub.install());
153+
mementos.add(UnitTestHash.install());
154+
155+
WlsDomainConfigSupport configSupport = new WlsDomainConfigSupport("domain");
156+
configSupport.addWlsServer("admin", 8045);
157+
configSupport.setAdminServerName("admin");
158+
Step plan =
159+
DomainProcessorImpl.bringAdminServerUp(
160+
new DomainPresenceInfo(domain), new NullPodWaiter(), null);
161+
testSupport.addToPacket(DOMAIN_TOPOLOGY, configSupport.createDomainConfig());
162+
testSupport.runSteps(plan);
163+
164+
List<V1Pod> resources = testSupport.getResources(POD);
165+
assertThat(resources.get(0), hasContainerPort(8045));
166+
}
167+
168+
static class NullPodWaiter implements PodAwaiterStepFactory {
169+
@Override
170+
public Step waitForReady(V1Pod pod, Step next) {
171+
return null;
172+
}
173+
}
174+
175+
@SuppressWarnings("unused")
176+
static class ContainerPortMatcher
177+
extends org.hamcrest.TypeSafeDiagnosingMatcher<io.kubernetes.client.models.V1Pod> {
178+
private int expectedPort;
179+
180+
private ContainerPortMatcher(int expectedPort) {
181+
this.expectedPort = expectedPort;
182+
}
183+
184+
static ContainerPortMatcher hasContainerPort(int expectedPort) {
185+
return new ContainerPortMatcher(expectedPort);
186+
}
187+
188+
@Override
189+
protected boolean matchesSafely(V1Pod item, Description mismatchDescription) {
190+
if (getContainerPorts(item).stream().anyMatch(p -> p.getContainerPort() == expectedPort))
191+
return true;
192+
193+
mismatchDescription.appendText("No matching port found in pod ").appendText(item.toString());
194+
return false;
195+
}
196+
197+
private List<V1ContainerPort> getContainerPorts(V1Pod item) {
198+
return Optional.ofNullable(item.getSpec().getContainers().get(0).getPorts())
199+
.orElse(Collections.emptyList());
200+
}
201+
202+
@Override
203+
public void describeTo(Description description) {
204+
description.appendText("Pod with container port ").appendValue(expectedPort);
205+
}
206+
}
207+
208+
@SuppressWarnings("unused")
134209
static class StepChainMatcher
135210
extends org.hamcrest.TypeSafeDiagnosingMatcher<oracle.kubernetes.operator.work.Step> {
136211
private String[] expectedSteps;

0 commit comments

Comments
 (0)