Skip to content

Commit d302822

Browse files
committed
add integration tests
1 parent f046e0f commit d302822

5 files changed

+220
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package io.javaoperatorsdk.operator;
2+
3+
import org.junit.jupiter.api.Test;
4+
import org.junit.jupiter.api.extension.RegisterExtension;
5+
6+
import io.fabric8.kubernetes.api.model.ConfigMap;
7+
import io.fabric8.kubernetes.api.model.ObjectMetaBuilder;
8+
import io.javaoperatorsdk.operator.junit.OperatorExtension;
9+
import io.javaoperatorsdk.operator.sample.kubernetesdependentgarbagecollection.DependentGarbageCollectionTestCustomResource;
10+
import io.javaoperatorsdk.operator.sample.kubernetesdependentgarbagecollection.DependentGarbageCollectionTestCustomResourceSpec;
11+
import io.javaoperatorsdk.operator.sample.kubernetesdependentgarbagecollection.DependentGarbageCollectionTestReconciler;
12+
13+
import static org.assertj.core.api.Assertions.assertThat;
14+
import static org.awaitility.Awaitility.await;
15+
16+
public class KubernetesDependentGarbageCollectionIT {
17+
18+
public static final String TEST_RESOURCE_NAME = "test1";
19+
@RegisterExtension
20+
OperatorExtension operator =
21+
OperatorExtension.builder()
22+
.withReconciler(new DependentGarbageCollectionTestReconciler())
23+
.build();
24+
25+
26+
@Test
27+
void resourceSecondaryResourceIsGarbageCollected() {
28+
var resource = customResource();
29+
var createdResources =
30+
operator.create(DependentGarbageCollectionTestCustomResource.class, resource);
31+
32+
await().untilAsserted(() -> {
33+
ConfigMap configMap = operator.get(ConfigMap.class, TEST_RESOURCE_NAME);
34+
assertThat(configMap).isNotNull();
35+
});
36+
37+
ConfigMap configMap = operator.get(ConfigMap.class, TEST_RESOURCE_NAME);
38+
assertThat(configMap.getMetadata().getOwnerReferences()).hasSize(1);
39+
assertThat(configMap.getMetadata().getOwnerReferences().get(0).getName())
40+
.isEqualTo(TEST_RESOURCE_NAME);
41+
42+
operator.delete(DependentGarbageCollectionTestCustomResource.class, createdResources);
43+
44+
await().untilAsserted(() -> {
45+
ConfigMap cm = operator.get(ConfigMap.class, TEST_RESOURCE_NAME);
46+
assertThat(cm).isNull();
47+
});
48+
}
49+
50+
@Test
51+
void deletesSecondaryResource() {
52+
var resource = customResource();
53+
var createdResources =
54+
operator.create(DependentGarbageCollectionTestCustomResource.class, resource);
55+
56+
await().untilAsserted(() -> {
57+
ConfigMap configMap = operator.get(ConfigMap.class, TEST_RESOURCE_NAME);
58+
assertThat(configMap).isNotNull();
59+
});
60+
61+
createdResources.getSpec().setCreateConfigMap(false);
62+
operator.replace(DependentGarbageCollectionTestCustomResource.class, createdResources);
63+
64+
await().untilAsserted(() -> {
65+
ConfigMap cm = operator.get(ConfigMap.class, TEST_RESOURCE_NAME);
66+
assertThat(cm).isNull();
67+
});
68+
}
69+
70+
DependentGarbageCollectionTestCustomResource customResource() {
71+
DependentGarbageCollectionTestCustomResource resource =
72+
new DependentGarbageCollectionTestCustomResource();
73+
resource.setMetadata(new ObjectMetaBuilder()
74+
.withName(TEST_RESOURCE_NAME)
75+
.build());
76+
resource.setSpec(new DependentGarbageCollectionTestCustomResourceSpec());
77+
resource.getSpec().setCreateConfigMap(true);
78+
return resource;
79+
}
80+
81+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package io.javaoperatorsdk.operator.sample.kubernetesdependentgarbagecollection;
2+
3+
import io.fabric8.kubernetes.api.model.Namespaced;
4+
import io.fabric8.kubernetes.client.CustomResource;
5+
import io.fabric8.kubernetes.model.annotation.Group;
6+
import io.fabric8.kubernetes.model.annotation.ShortNames;
7+
import io.fabric8.kubernetes.model.annotation.Version;
8+
9+
@Group("sample.javaoperatorsdk")
10+
@Version("v1")
11+
@ShortNames("dgc")
12+
public class DependentGarbageCollectionTestCustomResource
13+
extends
14+
CustomResource<DependentGarbageCollectionTestCustomResourceSpec, DependentGarbageCollectionTestCustomResourceStatus>
15+
implements Namespaced {
16+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package io.javaoperatorsdk.operator.sample.kubernetesdependentgarbagecollection;
2+
3+
public class DependentGarbageCollectionTestCustomResourceSpec {
4+
5+
private boolean createConfigMap;
6+
7+
public boolean isCreateConfigMap() {
8+
return createConfigMap;
9+
}
10+
11+
public DependentGarbageCollectionTestCustomResourceSpec setCreateConfigMap(
12+
boolean createConfigMap) {
13+
this.createConfigMap = createConfigMap;
14+
return this;
15+
}
16+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package io.javaoperatorsdk.operator.sample.kubernetesdependentgarbagecollection;
2+
3+
public class DependentGarbageCollectionTestCustomResourceStatus {
4+
5+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
package io.javaoperatorsdk.operator.sample.kubernetesdependentgarbagecollection;
2+
3+
import java.util.Map;
4+
5+
import io.fabric8.kubernetes.api.model.ConfigMap;
6+
import io.fabric8.kubernetes.api.model.ObjectMetaBuilder;
7+
import io.fabric8.kubernetes.client.KubernetesClient;
8+
import io.fabric8.kubernetes.client.KubernetesClientException;
9+
import io.javaoperatorsdk.operator.api.reconciler.*;
10+
import io.javaoperatorsdk.operator.api.reconciler.dependent.GarbageCollected;
11+
import io.javaoperatorsdk.operator.junit.KubernetesClientAware;
12+
import io.javaoperatorsdk.operator.processing.dependent.Creator;
13+
import io.javaoperatorsdk.operator.processing.dependent.Updater;
14+
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependentResource;
15+
import io.javaoperatorsdk.operator.processing.event.source.EventSource;
16+
17+
@ControllerConfiguration
18+
public class DependentGarbageCollectionTestReconciler
19+
implements Reconciler<DependentGarbageCollectionTestCustomResource>,
20+
EventSourceInitializer<DependentGarbageCollectionTestCustomResource>,
21+
KubernetesClientAware, ErrorStatusHandler<DependentGarbageCollectionTestCustomResource> {
22+
23+
private KubernetesClient kubernetesClient;
24+
private volatile boolean errorOccurred = false;
25+
26+
ConfigMapDependentResource configMapDependent;
27+
28+
public DependentGarbageCollectionTestReconciler() {
29+
configMapDependent = new ConfigMapDependentResource();
30+
}
31+
32+
@Override
33+
public Map<String, EventSource> prepareEventSources(
34+
EventSourceContext<DependentGarbageCollectionTestCustomResource> context) {
35+
return EventSourceInitializer
36+
.nameEventSources(configMapDependent.initEventSource(context));
37+
}
38+
39+
@Override
40+
public UpdateControl<DependentGarbageCollectionTestCustomResource> reconcile(
41+
DependentGarbageCollectionTestCustomResource primary,
42+
Context<DependentGarbageCollectionTestCustomResource> context) {
43+
44+
if (primary.getSpec().isCreateConfigMap()) {
45+
configMapDependent.reconcile(primary, context);
46+
} else {
47+
configMapDependent.delete(primary, context);
48+
}
49+
50+
return UpdateControl.noUpdate();
51+
}
52+
53+
@Override
54+
public void setKubernetesClient(KubernetesClient kubernetesClient) {
55+
this.kubernetesClient = kubernetesClient;
56+
configMapDependent.setKubernetesClient(kubernetesClient);
57+
}
58+
59+
@Override
60+
public KubernetesClient getKubernetesClient() {
61+
return this.kubernetesClient;
62+
}
63+
64+
@Override
65+
public ErrorStatusUpdateControl<DependentGarbageCollectionTestCustomResource> updateErrorStatus(
66+
DependentGarbageCollectionTestCustomResource resource,
67+
Context<DependentGarbageCollectionTestCustomResource> context, Exception e) {
68+
// this can happen when a namespace is terminated in test
69+
if (e instanceof KubernetesClientException) {
70+
return ErrorStatusUpdateControl.noStatusUpdate();
71+
}
72+
errorOccurred = true;
73+
return ErrorStatusUpdateControl.noStatusUpdate();
74+
}
75+
76+
public boolean isErrorOccurred() {
77+
return errorOccurred;
78+
}
79+
80+
private static class ConfigMapDependentResource extends
81+
KubernetesDependentResource<ConfigMap, DependentGarbageCollectionTestCustomResource>
82+
implements Creator<ConfigMap, DependentGarbageCollectionTestCustomResource>,
83+
Updater<ConfigMap, DependentGarbageCollectionTestCustomResource>,
84+
GarbageCollected<DependentGarbageCollectionTestCustomResource> {
85+
86+
public ConfigMapDependentResource() {
87+
super(ConfigMap.class);
88+
}
89+
90+
@Override
91+
protected ConfigMap desired(DependentGarbageCollectionTestCustomResource primary,
92+
Context<DependentGarbageCollectionTestCustomResource> context) {
93+
ConfigMap configMap = new ConfigMap();
94+
configMap.setMetadata(new ObjectMetaBuilder()
95+
.withName(primary.getMetadata().getName())
96+
.withNamespace(primary.getMetadata().getNamespace())
97+
.build());
98+
configMap.setData(Map.of("key", "data"));
99+
return configMap;
100+
}
101+
}
102+
}

0 commit comments

Comments
 (0)