Skip to content

Commit 0eb541d

Browse files
committed
refactor(operator): update CRD field structure and some example files
1 parent e162e41 commit 0eb541d

File tree

61 files changed

+1401
-592
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

61 files changed

+1401
-592
lines changed

operator/controller/src/main/deploy/api-controller-examples/example-registry-with-studio.apicurioregistry3.yaml

+3-3
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ metadata:
44
name: example-registry-with-studio
55
spec:
66
app:
7-
host: example-registry-with-studio-app.apps.yourcluster.example
7+
host: example-registry-with-studio-app.apps.cluster.example
88
ui:
9-
host: example-registry-with-studio-ui.apps.yourcluster.example
9+
host: example-registry-with-studio-ui.apps.cluster.example
1010
studioUi:
1111
enabled: true
12-
host: example-registry-with-studio-studio-ui.apps.yourcluster.example
12+
host: example-registry-with-studio-studio-ui.apps.cluster.example
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
apiVersion: registry.apicur.io/v1
22
kind: ApicurioRegistry3
33
metadata:
4-
name: simple-apicurioregistry3
4+
name: simple
55
spec:
66
app:
7-
host: simple-apicurioregistry3-app.apps.yourcluster.example
7+
ingress:
8+
host: simple-app.apps.cluster.example
89
ui:
9-
host: simple-apicurioregistry3-ui.apps.yourcluster.example
10+
ingress:
11+
host: simple-ui.apps.cluster.example

operator/controller/src/main/java/io/apicurio/registry/operator/ApicurioRegistry3Reconciler.java

+14-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package io.apicurio.registry.operator;
22

