Skip to content

Commit 9b82802

Browse files
authored
Merge pull request #350 from java-operator-sdk/use-crd-generator
feat: use CRD generator
2 parents a0069d9 + becd96c commit 9b82802

File tree

18 files changed

+57
-214
lines changed

18 files changed

+57
-214
lines changed

README.md

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ handle more complex scenarios take a look on [event sources](https://csviri.medi
3333
#### Roadmap
3434
* Testing of the framework and all samples while running on a real cluster.
3535
* Generate a project skeleton
36-
* Generate Java classes from CRD defintion (and/or the other way around)
36+
* Generate Java classes from CRD
3737
* Integrate with Quarkus (including native image build)
3838
* Integrate with OLM (Operator Lifecycle Manager)
3939

@@ -164,7 +164,34 @@ public class WebServerSpec {
164164
}
165165
}
166166
```
167-
167+
168+
#### Automatic generation of CRDs
169+
170+
To automatically generate CRD manifests from your annotated Custom Resource classes, you only need
171+
to add the following dependencies to your project:
172+
173+
```xml
174+
<dependency>
175+
<groupId>io.fabric8</groupId>
176+
<artifactId>crd-generator</artifactId>
177+
<scope>compile</scope>
178+
</dependency>
179+
<!-- This dependency will not be needed anymore in a future release of the kubernetes-client -->
180+
<dependency>
181+
<groupId>io.fabric8</groupId>
182+
<artifactId>kubernetes-model-common</artifactId>
183+
</dependency>
184+
```
185+
186+
The CRD will be generated in `target/classes/META-INF/fabric8` (or
187+
in `target/test-classes/META-INF/fabric8`, if you use the `test` scope) with the CRD name suffixed
188+
by the generated spec version. For example, a CR using the `java-operator-sdk.io` group with
189+
a `mycrs` plural form will result in 2 files:
190+
191+
- `mycrs.java-operator-sdk.io-v1.yml`
192+
- `mycrs.java-operator-sdk.io-v1beta1.yml`
193+
194+
168195
#### Quarkus
169196

170197
A [Quarkus](https://quarkus.io) extension is also provided to ease the development of Quarkus-based operators.

operator-framework/pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,11 @@
7979
<version>${slf4j.version}</version>
8080
<scope>test</scope>
8181
</dependency>
82+
<dependency>
83+
<groupId>io.fabric8</groupId>
84+
<artifactId>crd-generator</artifactId>
85+
<scope>test</scope>
86+
</dependency>
8287
</dependencies>
8388

8489
</project>

operator-framework/src/test/java/io/javaoperatorsdk/operator/ConcurrencyIT.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,7 @@ public class ConcurrencyIT {
3131
@BeforeAll
3232
public void setup() {
3333
KubernetesClient k8sClient = new DefaultKubernetesClient();
34-
integrationTest.initialize(
35-
k8sClient, new TestCustomResourceController(k8sClient, true), "test-crd.yaml");
34+
integrationTest.initialize(k8sClient, new TestCustomResourceController(k8sClient, true));
3635
}
3736

3837
@BeforeEach

operator-framework/src/test/java/io/javaoperatorsdk/operator/ControllerExecutionIT.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package io.javaoperatorsdk.operator;
22

3-
import static org.assertj.core.api.Assertions.*;
3+
import static org.assertj.core.api.Assertions.assertThat;
44
import static org.awaitility.Awaitility.await;
55

66
import io.fabric8.kubernetes.api.model.ConfigMap;
@@ -20,9 +20,7 @@ public class ControllerExecutionIT {
2020
public void initAndCleanup(boolean controllerStatusUpdate) {
2121
KubernetesClient k8sClient = new DefaultKubernetesClient();
2222
integrationTestSupport.initialize(
23-
k8sClient,
24-
new TestCustomResourceController(k8sClient, controllerStatusUpdate),
25-
"test-crd.yaml");
23+
k8sClient, new TestCustomResourceController(k8sClient, controllerStatusUpdate));
2624
integrationTestSupport.cleanup();
2725
}
2826

operator-framework/src/test/java/io/javaoperatorsdk/operator/EventSourceIT.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,7 @@ public class EventSourceIT {
2525
@BeforeEach
2626
public void initAndCleanup() {
2727
KubernetesClient k8sClient = new DefaultKubernetesClient();
28-
integrationTestSupport.initialize(
29-
k8sClient, new EventSourceTestCustomResourceController(), "eventsource-test-crd.yaml");
28+
integrationTestSupport.initialize(k8sClient, new EventSourceTestCustomResourceController());
3029
integrationTestSupport.cleanup();
3130
}
3231

operator-framework/src/test/java/io/javaoperatorsdk/operator/IntegrationTestSupport.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,21 +37,22 @@ public class IntegrationTestSupport {
3737
private Operator operator;
3838
private ResourceController controller;
3939

40-
public void initialize(
41-
KubernetesClient k8sClient, ResourceController controller, String crdPath) {
42-
initialize(k8sClient, controller, crdPath, null);
40+
public void initialize(KubernetesClient k8sClient, ResourceController controller) {
41+
initialize(k8sClient, controller, null);
4342
}
4443

45-
public void initialize(
46-
KubernetesClient k8sClient, ResourceController controller, String crdPath, Retry retry) {
44+
public void initialize(KubernetesClient k8sClient, ResourceController controller, Retry retry) {
4745
log.info("Initializing integration test in namespace {}", TEST_NAMESPACE);
4846
this.k8sClient = k8sClient;
49-
loadCRDAndApplyToCluster(crdPath);
5047
this.controller = controller;
5148

5249
final var configurationService = DefaultConfigurationService.instance();
5350

5451
final var config = configurationService.getConfigurationFor(controller);
52+
// load generated CRD
53+
final var crdPath = "/META-INF/fabric8/" + config.getCRDName() + "-v1.yml";
54+
loadCRDAndApplyToCluster(crdPath);
55+
5556
final var customResourceClass = config.getCustomResourceClass();
5657
this.crOperations = k8sClient.customResources(customResourceClass);
5758

operator-framework/src/test/java/io/javaoperatorsdk/operator/RetryIT.java

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

33
import static io.javaoperatorsdk.operator.IntegrationTestSupport.TEST_NAMESPACE;
4-
import static org.assertj.core.api.Assertions.*;
4+
import static org.assertj.core.api.Assertions.assertThat;
55

66
import io.fabric8.kubernetes.api.model.ObjectMetaBuilder;
77
import io.fabric8.kubernetes.client.DefaultKubernetesClient;
@@ -25,8 +25,7 @@ public void initAndCleanup() {
2525
Retry retry =
2626
new GenericRetry().setInitialInterval(RETRY_INTERVAL).withLinearRetry().setMaxAttempts(5);
2727
KubernetesClient k8sClient = new DefaultKubernetesClient();
28-
integrationTestSupport.initialize(
29-
k8sClient, new RetryTestCustomResourceController(), "retry-test-crd.yaml", retry);
28+
integrationTestSupport.initialize(k8sClient, new RetryTestCustomResourceController(), retry);
3029
integrationTestSupport.cleanup();
3130
}
3231

operator-framework/src/test/java/io/javaoperatorsdk/operator/SubResourceUpdateIT.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,7 @@ public class SubResourceUpdateIT {
2525
@BeforeEach
2626
public void initAndCleanup() {
2727
KubernetesClient k8sClient = new DefaultKubernetesClient();
28-
integrationTestSupport.initialize(
29-
k8sClient, new SubResourceTestCustomResourceController(), "subresource-test-crd.yaml");
28+
integrationTestSupport.initialize(k8sClient, new SubResourceTestCustomResourceController());
3029
integrationTestSupport.cleanup();
3130
}
3231

operator-framework/src/test/java/io/javaoperatorsdk/operator/UpdatingResAndSubResIT.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,7 @@ public class UpdatingResAndSubResIT {
2424
@BeforeEach
2525
public void initAndCleanup() {
2626
KubernetesClient k8sClient = new DefaultKubernetesClient();
27-
integrationTestSupport.initialize(
28-
k8sClient, new DoubleUpdateTestCustomResourceController(), "doubleupdate-test-crd.yaml");
27+
integrationTestSupport.initialize(k8sClient, new DoubleUpdateTestCustomResourceController());
2928
integrationTestSupport.cleanup();
3029
}
3130

operator-framework/src/test/resources/io/javaoperatorsdk/operator/doubleupdate-test-crd.yaml

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

operator-framework/src/test/resources/io/javaoperatorsdk/operator/eventsource-test-crd.yaml

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

operator-framework/src/test/resources/io/javaoperatorsdk/operator/retry-test-crd.yaml

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

operator-framework/src/test/resources/io/javaoperatorsdk/operator/subresource-test-crd.yaml

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

operator-framework/src/test/resources/io/javaoperatorsdk/operator/test-crd.yaml

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

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
<junit.version>5.7.0</junit.version>
3939
<surefire.version>3.0.0-M5</surefire.version>
4040
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
41-
<fabric8-client.version>5.1.0</fabric8-client.version>
41+
<fabric8-client.version>5.1.1</fabric8-client.version>
4242
<slf4j.version>1.7.30</slf4j.version>
4343
</properties>
4444

samples/common/crd/crd.yaml

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

samples/common/pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,11 @@
2626
<artifactId>operator-framework</artifactId>
2727
<version>${project.version}</version>
2828
</dependency>
29+
<dependency>
30+
<groupId>io.fabric8</groupId>
31+
<artifactId>crd-generator</artifactId>
32+
<scope>compile</scope>
33+
</dependency>
2934
<dependency>
3035
<groupId>org.junit.jupiter</groupId>
3136
<artifactId>junit-jupiter-api</artifactId>

samples/common/src/main/java/io/javaoperatorsdk/operator/sample/CustomService.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@
33
import io.fabric8.kubernetes.api.model.Namespaced;
44
import io.fabric8.kubernetes.client.CustomResource;
55
import io.fabric8.kubernetes.model.annotation.Group;
6+
import io.fabric8.kubernetes.model.annotation.ShortNames;
67
import io.fabric8.kubernetes.model.annotation.Version;
78

89
@Group("sample.javaoperatorsdk")
910
@Version("v1")
11+
@ShortNames("cs")
1012
public class CustomService extends CustomResource<ServiceSpec, Void> implements Namespaced {}

0 commit comments

Comments
 (0)