Skip to content

Commit 50f3b43

Browse files
authored
improve: integration test for special resources (#1910)
1 parent 92f2f28 commit 50f3b43

File tree

5 files changed

+158
-0
lines changed

5 files changed

+158
-0
lines changed
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
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.ObjectMetaBuilder;
7+
import io.fabric8.kubernetes.api.model.ServiceAccount;
8+
import io.javaoperatorsdk.operator.junit.LocallyRunOperatorExtension;
9+
import io.javaoperatorsdk.operator.sample.specialresourcesdependent.SpecialResourceCustomResource;
10+
import io.javaoperatorsdk.operator.sample.specialresourcesdependent.SpecialResourceSpec;
11+
import io.javaoperatorsdk.operator.sample.specialresourcesdependent.SpecialResourceTestReconciler;
12+
13+
import static io.javaoperatorsdk.operator.sample.specialresourcesdependent.SpecialResourceSpec.CHANGED_VALUE;
14+
import static io.javaoperatorsdk.operator.sample.specialresourcesdependent.SpecialResourceSpec.INITIAL_VALUE;
15+
import static org.assertj.core.api.Assertions.assertThat;
16+
import static org.awaitility.Awaitility.await;
17+
18+
/*
19+
* Test for resources that are somehow special, currently mostly to cover the approach to handle
20+
* resources without spec. Not all the resources added here.
21+
*/
22+
public class SpecialResourcesDependentIT {
23+
24+
public static final String RESOURCE_NAME = "test1";
25+
26+
@RegisterExtension
27+
LocallyRunOperatorExtension extension =
28+
LocallyRunOperatorExtension.builder().withReconciler(new SpecialResourceTestReconciler())
29+
.build();
30+
31+
@Test
32+
void specialCRUDReconciler() {
33+
var resource = extension.create(testResource());
34+
35+
await().untilAsserted(() -> {
36+
var sa = extension.get(ServiceAccount.class, RESOURCE_NAME);
37+
assertThat(sa).isNotNull();
38+
assertThat(sa.getAutomountServiceAccountToken()).isTrue();
39+
});
40+
41+
resource.getSpec().setValue(CHANGED_VALUE);
42+
extension.replace(resource);
43+
44+
await().untilAsserted(() -> {
45+
var sa = extension.get(ServiceAccount.class, RESOURCE_NAME);
46+
assertThat(sa).isNotNull();
47+
assertThat(sa.getAutomountServiceAccountToken()).isFalse();
48+
});
49+
50+
}
51+
52+
SpecialResourceCustomResource testResource() {
53+
SpecialResourceCustomResource res = new SpecialResourceCustomResource();
54+
res.setMetadata(new ObjectMetaBuilder()
55+
.withName(RESOURCE_NAME)
56+
.build());
57+
res.setSpec(new SpecialResourceSpec());
58+
res.getSpec().setValue(INITIAL_VALUE);
59+
return res;
60+
}
61+
62+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package io.javaoperatorsdk.operator.sample.specialresourcesdependent;
2+
3+
import io.fabric8.kubernetes.api.model.ObjectMetaBuilder;
4+
import io.fabric8.kubernetes.api.model.ServiceAccount;
5+
import io.javaoperatorsdk.operator.api.reconciler.Context;
6+
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.CRUDKubernetesDependentResource;
7+
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependent;
8+
9+
import static io.javaoperatorsdk.operator.sample.specialresourcesdependent.SpecialResourceSpec.INITIAL_VALUE;
10+
11+
@KubernetesDependent
12+
public class ServiceAccountDependentResource extends
13+
CRUDKubernetesDependentResource<ServiceAccount, SpecialResourceCustomResource> {
14+
15+
public ServiceAccountDependentResource() {
16+
super(ServiceAccount.class);
17+
}
18+
19+
@Override
20+
protected ServiceAccount desired(SpecialResourceCustomResource primary,
21+
Context<SpecialResourceCustomResource> context) {
22+
ServiceAccount res = new ServiceAccount();
23+
res.setMetadata(new ObjectMetaBuilder()
24+
.withName(primary.getMetadata().getName())
25+
.withNamespace(primary.getMetadata().getNamespace())
26+
.build());
27+
res.setAutomountServiceAccountToken(INITIAL_VALUE.equals(primary.getSpec().getValue()));
28+
29+
return res;
30+
}
31+
32+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package io.javaoperatorsdk.operator.sample.specialresourcesdependent;
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("srd")
12+
public class SpecialResourceCustomResource extends CustomResource<SpecialResourceSpec, Void>
13+
implements Namespaced {
14+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package io.javaoperatorsdk.operator.sample.specialresourcesdependent;
2+
3+
public class SpecialResourceSpec {
4+
5+
public static final String INITIAL_VALUE = "initial_val";
6+
public static final String CHANGED_VALUE = "changed_val";
7+
8+
private String value;
9+
10+
public String getValue() {
11+
return value;
12+
}
13+
14+
public SpecialResourceSpec setValue(String value) {
15+
this.value = value;
16+
return this;
17+
}
18+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package io.javaoperatorsdk.operator.sample.specialresourcesdependent;
2+
3+
import java.util.concurrent.atomic.AtomicInteger;
4+
5+
import io.javaoperatorsdk.operator.api.reconciler.*;
6+
import io.javaoperatorsdk.operator.api.reconciler.dependent.Dependent;
7+
import io.javaoperatorsdk.operator.support.TestExecutionInfoProvider;
8+
9+
@ControllerConfiguration(
10+
namespaces = Constants.WATCH_CURRENT_NAMESPACE,
11+
dependents = {
12+
@Dependent(type = ServiceAccountDependentResource.class),
13+
})
14+
public class SpecialResourceTestReconciler
15+
implements Reconciler<SpecialResourceCustomResource>,
16+
TestExecutionInfoProvider {
17+
18+
private final AtomicInteger numberOfExecutions = new AtomicInteger(0);
19+
20+
@Override
21+
public UpdateControl<SpecialResourceCustomResource> reconcile(
22+
SpecialResourceCustomResource resource,
23+
Context<SpecialResourceCustomResource> context) {
24+
numberOfExecutions.addAndGet(1);
25+
return UpdateControl.noUpdate();
26+
}
27+
28+
public int getNumberOfExecutions() {
29+
return numberOfExecutions.get();
30+
}
31+
32+
}

0 commit comments

Comments
 (0)