Skip to content

Commit 9a7a8f5

Browse files
Merge pull request #123 from pravisankar/add-controller-retry
Requeue requests during controller reconciliation if needed
2 parents 044ed27 + 3ae5481 commit 9a7a8f5

File tree

3 files changed

+71
-42
lines changed

3 files changed

+71
-42
lines changed

pkg/operator/controller/controller.go

Lines changed: 50 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
configv1 "github.com/openshift/api/config/v1"
2222

2323
"k8s.io/apimachinery/pkg/api/errors"
24+
"k8s.io/apimachinery/pkg/api/meta"
2425
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2526
"k8s.io/apimachinery/pkg/types"
2627
utilerrors "k8s.io/apimachinery/pkg/util/errors"
@@ -90,6 +91,9 @@ type Config struct {
9091
// events.
9192
type reconciler struct {
9293
Config
94+
95+
dnsConfig *configv1.DNS
96+
infraConfig *configv1.Infrastructure
9397
}
9498

9599
// 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
134138

135139
// Collect errors as we go.
136140
errs := []error{}
141+
result := reconcile.Result{}
137142

138143
if ingress != nil {
139144
// Only reconcile the ingress itself if it exists.
140145
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
144154
}
145155

146156
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
150165
}
151166

152167
// Ensure we have all the necessary scaffolding on which to place router
153168
// instances.
154169
err = r.ensureRouterNamespace()
155170
if err != nil {
156-
return reconcile.Result{}, err
171+
errs = append(errs, err)
172+
return result, utilerrors.NewAggregate(errs)
157173
}
158174

159175
if ingress.DeletionTimestamp != nil {
160176
// Handle deletion.
161-
err := r.ensureIngressDeleted(ingress, dnsConfig)
162-
if err != nil {
177+
if err := r.ensureIngressDeleted(ingress); err != nil {
163178
errs = append(errs, fmt.Errorf("failed to ensure ingress deletion: %v", err))
164179
}
165180
} else {
166181
// Handle everything else.
167-
err := r.ensureRouterForIngress(ingress, dnsConfig, infraConfig)
168-
if err != nil {
182+
if err := r.ensureRouterForIngress(ingress, &result); err != nil {
169183
errs = append(errs, fmt.Errorf("failed to ensure clusteringress: %v", err))
170184
}
171185
}
@@ -192,23 +206,25 @@ func (r *reconciler) reconcile(request reconcile.Request) (reconcile.Result, err
192206
}
193207
}
194208

195-
return reconcile.Result{}, utilerrors.NewAggregate(errs)
209+
return result, utilerrors.NewAggregate(errs)
196210
}
197211

198212
// ensureIngressDeleted tries to delete ingress, and if successful, will remove
199213
// the finalizer.
200-
func (r *reconciler) ensureIngressDeleted(ingress *ingressv1alpha1.ClusterIngress, dnsConfig *configv1.DNS) error {
214+
func (r *reconciler) ensureIngressDeleted(ingress *ingressv1alpha1.ClusterIngress) error {
201215
// TODO: This should also be tied to the HA type.
202-
err := r.finalizeLoadBalancerService(ingress, dnsConfig)
216+
err := r.finalizeLoadBalancerService(ingress)
203217
if err != nil {
204218
return fmt.Errorf("failed to finalize load balancer service for %s: %v", ingress.Name, err)
205219
}
206220
logrus.Infof("finalized load balancer service for ingress %s", ingress.Name)
221+
207222
err = r.ensureRouterDeleted(ingress)
208223
if err != nil {
209224
return fmt.Errorf("failed to delete deployment for ingress %s: %v", ingress.Name, err)
210225
}
211226
logrus.Infof("deleted deployment for ingress %s", ingress.Name)
227+
212228
// Clean up the finalizer to allow the clusteringress to be deleted.
213229
updated := ingress.DeepCopy()
214230
if slice.ContainsString(ingress.Finalizers, ClusterIngressFinalizer) {
@@ -297,7 +313,7 @@ func (r *reconciler) ensureRouterNamespace() error {
297313

298314
// ensureRouterForIngress ensures all necessary router resources exist for a
299315
// 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 {
301317
expected, err := r.ManifestFactory.RouterDeployment(ci)
302318
if err != nil {
303319
return fmt.Errorf("failed to build router deployment: %v", err)
@@ -336,42 +352,49 @@ func (r *reconciler) ensureRouterForIngress(ci *ingressv1alpha1.ClusterIngress,
336352
Controller: &trueVar,
337353
}
338354

339-
lbService, err := r.ensureLoadBalancerService(ci, infraConfig, current)
355+
errs := []error{}
356+
lbService, err := r.ensureLoadBalancerService(ci, current)
340357
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))
342359
}
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))
347362
}
348363

