Skip to content

Commit d21cf5f

Browse files
authored
fix: incorrect logic by introducing createOrUpdate method (#3172)
1 parent a47e0fe commit d21cf5f

File tree

1 file changed

+36
-40
lines changed

1 file changed

+36
-40
lines changed

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

Lines changed: 36 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,21 @@ public UpdateControl<WebPage> reconcile(WebPage webPage, Context<WebPage> contex
147122
createWebPageForStatusUpdate(webPage, desiredHtmlConfigMap.getMetadata().getName()));
148123
}
149124

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

208-
private Service makeDesiredService(WebPage webPage, String ns, Deployment desiredDeployment) {
198+
private Service makeDesiredService(WebPage webPage, Deployment desiredDeployment) {
209199
Service desiredService =
210200
ReconcilerUtilsInternal.loadYaml(Service.class, getClass(), "service.yaml");
201+
final var ns = webPage.getMetadata().getNamespace();
211202
desiredService.getMetadata().setName(serviceName(webPage));
212203
desiredService.getMetadata().setNamespace(ns);
213204
desiredService.getMetadata().setLabels(lowLevelLabel());
@@ -218,15 +209,18 @@ private Service makeDesiredService(WebPage webPage, String ns, Deployment desire
218209
return desiredService;
219210
}
220211

221-
private Deployment makeDesiredDeployment(
222-
WebPage webPage, String deploymentName, String ns, String configMapName) {
212+
private Deployment makeDesiredDeployment(WebPage webPage) {
223213
Deployment desiredDeployment =
224214
ReconcilerUtilsInternal.loadYaml(Deployment.class, getClass(), "deployment.yaml");
215+
final var ns = webPage.getMetadata().getNamespace();
216+
final var deploymentName = deploymentName(webPage);
225217
desiredDeployment.getMetadata().setName(deploymentName);
226218
desiredDeployment.getMetadata().setNamespace(ns);
227219
desiredDeployment.getMetadata().setLabels(lowLevelLabel());
228220
desiredDeployment.getSpec().getSelector().getMatchLabels().put("app", deploymentName);
229221
desiredDeployment.getSpec().getTemplate().getMetadata().getLabels().put("app", deploymentName);
222+
223+
final var configMapName = configMapName(webPage);
230224
desiredDeployment
231225
.getSpec()
232226
.getTemplate()
@@ -238,7 +232,9 @@ private Deployment makeDesiredDeployment(
238232
return desiredDeployment;
239233
}
240234

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

0 commit comments

Comments
 (0)