33
import io.apicurio.registry.operator.api.v1.ApicurioRegistry3;
4-
import io.apicurio.registry.operator.resource.ActivationConditions.UIIngressActivationCondition;
54
import io.apicurio.registry.operator.resource.LabelDiscriminators.AppDeploymentDiscriminator;
65
import io.apicurio.registry.operator.resource.app.AppDeploymentResource;
76
import io.apicurio.registry.operator.resource.app.AppIngressResource;
@@ -12,6 +11,9 @@
1211
import io.apicurio.registry.operator.resource.ui.UIDeploymentResource;
1312
import io.apicurio.registry.operator.resource.ui.UIIngressResource;
1413
import io.apicurio.registry.operator.resource.ui.UIServiceResource;
14+
import io.apicurio.registry.operator.updater.IngressCRUpdater;
15+
import io.apicurio.registry.operator.updater.KafkaSqlCRUpdater;
16+
import io.apicurio.registry.operator.updater.SqlCRUpdater;
1517
import io.fabric8.kubernetes.api.model.apps.Deployment;
1618
import io.javaoperatorsdk.operator.api.reconciler.*;
1719
import io.javaoperatorsdk.operator.api.reconciler.dependent.Dependent;
@@ -86,6 +88,17 @@ public UpdateControl<ApicurioRegistry3> reconcile(ApicurioRegistry3 primary,
8688
Context<ApicurioRegistry3> context) {
8789

8890
log.info("Reconciling Apicurio Registry: {}", primary);
91+
92+
// Some of the fields in the CR have been deprecated and another fields should be used instead.
93+
// Operator will attempt to update the CR to use the newer fields if possible.
94+
// This has to be done first, so subsequent functionality can deal with new fields only.
95+
var update = IngressCRUpdater.update(primary);
96+
update = SqlCRUpdater.update(primary) || update;
97+
update = KafkaSqlCRUpdater.update(primary) || update;
98+
if (update) {
99+
return UpdateControl.updateResource(primary);
100+
}
101+
89102
var statusUpdater = new StatusUpdater(primary);
90103

91104
return context.getSecondaryResource(Deployment.class, AppDeploymentDiscriminator.INSTANCE)

operator/controller/src/main/java/io/apicurio/registry/operator/StatusUpdater.java

+9-9
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22

33
import io.apicurio.registry.operator.api.v1.ApicurioRegistry3;
44
import io.apicurio.registry.operator.api.v1.ApicurioRegistry3Status;
5+
import io.apicurio.registry.operator.api.v1.status.Condition;
56
import io.apicurio.registry.operator.api.v1.status.ConditionStatus;
6-
import io.apicurio.registry.operator.api.v1.status.Conditions;
77
import io.fabric8.kubernetes.api.model.apps.Deployment;
88
import org.slf4j.Logger;
99
import org.slf4j.LoggerFactory;
@@ -28,13 +28,13 @@ public StatusUpdater(ApicurioRegistry3 registry) {
2828
this.registry = registry;
2929
}
3030

31-
private Conditions defaultCondition() {
32-
var conditions = new Conditions();
33-
conditions.setStatus(ConditionStatus.TRUE);
34-
conditions.setObservedGeneration(
31+
private Condition defaultCondition() {
32+
var condition = new Condition();
33+
condition.setStatus(ConditionStatus.TRUE);
34+
condition.setObservedGeneration(
3535
registry.getMetadata() == null ? null : registry.getMetadata().getGeneration());
36-
conditions.setLastTransitionTime(Instant.now());
37-
return conditions;
36+
condition.setLastTransitionTime(Instant.now());
37+
return condition;
3838
}
3939

4040
public ApicurioRegistry3Status errorStatus(Exception e) {
@@ -56,7 +56,7 @@ public ApicurioRegistry3Status next(Deployment deployment) {
5656
if (deployment.getStatus().getConditions().stream()
5757
.anyMatch(condition -> condition.getStatus().equalsIgnoreCase(
5858
ConditionStatus.TRUE.getValue()) && condition.getType().equals("Available"))
59-
&& !registry.getStatus().getConditions().stream()
59+
&& !registry.withStatus().getConditions().stream()
6060
.anyMatch(condition -> condition.getType().equals(READY_TYPE))) {
6161
var readyCondition = defaultCondition();
6262
readyCondition.setType(READY_TYPE);
@@ -66,7 +66,7 @@ public ApicurioRegistry3Status next(Deployment deployment) {
6666
conditions.add(readyCondition);
6767
return registry.getStatus();
6868
} else if (deployment.getStatus().getConditions().size() > 0
69-
&& !registry.getStatus().getConditions().stream()
69+
&& !registry.withStatus().getConditions().stream()
7070
.anyMatch(condition -> condition.getStatus().getValue().equals(STARTED_TYPE))) {
7171
var generation = registry.getMetadata() == null ? null
7272
: registry.getMetadata().getGeneration();
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,32 @@
11
package io.apicurio.registry.operator.feat;
22

33
import io.apicurio.registry.operator.api.v1.ApicurioRegistry3;
4+
import io.apicurio.registry.operator.api.v1.ApicurioRegistry3Spec;
5+
import io.apicurio.registry.operator.api.v1.spec.AppSpec;
6+
import io.apicurio.registry.operator.api.v1.spec.StorageSpec;
47
import io.fabric8.kubernetes.api.model.EnvVar;
58
import io.fabric8.kubernetes.api.model.EnvVarBuilder;
69

710
import java.util.Map;
811

912
import static io.apicurio.registry.operator.resource.app.AppDeploymentResource.addEnvVar;
1013
import static io.apicurio.registry.operator.utils.Utils.isBlank;
14+
import static java.util.Optional.ofNullable;
1115

1216
public class KafkaSql {
1317

1418
public static String ENV_STORAGE_KIND = "APICURIO_STORAGE_KIND";
1519
public static String ENV_KAFKASQL_BOOTSTRAP_SERVERS = "APICURIO_KAFKASQL_BOOTSTRAP_SERVERS";
1620

17-
public static boolean configureKafkaSQL(ApicurioRegistry3 primary, Map<String, EnvVar> env) {
18-
if (primary.getSpec().getApp().getKafkasql() != null
19-
&& !isBlank(primary.getSpec().getApp().getKafkasql().getBootstrapServers())) {
20-
addEnvVar(env, new EnvVarBuilder().withName(ENV_STORAGE_KIND).withValue("kafkasql").build());
21-
addEnvVar(env, new EnvVarBuilder().withName(ENV_KAFKASQL_BOOTSTRAP_SERVERS)
22-
.withValue(primary.getSpec().getApp().getKafkasql().getBootstrapServers()).build());
23-
return true;
24-
}
25-
return false;
21+
public static void configureKafkaSQL(ApicurioRegistry3 primary, Map<String, EnvVar> env) {
22+
ofNullable(primary.getSpec()).map(ApicurioRegistry3Spec::getApp).map(AppSpec::getStorage)
23+
.map(StorageSpec::getKafkasql).ifPresent(kafkasql -> {
24+
if (!isBlank(kafkasql.getBootstrapServers())) {
25+
addEnvVar(env,
26+
new EnvVarBuilder().withName(ENV_STORAGE_KIND).withValue("kafkasql").build());
27+
addEnvVar(env, new EnvVarBuilder().withName(ENV_KAFKASQL_BOOTSTRAP_SERVERS)
28+
.withValue(kafkasql.getBootstrapServers()).build());
29+
}
30+
});
2631
}
2732
}
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,17 @@
11
package io.apicurio.registry.operator.feat;
22

33
import io.apicurio.registry.operator.api.v1.ApicurioRegistry3;
4+
import io.apicurio.registry.operator.api.v1.ApicurioRegistry3Spec;
5+
import io.apicurio.registry.operator.api.v1.spec.AppSpec;
6+
import io.apicurio.registry.operator.api.v1.spec.SqlSpec;
7+
import io.apicurio.registry.operator.api.v1.spec.StorageSpec;
48
import io.fabric8.kubernetes.api.model.EnvVar;
59
import io.fabric8.kubernetes.api.model.EnvVarBuilder;
610

711
import java.util.Map;
812

913
import static io.apicurio.registry.operator.resource.app.AppDeploymentResource.addEnvVar;
14+
import static java.util.Optional.ofNullable;
1015

1116
public class PostgresSql {
1217

@@ -16,23 +21,22 @@ public class PostgresSql {
1621
public static final String ENV_APICURIO_DATASOURCE_USERNAME = "APICURIO_DATASOURCE_USERNAME";
1722
public static final String ENV_APICURIO_DATASOURCE_PASSWORD = "APICURIO_DATASOURCE_PASSWORD";
1823

19-
public static boolean configureDatasource(ApicurioRegistry3 primary, Map<String, EnvVar> env) {
20-
if (primary.getSpec().getApp().getSql() != null
21-
&& primary.getSpec().getApp().getSql().getDataSource() != null) {
22-
var datasource = primary.getSpec().getApp().getSql().getDataSource();
23-
24-
addEnvVar(env, new EnvVarBuilder().withName(ENV_APICURIO_STORAGE_KIND).withValue("sql").build());
25-
addEnvVar(env, new EnvVarBuilder().withName(ENV_APICURIO_STORAGE_SQL_KIND).withValue("postgresql")
26-
.build());
27-
28-
addEnvVar(env, new EnvVarBuilder().withName(ENV_APICURIO_DATASOURCE_URL)
29-
.withValue(datasource.getUrl()).build());
30-
addEnvVar(env, new EnvVarBuilder().withName(ENV_APICURIO_DATASOURCE_USERNAME)
31-
.withValue(datasource.getUsername()).build());
32-
addEnvVar(env, new EnvVarBuilder().withName(ENV_APICURIO_DATASOURCE_PASSWORD)
33-
.withValue(datasource.getPassword()).build());
34-
return true;
35-
}
36-
return false;
24+
public static void configureDatasource(ApicurioRegistry3 primary, Map<String, EnvVar> env) {
25+
ofNullable(primary.getSpec()).map(ApicurioRegistry3Spec::getApp).map(AppSpec::getStorage)
26+
.map(StorageSpec::getSql).map(SqlSpec::getDataSource).ifPresent(dataSource -> {
27+
28+
// TODO: Validation
29+
addEnvVar(env,
30+
new EnvVarBuilder().withName(ENV_APICURIO_STORAGE_KIND).withValue("sql").build());
31+
addEnvVar(env, new EnvVarBuilder().withName(ENV_APICURIO_STORAGE_SQL_KIND)
32+
.withValue("postgresql").build());
33+
34+
addEnvVar(env, new EnvVarBuilder().withName(ENV_APICURIO_DATASOURCE_URL)
35+
.withValue(dataSource.getUrl()).build());
36+
addEnvVar(env, new EnvVarBuilder().withName(ENV_APICURIO_DATASOURCE_USERNAME)
37+
.withValue(dataSource.getUsername()).build());
38+
addEnvVar(env, new EnvVarBuilder().withName(ENV_APICURIO_DATASOURCE_PASSWORD)
39+
.withValue(dataSource.getPassword()).build());
40+
});
3741
}
3842
}

operator/controller/src/main/java/io/apicurio/registry/operator/resource/ActivationConditions.java

+22-10
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
package io.apicurio.registry.operator.resource;
22

33
import io.apicurio.registry.operator.api.v1.ApicurioRegistry3;
4+
import io.apicurio.registry.operator.api.v1.ApicurioRegistry3Spec;
5+
import io.apicurio.registry.operator.api.v1.spec.AppSpec;
6+
import io.apicurio.registry.operator.api.v1.spec.IngressSpec;
7+
import io.apicurio.registry.operator.api.v1.spec.StudioUiSpec;
8+
import io.apicurio.registry.operator.api.v1.spec.UiSpec;
49
import io.apicurio.registry.operator.resource.app.AppIngressResource;
510
import io.apicurio.registry.operator.resource.studioui.StudioUIDeploymentResource;
611
import io.apicurio.registry.operator.resource.studioui.StudioUIIngressResource;
@@ -27,11 +32,13 @@ public static class AppIngressActivationCondition implements Condition<Ingress,
2732
public boolean isMet(DependentResource<Ingress, ApicurioRegistry3> resource,
2833
ApicurioRegistry3 primary, Context<ApicurioRegistry3> context) {
2934

30-
var disabled = isBlank(primary.getSpec().getApp().getHost());
31-
if (disabled) {
35+
var enabled = ofNullable(primary.getSpec()).map(ApicurioRegistry3Spec::getApp)
36+
.map(AppSpec::getIngress).map(IngressSpec::getHost).map(host -> !isBlank(host))
37+
.orElse(false);
38+
if (!enabled) {
3239
((AppIngressResource) resource).delete(primary, context);
3340
}
34-
return !disabled;
41+
return enabled;
3542
}
3643
}
3744

@@ -43,11 +50,13 @@ public static class UIIngressActivationCondition implements Condition<Ingress, A
4350
public boolean isMet(DependentResource<Ingress, ApicurioRegistry3> resource,
4451
ApicurioRegistry3 primary, Context<ApicurioRegistry3> context) {
4552

46-
var disabled = isBlank(primary.getSpec().getUi().getHost());
47-
if (disabled) {
53+
var enabled = ofNullable(primary.getSpec()).map(ApicurioRegistry3Spec::getUi)
54+
.map(UiSpec::getIngress).map(IngressSpec::getHost).map(host -> !isBlank(host))
55+
.orElse(false);
56+
if (!enabled) {
4857
((UIIngressResource) resource).delete(primary, context);
4958
}
50-
return !disabled;
59+
return enabled;
5160
}
5261
}
5362

@@ -60,7 +69,8 @@ public static class StudioUIDeploymentActivationCondition
6069
public boolean isMet(DependentResource<Deployment, ApicurioRegistry3> resource,
6170
ApicurioRegistry3 primary, Context<ApicurioRegistry3> context) {
6271

63-
var enabled = ofNullable(primary.getSpec().getStudioUi().getEnabled()).orElse(false);
72+
var enabled = ofNullable(primary.getSpec()).map(ApicurioRegistry3Spec::getStudioUi)
73+
.map(StudioUiSpec::getEnabled).orElse(false);
6474
if (!enabled) {
6575
((StudioUIDeploymentResource) resource).delete(primary, context);
6676
}
@@ -74,11 +84,13 @@ public static class StudioUIIngressActivationCondition implements Condition<Ingr
7484
public boolean isMet(DependentResource<Ingress, ApicurioRegistry3> resource,
7585
ApicurioRegistry3 primary, Context<ApicurioRegistry3> context) {
7686

77-
var disabled = isBlank(primary.getSpec().getStudioUi().getHost());
78-
if (disabled) {
87+
var enabled = ofNullable(primary.getSpec()).map(ApicurioRegistry3Spec::getStudioUi)
88+
.map(StudioUiSpec::getIngress).map(IngressSpec::getHost).map(host -> !isBlank(host))
89+
.orElse(false);
90+
if (!enabled) {
7991
((StudioUIIngressResource) resource).delete(primary, context);
8092
}
81-
return !disabled;
93+
return enabled;
8294
}
8395
}
8496
}

operator/controller/src/main/java/io/apicurio/registry/operator/resource/ResourceFactory.java

+17-12
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@
44
import io.apicurio.registry.operator.Configuration;
55
import io.apicurio.registry.operator.OperatorException;
66
import io.apicurio.registry.operator.api.v1.ApicurioRegistry3;
7+
import io.apicurio.registry.operator.api.v1.ApicurioRegistry3Spec;
8+
import io.apicurio.registry.operator.api.v1.spec.AppSpec;
9+
import io.apicurio.registry.operator.api.v1.spec.StudioUiSpec;
10+
import io.apicurio.registry.operator.api.v1.spec.UiSpec;
711
import io.fabric8.kubernetes.api.model.*;
812
import io.fabric8.kubernetes.api.model.apps.Deployment;
913
import io.fabric8.kubernetes.api.model.apps.DeploymentSpec;
@@ -16,9 +20,11 @@
1620
import java.util.List;
1721
import java.util.Map;
1822

23+
import static io.apicurio.registry.operator.api.v1.ContainerNames.*;
1924
import static io.apicurio.registry.operator.resource.app.AppDeploymentResource.getContainerFromPodTemplateSpec;
2025
import static io.apicurio.registry.operator.utils.Mapper.YAML_MAPPER;
2126
import static io.apicurio.registry.operator.utils.Utils.isBlank;
27+
import static java.util.Optional.ofNullable;
2228

2329
public class ResourceFactory {
2430

@@ -34,17 +40,14 @@ public class ResourceFactory {
3440
public static final String RESOURCE_TYPE_SERVICE = "service";
3541
public static final String RESOURCE_TYPE_INGRESS = "ingress";
3642

37-
public static final String APP_CONTAINER_NAME = "apicurio-registry-app";
38-
public static final String UI_CONTAINER_NAME = "apicurio-registry-ui";
39-
public static final String STUDIO_UI_CONTAINER_NAME = "apicurio-studio-ui";
40-
4143
public Deployment getDefaultAppDeployment(ApicurioRegistry3 primary) {
42-
var r = initDefaultDeployment(primary, COMPONENT_APP, 1,
43-
primary.getSpec().getApp().getPodTemplateSpec()); // TODO: Replicas
44+
var r = initDefaultDeployment(primary, COMPONENT_APP, 1, ofNullable(primary.getSpec())
45+
.map(ApicurioRegistry3Spec::getApp).map(AppSpec::getPodTemplateSpec).orElse(null)); // TODO:
46+
// Replicas
4447
mergeDeploymentPodTemplateSpec(
4548
// spotless:off
4649
r.getSpec().getTemplate(),
47-
APP_CONTAINER_NAME,
50+
REGISTRY_APP_CONTAINER_NAME,
4851
Configuration.getAppImage(),
4952
List.of(new ContainerPortBuilder().withName("http").withProtocol("TCP").withContainerPort(8080).build()),
5053
new ProbeBuilder().withHttpGet(new HTTPGetActionBuilder().withPath("/health/ready").withPort(new IntOrString(8080)).withScheme("HTTP").build()).build(),
@@ -60,12 +63,13 @@ public Deployment getDefaultAppDeployment(ApicurioRegistry3 primary) {
6063
}
6164

6265
public Deployment getDefaultUIDeployment(ApicurioRegistry3 primary) {
63-
var r = initDefaultDeployment(primary, COMPONENT_UI, 1,
64-
primary.getSpec().getUi().getPodTemplateSpec()); // TODO: Replicas
66+
var r = initDefaultDeployment(primary, COMPONENT_UI, 1, ofNullable(primary.getSpec())
67+
.map(ApicurioRegistry3Spec::getUi).map(UiSpec::getPodTemplateSpec).orElse(null)); // TODO:
68+
// Replicas
6569
mergeDeploymentPodTemplateSpec(
6670
// spotless:off
6771
r.getSpec().getTemplate(),
68-
UI_CONTAINER_NAME,
72+
REGISTRY_UI_CONTAINER_NAME,
6973
Configuration.getUIImage(),
7074
List.of(new ContainerPortBuilder().withName("http").withProtocol("TCP").withContainerPort(8080).build()),
7175
new ProbeBuilder().withHttpGet(new HTTPGetActionBuilder().withPath("/config.js").withPort(new IntOrString(8080)).withScheme("HTTP").build()).build(),
@@ -81,8 +85,9 @@ public Deployment getDefaultUIDeployment(ApicurioRegistry3 primary) {
8185
}
8286

8387
public Deployment getDefaultStudioUIDeployment(ApicurioRegistry3 primary) {
84-
var r = initDefaultDeployment(primary, COMPONENT_STUDIO_UI, 1,
85-
primary.getSpec().getStudioUi().getPodTemplateSpec()); // TODO: Replicas
88+
var r = initDefaultDeployment(primary, COMPONENT_STUDIO_UI, 1, ofNullable(primary.getSpec())
89+
.map(ApicurioRegistry3Spec::getStudioUi).map(StudioUiSpec::getPodTemplateSpec).orElse(null)); // TODO:
90+
// Replicas
8691
mergeDeploymentPodTemplateSpec(
8792
// spotless:off
8893
r.getSpec().getTemplate(),

0 commit comments

Comments
 (0)