Skip to content

Commit 4db7b22

Browse files
authored
Merge pull request #4166 from kubernetes-sigs/fix/softerror-should-not-fatal
fix: provide possibility to have a soft error mode
2 parents 2b69c57 + b8ac272 commit 4db7b22

File tree

3 files changed

+24
-9
lines changed

3 files changed

+24
-9
lines changed

controller/controller.go

+6-1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package controller
1818

1919
import (
2020
"context"
21+
"errors"
2122
"fmt"
2223
"sync"
2324
"time"
@@ -331,7 +332,11 @@ func (c *Controller) Run(ctx context.Context) {
331332
for {
332333
if c.ShouldRunOnce(time.Now()) {
333334
if err := c.RunOnce(ctx); err != nil {
334-
log.Fatal(err)
335+
if errors.Is(err, provider.SoftError) {
336+
log.Errorf("Failed to do run once: %v", err)
337+
} else {
338+
log.Fatalf("Failed to do run once: %v", err)
339+
}
335340
}
336341
}
337342
select {

provider/aws/aws.go

+7-8
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ import (
2727
"github.com/aws/aws-sdk-go/aws"
2828
"github.com/aws/aws-sdk-go/aws/request"
2929
"github.com/aws/aws-sdk-go/service/route53"
30-
"github.com/pkg/errors"
3130
log "github.com/sirupsen/logrus"
3231

3332
"sigs.k8s.io/external-dns/endpoint"
@@ -325,10 +324,10 @@ func (p *AWSProvider) Zones(ctx context.Context) (map[string]*route53.HostedZone
325324

326325
err := p.client.ListHostedZonesPagesWithContext(ctx, &route53.ListHostedZonesInput{}, f)
327326
if err != nil {
328-
return nil, errors.Wrap(err, "failed to list hosted zones")
327+
return nil, provider.NewSoftError(fmt.Errorf("failed to list hosted zones: %w", err))
329328
}
330329
if tagErr != nil {
331-
return nil, errors.Wrap(tagErr, "failed to list zones tags")
330+
return nil, provider.NewSoftError(fmt.Errorf("failed to list zones tags: %w", tagErr))
332331
}
333332

334333
for _, zone := range zones {
@@ -353,7 +352,7 @@ func wildcardUnescape(s string) string {
353352
func (p *AWSProvider) Records(ctx context.Context) (endpoints []*endpoint.Endpoint, _ error) {
354353
zones, err := p.Zones(ctx)
355354
if err != nil {
356-
return nil, errors.Wrap(err, "records retrieval failed")
355+
return nil, provider.NewSoftError(fmt.Errorf("records retrieval failed: %w", err))
357356
}
358357

359358
return p.records(ctx, zones)
@@ -445,7 +444,7 @@ func (p *AWSProvider) records(ctx context.Context, zones map[string]*route53.Hos
445444
}
446445

447446
if err := p.client.ListResourceRecordSetsPagesWithContext(ctx, params, f); err != nil {
448-
return nil, errors.Wrapf(err, "failed to list resource records sets for zone %s", *z.Id)
447+
return nil, provider.NewSoftError(fmt.Errorf("failed to list resource records sets for zone %s: %w", *z.Id, err))
449448
}
450449
}
451450

@@ -530,7 +529,7 @@ func (p *AWSProvider) GetDomainFilter() endpoint.DomainFilter {
530529
func (p *AWSProvider) ApplyChanges(ctx context.Context, changes *plan.Changes) error {
531530
zones, err := p.Zones(ctx)
532531
if err != nil {
533-
return errors.Wrap(err, "failed to list zones, not applying changes")
532+
return provider.NewSoftError(fmt.Errorf("failed to list zones, not applying changes: %w", err))
534533
}
535534

536535
updateChanges := p.createUpdateChanges(changes.UpdateNew, changes.UpdateOld)
@@ -632,7 +631,7 @@ func (p *AWSProvider) submitChanges(ctx context.Context, changes Route53Changes,
632631
}
633632

634633
if len(failedZones) > 0 {
635-
return errors.Errorf("failed to submit all changes for the following zones: %v", failedZones)
634+
return provider.NewSoftError(fmt.Errorf("failed to submit all changes for the following zones: %v", failedZones))
636635
}
637636

638637
return nil
@@ -847,7 +846,7 @@ func (p *AWSProvider) tagsForZone(ctx context.Context, zoneID string) (map[strin
847846
ResourceId: aws.String(zoneID),
848847
})
849848
if err != nil {
850-
return nil, errors.Wrapf(err, "failed to list tags for zone %s", zoneID)
849+
return nil, provider.NewSoftError(fmt.Errorf("failed to list tags for zone %s: %w", zoneID, err))
851850
}
852851
tagMap := map[string]string{}
853852
for _, tag := range response.ResourceTagSet.Tags {

provider/provider.go

+11
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,24 @@ package provider
1818

1919
import (
2020
"context"
21+
"errors"
2122
"net"
2223
"strings"
2324

2425
"sigs.k8s.io/external-dns/endpoint"
2526
"sigs.k8s.io/external-dns/plan"
2627
)
2728

29+
// SoftError is an error, that provider will only log as error instead
30+
// of fatal. It is meant for error propagation from providers to tell
31+
// that this is a transient error.
32+
var SoftError error = errors.New("soft error")
33+
34+
// NewSoftError creates a SoftError from the given error
35+
func NewSoftError(err error) error {
36+
return errors.Join(SoftError, err)
37+
}
38+
2839
// Provider defines the interface DNS providers should implement.
2940
type Provider interface {
3041
Records(ctx context.Context) ([]*endpoint.Endpoint, error)

0 commit comments

Comments
 (0)