Skip to content

Commit 0175b00

Browse files
committed
fix: incorrect logic by introducing createOrUpdate method
Signed-off-by: Chris Laprun <metacosm@gmail.com>
1 parent 429c2c5 commit 0175b00

File tree

1 file changed

+35
-40
lines changed

1 file changed

+35
-40
lines changed

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

Lines changed: 35 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@
1919
import java.util.List;
2020
import java.util.Map;
2121
import java.util.Objects;
22+
import java.util.function.BiFunction;
2223

23-
import org.apache.commons.lang3.StringUtils;
2424
import org.slf4j.Logger;
2525
import org.slf4j.LoggerFactory;
2626

@@ -90,55 +90,30 @@ public UpdateControl<WebPage> reconcile(WebPage webPage, Context<WebPage> contex
9090
return UpdateControl.patchStatus(setInvalidHtmlErrorMessage(webPage));
9191
}
9292

93-
String ns = webPage.getMetadata().getNamespace();
94-
String configMapName = configMapName(webPage);
95-
String deploymentName = deploymentName(webPage);
93+
ConfigMap desiredHtmlConfigMap = makeDesiredHtmlConfigMap(webPage);
94+
Deployment desiredDeployment = makeDesiredDeployment(webPage);
95+
Service desiredService = makeDesiredService(webPage, desiredDeployment);
9696

97-
ConfigMap desiredHtmlConfigMap = makeDesiredHtmlConfigMap(ns, configMapName, webPage);
98-
Deployment desiredDeployment =
99-
makeDesiredDeployment(webPage, deploymentName, ns, configMapName);
100-
Service desiredService = makeDesiredService(webPage, ns, desiredDeployment);
101-
102-
var previousConfigMap = context.getSecondaryResource(ConfigMap.class).orElse(null);
103-
if (!match(desiredHtmlConfigMap, previousConfigMap)) {
104-
log.info(
105-
"Creating or updating ConfigMap {} in {}",
106-
desiredHtmlConfigMap.getMetadata().getName(),
107-
ns);
108-
context.resourceOperations().serverSideApply(desiredHtmlConfigMap);
109-
}
110-
111-
var existingDeployment = context.getSecondaryResource(Deployment.class).orElse(null);
112-
if (!match(desiredDeployment, existingDeployment)) {
113-
log.info(
114-
"Creating or updating Deployment {} in {}",
115-
desiredDeployment.getMetadata().getName(),
116-
ns);
117-
context.resourceOperations().serverSideApply(desiredDeployment);
118-
}
119-
120-
var existingService = context.getSecondaryResource(Service.class).orElse(null);
121-
if (!match(desiredService, existingService)) {
122-
log.info(
123-
"Creating or updating Service {} in {}", desiredDeployment.getMetadata().getName(), ns);
124-
context.resourceOperations().serverSideApply(desiredService);
125-
}
97+
final var previousConfigMap = createOrUpdate(context, desiredHtmlConfigMap, this::match);
98+
createOrUpdate(context, desiredDeployment, this::match);
99+
createOrUpdate(context, desiredService, this::match);
126100

127101
var existingIngress = context.getSecondaryResource(Ingress.class);
128102
if (Boolean.TRUE.equals(webPage.getSpec().getExposed())) {
129103
var desiredIngress = makeDesiredIngress(webPage);
130104
if (existingIngress.isEmpty() || !match(desiredIngress, existingIngress.get())) {
131-
context.resourceOperations().serverSideApply(desiredDeployment);
105+
context.resourceOperations().serverSideApply(desiredIngress);
132106
}
133107
} else existingIngress.ifPresent(ingress -> context.getClient().resource(ingress).delete());
134108