349364
internalSvc, err := r.ensureInternalRouterServiceForIngress(ci, deploymentRef)
350365
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)
352368
}
353369

354370
if ci.Spec.DefaultCertificateSecret == nil {
355371
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)
357374
}
358375
} else {
359376
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)
361379
}
362380
}
363381

364382
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)
366385
}
367386

368387
_, err = r.ensureServiceMonitor(ci, internalSvc, current)
369388
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+
}
371393
}
372394

373395
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)
375398
}
376399

377400
return nil

pkg/operator/controller/controller_dns.go

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,12 @@ import (
1515

1616
// ensureDNS will create DNS records for the given LB service. If service is
1717
// nil, nothing is done.
18-
func (r *reconciler) ensureDNS(ci *ingressv1alpha1.ClusterIngress, dnsConfig *configv1.DNS, service *corev1.Service) error {
19-
desiredDNSRecords, err := desiredDNSRecords(ci, dnsConfig, service)
18+
func (r *reconciler) ensureDNS(ci *ingressv1alpha1.ClusterIngress, service *corev1.Service) error {
19+
dnsRecords, err := r.desiredDNSRecords(ci, service)
2020
if err != nil {
2121
return err
2222
}
23-
for _, record := range desiredDNSRecords {
23+
for _, record := range dnsRecords {
2424
err := r.DNSManager.Ensure(record)
2525
if err != nil {
2626
return fmt.Errorf("failed to ensure DNS record %v for %s: %v", record, ci.Name, err)
@@ -34,7 +34,7 @@ func (r *reconciler) ensureDNS(ci *ingressv1alpha1.ClusterIngress, dnsConfig *co
3434
// If service is nil, no records are desired. If an ingress domain is in use,
3535
// records are desired in every specified zone present in the cluster DNS
3636
// configuration.
37-
func desiredDNSRecords(ci *ingressv1alpha1.ClusterIngress, dnsConfig *configv1.DNS, service *corev1.Service) ([]*dns.Record, error) {
37+
func (r *reconciler) desiredDNSRecords(ci *ingressv1alpha1.ClusterIngress, service *corev1.Service) ([]*dns.Record, error) {
3838
records := []*dns.Record{}
3939

4040
// If no service exists, no DNS records should exist.
@@ -49,8 +49,11 @@ func desiredDNSRecords(ci *ingressv1alpha1.ClusterIngress, dnsConfig *configv1.D
4949
return records, nil
5050
}
5151

52+
if r.dnsConfig == nil {
53+
return records, fmt.Errorf("dns config not found")
54+
}
5255
// If no zones are configured, there's nothing to do.
53-
if dnsConfig.Spec.PrivateZone == nil && dnsConfig.Spec.PublicZone == nil {
56+
if r.dnsConfig.Spec.PrivateZone == nil && r.dnsConfig.Spec.PublicZone == nil {
5457
return records, nil
5558
}
5659

@@ -72,11 +75,11 @@ func desiredDNSRecords(ci *ingressv1alpha1.ClusterIngress, dnsConfig *configv1.D
7275
},
7376
}
7477
}
75-
if dnsConfig.Spec.PrivateZone != nil {
76-
records = append(records, makeRecord(dnsConfig.Spec.PrivateZone))
78+
if r.dnsConfig.Spec.PrivateZone != nil {
79+
records = append(records, makeRecord(r.dnsConfig.Spec.PrivateZone))
7780
}
78-
if dnsConfig.Spec.PublicZone != nil {
79-
records = append(records, makeRecord(dnsConfig.Spec.PublicZone))
81+
if r.dnsConfig.Spec.PublicZone != nil {
82+
records = append(records, makeRecord(r.dnsConfig.Spec.PublicZone))
8083
}
8184
return records, nil
8285
}

pkg/operator/controller/controller_lb.go

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@ const (
3434
// ensureLoadBalancerService creates an LB service if one is desired but absent.
3535
// Always returns the current LB service if one exists (whether it already
3636
// existed or was created during the course of the function).
37-
func (r *reconciler) ensureLoadBalancerService(ci *ingressv1alpha1.ClusterIngress, infra *configv1.Infrastructure, deployment *appsv1.Deployment) (*corev1.Service, error) {
38-
desiredLBService, err := desiredLoadBalancerService(ci, infra, deployment)
37+
func (r *reconciler) ensureLoadBalancerService(ci *ingressv1alpha1.ClusterIngress, deployment *appsv1.Deployment) (*corev1.Service, error) {
38+
desiredLBService, err := r.desiredLoadBalancerService(ci, deployment)
3939
if err != nil {
4040
return nil, err
4141
}
@@ -66,7 +66,7 @@ func loadBalancerServiceName(ci *ingressv1alpha1.ClusterIngress) types.Namespace
6666
// clusteringress, or nil if an LB service isn't desired. An LB service is
6767
// desired if the high availability type is Cloud. An LB service will declare an
6868
// owner reference to the given deployment.
69-
func desiredLoadBalancerService(ci *ingressv1alpha1.ClusterIngress, infra *configv1.Infrastructure, deployment *appsv1.Deployment) (*corev1.Service, error) {
69+
func (r *reconciler) desiredLoadBalancerService(ci *ingressv1alpha1.ClusterIngress, deployment *appsv1.Deployment) (*corev1.Service, error) {
7070
if ci.Spec.HighAvailability == nil || ci.Spec.HighAvailability.Type != ingressv1alpha1.CloudClusterIngressHA {
7171
return nil, nil
7272
}
@@ -96,7 +96,10 @@ func desiredLoadBalancerService(ci *ingressv1alpha1.ClusterIngress, infra *confi
9696
}
9797
service.Spec.Selector["router"] = name.Name
9898

99-
if infra.Status.Platform == configv1.AWSPlatform {
99+
if r.infraConfig == nil {
100+
return nil, fmt.Errorf("infra config not found")
101+
}
102+
if r.infraConfig.Status.Platform == configv1.AWSPlatform {
100103
if service.Annotations == nil {
101104
service.Annotations = map[string]string{}
102105
}
@@ -124,15 +127,15 @@ func (r *reconciler) currentLoadBalancerService(ci *ingressv1alpha1.ClusterIngre
124127
// finalizeLoadBalancerService deletes any DNS entries associated with any
125128
// current LB service associated with the clusteringress and then finalizes the
126129
// service.
127-
func (r *reconciler) finalizeLoadBalancerService(ci *ingressv1alpha1.ClusterIngress, dnsConfig *configv1.DNS) error {
130+
func (r *reconciler) finalizeLoadBalancerService(ci *ingressv1alpha1.ClusterIngress) error {
128131
service, err := r.currentLoadBalancerService(ci)
129132
if err != nil {
130133
return err
131134
}
132135
if service == nil {
133136
return nil
134137
}
135-
records, err := desiredDNSRecords(ci, dnsConfig, service)
138+
records, err := r.desiredDNSRecords(ci, service)
136139
if err != nil {
137140
return err
138141
}

0 commit comments

Comments
 (0)