Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 3dbc424

Browse files
committedFeb 17, 2022
fix: make it possible to have read-only dependents
Fixes #955
1 parent 73dc445 commit 3dbc424

File tree

8 files changed

+54
-38
lines changed

8 files changed

+54
-38
lines changed
 

‎operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/dependent/AbstractDependentResource.java

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package io.javaoperatorsdk.operator.api.reconciler.dependent;
22

3+
import java.util.Optional;
4+
35
import io.fabric8.kubernetes.api.model.HasMetadata;
46
import io.javaoperatorsdk.operator.api.reconciler.Context;
57

@@ -8,18 +10,21 @@ public abstract class AbstractDependentResource<R, P extends HasMetadata, C>
810

911
@Override
1012
public void reconcile(P primary, Context context) {
11-
var actual = getResource(primary);
12-
var desired = desired(primary, context);
13-
if (actual.isEmpty()) {
14-
create(desired, primary, context);
15-
} else {
16-
if (!match(actual.get(), desired, context)) {
17-
update(actual.get(), desired, primary, context);
13+
var maybeActual = getResource(primary);
14+
var maybeDesired = desired(primary, context);
15+
maybeDesired.ifPresent(desired -> {
16+
if (maybeActual.isEmpty()) {
17+
create(desired, primary, context);
18+
} else {
19+
final var actual = maybeActual.get();
20+
if (!match(actual, desired, context)) {
21+
update(actual, desired, primary, context);
22+
}
1823
}
19-
}
24+
});
2025
}
2126

22-
protected abstract R desired(P primary, Context context);
27+
protected abstract Optional<R> desired(P primary, Context context);
2328

2429
protected abstract boolean match(R actual, R target, Context context);
2530

‎operator-framework-core/src/test/java/io/javaoperatorsdk/operator/api/config/UtilsTest.java

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

3+
import java.util.Optional;
4+
35
import org.junit.jupiter.api.Test;
46

57
import io.fabric8.kubernetes.api.model.apps.Deployment;
@@ -23,8 +25,8 @@ public static class TestKubernetesDependentResource
2325
extends KubernetesDependentResource<Deployment, TestCustomResource> {
2426

2527
@Override
26-
protected Deployment desired(TestCustomResource primary, Context context) {
27-
return null;
28+
protected Optional<Deployment> desired(TestCustomResource primary, Context context) {
29+
return Optional.empty();
2830
}
2931
}
3032
}

‎operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/standalonedependent/StandaloneDependentTestReconciler.java

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

33
import java.util.List;
4+
import java.util.Optional;
45

56
import io.fabric8.kubernetes.api.model.apps.Deployment;
67
import io.fabric8.kubernetes.client.KubernetesClient;
@@ -50,16 +51,17 @@ public KubernetesClient getKubernetesClient() {
5051
return this.kubernetesClient;
5152
}
5253

53-
private class DeploymentDependentResource extends
54+
private static class DeploymentDependentResource extends
5455
KubernetesDependentResource<Deployment, StandaloneDependentTestCustomResource> {
5556

5657
@Override
57-
protected Deployment desired(StandaloneDependentTestCustomResource primary, Context context) {
58+
protected Optional<Deployment> desired(StandaloneDependentTestCustomResource primary,
59+
Context context) {
5860
Deployment deployment =
5961
ReconcilerUtils.loadYaml(Deployment.class, getClass(), "nginx-deployment.yaml");
6062
deployment.getMetadata().setName(primary.getMetadata().getName());
6163
deployment.getMetadata().setNamespace(primary.getMetadata().getNamespace());
62-
return deployment;
64+
return Optional.of(deployment);
6365
}
6466
}
6567
}

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,9 @@ public EventSource eventSource(EventSourceContext<MySQLSchema> context) {
4242
}
4343

4444
@Override
45-
public Schema desired(MySQLSchema primary, Context context) {
46-
return new Schema(primary.getMetadata().getName(), primary.getSpec().getEncoding());
45+
public Optional<Schema> desired(MySQLSchema primary, Context context) {
46+
return Optional
47+
.of(new Schema(primary.getMetadata().getName(), primary.getSpec().getEncoding()));
4748
}
4849

4950
@Override

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

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

33
import java.util.Base64;
4+
import java.util.Optional;
45

56
import io.fabric8.kubernetes.api.model.Secret;
67
import io.fabric8.kubernetes.api.model.SecretBuilder;
@@ -27,8 +28,8 @@ protected Secret update(Secret actual, Secret target, MySQLSchema primary, Conte
2728
}
2829

2930
@Override
30-
protected Secret desired(MySQLSchema schema, Context context) {
31-
return new SecretBuilder()
31+
protected Optional<Secret> desired(MySQLSchema schema, Context context) {
32+
return Optional.of(new SecretBuilder()
3233
.withNewMetadata()
3334
.withName(context.getMandatory(MYSQL_SECRET_NAME, String.class))
3435
.withNamespace(schema.getMetadata().getNamespace())
@@ -37,7 +38,7 @@ protected Secret desired(MySQLSchema schema, Context context) {
3738
"MYSQL_USERNAME", encode(context.getMandatory(MYSQL_SECRET_USERNAME, String.class)))
3839
.addToData(
3940
"MYSQL_PASSWORD", encode(context.getMandatory(MYSQL_SECRET_PASSWORD, String.class)))
40-
.build();
41+
.build());
4142
}
4243

4344
@Override

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

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

3+
import java.util.Optional;
4+
35
import io.fabric8.kubernetes.api.model.ObjectMeta;
46
import io.fabric8.kubernetes.api.model.apps.Deployment;
57
import io.fabric8.kubernetes.api.model.apps.DeploymentBuilder;
@@ -16,7 +18,7 @@ private static String tomcatImage(Tomcat tomcat) {
1618
}
1719

1820
@Override
19-
protected Deployment desired(Tomcat tomcat, Context context) {
21+
protected Optional<Deployment> desired(Tomcat tomcat, Context context) {
2022
Deployment deployment =
2123
ReconcilerUtils.loadYaml(Deployment.class, getClass(), "deployment.yaml");
2224
final ObjectMeta tomcatMetadata = tomcat.getMetadata();
@@ -43,6 +45,6 @@ protected Deployment desired(Tomcat tomcat, Context context) {
4345
.endTemplate()
4446
.endSpec()
4547
.build();
46-
return deployment;
48+
return Optional.of(deployment);
4749
}
4850
}
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package io.javaoperatorsdk.operator.sample;
22

3+
import java.util.Optional;
4+
35
import io.fabric8.kubernetes.api.model.ObjectMeta;
46
import io.fabric8.kubernetes.api.model.Service;
57
import io.fabric8.kubernetes.api.model.ServiceBuilder;
@@ -10,17 +12,18 @@
1012
public class ServiceDependentResource extends KubernetesDependentResource<Service, Tomcat> {
1113

1214
@Override
13-
protected Service desired(Tomcat tomcat, Context context) {
15+
protected Optional<Service> desired(Tomcat tomcat, Context context) {
1416
final ObjectMeta tomcatMetadata = tomcat.getMetadata();
15-
return new ServiceBuilder(ReconcilerUtils.loadYaml(Service.class, getClass(), "service.yaml"))
16-
.editMetadata()
17-
.withName(tomcatMetadata.getName())
18-
.withNamespace(tomcatMetadata.getNamespace())
19-
.endMetadata()
20-
.editSpec()
21-
.addToSelector("app", tomcatMetadata.getName())
22-
.endSpec()
23-
.build();
17+
return Optional
18+
.of(new ServiceBuilder(ReconcilerUtils.loadYaml(Service.class, getClass(), "service.yaml"))
19+
.editMetadata()
20+
.withName(tomcatMetadata.getName())
21+
.withNamespace(tomcatMetadata.getNamespace())
22+
.endMetadata()
23+
.editSpec()
24+
.addToSelector("app", tomcatMetadata.getName())
25+
.endSpec()
26+
.build());
2427
}
2528

2629
}

‎sample-operators/webpage/src/main/java/io/javaoperatorsdk/operator/sample/WebPageReconciler.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ private void createDependentResources(KubernetesClient client) {
8787
new KubernetesDependentResource<>() {
8888

8989
@Override
90-
protected Deployment desired(WebPage webPage, Context context) {
90+
protected Optional<Deployment> desired(WebPage webPage, Context context) {
9191
var deploymentName = deploymentName(webPage);
9292
Deployment deployment = loadYaml(Deployment.class, getClass(), "deployment.yaml");
9393
deployment.getMetadata().setName(deploymentName);
@@ -108,7 +108,7 @@ protected Deployment desired(WebPage webPage, Context context) {
108108
.get(0)
109109
.setConfigMap(
110110
new ConfigMapVolumeSourceBuilder().withName(configMapName(webPage)).build());
111-
return deployment;
111+
return Optional.of(deployment);
112112
}
113113

114114
@Override
@@ -121,14 +121,14 @@ protected Class<Deployment> resourceType() {
121121
new KubernetesDependentResource<>() {
122122

123123
@Override
124-
protected Service desired(WebPage webPage, Context context) {
124+
protected Optional<Service> desired(WebPage webPage, Context context) {
125125
Service service = loadYaml(Service.class, getClass(), "service.yaml");
126126
service.getMetadata().setName(serviceName(webPage));
127127
service.getMetadata().setNamespace(webPage.getMetadata().getNamespace());
128128
Map<String, String> labels = new HashMap<>();
129129
labels.put("app", deploymentName(webPage));
130130
service.getSpec().setSelector(labels);
131-
return service;
131+
return Optional.of(service);
132132
}
133133

134134
@Override
@@ -155,17 +155,17 @@ private class ConfigMapDependentResource extends KubernetesDependentResource<Con
155155
AssociatedSecondaryResourceIdentifier<WebPage> {
156156

157157
@Override
158-
protected ConfigMap desired(WebPage webPage, Context context) {
158+
protected Optional<ConfigMap> desired(WebPage webPage, Context context) {
159159
Map<String, String> data = new HashMap<>();
160160
data.put("index.html", webPage.getSpec().getHtml());
161-
return new ConfigMapBuilder()
161+
return Optional.of(new ConfigMapBuilder()
162162
.withMetadata(
163163
new ObjectMetaBuilder()
164164
.withName(WebPageReconciler.configMapName(webPage))
165165
.withNamespace(webPage.getMetadata().getNamespace())
166166
.build())
167167
.withData(data)
168-
.build();
168+
.build());
169169
}
170170

171171
@Override

0 commit comments

Comments
 (0)
Please sign in to comment.