Skip to content

Commit 862b80b

Browse files
committed
integration test
1 parent 81e889d commit 862b80b

File tree

3 files changed

+67
-3
lines changed

3 files changed

+67
-3
lines changed

operator-framework/src/test/java/io/javaoperatorsdk/operator/ExternalStateIT.java

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,75 @@
33
import org.junit.jupiter.api.Test;
44
import org.junit.jupiter.api.extension.RegisterExtension;
55

6+
import io.fabric8.kubernetes.api.model.ConfigMap;
7+
import io.fabric8.kubernetes.api.model.ObjectMetaBuilder;
68
import io.javaoperatorsdk.operator.junit.LocallyRunOperatorExtension;
9+
import io.javaoperatorsdk.operator.sample.externalstate.ExternalStateCustomResource;
710
import io.javaoperatorsdk.operator.sample.externalstate.ExternalStateReconciler;
11+
import io.javaoperatorsdk.operator.sample.externalstate.ExternalStateSpec;
12+
import io.javaoperatorsdk.operator.support.ExternalIDGenServiceMock;
13+
14+
import static io.javaoperatorsdk.operator.sample.externalstate.ExternalStateReconciler.ID_KEY;
15+
import static org.assertj.core.api.Assertions.assertThat;
16+
import static org.awaitility.Awaitility.await;
817

918
class ExternalStateIT {
1019

20+
private static final String TEST_RESOURCE_NAME = "test1";
21+
22+
public static final String INITIAL_TEST_DATA = "initialTestData";
23+
public static final String UPDATED_DATA = "updatedData";
24+
25+
private ExternalIDGenServiceMock externalService = ExternalIDGenServiceMock.getInstance();
26+
1127
@RegisterExtension
1228
LocallyRunOperatorExtension operator =
1329
LocallyRunOperatorExtension.builder().withReconciler(ExternalStateReconciler.class)
1430
.build();
1531

1632
@Test
1733
public void reconcilesResourceWithPersistentState() {
34+
var resource = operator.create(testResource());
35+
assertResourcesCreated(resource, INITIAL_TEST_DATA);
36+
37+
resource.getSpec().setData(UPDATED_DATA);
38+
operator.replace(resource);
39+
assertResourcesCreated(resource, UPDATED_DATA);
1840

41+
operator.delete(resource);
42+
assertResourcesDeleted(resource);
1943
}
2044

45+
private void assertResourcesDeleted(ExternalStateCustomResource resource) {
46+
await().untilAsserted(() -> {
47+
var cm = operator.get(ConfigMap.class, resource.getMetadata().getName());
48+
var resources = externalService.listResources();
49+
assertThat(cm).isNull();
50+
assertThat(resources).isEmpty();
51+
});
52+
}
53+
54+
private void assertResourcesCreated(ExternalStateCustomResource resource,
55+
String initialTestData) {
56+
await().untilAsserted(() -> {
57+
var cm = operator.get(ConfigMap.class, resource.getMetadata().getName());
58+
var resources = externalService.listResources();
59+
assertThat(resources).hasSize(1);
60+
var extRes = externalService.listResources().get(0);
61+
assertThat(extRes.getData()).isEqualTo(initialTestData);
62+
assertThat(cm).isNotNull();
63+
assertThat(cm.getData().get(ID_KEY)).isEqualTo(extRes.getId());
64+
});
65+
}
66+
67+
private ExternalStateCustomResource testResource() {
68+
var res = new ExternalStateCustomResource();
69+
res.setMetadata(new ObjectMetaBuilder()
70+
.withName(TEST_RESOURCE_NAME)
71+
.build());
72+
73+
res.setSpec(new ExternalStateSpec());
74+
res.getSpec().setData(INITIAL_TEST_DATA);
75+
return res;
76+
}
2177
}

operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/externalstate/ExternalStateReconciler.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,10 @@ private void createExternalResource(ExternalStateCustomResource resource) {
8585
@Override
8686
public DeleteControl cleanup(ExternalStateCustomResource resource,
8787
Context<ExternalStateCustomResource> context) {
88+
var externalResource = context.getSecondaryResource(ExternalResource.class);
89+
externalResource.ifPresent(er -> {
90+
externalService.delete(er.getId());
91+
});
8892
client.configMaps().inNamespace(resource.getMetadata().getNamespace())
8993
.withName(resource.getMetadata().getName()).delete();
9094
return DeleteControl.defaultDelete();
@@ -103,7 +107,10 @@ public Map<String, EventSource> prepareEventSources(
103107
configMapEventSource.setEventSourcePriority(EventSourceStartPriority.RESOURCE_STATE_LOADER);
104108

105109
externalResourceEventSource = new PerResourcePollingEventSource<>(primaryResource -> {
106-
var configMap = configMapEventSource.getSecondaryResource(primaryResource).orElseThrow();
110+
var configMap = configMapEventSource.getSecondaryResource(primaryResource).orElse(null);
111+
if (configMap == null) {
112+
return Collections.emptySet();
113+
}
107114
var id = configMap.getData().get(ID_KEY);
108115
var externalResource = externalService.read(id);
109116
return externalResource.map(er -> Set.of(er)).orElse(Collections.emptySet());

operator-framework/src/test/java/io/javaoperatorsdk/operator/support/ExternalIDGenServiceMock.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,9 @@ public ExternalResource create(ExternalResource externalResource) {
1414
throw new IllegalArgumentException("ID provided for external resource");
1515
}
1616
String id = UUID.randomUUID().toString();
17-
resourceMap.put(id, new ExternalResource(id, externalResource.getData()));
18-
return externalResource;
17+
var newResource = new ExternalResource(id, externalResource.getData());
18+
resourceMap.put(id, newResource);
19+
return newResource;
1920
}
2021

2122
public Optional<ExternalResource> read(String id) {

0 commit comments

Comments
 (0)