From c9035b9e82ea688df965dc030eb5e62ca1b690c8 Mon Sep 17 00:00:00 2001 From: Pavel Okhlopkov Date: Wed, 6 Nov 2024 17:35:28 +0300 Subject: [PATCH 1/9] add debug, todos Signed-off-by: Pavel Okhlopkov --- client/client.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/client/client.go b/client/client.go index cffa57e..733bc17 100644 --- a/client/client.go +++ b/client/client.go @@ -35,6 +35,8 @@ const ( kubeNamespaceFilePath = "/var/run/secrets/kubernetes.io/serviceaccount/namespace" ) +// TODO: refactor with methods +// add logger to client when create func New() *Client { return &Client{} } @@ -227,7 +229,7 @@ func (c *Client) Init() error { } c.restConfig = config - logger.Infof("Kubernetes client is configured successfully with '%s' config", configType) + logger.Debugf("Kubernetes client is configured successfully with '%s' config", configType) return nil } From cf9831876eacfa039a53f3ab1249e7fdfc1351ed Mon Sep 17 00:00:00 2001 From: Pavel Okhlopkov Date: Wed, 6 Nov 2024 17:37:05 +0300 Subject: [PATCH 2/9] bump log lib Signed-off-by: Pavel Okhlopkov --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index a2b69bd..2f897da 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.22.8 toolchain go1.23.1 require ( - github.com/deckhouse/deckhouse/pkg/log v0.0.0-20241102110904-83c5e473e0ca + github.com/deckhouse/deckhouse/pkg/log v0.0.0-20241106140903-258b93b3334e github.com/onsi/gomega v1.29.0 github.com/pkg/errors v0.9.1 github.com/prometheus/client_golang v1.16.0 diff --git a/go.sum b/go.sum index e345bd6..7c583a2 100644 --- a/go.sum +++ b/go.sum @@ -8,8 +8,8 @@ github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ3 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/deckhouse/deckhouse/pkg/log v0.0.0-20241102110904-83c5e473e0ca h1:qbVHWHa4sDRW55Xbui4vpL1XgJbrrdVr6iQARARiFWQ= -github.com/deckhouse/deckhouse/pkg/log v0.0.0-20241102110904-83c5e473e0ca/go.mod h1:Mk5HRzkc5pIcDIZ2JJ6DPuuqnwhXVkb3you8M8Mg+4w= +github.com/deckhouse/deckhouse/pkg/log v0.0.0-20241106140903-258b93b3334e h1:QUQy+5Bv7/UzhfrytiG3c5gfLGhPppepVbRpbMisVIw= +github.com/deckhouse/deckhouse/pkg/log v0.0.0-20241106140903-258b93b3334e/go.mod h1:Mk5HRzkc5pIcDIZ2JJ6DPuuqnwhXVkb3you8M8Mg+4w= github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/evanphx/json-patch v4.12.0+incompatible h1:4onqiflcdA9EOZ4RxV643DvftH5pOlLGNtQ5lPWQu84= From 9b2201dc9e4881cde109469487499c3b0e6870db Mon Sep 17 00:00:00 2001 From: Pavel Okhlopkov Date: Wed, 6 Nov 2024 17:39:33 +0300 Subject: [PATCH 3/9] golangci-lint Signed-off-by: Pavel Okhlopkov --- .golangci.yaml | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/.golangci.yaml b/.golangci.yaml index 4fd7a1a..687deb3 100644 --- a/.golangci.yaml +++ b/.golangci.yaml @@ -23,6 +23,7 @@ linters: - nolintlint - prealloc - revive + - sloglint - staticcheck - stylecheck - unconvert @@ -44,6 +45,33 @@ linters-settings: deny: - pkg: github.com/evanphx/json-patch desc: "The 'github.com/evanphx/json-patch' package is superseded. Use pkg/utils/jsonpatch.go instead." + sloglint: + # Enforce not mixing key-value pairs and attributes. + no-mixed-args: true + # Enforce using key-value pairs only (overrides no-mixed-args, incompatible with attr-only). + kv-only: false + # Enforce using attributes only (overrides no-mixed-args, incompatible with kv-only). + attr-only: false + # Enforce not using global loggers. + no-global: "" + # Enforce using methods that accept a context. + context: "" + # Enforce using static values for log messages. + static-msg: false + # Enforce using constants instead of raw keys. + no-raw-keys: false + # Enforce a single key naming convention. + key-naming-case: "" + # Enforce not using specific keys. + forbidden-keys: + - level + - msg + - logger + - source + - stacktrace + - time + # Enforce putting arguments on separate lines. + args-on-sep-lines: false issues: exclude: # Using underscores is a common practice, refactor in the future From 85138d2b6afa71f5bf9c853f7ee0c6a9f7131a20 Mon Sep 17 00:00:00 2001 From: Pavel Okhlopkov Date: Wed, 6 Nov 2024 17:42:14 +0300 Subject: [PATCH 4/9] lint Signed-off-by: Pavel Okhlopkov --- client/client.go | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/client/client.go b/client/client.go index 733bc17..4b892ca 100644 --- a/client/client.go +++ b/client/client.go @@ -2,6 +2,7 @@ package client import ( "fmt" + "log/slog" "os" "strings" "time" @@ -148,18 +149,18 @@ func (c *Client) Init() error { if c.configPath != "" || c.contextName != "" { if outOfClusterErr != nil { err = fmt.Errorf("out-of-cluster config error: %v, in-cluster config error: %v", outOfClusterErr, err) - logger.Errorf("configuration problems: %s", err) + logger.Error("configuration problems", slog.String("error", err.Error())) return err } return fmt.Errorf("in-cluster config is not found") } - logger.Errorf("in-cluster problem: %s", err) + logger.Error("in-cluster problem", slog.String("error", err.Error())) return err } } else { // if not in cluster return outOfCluster error if outOfClusterErr != nil { - logger.Errorf("out-of-cluster problem: %s", outOfClusterErr) + logger.Error("out-of-cluster problem", slog.String("error", outOfClusterErr.Error())) return outOfClusterErr } return fmt.Errorf("no kubernetes client config found") @@ -185,7 +186,7 @@ func (c *Client) Init() error { c.Interface, err = kubernetes.NewForConfig(config) if err != nil { - logger.Errorf("configuration problem: %s", err) + logger.Error("configuration problem", slog.String("error", err.Error())) return err } @@ -229,7 +230,7 @@ func (c *Client) Init() error { } c.restConfig = config - logger.Debugf("Kubernetes client is configured successfully with '%s' config", configType) + logger.Debug("Kubernetes client is configured successfully with config", slog.String("config", configType)) return nil } From c9ebcff51b51a55a529e8cbbab4e8041cbb124c3 Mon Sep 17 00:00:00 2001 From: Pavel Okhlopkov Date: Wed, 6 Nov 2024 17:45:45 +0300 Subject: [PATCH 5/9] add logger to constructor Signed-off-by: Pavel Okhlopkov --- client/client.go | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/client/client.go b/client/client.go index 4b892ca..8621e18 100644 --- a/client/client.go +++ b/client/client.go @@ -37,9 +37,10 @@ const ( ) // TODO: refactor with methods -// add logger to client when create -func New() *Client { - return &Client{} +func New(logger *log.Logger) *Client { + return &Client{ + logger: logger, + } } func NewFake(gvr map[schema.GroupVersionResource]string) *Client { @@ -50,6 +51,7 @@ func NewFake(gvr map[schema.GroupVersionResource]string) *Client { dynamicClient: fakedynamic.NewSimpleDynamicClientWithCustomListKinds(sc, gvr), metadataClient: fakemetadata.NewSimpleMetadataClient(sc), schema: sc, + logger: log.NewNop(), } } @@ -70,6 +72,7 @@ type Client struct { metricLabels map[string]string schema *runtime.Scheme restConfig *rest.Config + logger *log.Logger } // ReloadDynamic creates new dynamic client with the new set of CRDs. From 807a3acedfb0c4e0781231b48fbf654a13b88828 Mon Sep 17 00:00:00 2001 From: Pavel Okhlopkov Date: Wed, 6 Nov 2024 17:47:18 +0300 Subject: [PATCH 6/9] replace logger with constructed Signed-off-by: Pavel Okhlopkov --- client/client.go | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/client/client.go b/client/client.go index 8621e18..b711f79 100644 --- a/client/client.go +++ b/client/client.go @@ -39,7 +39,7 @@ const ( // TODO: refactor with methods func New(logger *log.Logger) *Client { return &Client{ - logger: logger, + logger: logger.With("operator.component", "KubernetesAPIClient"), } } @@ -131,8 +131,9 @@ func (c *Client) RestConfig() *rest.Config { } func (c *Client) Init() error { - logger := log.NewLogger(log.Options{}) - logger = logger.With("operator.component", "KubernetesAPIClient") + if c.logger == nil { + c.logger = log.NewLogger(log.Options{}).With("operator.component", "KubernetesAPIClient") + } var err error var config *rest.Config @@ -152,18 +153,18 @@ func (c *Client) Init() error { if c.configPath != "" || c.contextName != "" { if outOfClusterErr != nil { err = fmt.Errorf("out-of-cluster config error: %v, in-cluster config error: %v", outOfClusterErr, err) - logger.Error("configuration problems", slog.String("error", err.Error())) + c.logger.Error("configuration problems", slog.String("error", err.Error())) return err } return fmt.Errorf("in-cluster config is not found") } - logger.Error("in-cluster problem", slog.String("error", err.Error())) + c.logger.Error("in-cluster problem", slog.String("error", err.Error())) return err } } else { // if not in cluster return outOfCluster error if outOfClusterErr != nil { - logger.Error("out-of-cluster problem", slog.String("error", outOfClusterErr.Error())) + c.logger.Error("out-of-cluster problem", slog.String("error", outOfClusterErr.Error())) return outOfClusterErr } return fmt.Errorf("no kubernetes client config found") @@ -189,7 +190,7 @@ func (c *Client) Init() error { c.Interface, err = kubernetes.NewForConfig(config) if err != nil { - logger.Error("configuration problem", slog.String("error", err.Error())) + c.logger.Error("configuration problem", slog.String("error", err.Error())) return err } @@ -233,7 +234,7 @@ func (c *Client) Init() error { } c.restConfig = config - logger.Debug("Kubernetes client is configured successfully with config", slog.String("config", configType)) + c.logger.Debug("Kubernetes client is configured successfully with config", slog.String("config", configType)) return nil } From 74dd66e8b2397c60a54294c488850950eb8bab39 Mon Sep 17 00:00:00 2001 From: Pavel Okhlopkov Date: Wed, 6 Nov 2024 17:48:02 +0300 Subject: [PATCH 7/9] add named Signed-off-by: Pavel Okhlopkov --- client/client.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/client.go b/client/client.go index b711f79..1cea2cd 100644 --- a/client/client.go +++ b/client/client.go @@ -39,7 +39,7 @@ const ( // TODO: refactor with methods func New(logger *log.Logger) *Client { return &Client{ - logger: logger.With("operator.component", "KubernetesAPIClient"), + logger: logger.Named("kubernetes-api-client").With("operator.component", "KubernetesAPIClient"), } } @@ -132,7 +132,7 @@ func (c *Client) RestConfig() *rest.Config { func (c *Client) Init() error { if c.logger == nil { - c.logger = log.NewLogger(log.Options{}).With("operator.component", "KubernetesAPIClient") + c.logger = log.NewLogger(log.Options{}).Named("kubernetes-api-client").With("operator.component", "KubernetesAPIClient") } var err error From 89d1fe8c63bfbe0dc784e969c8b8a6cbebabc36b Mon Sep 17 00:00:00 2001 From: Pavel Okhlopkov Date: Wed, 6 Nov 2024 17:51:08 +0300 Subject: [PATCH 8/9] remove named Signed-off-by: Pavel Okhlopkov --- client/client.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/client.go b/client/client.go index 1cea2cd..d199f51 100644 --- a/client/client.go +++ b/client/client.go @@ -39,7 +39,7 @@ const ( // TODO: refactor with methods func New(logger *log.Logger) *Client { return &Client{ - logger: logger.Named("kubernetes-api-client").With("operator.component", "KubernetesAPIClient"), + logger: logger.With("operator.component", "KubernetesAPIClient"), } } From aedb66ab41ce5ca51526e0ce13d67bcf7f05c665 Mon Sep 17 00:00:00 2001 From: Pavel Okhlopkov Date: Wed, 6 Nov 2024 18:13:17 +0300 Subject: [PATCH 9/9] add options Signed-off-by: Pavel Okhlopkov --- client/client.go | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/client/client.go b/client/client.go index d199f51..7b77637 100644 --- a/client/client.go +++ b/client/client.go @@ -36,11 +36,27 @@ const ( kubeNamespaceFilePath = "/var/run/secrets/kubernetes.io/serviceaccount/namespace" ) -// TODO: refactor with methods -func New(logger *log.Logger) *Client { - return &Client{ - logger: logger.With("operator.component", "KubernetesAPIClient"), +type Option func(client *Client) + +func WithLogger(logger *log.Logger) Option { + return func(client *Client) { + client.logger = logger.With("operator.component", "KubernetesAPIClient") + } +} + +// TODO: refactor all "with" methods +func New(opts ...Option) *Client { + c := &Client{} + + for _, fn := range opts { + fn(c) } + + if c.logger == nil { + c.logger = log.NewLogger(log.Options{}).Named("kubernetes-api-client").With("operator.component", "KubernetesAPIClient") + } + + return c } func NewFake(gvr map[schema.GroupVersionResource]string) *Client {