diff --git a/provider/webhook/webhook.go b/provider/webhook/webhook.go index fdd697c01f..6bfe4409d8 100644 --- a/provider/webhook/webhook.go +++ b/provider/webhook/webhook.go @@ -26,6 +26,7 @@ import ( "sigs.k8s.io/external-dns/endpoint" "sigs.k8s.io/external-dns/plan" + "sigs.k8s.io/external-dns/provider" webhookapi "sigs.k8s.io/external-dns/provider/webhook/api" backoff "github.com/cenkalti/backoff/v4" @@ -180,7 +181,11 @@ func (p WebhookProvider) Records(ctx context.Context) ([]*endpoint.Endpoint, err if resp.StatusCode != http.StatusOK { recordsErrorsGauge.Inc() log.Debugf("Failed to get records with code %d", resp.StatusCode) - return nil, fmt.Errorf("failed to get records with code %d", resp.StatusCode) + err := fmt.Errorf("failed to get records with code %d", resp.StatusCode) + if resp.StatusCode >= http.StatusInternalServerError { + return nil, provider.NewSoftError(err) + } + return nil, err } endpoints := []*endpoint.Endpoint{} @@ -224,7 +229,11 @@ func (p WebhookProvider) ApplyChanges(ctx context.Context, changes *plan.Changes if resp.StatusCode != http.StatusNoContent { applyChangesErrorsGauge.Inc() log.Debugf("Failed to apply changes with code %d", resp.StatusCode) - return fmt.Errorf("failed to apply changes with code %d", resp.StatusCode) + err := fmt.Errorf("failed to apply changes with code %d", resp.StatusCode) + if resp.StatusCode >= http.StatusInternalServerError { + return provider.NewSoftError(err) + } + return err } return nil } @@ -270,7 +279,11 @@ func (p WebhookProvider) AdjustEndpoints(e []*endpoint.Endpoint) ([]*endpoint.En if resp.StatusCode != http.StatusOK { adjustEndpointsErrorsGauge.Inc() log.Debugf("Failed to AdjustEndpoints with code %d", resp.StatusCode) - return nil, fmt.Errorf("failed to AdjustEndpoints with code %d", resp.StatusCode) + err := fmt.Errorf("failed to AdjustEndpoints with code %d", resp.StatusCode) + if resp.StatusCode >= http.StatusInternalServerError { + return nil, provider.NewSoftError(err) + } + return nil, err } if err := json.NewDecoder(resp.Body).Decode(&endpoints); err != nil { diff --git a/provider/webhook/webhook_test.go b/provider/webhook/webhook_test.go index ed2b17f638..03b02c20f7 100644 --- a/provider/webhook/webhook_test.go +++ b/provider/webhook/webhook_test.go @@ -26,6 +26,7 @@ import ( "github.com/stretchr/testify/require" "sigs.k8s.io/external-dns/endpoint" + "sigs.k8s.io/external-dns/provider" webhookapi "sigs.k8s.io/external-dns/provider/webhook/api" ) @@ -99,10 +100,11 @@ func TestRecordsWithErrors(t *testing.T) { })) defer svr.Close() - provider, err := NewWebhookProvider(svr.URL) + p, err := NewWebhookProvider(svr.URL) require.NoError(t, err) - _, err = provider.Records(context.Background()) + _, err = p.Records(context.Background()) require.NotNil(t, err) + require.ErrorIs(t, err, provider.SoftError) } func TestApplyChanges(t *testing.T) { @@ -122,15 +124,16 @@ func TestApplyChanges(t *testing.T) { })) defer svr.Close() - provider, err := NewWebhookProvider(svr.URL) + p, err := NewWebhookProvider(svr.URL) require.NoError(t, err) - err = provider.ApplyChanges(context.TODO(), nil) + err = p.ApplyChanges(context.TODO(), nil) require.NoError(t, err) successfulApplyChanges = false - err = provider.ApplyChanges(context.TODO(), nil) + err = p.ApplyChanges(context.TODO(), nil) require.NotNil(t, err) + require.ErrorIs(t, err, provider.SoftError) } func TestAdjustEndpoints(t *testing.T) { @@ -198,7 +201,7 @@ func TestAdjustendpointsWithError(t *testing.T) { })) defer svr.Close() - provider, err := NewWebhookProvider(svr.URL) + p, err := NewWebhookProvider(svr.URL) require.NoError(t, err) endpoints := []*endpoint.Endpoint{ { @@ -210,6 +213,7 @@ func TestAdjustendpointsWithError(t *testing.T) { }, }, } - _, err = provider.AdjustEndpoints(endpoints) + _, err = p.AdjustEndpoints(endpoints) require.Error(t, err) + require.ErrorIs(t, err, provider.SoftError) }