Skip to content

Commit 9a00689

Browse files
committed
feat: make ControllerConfiguration easier to implement for simple cases
Now providing default implementation for most methods. Removed confusing AbstractConfiguration and AnnotationConfiguration classes.
1 parent cb7608e commit 9a00689

File tree

6 files changed

+117
-119
lines changed

6 files changed

+117
-119
lines changed

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/AbstractConfiguration.java

Lines changed: 0 additions & 48 deletions
This file was deleted.

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/AnnotationConfiguration.java

Lines changed: 0 additions & 36 deletions
This file was deleted.

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ControllerConfiguration.java

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,38 @@
11
package io.javaoperatorsdk.operator.api.config;
22

33
import io.fabric8.kubernetes.client.CustomResource;
4+
import io.javaoperatorsdk.operator.ControllerUtils;
45
import io.javaoperatorsdk.operator.api.Controller;
6+
import java.lang.reflect.ParameterizedType;
57
import java.util.Collections;
68
import java.util.Set;
79

810
public interface ControllerConfiguration<R extends CustomResource> {
911

10-
String getName();
12+
default String getName() {
13+
return ControllerUtils.getDefaultResourceControllerName(getAssociatedControllerClassName());
14+
}
1115

12-
String getCRDName();
16+
default String getCRDName() {
17+
return CustomResource.getCRDName(getCustomResourceClass());
18+
}
1319

14-
String getFinalizer();
20+
default String getFinalizer() {
21+
return ControllerUtils.getDefaultFinalizerName(getCRDName());
22+
}
1523

16-
String getLabelSelector();
24+
default String getLabelSelector() {
25+
return null;
26+
}
1727

18-
boolean isGenerationAware();
28+
default boolean isGenerationAware() {
29+
return true;
30+
}
1931

20-
Class<R> getCustomResourceClass();
32+
default Class<R> getCustomResourceClass() {
33+
ParameterizedType type = (ParameterizedType) getClass().getGenericInterfaces()[0];
34+
return (Class<R>) type.getActualTypeArguments()[0];
35+
}
2136

2237
String getAssociatedControllerClassName();
2338

@@ -69,7 +84,7 @@ default RetryConfiguration getRetryConfiguration() {
6984

7085
ConfigurationService getConfigurationService();
7186

72-
void setConfigurationService(ConfigurationService service);
87+
default void setConfigurationService(ConfigurationService service) {}
7388

7489
default boolean useFinalizer() {
7590
return !Controller.NO_FINALIZER.equals(getFinalizer());
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package io.javaoperatorsdk.operator.api.config;
2+
3+
import static org.junit.jupiter.api.Assertions.*;
4+
5+
import io.javaoperatorsdk.operator.sample.simple.TestCustomResource;
6+
import org.junit.jupiter.api.Test;
7+
8+
class ControllerConfigurationTest {
9+
10+
@Test
11+
void getCustomResourceClass() {
12+
final ControllerConfiguration<TestCustomResource> conf = new ControllerConfiguration<>() {
13+
@Override
14+
public String getAssociatedControllerClassName() {
15+
return null;
16+
}
17+
18+
@Override
19+
public ConfigurationService getConfigurationService() {
20+
return null;
21+
}
22+
};
23+
assertEquals(TestCustomResource.class, conf.getCustomResourceClass());
24+
}
25+
}

operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/internal/CustomResourceSelectorTest.java

Lines changed: 12 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,13 @@
1414
import io.fabric8.kubernetes.client.VersionInfo;
1515
import io.fabric8.kubernetes.client.server.mock.EnableKubernetesMockClient;
1616
import io.fabric8.kubernetes.client.server.mock.KubernetesMockServer;
17-
import io.javaoperatorsdk.operator.ControllerUtils;
1817
import io.javaoperatorsdk.operator.Operator;
1918
import io.javaoperatorsdk.operator.api.Context;
2019
import io.javaoperatorsdk.operator.api.Controller;
2120
import io.javaoperatorsdk.operator.api.ResourceController;
2221
import io.javaoperatorsdk.operator.api.UpdateControl;
23-
import io.javaoperatorsdk.operator.api.config.AbstractConfiguration;
24-
import io.javaoperatorsdk.operator.api.config.AnnotationConfiguration;
2522
import io.javaoperatorsdk.operator.api.config.ConfigurationService;
23+
import io.javaoperatorsdk.operator.api.config.ControllerConfiguration;
2624
import io.javaoperatorsdk.operator.api.config.Version;
2725
import io.javaoperatorsdk.operator.sample.simple.TestCustomResource;
2826
import java.text.ParseException;
@@ -70,14 +68,8 @@ void setUpResources() throws ParseException {
7068
configurationService = spy(ConfigurationService.class);
7169
when(configurationService.checkCRDAndValidateLocalModel()).thenReturn(false);
7270
when(configurationService.getVersion()).thenReturn(new Version("1", "1", new Date()));
73-
when(configurationService.getConfigurationFor(any(ResourceController.class)))
74-
.thenAnswer(
75-
invocation -> {
76-
var answer =
77-
new AnnotationConfiguration<>(MyController.class, TestCustomResource.class);
78-
answer.setConfigurationService(configurationService);
79-
return answer;
80-
});
71+
when(configurationService.getConfigurationFor(any(MyController.class))).thenReturn(
72+
new MyConfiguration(configurationService, null));
8173
}
8274

8375
@Test
@@ -145,30 +137,29 @@ public TestCustomResource newMyResource(String app) {
145137
return resource;
146138
}
147139

148-
public static class MyConfiguration extends AbstractConfiguration<TestCustomResource> {
140+
public static class MyConfiguration implements ControllerConfiguration<TestCustomResource> {
149141

150142
private final String labelSelector;
143+
private final ConfigurationService service;
151144

152145
public MyConfiguration(ConfigurationService configurationService, String labelSelector) {
153-
super(MyController.class, TestCustomResource.class);
154146
this.labelSelector = labelSelector;
155-
156-
setConfigurationService(configurationService);
147+
service = configurationService;
157148
}
158149

159150
@Override
160-
public String getFinalizer() {
161-
return ControllerUtils.getDefaultFinalizerName(getCRDName());
151+
public String getLabelSelector() {
152+
return labelSelector;
162153
}
163154

164155
@Override
165-
public String getLabelSelector() {
166-
return labelSelector;
156+
public String getAssociatedControllerClassName() {
157+
return MyController.class.getCanonicalName();
167158
}
168159

169160
@Override
170-
public boolean isGenerationAware() {
171-
return true;
161+
public ConfigurationService getConfigurationService() {
162+
return service;
172163
}
173164
}
174165

Lines changed: 58 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,68 @@
11
package io.javaoperatorsdk.operator.config.runtime;
22

33
import io.fabric8.kubernetes.client.CustomResource;
4+
import io.javaoperatorsdk.operator.ControllerUtils;
5+
import io.javaoperatorsdk.operator.api.Controller;
46
import io.javaoperatorsdk.operator.api.ResourceController;
7+
import io.javaoperatorsdk.operator.api.config.ConfigurationService;
8+
import io.javaoperatorsdk.operator.api.config.ControllerConfiguration;
9+
import java.util.Optional;
10+
import java.util.Set;
11+
import java.util.function.Predicate;
512

6-
/** @deprecated use {@link io.javaoperatorsdk.operator.api.config.AnnotationConfiguration} */
7-
@Deprecated
8-
@SuppressWarnings("unchecked")
913
public class AnnotationConfiguration<R extends CustomResource>
10-
extends io.javaoperatorsdk.operator.api.config.AnnotationConfiguration<R> {
14+
implements ControllerConfiguration<R> {
15+
16+
private final ResourceController<R> controller;
17+
private final Optional<Controller> annotation;
18+
private ConfigurationService service;
1119

1220
public AnnotationConfiguration(ResourceController<R> controller) {
13-
super(
14-
(Class<ResourceController<R>>) controller.getClass(),
15-
RuntimeControllerMetadata.getCustomResourceClass(controller));
21+
this.controller = controller;
22+
this.annotation = Optional.ofNullable(controller.getClass().getAnnotation(Controller.class));
23+
}
24+
25+
@Override
26+
public String getName() {
27+
return ControllerUtils.getNameFor(controller);
28+
}
29+
30+
@Override
31+
public String getFinalizer() {
32+
return annotation
33+
.map(Controller::finalizerName)
34+
.filter(Predicate.not(String::isBlank))
35+
.orElse(ControllerUtils.getDefaultFinalizerName(getCRDName()));
36+
}
37+
38+
@Override
39+
public boolean isGenerationAware() {
40+
return annotation.map(Controller::generationAwareEventProcessing).orElse(true);
41+
}
42+
43+
@Override
44+
public Class<R> getCustomResourceClass() {
45+
return RuntimeControllerMetadata.getCustomResourceClass(controller);
46+
}
47+
48+
@Override
49+
public Set<String> getNamespaces() {
50+
return Set.of(annotation.map(Controller::namespaces).orElse(new String[] {}));
51+
}
52+
53+
@Override
54+
public ConfigurationService getConfigurationService() {
55+
return service;
56+
}
57+
58+
@Override
59+
public void setConfigurationService(ConfigurationService service) {
60+
this.service = service;
61+
}
62+
63+
@Override
64+
public String getAssociatedControllerClassName() {
65+
return controller.getClass().getCanonicalName();
1666
}
1767
}
68+

0 commit comments

Comments
 (0)