Skip to content

Commit d1db8d5

Browse files
committed
feat: automatically derive the the dependent resource type if not specified
Signed-off-by: xstefank <[email protected]>
1 parent 4225645 commit d1db8d5

File tree

15 files changed

+66
-33
lines changed

15 files changed

+66
-33
lines changed

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/AbstractEventSourceHolderDependentResource.java

+21-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package io.javaoperatorsdk.operator.processing.dependent;
22

3+
import java.lang.reflect.ParameterizedType;
34
import java.util.Optional;
45

56
import io.fabric8.kubernetes.api.model.HasMetadata;
@@ -23,13 +24,22 @@ public abstract class AbstractEventSourceHolderDependentResource<
2324
private boolean isCacheFillerEventSource;
2425
protected String eventSourceNameToUse;
2526

27+
@SuppressWarnings("unchecked")
28+
protected AbstractEventSourceHolderDependentResource() {
29+
this(null, null);
30+
}
31+
2632
protected AbstractEventSourceHolderDependentResource(Class<R> resourceType) {
2733
this(resourceType, null);
2834
}
2935

3036
protected AbstractEventSourceHolderDependentResource(Class<R> resourceType, String name) {
3137
super(name);
32-
this.resourceType = resourceType;
38+
if (resourceType == null) {
39+
this.resourceType = findFirstGenericSuperclass(getClass());
40+
} else {
41+
this.resourceType = resourceType;
42+
}
3343
}
3444

