1919import java .util .List ;
2020import java .util .Map ;
2121import java .util .Objects ;
22+ import java .util .function .BiFunction ;
2223
23- import org .apache .commons .lang3 .StringUtils ;
2424import org .slf4j .Logger ;
2525import 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