@@ -116,21 +116,26 @@ func (r *SolrCloudReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {
116
116
117
117
// Generate Common Service
118
118
commonService := util .GenerateCommonService (instance )
119
- if err := controllerutil .SetControllerReference (instance , commonService , r .scheme ); err != nil {
120
- return requeueOrNot , err
121
- }
122
119
123
120
// Check if the Common Service already exists
124
121
commonServiceLogger := logger .WithValues ("service" , commonService .Name )
125
122
foundCommonService := & corev1.Service {}
126
123
err = r .Get (context .TODO (), types.NamespacedName {Name : commonService .Name , Namespace : commonService .Namespace }, foundCommonService )
127
124
if err != nil && errors .IsNotFound (err ) {
128
125
commonServiceLogger .Info ("Creating Common Service" )
129
- err = r .Create (context .TODO (), commonService )
130
- } else if err == nil && util .CopyServiceFields (commonService , foundCommonService , commonServiceLogger ) {
126
+ if err = controllerutil .SetControllerReference (instance , commonService , r .scheme ); err == nil {
127
+ err = r .Create (context .TODO (), commonService )
128
+ }
129
+ } else if err == nil {
130
+ var needsUpdate bool
131
+ needsUpdate , err = util .OvertakeControllerRef (instance , foundCommonService , r .scheme )
132
+ needsUpdate = util .CopyServiceFields (commonService , foundCommonService , commonServiceLogger ) || needsUpdate
133
+
131
134
// Update the found Service and write the result back if there are any changes
132
- commonServiceLogger .Info ("Updating Common Service" )
133
- err = r .Update (context .TODO (), foundCommonService )
135
+ if needsUpdate && err == nil {
136
+ commonServiceLogger .Info ("Updating Common Service" )
137
+ err = r .Update (context .TODO (), foundCommonService )
138
+ }
134
139
}
135
140
if err != nil {
136
141
return requeueOrNot , err
@@ -161,21 +166,26 @@ func (r *SolrCloudReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {
161
166
// Generate HeadlessService
162
167
if instance .UsesHeadlessService () {
163
168
headless := util .GenerateHeadlessService (instance )
164
- if err := controllerutil .SetControllerReference (instance , headless , r .scheme ); err != nil {
165
- return requeueOrNot , err
166
- }
167
169
168
170
// Check if the HeadlessService already exists
169
171
headlessServiceLogger := logger .WithValues ("service" , headless .Name )
170
172
foundHeadless := & corev1.Service {}
171
173
err = r .Get (context .TODO (), types.NamespacedName {Name : headless .Name , Namespace : headless .Namespace }, foundHeadless )
172
174
if err != nil && errors .IsNotFound (err ) {
173
- headlessServiceLogger .Info ("Creating HeadlessService" )
174
- err = r .Create (context .TODO (), headless )
175
- } else if err == nil && util .CopyServiceFields (headless , foundHeadless , headlessServiceLogger ) {
175
+ headlessServiceLogger .Info ("Creating Headless Service" )
176
+ if err = controllerutil .SetControllerReference (instance , headless , r .scheme ); err == nil {
177
+ err = r .Create (context .TODO (), headless )
178
+ }
179
+ } else if err == nil {
180
+ var needsUpdate bool
181
+ needsUpdate , err = util .OvertakeControllerRef (instance , foundHeadless , r .scheme )
182
+ needsUpdate = util .CopyServiceFields (headless , foundHeadless , headlessServiceLogger ) || needsUpdate
183
+
176
184
// Update the found HeadlessService and write the result back if there are any changes
177
- headlessServiceLogger .Info ("Updating HeadlessService" )
178
- err = r .Update (context .TODO (), foundHeadless )
185
+ if needsUpdate && err == nil {
186
+ headlessServiceLogger .Info ("Updating Headless Service" )
187
+ err = r .Update (context .TODO (), foundHeadless )
188
+ }
179
189
}
180
190
if err != nil {
181
191
return requeueOrNot , err
@@ -235,9 +245,6 @@ func (r *SolrCloudReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {
235
245
if reconcileConfigInfo [util .SolrXmlFile ] == "" {
236
246
// no user provided solr.xml, so create the default
237
247
configMap := util .GenerateConfigMap (instance )
238
- if err := controllerutil .SetControllerReference (instance , configMap , r .scheme ); err != nil {
239
- return requeueOrNot , err
240
- }
241
248
242
249
reconcileConfigInfo [util .SolrXmlMd5Annotation ] = fmt .Sprintf ("%x" , md5 .Sum ([]byte (configMap .Data [util .SolrXmlFile ])))
243
250
reconcileConfigInfo [util .SolrXmlFile ] = configMap .Name
@@ -248,11 +255,19 @@ func (r *SolrCloudReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {
248
255
err = r .Get (context .TODO (), types.NamespacedName {Name : configMap .Name , Namespace : configMap .Namespace }, foundConfigMap )
249
256
if err != nil && errors .IsNotFound (err ) {
250
257
configMapLogger .Info ("Creating ConfigMap" )
251
- err = r .Create (context .TODO (), configMap )
252
- } else if err == nil && util .CopyConfigMapFields (configMap , foundConfigMap , configMapLogger ) {
258
+ if err = controllerutil .SetControllerReference (instance , configMap , r .scheme ); err == nil {
259
+ err = r .Create (context .TODO (), configMap )
260
+ }
261
+ } else if err == nil {
262
+ var needsUpdate bool
263
+ needsUpdate , err = util .OvertakeControllerRef (instance , foundConfigMap , r .scheme )
264
+ needsUpdate = util .CopyConfigMapFields (configMap , foundConfigMap , configMapLogger ) || needsUpdate
265
+
253
266
// Update the found ConfigMap and write the result back if there are any changes
254
- configMapLogger .Info ("Updating ConfigMap" )
255
- err = r .Update (context .TODO (), foundConfigMap )
267
+ if needsUpdate && err == nil {
268
+ configMapLogger .Info ("Updating ConfigMap" )
269
+ err = r .Update (context .TODO (), foundConfigMap )
270
+ }
256
271
}
257
272
if err != nil {
258
273
return requeueOrNot , err
@@ -395,28 +410,33 @@ func (r *SolrCloudReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {
395
410
if ! blockReconciliationOfStatefulSet {
396
411
// Generate StatefulSet
397
412
statefulSet := util .GenerateStatefulSet (instance , & newStatus , hostNameIpMap , reconcileConfigInfo , needsPkcs12InitContainer , tlsCertMd5 )
398
- if err := controllerutil .SetControllerReference (instance , statefulSet , r .scheme ); err != nil {
399
- return requeueOrNot , err
400
- }
401
413
402
414
// Check if the StatefulSet already exists
403
415
statefulSetLogger := logger .WithValues ("statefulSet" , statefulSet .Name )
404
416
foundStatefulSet := & appsv1.StatefulSet {}
405
417
err = r .Get (context .TODO (), types.NamespacedName {Name : statefulSet .Name , Namespace : statefulSet .Namespace }, foundStatefulSet )
406
418
if err != nil && errors .IsNotFound (err ) {
407
419
statefulSetLogger .Info ("Creating StatefulSet" )
408
- err = r .Create (context .TODO (), statefulSet )
420
+ if err = controllerutil .SetControllerReference (instance , statefulSet , r .scheme ); err == nil {
421
+ err = r .Create (context .TODO (), statefulSet )
422
+ }
409
423
// Find which labels the PVCs will be using, to use for the finalizer
410
424
pvcLabelSelector = statefulSet .Spec .Selector .MatchLabels
411
425
} else if err == nil {
412
426
statefulSetStatus = foundStatefulSet .Status
413
- if util .CopyStatefulSetFields (statefulSet , foundStatefulSet , statefulSetLogger ) {
414
- // Update the found StatefulSet and write the result back if there are any changes
427
+ // Find which labels the PVCs will be using, to use for the finalizer
428
+ pvcLabelSelector = foundStatefulSet .Spec .Selector .MatchLabels
429
+
430
+ // Check to see if the StatefulSet needs an update
431
+ var needsUpdate bool
432
+ needsUpdate , err = util .OvertakeControllerRef (instance , foundStatefulSet , r .scheme )
433
+ needsUpdate = util .CopyStatefulSetFields (statefulSet , foundStatefulSet , statefulSetLogger ) || needsUpdate
434
+
435
+ // Update the found StatefulSet and write the result back if there are any changes
436
+ if needsUpdate && err == nil {
415
437
statefulSetLogger .Info ("Updating StatefulSet" )
416
438
err = r .Update (context .TODO (), foundStatefulSet )
417
439
}
418
- // Find which labels the PVCs will be using, to use for the finalizer
419
- pvcLabelSelector = foundStatefulSet .Spec .Selector .MatchLabels
420
440
}
421
441
if err != nil {
422
442
return requeueOrNot , err
@@ -493,21 +513,26 @@ func (r *SolrCloudReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {
493
513
if extAddressabilityOpts != nil && extAddressabilityOpts .Method == solr .Ingress {
494
514
// Generate Ingress
495
515
ingress := util .GenerateIngress (instance , solrNodeNames )
496
- if err := controllerutil .SetControllerReference (instance , ingress , r .scheme ); err != nil {
497
- return requeueOrNot , err
498
- }
499
516
500
517
// Check if the Ingress already exists
501
518
ingressLogger := logger .WithValues ("ingress" , ingress .Name )
502
519
foundIngress := & netv1.Ingress {}
503
520
err = r .Get (context .TODO (), types.NamespacedName {Name : ingress .Name , Namespace : ingress .Namespace }, foundIngress )
504
521
if err != nil && errors .IsNotFound (err ) {
505
522
ingressLogger .Info ("Creating Ingress" )
506
- err = r .Create (context .TODO (), ingress )
507
- } else if err == nil && util .CopyIngressFields (ingress , foundIngress , ingressLogger ) {
523
+ if err = controllerutil .SetControllerReference (instance , ingress , r .scheme ); err == nil {
524
+ err = r .Create (context .TODO (), ingress )
525
+ }
526
+ } else if err == nil {
527
+ var needsUpdate bool
528
+ needsUpdate , err = util .OvertakeControllerRef (instance , foundIngress , r .scheme )
529
+ needsUpdate = util .CopyIngressFields (ingress , foundIngress , ingressLogger ) || needsUpdate
530
+
508
531
// Update the found Ingress and write the result back if there are any changes
509
- ingressLogger .Info ("Updating Ingress" )
510
- err = r .Update (context .TODO (), foundIngress )
532
+ if needsUpdate && err == nil {
533
+ ingressLogger .Info ("Updating Ingress" )
534
+ err = r .Update (context .TODO (), foundIngress )
535
+ }
511
536
}
512
537
if err != nil {
513
538
return requeueOrNot , err
@@ -651,24 +676,29 @@ func reconcileCloudStatus(r *SolrCloudReconciler, solrCloud *solr.SolrCloud, new
651
676
func reconcileNodeService (r * SolrCloudReconciler , logger logr.Logger , instance * solr.SolrCloud , nodeName string ) (err error , ip string ) {
652
677
// Generate Node Service
653
678
service := util .GenerateNodeService (instance , nodeName )
654
- if err := controllerutil .SetControllerReference (instance , service , r .scheme ); err != nil {
655
- return err , ip
656
- }
657
679
658
680
// Check if the Node Service already exists
659
681
nodeServiceLogger := logger .WithValues ("service" , service .Name )
660
682
foundService := & corev1.Service {}
661
683
err = r .Get (context .TODO (), types.NamespacedName {Name : service .Name , Namespace : service .Namespace }, foundService )
662
684
if err != nil && errors .IsNotFound (err ) {
663
685
nodeServiceLogger .Info ("Creating Node Service" )
664
- err = r .Create (context .TODO (), service )
686
+ if err = controllerutil .SetControllerReference (instance , service , r .scheme ); err == nil {
687
+ err = r .Create (context .TODO (), service )
688
+ }
665
689
} else if err == nil {
666
- if util .CopyServiceFields (service , foundService , nodeServiceLogger ) {
690
+ ip = foundService .Spec .ClusterIP
691
+
692
+ // Check to see if the Service needs an update
693
+ var needsUpdate bool
694
+ needsUpdate , err = util .OvertakeControllerRef (instance , foundService , r .scheme )
695
+ needsUpdate = util .CopyServiceFields (service , foundService , nodeServiceLogger ) || needsUpdate
696
+
697
+ if needsUpdate && err == nil {
667
698
// Update the found Node service because there are differences between our version and the existing version
668
699
nodeServiceLogger .Info ("Updating Node Service" )
669
700
err = r .Update (context .TODO (), foundService )
670
701
}
671
- ip = foundService .Spec .ClusterIP
672
702
}
673
703
if err != nil {
674
704
return err , ip
@@ -689,20 +719,23 @@ func reconcileZk(r *SolrCloudReconciler, logger logr.Logger, instance *solr.Solr
689
719
return errors .NewBadRequest ("Cannot create a Zookeeper Cluster, as the Solr Operator is not configured to use the Zookeeper CRD" )
690
720
}
691
721
zkCluster := util .GenerateZookeeperCluster (instance , pzk )
692
- if err := controllerutil .SetControllerReference (instance , zkCluster , r .scheme ); err != nil {
693
- return err
694
- }
695
722
696
723
// Check if the ZookeeperCluster already exists
697
724
zkLogger := logger .WithValues ("zookeeperCluster" , zkCluster .Name )
698
725
foundZkCluster := & zk.ZookeeperCluster {}
699
726
err := r .Get (context .TODO (), types.NamespacedName {Name : zkCluster .Name , Namespace : zkCluster .Namespace }, foundZkCluster )
700
727
if err != nil && errors .IsNotFound (err ) {
701
728
zkLogger .Info ("Creating Zookeeer Cluster" )
702
- err = r .Create (context .TODO (), zkCluster )
729
+ if err = controllerutil .SetControllerReference (instance , zkCluster , r .scheme ); err == nil {
730
+ err = r .Create (context .TODO (), zkCluster )
731
+ }
703
732
} else if err == nil {
704
- if util .CopyZookeeperClusterFields (zkCluster , foundZkCluster , zkLogger ) {
705
- // Update the found ZookeeperCluster and write the result back if there are any changes
733
+ var needsUpdate bool
734
+ needsUpdate , err = util .OvertakeControllerRef (instance , foundZkCluster , r .scheme )
735
+ needsUpdate = util .CopyZookeeperClusterFields (zkCluster , foundZkCluster , zkLogger ) || needsUpdate
736
+
737
+ // Update the found ZookeeperCluster and write the result back if there are any changes
738
+ if needsUpdate && err == nil {
706
739
zkLogger .Info ("Updating Zookeeer Cluster" )
707
740
err = r .Update (context .TODO (), foundZkCluster )
708
741
}
0 commit comments