3545
/**
@@ -116,4 +126,14 @@ protected void onUpdated(P primary, R updated, R actual, Context<P> context) {
116126
private RecentOperationCacheFiller<R> recentOperationCacheFiller() {
117127
return (RecentOperationCacheFiller<R>) eventSource;
118128
}
129+
130+
@SuppressWarnings("unchecked")
131+
private Class<R> findFirstGenericSuperclass(
132+
Class<? extends AbstractEventSourceHolderDependentResource> clazz) {
133+
while (!(clazz.getGenericSuperclass() instanceof ParameterizedType)) {
134+
clazz = (Class<? extends AbstractEventSourceHolderDependentResource>) clazz.getSuperclass();
135+
}
136+
return (Class<R>)
137+
((ParameterizedType) clazz.getGenericSuperclass()).getActualTypeArguments()[0];
138+
}
119139
}

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/AbstractExternalDependentResource.java

+2
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ public abstract class AbstractExternalDependentResource<
2121

2222
private InformerEventSource<?, P> externalStateEventSource;
2323

24+
protected AbstractExternalDependentResource() {}
25+
2426
@SuppressWarnings("unchecked")
2527
protected AbstractExternalDependentResource(Class<R> resourceType) {
2628
super(resourceType);

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/external/AbstractPollingDependentResource.java

+2
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ public abstract class AbstractPollingDependentResource<R, P extends HasMetadata>
1616
public static final Duration DEFAULT_POLLING_PERIOD = Duration.ofMillis(5000);
1717
private Duration pollingPeriod;
1818

19+
protected AbstractPollingDependentResource() {}
20+
1921
protected AbstractPollingDependentResource(Class<R> resourceType) {
2022
this(resourceType, DEFAULT_POLLING_PERIOD);
2123
}

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/external/PerResourcePollingDependentResource.java

+2
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ public abstract class PerResourcePollingDependentResource<R, P extends HasMetada
1414
extends AbstractPollingDependentResource<R, P>
1515
implements PerResourcePollingEventSource.ResourceFetcher<R, P> {
1616

17+
public PerResourcePollingDependentResource() {}
18+
1719
public PerResourcePollingDependentResource(Class<R> resourceType) {
1820
super(resourceType);
1921
}

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/CRUDKubernetesDependentResource.java

+2
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ public abstract class CRUDKubernetesDependentResource<R extends HasMetadata, P e
1818
extends KubernetesDependentResource<R, P>
1919
implements Creator<R, P>, Updater<R, P>, GarbageCollected<P> {
2020

21+
public CRUDKubernetesDependentResource() {}
22+
2123
public CRUDKubernetesDependentResource(Class<R> resourceType) {
2224
super(resourceType);
2325
}

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/KubernetesDependentResource.java

+2
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ public abstract class KubernetesDependentResource<R extends HasMetadata, P exten
4141
private KubernetesDependentResourceConfig<R> kubernetesDependentResourceConfig;
4242
private volatile Boolean useSSA;
4343

44+
public KubernetesDependentResource() {}
45+
4446
public KubernetesDependentResource(Class<R> resourceType) {
4547
this(resourceType, null);
4648
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package io.javaoperatorsdk.operator.processing.dependent.kubernetes;
2+
3+
import org.junit.jupiter.params.provider.ValueSource;
4+
5+
import io.fabric8.kubernetes.api.model.apps.Deployment;
6+
import io.javaoperatorsdk.operator.sample.simple.TestCustomResource;
7+
8+
import static org.assertj.core.api.Assertions.assertThat;
9+
10+
class KubernetesDependentResourceTest {
11+
12+
// @ParameterizedTest
13+
@ValueSource(
14+
classes = {
15+
ParentDeploymentDependentResource.class,
16+
ChildTestDeploymentDependentResource.class,
17+
GrandChildTestDeploymentDependentResource.class
18+
})
19+
void checkResourceTypeDerivationWithInheritance(Class<?> clazz) throws Exception {
20+
System.out.println(clazz);
21+
KubernetesDependentResource<?, ?> dependentResource =
22+
(KubernetesDependentResource<?, ?>) clazz.getDeclaredConstructor().newInstance();
23+
assertThat(dependentResource).isInstanceOf(KubernetesDependentResource.class);
24+
assertThat(dependentResource.resourceType()).isEqualTo(Deployment.class);
25+
}
26+
27+
private static class GrandChildTestDeploymentDependentResource
28+
extends ChildTestDeploymentDependentResource {}
29+
30+
private static class ChildTestDeploymentDependentResource
31+
extends ParentDeploymentDependentResource {}
32+
33+
private static class ParentDeploymentDependentResource
34+
extends KubernetesDependentResource<Deployment, TestCustomResource> {}
35+
}

sample-operators/mysql-schema/src/main/java/io/javaoperatorsdk/operator/sample/dependent/SchemaDependentResource.java

-4
Original file line numberDiff line numberDiff line change
@@ -54,10 +54,6 @@ public class SchemaDependentResource
5454

5555
private MySQLDbConfig dbConfig;
5656

57-
public SchemaDependentResource() {
58-
super(Schema.class);
59-
}
60-
6157
@Override
6258
public Optional<ResourcePollerConfig> configuration() {
6359
return Optional.of(new ResourcePollerConfig(getPollingPeriod(), dbConfig));

sample-operators/mysql-schema/src/main/java/io/javaoperatorsdk/operator/sample/dependent/SecretDependentResource.java

-4
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,6 @@ public class SecretDependentResource extends KubernetesDependentResource<Secret,
2727
public static final String MYSQL_SECRET_USERNAME = "mysql.secret.user.name";
2828
public static final String MYSQL_SECRET_PASSWORD = "mysql.secret.user.password";
2929

30-
public SecretDependentResource() {
31-
super(Secret.class);
32-
}
33-
3430
private static String encode(String value) {
3531
return Base64.getEncoder().encodeToString(value.getBytes());
3632
}

sample-operators/tomcat-operator/src/main/java/io/javaoperatorsdk/operator/sample/DeploymentDependentResource.java

-4
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,6 @@
1414
public class DeploymentDependentResource
1515
extends CRUDKubernetesDependentResource<Deployment, Tomcat> {
1616

17-
public DeploymentDependentResource() {
18-
super(Deployment.class);
19-
}
20-
2117
private static String tomcatImage(Tomcat tomcat) {
2218
return "tomcat:" + tomcat.getSpec().getVersion();
2319
}

sample-operators/tomcat-operator/src/main/java/io/javaoperatorsdk/operator/sample/ServiceDependentResource.java

-4
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,6 @@
1313
informer = @Informer(labelSelector = "app.kubernetes.io/managed-by=tomcat-operator"))
1414
public class ServiceDependentResource extends CRUDKubernetesDependentResource<Service, Tomcat> {
1515

16-
public ServiceDependentResource() {
17-
super(Service.class);
18-
}
19-
2016
@Override
2117
protected Service desired(Tomcat tomcat, Context<Tomcat> context) {
2218
final ObjectMeta tomcatMetadata = tomcat.getMetadata();

sample-operators/webpage/src/main/java/io/javaoperatorsdk/operator/sample/dependentresource/ConfigMapDependentResource.java

-4
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,6 @@
2020
public class ConfigMapDependentResource
2121
extends CRUDKubernetesDependentResource<ConfigMap, WebPage> {
2222

23-
public ConfigMapDependentResource() {
24-
super(ConfigMap.class);
25-
}
26-
2723
@Override
2824
protected ConfigMap desired(WebPage webPage, Context<WebPage> context) {
2925
Map<String, String> data = new HashMap<>();

sample-operators/webpage/src/main/java/io/javaoperatorsdk/operator/sample/dependentresource/DeploymentDependentResource.java

-4
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,6 @@
2222
public class DeploymentDependentResource
2323
extends CRUDKubernetesDependentResource<Deployment, WebPage> {
2424

25-
public DeploymentDependentResource() {
26-
super(Deployment.class);
27-
}
28-
2925
@Override
3026
protected Deployment desired(WebPage webPage, Context<WebPage> context) {
3127
Map<String, String> labels = new HashMap<>();

sample-operators/webpage/src/main/java/io/javaoperatorsdk/operator/sample/dependentresource/IngressDependentResource.java

-4
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,6 @@
1515
informer = @Informer(labelSelector = WebPageManagedDependentsReconciler.SELECTOR))
1616
public class IngressDependentResource extends CRUDKubernetesDependentResource<Ingress, WebPage> {
1717

18-
public IngressDependentResource() {
19-
super(Ingress.class);
20-
}
21-
2218
@Override
2319
protected Ingress desired(WebPage webPage, Context<WebPage> context) {
2420
return makeDesiredIngress(webPage);

sample-operators/webpage/src/main/java/io/javaoperatorsdk/operator/sample/dependentresource/ServiceDependentResource.java

-4
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,6 @@ public class ServiceDependentResource
2222
.CRUDKubernetesDependentResource<
2323
Service, WebPage> {
2424

25-
public ServiceDependentResource() {
26-
super(Service.class);
27-
}
28-
2925
@Override
3026
protected Service desired(WebPage webPage, Context<WebPage> context) {
3127
Map<String, String> serviceLabels = new HashMap<>();

0 commit comments

Comments
 (0)