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,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