From 7d28faf803ff5ff4dfe3365bd28e796d03e60d68 Mon Sep 17 00:00:00 2001 From: Hoang Quoc Trung Date: Wed, 6 Mar 2024 09:31:30 +0100 Subject: [PATCH] fix(#5658): handle edge cases for tag filtering detection Signed-off-by: Hoang Quoc Trung --- internal/dataplane/sendconfig/kong.go | 30 +++++++++++++++++++-------- internal/manager/run.go | 4 +++- 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/internal/dataplane/sendconfig/kong.go b/internal/dataplane/sendconfig/kong.go index 32163a8d50..c066f825cf 100644 --- a/internal/dataplane/sendconfig/kong.go +++ b/internal/dataplane/sendconfig/kong.go @@ -2,6 +2,7 @@ package sendconfig import ( "context" + "errors" "fmt" "github.com/blang/semver/v4" @@ -11,6 +12,11 @@ import ( "github.com/kong/kubernetes-ingress-controller/v3/internal/adminapi" ) +var ( + ErrAdminAPIUnreachable = errors.New("Kong Admin API is unreachable") + ErrAdminAPITagsDisabled = errors.New("Kong Admin API does not support tags") +) + // Config gathers parameters that are needed for sending configuration to Kong Admin APIs. type Config struct { // Currently, this assumes that all underlying clients are using the same version @@ -47,13 +53,18 @@ func (c *Config) Init( ctx context.Context, logger logr.Logger, kongClients []*adminapi.Client, -) { +) error { if err := tagsFilteringEnabled(ctx, kongClients); err != nil { - logger.Error(err, "Tag filtering disabled") - c.FilterTags = nil - } else { - logger.Info("Tag filtering enabled", "tags", c.FilterTags) + if errors.Is(err, ErrAdminAPITagsDisabled) { + logger.Error(err, "Tag filtering disabled") + c.FilterTags = nil + return nil + } + return err } + + logger.Info("Tag filtering enabled", "tags", c.FilterTags) + return nil } func tagsFilteringEnabled(ctx context.Context, kongClients []*adminapi.Client) error { @@ -62,11 +73,12 @@ func tagsFilteringEnabled(ctx context.Context, kongClients []*adminapi.Client) e cl := cl errg.Go(func() error { ok, err := cl.AdminAPIClient().Tags.Exists(ctx) - if err != nil { - return fmt.Errorf("Kong Admin API (%s) does not support tags: %w", cl.BaseRootURL(), err) - } + if !ok { - return fmt.Errorf("Kong Admin API (%s) does not support tags", cl.BaseRootURL()) + if err == nil { + return fmt.Errorf("%w", ErrAdminAPIUnreachable) + } + return fmt.Errorf("%w: %w", ErrAdminAPIUnreachable, err) } return nil }) diff --git a/internal/manager/run.go b/internal/manager/run.go index 8e7e62500d..16d431dc00 100644 --- a/internal/manager/run.go +++ b/internal/manager/run.go @@ -123,7 +123,9 @@ func Run( ExpressionRoutes: dpconf.ShouldEnableExpressionRoutes(routerFlavor), SanitizeKonnectConfigDumps: featureGates.Enabled(featuregates.SanitizeKonnectConfigDumps), } - kongConfig.Init(ctx, setupLog, initialKongClients) + if err := kongConfig.Init(ctx, setupLog, initialKongClients); err != nil { + return fmt.Errorf("unable to check if tags filtering is enabled: %w", err) + } setupLog.Info("Configuring and building the controller manager") managerOpts, err := setupManagerOptions(ctx, setupLog, c, dbMode)