@@ -21,6 +21,7 @@ import (
21
21
configv1 "github.com/openshift/api/config/v1"
22
22
23
23
"k8s.io/apimachinery/pkg/api/errors"
24
+ "k8s.io/apimachinery/pkg/api/meta"
24
25
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
25
26
"k8s.io/apimachinery/pkg/types"
26
27
utilerrors "k8s.io/apimachinery/pkg/util/errors"
@@ -90,6 +91,9 @@ type Config struct {
90
91
// events.
91
92
type reconciler struct {
92
93
Config
94
+
95
+ dnsConfig * configv1.DNS
96
+ infraConfig * configv1.Infrastructure
93
97
}
94
98
95
99
// Reconcile expects request to refer to a clusteringress in the operator
@@ -134,38 +138,48 @@ func (r *reconciler) reconcile(request reconcile.Request) (reconcile.Result, err
134
138
135
139
// Collect errors as we go.
136
140
errs := []error {}
141
+ result := reconcile.Result {}
137
142
138
143
if ingress != nil {
139
144
// Only reconcile the ingress itself if it exists.
140
145
dnsConfig := & configv1.DNS {}
141
- err = r .Client .Get (context .TODO (), types.NamespacedName {Name : "cluster" }, dnsConfig )
142
- if err != nil {
143
- return reconcile.Result {}, fmt .Errorf ("failed to get dns 'cluster': %v" , err )
146
+ if err := r .Client .Get (context .TODO (), types.NamespacedName {Name : "cluster" }, dnsConfig ); err != nil {
147
+ errs = append (errs , fmt .Errorf ("failed to get dns 'cluster': %v" , err ))
148
+ r .dnsConfig = nil
149
+ if errors .IsNotFound (err ) {
150
+ result .RequeueAfter = 10 * time .Second
151
+ }
152
+ } else {
153
+ r .dnsConfig = dnsConfig
144
154
}
145
155
146
156
infraConfig := & configv1.Infrastructure {}
147
- err = r .Client .Get (context .TODO (), types.NamespacedName {Name : "cluster" }, infraConfig )
148
- if err != nil {
149
- return reconcile.Result {}, fmt .Errorf ("failed to get infrastructure 'cluster': %v" , err )
157
+ if err := r .Client .Get (context .TODO (), types.NamespacedName {Name : "cluster" }, infraConfig ); err != nil {
158
+ errs = append (errs , fmt .Errorf ("failed to get infrastructure 'cluster': %v" , err ))
159
+ r .infraConfig = nil
160
+ if errors .IsNotFound (err ) {
161
+ result .RequeueAfter = 10 * time .Second
162
+ }
163
+ } else {
164
+ r .infraConfig = infraConfig
150
165
}
151
166
152
167
// Ensure we have all the necessary scaffolding on which to place router
153
168
// instances.
154
169
err = r .ensureRouterNamespace ()
155
170
if err != nil {
156
- return reconcile.Result {}, err
171
+ errs = append (errs , err )
172
+ return result , utilerrors .NewAggregate (errs )
157
173
}
158
174
159
175
if ingress .DeletionTimestamp != nil {
160
176
// Handle deletion.
161
- err := r .ensureIngressDeleted (ingress , dnsConfig )
162
- if err != nil {
177
+ if err := r .ensureIngressDeleted (ingress ); err != nil {
163
178
errs = append (errs , fmt .Errorf ("failed to ensure ingress deletion: %v" , err ))
164
179
}
165
180
} else {
166
181
// Handle everything else.
167
- err := r .ensureRouterForIngress (ingress , dnsConfig , infraConfig )
168
- if err != nil {
182
+ if err := r .ensureRouterForIngress (ingress , & result ); err != nil {
169
183
errs = append (errs , fmt .Errorf ("failed to ensure clusteringress: %v" , err ))
170
184
}
171
185
}
@@ -192,23 +206,25 @@ func (r *reconciler) reconcile(request reconcile.Request) (reconcile.Result, err
192
206
}
193
207
}
194
208
195
- return reconcile. Result {} , utilerrors .NewAggregate (errs )
209
+ return result , utilerrors .NewAggregate (errs )
196
210
}
197
211
198
212
// ensureIngressDeleted tries to delete ingress, and if successful, will remove
199
213
// the finalizer.
200
- func (r * reconciler ) ensureIngressDeleted (ingress * ingressv1alpha1.ClusterIngress , dnsConfig * configv1. DNS ) error {
214
+ func (r * reconciler ) ensureIngressDeleted (ingress * ingressv1alpha1.ClusterIngress ) error {
201
215
// TODO: This should also be tied to the HA type.
202
- err := r .finalizeLoadBalancerService (ingress , dnsConfig )
216
+ err := r .finalizeLoadBalancerService (ingress )
203
217
if err != nil {
204
218
return fmt .Errorf ("failed to finalize load balancer service for %s: %v" , ingress .Name , err )
205
219
}
206
220
logrus .Infof ("finalized load balancer service for ingress %s" , ingress .Name )
221
+
207
222
err = r .ensureRouterDeleted (ingress )
208
223
if err != nil {
209
224
return fmt .Errorf ("failed to delete deployment for ingress %s: %v" , ingress .Name , err )
210
225
}
211
226
logrus .Infof ("deleted deployment for ingress %s" , ingress .Name )
227
+
212
228
// Clean up the finalizer to allow the clusteringress to be deleted.
213
229
updated := ingress .DeepCopy ()
214
230
if slice .ContainsString (ingress .Finalizers , ClusterIngressFinalizer ) {
@@ -297,7 +313,7 @@ func (r *reconciler) ensureRouterNamespace() error {
297
313
298
314
// ensureRouterForIngress ensures all necessary router resources exist for a
299
315
// given clusteringress.
300
- func (r * reconciler ) ensureRouterForIngress (ci * ingressv1alpha1.ClusterIngress , dnsConfig * configv1. DNS , infraConfig * configv1. Infrastructure ) error {
316
+ func (r * reconciler ) ensureRouterForIngress (ci * ingressv1alpha1.ClusterIngress , result * reconcile. Result ) error {
301
317
expected , err := r .ManifestFactory .RouterDeployment (ci )
302
318
if err != nil {
303
319
return fmt .Errorf ("failed to build router deployment: %v" , err )
@@ -336,42 +352,49 @@ func (r *reconciler) ensureRouterForIngress(ci *ingressv1alpha1.ClusterIngress,
336
352
Controller : & trueVar ,
337
353
}
338
354
339
- lbService , err := r .ensureLoadBalancerService (ci , infraConfig , current )
355
+ errs := []error {}
356
+ lbService , err := r .ensureLoadBalancerService (ci , current )
340
357
if err != nil {
341
- return fmt .Errorf ("failed to ensure load balancer service for %s: %v" , ci .Name , err )
358
+ errs = append ( errs , fmt .Errorf ("failed to ensure load balancer service for %s: %v" , ci .Name , err ) )
342
359
}
343
-
344
- err = r .ensureDNS (ci , dnsConfig , lbService )
345
- if err != nil {
346
- return fmt .Errorf ("failed to ensure DNS for %s: %v" , ci .Name , err )
360
+ if err = r .ensureDNS (ci , lbService ); err != nil {
361
+ errs = append (errs , fmt .Errorf ("failed to ensure DNS for %s: %v" , ci .Name , err ))
347
362
}
348
363
349
364
internalSvc , err := r .ensureInternalRouterServiceForIngress (ci , deploymentRef )
350
365
if err != nil {
351
- return fmt .Errorf ("failed to create internal router service for clusteringress %s: %v" , ci .Name , err )
366
+ errs = append (errs , fmt .Errorf ("failed to create internal router service for clusteringress %s: %v" , ci .Name , err ))
367
+ return utilerrors .NewAggregate (errs )
352
368
}
353
369
354
370
if ci .Spec .DefaultCertificateSecret == nil {
355
371
if err := r .ensureDefaultCertificateForIngress (current , ci ); err != nil {
356
- return fmt .Errorf ("failed to create default certificate for clusteringress %s: %v" , ci .Name , err )
372
+ errs = append (errs , fmt .Errorf ("failed to create default certificate for clusteringress %s: %v" , ci .Name , err ))
373
+ return utilerrors .NewAggregate (errs )
357
374
}
358
375
} else {
359
376
if err := r .ensureDefaultCertificateDeleted (current , ci ); err != nil {
360
- return fmt .Errorf ("failed to delete operator-generated default certificate for clusteringress %s: %v" , ci .Name , err )
377
+ errs = append (errs , fmt .Errorf ("failed to delete operator-generated default certificate for clusteringress %s: %v" , ci .Name , err ))
378
+ return utilerrors .NewAggregate (errs )
361
379
}
362
380
}
363
381
364
382
if err := r .ensureMetricsIntegration (ci , internalSvc , deploymentRef ); err != nil {
365
- return fmt .Errorf ("failed to integrate metrics with openshift-monitoring for clusteringress %s: %v" , ci .Name , err )
383
+ errs = append (errs , fmt .Errorf ("failed to integrate metrics with openshift-monitoring for clusteringress %s: %v" , ci .Name , err ))
384
+ return utilerrors .NewAggregate (errs )
366
385
}
367
386
368
387
_ , err = r .ensureServiceMonitor (ci , internalSvc , current )
369
388
if err != nil {
370
- return fmt .Errorf ("failed to ensure servicemonitor for %s: %v" , ci .Name , err )
389
+ errs = append (errs , fmt .Errorf ("failed to ensure servicemonitor for %s: %v" , ci .Name , err ))
390
+ if meta .IsNoMatchError (err ) {
391
+ result .RequeueAfter = 10 * time .Second
392
+ }
371
393
}
372
394
373
395
if err := r .syncClusterIngressStatus (current , ci ); err != nil {
374
- return fmt .Errorf ("failed to update status of clusteringress %s/%s: %v" , current .Namespace , current .Name , err )
396
+ errs = append (errs , fmt .Errorf ("failed to update status of clusteringress %s/%s: %v" , current .Namespace , current .Name , err ))
397
+ return utilerrors .NewAggregate (errs )
375
398
}
376
399
377
400
return nil
0 commit comments