Skip to content

Commit cf84be7

Browse files
committed
from now only crd name needs to be specified
1 parent 6a445c0 commit cf84be7

File tree

9 files changed

+47
-102
lines changed

9 files changed

+47
-102
lines changed

README.md

+3-7
Original file line numberDiff line numberDiff line change
@@ -48,24 +48,20 @@ The Controller implements the business logic and describes all the classes neede
4848

4949
```java
5050
@Controller(customResourceClass = WebServer.class,
51-
kind = WebServerController.KIND,
52-
group = WebServerController.GROUP,
51+
crdName = "webservers.sample.javaoperatorsdk",
5352
customResourceListClass = WebServerList.class,
5453
customResourceDonebaleClass = WebServerDoneable.class)
5554
public class WebServerController implements ResourceController<WebServer> {
5655

57-
static final String KIND = "WebServer";
58-
static final String GROUP = "sample.javaoperatorsdk";
59-
6056
@Override
61-
public boolean deleteResource(CustomService resource, Context<CustomService> context) {
57+
public boolean deleteResource(CustomService resource) {
6258
// ... your logic ...
6359
return true;
6460
}
6561

6662
// Return the changed resource, so it gets updated. See javadoc for details.
6763
@Override
68-
public Optional<CustomService> createOrUpdateResource(CustomService resource, Context<CustomService> context) {
64+
public Optional<CustomService> createOrUpdateResource(CustomService resource) {
6965
// ... your logic ...
7066
return resource;
7167
}

operator-framework/src/main/java/com/github/containersolutions/operator/ControllerUtils.java

+3-28
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,8 @@
66
import io.fabric8.kubernetes.client.CustomResourceDoneable;
77
import io.fabric8.kubernetes.client.CustomResourceList;
88

9-
import java.util.Optional;
10-
119
class ControllerUtils {
1210

13-
public static final String GROUP_API_DELIMITER = "/";
14-
1511
static String getDefaultFinalizer(ResourceController controller) {
1612
return getAnnotation(controller).defaultFinalizer();
1713
}
@@ -20,37 +16,16 @@ static <R extends CustomResource> Class<R> getCustomResourceClass(ResourceContro
2016
return (Class<R>) getAnnotation(controller).customResourceClass();
2117
}
2218

23-
static String getApiVersion(ResourceController controller) {
24-
return getGroup(controller) + GROUP_API_DELIMITER + getAnnotation(controller).version();
25-
}
26-
27-
static String getVersion(ResourceController controller) {
28-
return getAnnotation(controller).version();
29-
}
30-
31-
static Optional<String> getCrdName(ResourceController controller) {
32-
String crdName = getAnnotation(controller).crdName();
33-
if (crdName.isEmpty()) {
34-
return Optional.empty();
35-
} else {
36-
return Optional.of(crdName);
37-
}
38-
}
39-
40-
static String getKind(ResourceController controller) {
41-
return getAnnotation(controller).kind();
19+
static String getCrdName(ResourceController controller) {
20+
return getAnnotation(controller).crdName();
4221
}
4322

4423
static <R extends CustomResource> Class<? extends CustomResourceList<R>> getCustomResourceListClass(ResourceController controller) {
4524
return (Class<? extends CustomResourceList<R>>) getAnnotation(controller).customResourceListClass();
4625
}
4726

4827
static <R extends CustomResource> Class<? extends CustomResourceDoneable<R>> getCustomResourceDonebaleClass(ResourceController controller) {
49-
return (Class<? extends CustomResourceDoneable<R>>) getAnnotation(controller).customResourceDonebaleClass();
50-
}
51-
52-
private static String getGroup(ResourceController controller) {
53-
return getAnnotation(controller).group();
28+
return (Class<? extends CustomResourceDoneable<R>>) getAnnotation(controller).customResourceDoneableClass();
5429
}
5530

5631
private static Controller getAnnotation(ResourceController controller) {

operator-framework/src/main/java/com/github/containersolutions/operator/Operator.java

+31-30
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import com.github.containersolutions.operator.processing.EventDispatcher;
55
import com.github.containersolutions.operator.processing.EventScheduler;
66
import io.fabric8.kubernetes.api.model.apiextensions.CustomResourceDefinition;
7-
import io.fabric8.kubernetes.api.model.apiextensions.CustomResourceDefinitionList;
87
import io.fabric8.kubernetes.client.CustomResource;
98
import io.fabric8.kubernetes.client.CustomResourceDoneable;
109
import io.fabric8.kubernetes.client.CustomResourceList;
@@ -18,7 +17,6 @@
1817
import java.util.Arrays;
1918
import java.util.HashMap;
2019
import java.util.Map;
21-
import java.util.Optional;
2220

2321
import static com.github.containersolutions.operator.ControllerUtils.*;
2422

@@ -28,7 +26,6 @@ public class Operator {
2826

2927
private Map<ResourceController, EventScheduler> controllers = new HashMap<>();
3028
private Map<Class<? extends CustomResource>, CustomResourceOperationsImpl> customResourceClients = new HashMap<>();
31-
private EventScheduler eventScheduler;
3229

3330
private final static Logger log = LoggerFactory.getLogger(Operator.class);
3431

@@ -44,36 +41,35 @@ public <R extends CustomResource> void registerController(ResourceController<R>
4441
registerController(controller, false, targetNamespaces);
4542
}
4643

44+
@SuppressWarnings("rawtypes")
4745
private <R extends CustomResource> void registerController(ResourceController<R> controller,
4846
boolean watchAllNamespaces, String... targetNamespaces) throws OperatorException {
4947
Class<R> resClass = getCustomResourceClass(controller);
50-
Optional<CustomResourceDefinition> crd = getCustomResourceDefinitionForController(controller);
51-
String kind = ControllerUtils.getKind(controller);
52-
KubernetesDeserializer.registerCustomKind(getApiVersion(controller), kind, resClass);
48+
CustomResourceDefinition crd = getCustomResourceDefinitionForController(controller);
5349

54-
if (crd.isPresent()) {
55-
Class<? extends CustomResourceList<R>> list = getCustomResourceListClass(controller);
56-
Class<? extends CustomResourceDoneable<R>> doneable = getCustomResourceDonebaleClass(controller);
57-
MixedOperation client = k8sClient.customResources(crd.get(), resClass, list, doneable);
50+
String kind = getKind(crd);
5851

59-
EventDispatcher<R> eventDispatcher =
60-
new EventDispatcher<>(controller, (CustomResourceOperationsImpl) client,
61-
ControllerUtils.getDefaultFinalizer(controller));
52+
KubernetesDeserializer.registerCustomKind(getApiVersion(crd), kind, resClass);
6253

63-
eventScheduler = new EventScheduler(eventDispatcher);
54+
Class<? extends CustomResourceList<R>> list = getCustomResourceListClass(controller);
55+
Class<? extends CustomResourceDoneable<R>> doneable = getCustomResourceDonebaleClass(controller);
56+
MixedOperation client = k8sClient.customResources(crd, resClass, list, doneable);
6457

65-
registerWatches(controller, client, resClass, watchAllNamespaces, targetNamespaces);
66-
} else {
67-
throw new OperatorException("CRD '" + resClass.getSimpleName() + "' with version '"
68-
+ getVersion(controller) + "' not found");
69-
}
58+
EventDispatcher eventDispatcher = new EventDispatcher(controller, (CustomResourceOperationsImpl) client,
59+
getDefaultFinalizer(controller));
60+
61+
EventScheduler eventScheduler = new EventScheduler(eventDispatcher);
62+
63+
registerWatches(controller, client, resClass, watchAllNamespaces, targetNamespaces, eventScheduler);
7064
}
7165

7266
private <R extends CustomResource> void registerWatches(ResourceController<R> controller, MixedOperation client,
7367
Class<R> resClass,
74-
boolean watchAllNamespaces, String[] targetNamespaces) {
68+
boolean watchAllNamespaces, String[] targetNamespaces, EventScheduler eventScheduler) {
69+
7570
CustomResourceOperationsImpl crClient = (CustomResourceOperationsImpl) client;
7671
if (watchAllNamespaces) {
72+
// todo check if this works
7773
crClient.inAnyNamespace().watch(eventScheduler);
7874
} else if (targetNamespaces.length == 0) {
7975
client.watch(eventScheduler);
@@ -89,17 +85,13 @@ private <R extends CustomResource> void registerWatches(ResourceController<R> co
8985
resClass, targetNamespaces.length == 0 ? "[all/client namespace]" : Arrays.toString(targetNamespaces));
9086
}
9187

92-
private Optional<CustomResourceDefinition> getCustomResourceDefinitionForController(ResourceController controller) {
93-
Optional<String> crdName = getCrdName(controller);
94-
if (crdName.isPresent()) {
95-
return Optional.ofNullable(k8sClient.customResourceDefinitions().withName(crdName.get()).get());
96-
} else {
97-
CustomResourceDefinitionList crdList = k8sClient.customResourceDefinitions().list();
98-
return crdList.getItems().stream()
99-
.filter(c -> getKind(controller).equals(c.getSpec().getNames().getKind()) &&
100-
getVersion(controller).equals(c.getSpec().getVersion()))
101-
.findFirst();
88+
private CustomResourceDefinition getCustomResourceDefinitionForController(ResourceController controller) {
89+
String crdName = getCrdName(controller);
90+
CustomResourceDefinition customResourceDefinition = k8sClient.customResourceDefinitions().withName(crdName).get();
91+
if (customResourceDefinition == null) {
92+
throw new OperatorException("Cannot find Custom Resource Definition with name: " + crdName);
10293
}
94+
return customResourceDefinition;
10395
}
10496

10597
public Map<Class<? extends CustomResource>, CustomResourceOperationsImpl> getCustomResourceClients() {
@@ -113,4 +105,13 @@ public void stop() {
113105
public <T extends CustomResource> CustomResourceOperationsImpl getCustomResourceClients(Class<T> customResourceClass) {
114106
return customResourceClients.get(customResourceClass);
115107
}
108+
109+
private String getKind(CustomResourceDefinition crd) {
110+
return crd.getSpec().getNames().getKind();
111+
}
112+
113+
private String getApiVersion(CustomResourceDefinition crd) {
114+
return crd.getSpec().getGroup() + "/" + crd.getSpec().getVersion();
115+
}
116+
116117
}

operator-framework/src/main/java/com/github/containersolutions/operator/api/Controller.java

+2-10
Original file line numberDiff line numberDiff line change
@@ -15,21 +15,13 @@
1515

1616
String DEFAULT_FINALIZER = "operator.default.finalizer";
1717

18-
String DEFAULT_VERSION = "v1";
19-
20-
String version() default DEFAULT_VERSION;
21-
22-
String crdName() default "";
23-
24-
String group();
25-
26-
String kind();
18+
String crdName();
2719

2820
Class<? extends CustomResource> customResourceClass();
2921

3022
Class<? extends CustomResourceList<? extends CustomResource>> customResourceListClass();
3123

32-
Class<? extends CustomResourceDoneable<? extends CustomResource>> customResourceDonebaleClass();
24+
Class<? extends CustomResourceDoneable<? extends CustomResource>> customResourceDoneableClass();
3325

3426
String defaultFinalizer() default DEFAULT_FINALIZER;
3527

operator-framework/src/test/java/com/github/containersolutions/operator/ControllerUtilsTest.java

+1-6
Original file line numberDiff line numberDiff line change
@@ -7,23 +7,18 @@
77
import org.junit.jupiter.api.Test;
88

99
import static com.github.containersolutions.operator.api.Controller.DEFAULT_FINALIZER;
10-
import static com.github.containersolutions.operator.api.Controller.DEFAULT_VERSION;
1110
import static com.github.containersolutions.operator.sample.TestCustomResourceController.CRD_NAME;
12-
import static com.github.containersolutions.operator.sample.TestCustomResourceController.TEST_GROUP;
1311
import static org.junit.jupiter.api.Assertions.assertEquals;
1412

1513
class ControllerUtilsTest {
1614

1715
@Test
1816
public void returnsValuesFromControllerAnnotationFinalizer() {
1917
assertEquals(DEFAULT_FINALIZER, ControllerUtils.getDefaultFinalizer(new TestCustomResourceController(null)));
20-
assertEquals(TEST_GROUP + "/" + DEFAULT_VERSION, ControllerUtils.getApiVersion(new TestCustomResourceController(null)));
21-
assertEquals(DEFAULT_VERSION, ControllerUtils.getVersion(new TestCustomResourceController(null)));
22-
assertEquals(TestCustomResourceController.KIND_NAME, ControllerUtils.getKind(new TestCustomResourceController(null)));
2318
assertEquals(TestCustomResource.class, ControllerUtils.getCustomResourceClass(new TestCustomResourceController(null)));
2419
assertEquals(TestCustomResourceDoneable.class, ControllerUtils.getCustomResourceDonebaleClass(new TestCustomResourceController(null)));
2520
assertEquals(TestCustomResourceList.class, ControllerUtils.getCustomResourceListClass(new TestCustomResourceController(null)));
26-
assertEquals(CRD_NAME, ControllerUtils.getCrdName(new TestCustomResourceController(null)).get());
21+
assertEquals(CRD_NAME, ControllerUtils.getCrdName(new TestCustomResourceController(null)));
2722
}
2823

2924
}

operator-framework/src/test/java/com/github/containersolutions/operator/sample/TestCustomResourceController.java

+1-5
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,13 @@
1515

1616
@Controller(
1717
crdName = TestCustomResourceController.CRD_NAME,
18-
group = TestCustomResourceController.TEST_GROUP,
19-
kind = TestCustomResourceController.KIND_NAME,
2018
customResourceClass = TestCustomResource.class,
2119
customResourceListClass = TestCustomResourceList.class,
22-
customResourceDonebaleClass = TestCustomResourceDoneable.class)
20+
customResourceDoneableClass = TestCustomResourceDoneable.class)
2321
public class TestCustomResourceController implements ResourceController<TestCustomResource> {
2422

2523
private static final Logger log = LoggerFactory.getLogger(TestCustomResourceController.class);
2624

27-
public static final String KIND_NAME = "CustomService";
28-
public static final String TEST_GROUP = "sample.javaoperatorsdk";
2925
public static final String CRD_NAME = "customservices.sample.javaoperatorsdk";
3026

3127
private final KubernetesClient kubernetesClient;

samples/basic/common/src/main/java/com/github/containersolutions/operator/sample/CustomServiceController.java

+1-4
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,12 @@
1616
*/
1717
@Controller(customResourceClass = CustomService.class,
1818
crdName = "customservices.sample.javaoperatorsdk",
19-
kind = CustomServiceController.KIND,
20-
group = CustomServiceController.GROUP,
2119
customResourceListClass = CustomServiceList.class,
22-
customResourceDonebaleClass = CustomServiceDoneable.class)
20+
customResourceDoneableClass = CustomServiceDoneable.class)
2321
public class CustomServiceController implements ResourceController<CustomService> {
2422

2523
public static final String KIND = "CustomService";
2624
private final static Logger log = LoggerFactory.getLogger(CustomServiceController.class);
27-
public static final String GROUP = "sample.javaoperatorsdk";
2825

2926
private final KubernetesClient kubernetesClient;
3027

samples/webserver/src/main/java/com/github/containersolutions/operator/sample/WebServerController.java

+2-7
Original file line numberDiff line numberDiff line change
@@ -21,18 +21,13 @@
2121
import java.util.Optional;
2222

2323
@Controller(customResourceClass = WebServer.class,
24-
kind = WebServerController.KIND,
25-
group = WebServerController.GROUP,
24+
crdName = "webservers.sample.javaoperatorsdk",
2625
customResourceListClass = WebServerList.class,
27-
customResourceDonebaleClass = WebServerDoneable.class)
26+
customResourceDoneableClass = WebServerDoneable.class)
2827
public class WebServerController implements ResourceController<WebServer> {
2928

30-
static final String KIND = "WebServer";
31-
static final String GROUP = "sample.javaoperatorsdk";
32-
3329
private final Logger log = LoggerFactory.getLogger(getClass());
3430

35-
3631
private final KubernetesClient kubernetesClient;
3732

3833
public WebServerController(KubernetesClient kubernetesClient) {

spring-boot-starter/src/test/java/com/github/containersolutions/operator/spingboot/starter/TestController.java

+3-5
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,13 @@
1111
import java.util.Optional;
1212

1313
@Component
14-
@Controller(group = "testGroup",
15-
kind = TestController.KIND,
14+
@Controller(
15+
crdName = "name",
1616
customResourceClass = TestResource.class,
1717
customResourceListClass = TestResourceList.class,
18-
customResourceDonebaleClass = TestResourceDoneable.class)
18+
customResourceDoneableClass = TestResourceDoneable.class)
1919
public class TestController implements ResourceController {
2020

21-
public static final String KIND = "testKind";
22-
2321
@Override
2422
public boolean deleteResource(CustomResource resource) {
2523
return true;

0 commit comments

Comments
 (0)