135109
// not that this is not necessary, eventually mounted config map would be updated, just this way
136-
// is much faster; what is handy for demo purposes.
110+
// is much faster; this is handy for demo purposes.
137111
// https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/#mounted-configmaps-are-updated-automatically
138112
if (previousConfigMap != null
139-
&& !StringUtils.equals(
113+
&& !Objects.equals(
140114
previousConfigMap.getData().get(INDEX_HTML),
141115
desiredHtmlConfigMap.getData().get(INDEX_HTML))) {
116+
final var ns = webPage.getMetadata().getNamespace();
142117
log.info("Restarting pods because HTML has changed in {}", ns);
143118
context.getClient().pods().inNamespace(ns).withLabel("app", deploymentName(webPage)).delete();
144119
}
@@ -147,6 +122,20 @@ public UpdateControl<WebPage> reconcile(WebPage webPage, Context<WebPage> contex
147122
createWebPageForStatusUpdate(webPage, desiredHtmlConfigMap.getMetadata().getName()));
148123
}
149124

125+
126+
private <T extends HasMetadata> T createOrUpdate(Context<WebPage> context, T desired, BiFunction<T, T, Boolean> matcher) {
127+
@SuppressWarnings("unchecked") final T previous = (T) context.getSecondaryResource(desired.getClass()).orElse(null);
128+
if (!matcher.apply(desired, previous)) {
129+
log.info(
130+
"Creating or updating {} {} in {}",
131+
desired.getKind(),
132+
desired.getMetadata().getName(),
133+
desired.getMetadata().getNamespace());
134+
context.resourceOperations().serverSideApply(desired);
135+
}
136+
return previous;
137+
}
138+
150139
private boolean match(Ingress desiredIngress, Ingress existingIngress) {
151140
String desiredServiceName =
152141
desiredIngress
@@ -205,9 +194,10 @@ private boolean match(ConfigMap desiredHtmlConfigMap, ConfigMap existingConfigMa
205194
}
206195
}
207196

208-
private Service makeDesiredService(WebPage webPage, String ns, Deployment desiredDeployment) {
197+
private Service makeDesiredService(WebPage webPage, Deployment desiredDeployment) {
209198
Service desiredService =
210199
ReconcilerUtilsInternal.loadYaml(Service.class, getClass(), "service.yaml");
200+
final var ns = webPage.getMetadata().getNamespace();
211201
desiredService.getMetadata().setName(serviceName(webPage));
212202
desiredService.getMetadata().setNamespace(ns);
213203
desiredService.getMetadata().setLabels(lowLevelLabel());
@@ -218,15 +208,18 @@ private Service makeDesiredService(WebPage webPage, String ns, Deployment desire
218208
return desiredService;
219209
}
220210

221-
private Deployment makeDesiredDeployment(
222-
WebPage webPage, String deploymentName, String ns, String configMapName) {
211+
private Deployment makeDesiredDeployment(WebPage webPage) {
223212
Deployment desiredDeployment =
224213
ReconcilerUtilsInternal.loadYaml(Deployment.class, getClass(), "deployment.yaml");
214+
final var ns = webPage.getMetadata().getNamespace();
215+
final var deploymentName = deploymentName(webPage);
225216
desiredDeployment.getMetadata().setName(deploymentName);
226217
desiredDeployment.getMetadata().setNamespace(ns);
227218
desiredDeployment.getMetadata().setLabels(lowLevelLabel());
228219
desiredDeployment.getSpec().getSelector().getMatchLabels().put("app", deploymentName);
229220
desiredDeployment.getSpec().getTemplate().getMetadata().getLabels().put("app", deploymentName);
221+
222+
final var configMapName = configMapName(webPage);
230223
desiredDeployment
231224
.getSpec()
232225
.getTemplate()
@@ -238,7 +231,9 @@ private Deployment makeDesiredDeployment(
238231
return desiredDeployment;
239232
}
240233

241-
private ConfigMap makeDesiredHtmlConfigMap(String ns, String configMapName, WebPage webPage) {
234+
private ConfigMap makeDesiredHtmlConfigMap(WebPage webPage) {
235+
final var ns = webPage.getMetadata().getNamespace();
236+
final var configMapName = configMapName(webPage);
242237
Map<String, String> data = new HashMap<>();
243238
data.put(INDEX_HTML, webPage.getSpec().getHtml());
244239
ConfigMap configMap =

0 commit comments

Comments
 (0)