From 7211dd8b3beab0b2eb81e13cdecc9bde5c99c498 Mon Sep 17 00:00:00 2001 From: Lukas Metzner <lukas.metzner@hetzner-cloud.de> Date: Mon, 28 Oct 2024 11:23:18 +0100 Subject: [PATCH] refactor: migrated from go-kit/log to log/slog (#761) --- .golangci.yaml | 3 - cmd/aio/main.go | 55 +++++----- cmd/controller/main.go | 34 +++--- cmd/node/main.go | 42 +++---- go.mod | 4 +- go.sum | 18 --- internal/api/volume.go | 157 +++++++++++++-------------- internal/api/volume_test.go | 4 +- internal/app/app.go | 88 ++++++++------- internal/driver/controller.go | 15 ++- internal/driver/controller_test.go | 4 +- internal/driver/identity.go | 6 +- internal/driver/identity_test.go | 5 +- internal/driver/node.go | 6 +- internal/driver/node_test.go | 4 +- internal/driver/sanity_test.go | 17 +-- internal/metrics/metrics.go | 23 ++-- internal/testutil/testutil.go | 11 ++ internal/volumes/cryptsetup.go | 24 ++-- internal/volumes/idempotency.go | 40 ++++--- internal/volumes/idempotency_test.go | 31 +++--- internal/volumes/mount.go | 15 ++- internal/volumes/resize.go | 11 +- internal/volumes/stats.go | 7 +- test/integration/cryptsetup_test.go | 5 +- test/integration/integration_test.go | 4 +- test/integration/volumes_test.go | 8 +- 27 files changed, 306 insertions(+), 335 deletions(-) create mode 100644 internal/testutil/testutil.go diff --git a/.golangci.yaml b/.golangci.yaml index 67e3da0..2536f8f 100644 --- a/.golangci.yaml +++ b/.golangci.yaml @@ -1,8 +1,5 @@ --- linters-settings: - errcheck: - exclude-functions: - - (github.com/go-kit/log.Logger).Log misspell: locale: US gci: diff --git a/cmd/aio/main.go b/cmd/aio/main.go index 75849ff..b610195 100644 --- a/cmd/aio/main.go +++ b/cmd/aio/main.go @@ -2,13 +2,12 @@ package main import ( "fmt" + "log/slog" "os" "strconv" "strings" proto "github.com/container-storage-interface/spec/lib/go/csi" - "github.com/go-kit/log" - "github.com/go-kit/log/level" "github.com/hetznercloud/csi-driver/internal/api" "github.com/hetznercloud/csi-driver/internal/app" @@ -17,7 +16,7 @@ import ( "github.com/hetznercloud/hcloud-go/v2/hcloud/metadata" ) -var logger log.Logger +var logger *slog.Logger func main() { logger = app.CreateLogger() @@ -26,8 +25,8 @@ func main() { hcloudClient, err := app.CreateHcloudClient(m.Registry(), logger) if err != nil { - level.Error(logger).Log( - "msg", "failed to initialize hcloud client", + logger.Error( + "failed to initialize hcloud client", "err", err, ) os.Exit(1) @@ -36,41 +35,36 @@ func main() { metadataClient := metadata.NewClient(metadata.WithInstrumentation(m.Registry())) if !metadataClient.IsHcloudServer() { - level.Warn(logger).Log("msg", "unable to connect to metadata service, are you sure this is running on a Hetzner Cloud server?") + logger.Warn("unable to connect to metadata service, are you sure this is running on a Hetzner Cloud server?") } // node serverID, err := metadataClient.InstanceID() if err != nil { - level.Error(logger).Log("msg", "failed to fetch server ID from metadata service", "err", err) + logger.Error("failed to fetch server ID from metadata service", "err", err) os.Exit(1) } serverAZ, err := metadataClient.AvailabilityZone() if err != nil { - level.Error(logger).Log("msg", "failed to fetch server availability-zone from metadata service", "err", err) + logger.Error("failed to fetch server availability-zone from metadata service", "err", err) os.Exit(1) } parts := strings.Split(serverAZ, "-") if len(parts) != 2 { - level.Error(logger).Log("msg", fmt.Sprintf("unexpected server availability zone: %s", serverAZ), "err", err) + logger.Error(fmt.Sprintf("unexpected server availability zone: %s", serverAZ), "err", err) os.Exit(1) } serverLocation := parts[0] - level.Info(logger).Log("msg", "Fetched data from metadata service", "id", serverID, "location", serverLocation) + logger.Info("Fetched data from metadata service", "id", serverID, "location", serverLocation) + + volumeMountService := volumes.NewLinuxMountService(logger.With("component", "linux-mount-service")) + volumeResizeService := volumes.NewLinuxResizeService(logger.With("component", "linux-resize-service")) + volumeStatsService := volumes.NewLinuxStatsService(logger.With("component", "linux-stats-service")) - volumeMountService := volumes.NewLinuxMountService( - log.With(logger, "component", "linux-mount-service"), - ) - volumeResizeService := volumes.NewLinuxResizeService( - log.With(logger, "component", "linux-resize-service"), - ) - volumeStatsService := volumes.NewLinuxStatsService( - log.With(logger, "component", "linux-stats-service"), - ) nodeService := driver.NewNodeService( - log.With(logger, "component", "driver-node-service"), + logger.With("component", "driver-node-service"), strconv.FormatInt(serverID, 10), serverLocation, volumeMountService, @@ -80,34 +74,37 @@ func main() { // controller volumeService := volumes.NewIdempotentService( - log.With(logger, "component", "idempotent-volume-service"), + logger.With("component", "idempotent-volume-service"), api.NewVolumeService( - log.With(logger, "component", "api-volume-service"), + logger.With("component", "api-volume-service"), hcloudClient, ), ) controllerService := driver.NewControllerService( - log.With(logger, "component", "driver-controller-service"), + logger.With("component", "driver-controller-service"), volumeService, serverLocation, ) // common identityService := driver.NewIdentityService( - log.With(logger, "component", "driver-identity-service"), + logger.With("component", "driver-identity-service"), ) // common listener, err := app.CreateListener() if err != nil { - level.Error(logger).Log( - "msg", "failed to create listener", + logger.Error( + "failed to create listener", "err", err, ) os.Exit(1) } - grpcServer := app.CreateGRPCServer(logger, m.UnaryServerInterceptor()) + grpcServer := app.CreateGRPCServer( + logger.With("component", "grpc-server"), + m.UnaryServerInterceptor(), + ) // controller proto.RegisterControllerServer(grpcServer, controllerService) @@ -121,8 +118,8 @@ func main() { identityService.SetReady(true) if err := grpcServer.Serve(listener); err != nil { - level.Error(logger).Log( - "msg", "grpc server failed", + logger.Error( + "grpc server failed", "err", err, ) os.Exit(1) diff --git a/cmd/controller/main.go b/cmd/controller/main.go index 533009c..27a5c76 100644 --- a/cmd/controller/main.go +++ b/cmd/controller/main.go @@ -1,11 +1,10 @@ package main import ( + "log/slog" "os" proto "github.com/container-storage-interface/spec/lib/go/csi" - "github.com/go-kit/log" - "github.com/go-kit/log/level" "github.com/hetznercloud/csi-driver/internal/api" "github.com/hetznercloud/csi-driver/internal/app" @@ -14,7 +13,7 @@ import ( "github.com/hetznercloud/hcloud-go/v2/hcloud/metadata" ) -var logger log.Logger +var logger *slog.Logger func main() { logger = app.CreateLogger() @@ -23,8 +22,8 @@ func main() { hcloudClient, err := app.CreateHcloudClient(m.Registry(), logger) if err != nil { - level.Error(logger).Log( - "msg", "failed to initialize hcloud client", + logger.Error( + "failed to initialize hcloud client", "err", err, ) os.Exit(1) @@ -38,15 +37,15 @@ func main() { metadataClient := metadata.NewClient(metadata.WithInstrumentation(m.Registry())) if !metadataClient.IsHcloudServer() { - level.Warn(logger).Log("msg", "Unable to connect to metadata service. "+ - "In the current configuration the controller is required to run on a Hetzner Cloud server. "+ + logger.Warn("Unable to connect to metadata service. " + + "In the current configuration the controller is required to run on a Hetzner Cloud server. " + "You can set HCLOUD_VOLUME_DEFAULT_LOCATION if you want to run it somewhere else.") } server, err := app.GetServer(logger, hcloudClient, metadataClient) if err != nil { - level.Error(logger).Log( - "msg", "failed to fetch server", + logger.Error( + "failed to fetch server", "err", err, ) os.Exit(1) @@ -56,25 +55,26 @@ func main() { } volumeService := volumes.NewIdempotentService( - log.With(logger, "component", "idempotent-volume-service"), + logger.With("component", "idempotent-volume-service"), api.NewVolumeService( - log.With(logger, "component", "api-volume-service"), + logger.With("component", "api-volume-service"), hcloudClient, ), ) controllerService := driver.NewControllerService( - log.With(logger, "component", "driver-controller-service"), + logger.With("component", "driver-controller-service"), volumeService, location, ) + identityService := driver.NewIdentityService( - log.With(logger, "component", "driver-identity-service"), + logger.With("component", "driver-identity-service"), ) listener, err := app.CreateListener() if err != nil { - level.Error(logger).Log( - "msg", "failed to create listener", + logger.Error( + "failed to create listener", "err", err, ) os.Exit(1) @@ -90,8 +90,8 @@ func main() { identityService.SetReady(true) if err := grpcServer.Serve(listener); err != nil { - level.Error(logger).Log( - "msg", "grpc server failed", + logger.Error( + "grpc server failed", "err", err, ) os.Exit(1) diff --git a/cmd/node/main.go b/cmd/node/main.go index 086e718..772ec47 100644 --- a/cmd/node/main.go +++ b/cmd/node/main.go @@ -2,13 +2,12 @@ package main import ( "fmt" + "log/slog" "os" "strconv" "strings" proto "github.com/container-storage-interface/spec/lib/go/csi" - "github.com/go-kit/log" - "github.com/go-kit/log/level" "github.com/hetznercloud/csi-driver/internal/app" "github.com/hetznercloud/csi-driver/internal/driver" @@ -16,7 +15,7 @@ import ( "github.com/hetznercloud/hcloud-go/v2/hcloud/metadata" ) -var logger log.Logger +var logger *slog.Logger func main() { logger = app.CreateLogger() @@ -26,43 +25,36 @@ func main() { metadataClient := metadata.NewClient(metadata.WithInstrumentation(m.Registry())) if !metadataClient.IsHcloudServer() { - level.Warn(logger).Log("msg", "unable to connect to metadata service, are you sure this is running on a Hetzner Cloud server?") + logger.Warn("unable to connect to metadata service, are you sure this is running on a Hetzner Cloud server?") } serverID, err := metadataClient.InstanceID() if err != nil { - level.Error(logger).Log("msg", "failed to fetch server ID from metadata service", "err", err) + logger.Error("failed to fetch server ID from metadata service", "err", err) os.Exit(1) } serverAZ, err := metadataClient.AvailabilityZone() if err != nil { - level.Error(logger).Log("msg", "failed to fetch server availability-zone from metadata service", "err", err) + logger.Error("failed to fetch server availability-zone from metadata service", "err", err) os.Exit(1) } parts := strings.Split(serverAZ, "-") if len(parts) != 2 { - level.Error(logger).Log("msg", fmt.Sprintf("unexpected server availability zone: %s", serverAZ), "err", err) + logger.Error(fmt.Sprintf("unexpected server availability zone: %s", serverAZ), "err", err) os.Exit(1) } serverLocation := parts[0] - level.Info(logger).Log("msg", "Fetched data from metadata service", "id", serverID, "location", serverLocation) + logger.Info("Fetched data from metadata service", "id", serverID, "location", serverLocation) + + volumeMountService := volumes.NewLinuxMountService(logger.With("component", "linux-mount-service")) + volumeResizeService := volumes.NewLinuxResizeService(logger.With("component", "linux-resize-service")) + volumeStatsService := volumes.NewLinuxStatsService(logger.With("component", "linux-stats-service")) + identityService := driver.NewIdentityService(logger.With("component", "driver-identity-service")) - volumeMountService := volumes.NewLinuxMountService( - log.With(logger, "component", "linux-mount-service"), - ) - volumeResizeService := volumes.NewLinuxResizeService( - log.With(logger, "component", "linux-resize-service"), - ) - volumeStatsService := volumes.NewLinuxStatsService( - log.With(logger, "component", "linux-stats-service"), - ) - identityService := driver.NewIdentityService( - log.With(logger, "component", "driver-identity-service"), - ) nodeService := driver.NewNodeService( - log.With(logger, "component", "driver-node-service"), + logger.With("component", "driver-node-service"), strconv.FormatInt(serverID, 10), serverLocation, volumeMountService, @@ -72,8 +64,8 @@ func main() { listener, err := app.CreateListener() if err != nil { - level.Error(logger).Log( - "msg", "failed to create listener", + logger.Error( + "failed to create listener", "err", err, ) os.Exit(1) @@ -89,8 +81,8 @@ func main() { identityService.SetReady(true) if err := grpcServer.Serve(listener); err != nil { - level.Error(logger).Log( - "msg", "grpc server failed", + logger.Error( + "grpc server failed", "err", err, ) os.Exit(1) diff --git a/go.mod b/go.mod index a2488f6..050ca10 100644 --- a/go.mod +++ b/go.mod @@ -6,11 +6,11 @@ toolchain go1.23.2 require ( github.com/container-storage-interface/spec v1.10.0 - github.com/go-kit/log v0.2.1 github.com/golang/protobuf v1.5.4 github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1 github.com/hetznercloud/hcloud-go/v2 v2.14.0 github.com/kubernetes-csi/csi-test/v5 v5.3.1 + github.com/moby/buildkit v0.16.0 github.com/prometheus/client_golang v1.20.5 github.com/stretchr/testify v1.9.0 golang.org/x/sys v0.26.0 @@ -24,7 +24,6 @@ require ( github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/coreos/go-systemd/v22 v22.5.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect - github.com/go-logfmt/logfmt v0.5.1 // indirect github.com/go-logr/logr v1.4.2 // indirect github.com/go-task/slim-sprig/v3 v3.0.0 // indirect github.com/godbus/dbus/v5 v5.1.0 // indirect @@ -34,7 +33,6 @@ require ( github.com/google/uuid v1.6.0 // indirect github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0 // indirect github.com/klauspost/compress v1.17.9 // indirect - github.com/moby/buildkit v0.16.0 // indirect github.com/moby/sys/mountinfo v0.7.2 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/onsi/ginkgo/v2 v2.19.0 // indirect diff --git a/go.sum b/go.sum index 3c61788..8873d9a 100644 --- a/go.sum +++ b/go.sum @@ -10,10 +10,6 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= -github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= -github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA= -github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= @@ -35,11 +31,8 @@ github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1 h1:qnpS github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1/go.mod h1:lXGCsh6c22WGtjr+qGHj1otzZpV/1kwTMAqkwZsnWRU= github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0 h1:pRhl55Yx1eC7BZ1N+BBWwnKaMyD8uC+34TLdndZMAKk= github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0/go.mod h1:XKMd7iuf/RGPSMJ/U4HP0zS2Z9Fh8Ps9a+6X26m/tmI= -github.com/hetznercloud/hcloud-go/v2 v2.13.1 h1:jq0GP4QaYE5d8xR/Zw17s9qoaESRJMXfGmtD1a/qckQ= -github.com/hetznercloud/hcloud-go/v2 v2.13.1/go.mod h1:dhix40Br3fDiBhwaSG/zgaYOFFddpfBm/6R1Zz0IiF0= github.com/hetznercloud/hcloud-go/v2 v2.14.0 h1:WQW72DuOGqT486F0eNp92lDH5cwDTmyn9Mhin93m1To= github.com/hetznercloud/hcloud-go/v2 v2.14.0/go.mod h1:h8sHav+27Xa+48cVMAvAUMELov5h298Ilg2vflyTHgg= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= @@ -52,8 +45,6 @@ github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0 github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/moby/buildkit v0.16.0 h1:wOVBj1o5YNVad/txPQNXUXdelm7Hs/i0PUFjzbK0VKE= github.com/moby/buildkit v0.16.0/go.mod h1:Xqx/5GlrqE1yIRORk0NSCVDFpQAU1WjlT6KHYZdisIQ= -github.com/moby/sys/mountinfo v0.7.1 h1:/tTvQaSJRr2FshkhXiIpux6fQ2Zvc4j7tAhMTStAG2g= -github.com/moby/sys/mountinfo v0.7.1/go.mod h1:IJb6JQeOklcdMU9F5xQ8ZALD+CUr5VlGpwtX+VE0rpI= github.com/moby/sys/mountinfo v0.7.2 h1:1shs6aH5s4o5H2zQLn796ADW1wMrIwHsyJ2v9KouLrg= github.com/moby/sys/mountinfo v0.7.2/go.mod h1:1YOa8w8Ih7uW0wALDUgT1dTTSBrZ+HiBLGws92L2RU4= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= @@ -64,8 +55,6 @@ github.com/onsi/gomega v1.33.1 h1:dsYjIxxSR755MDmKVsaFQTE22ChNBcuuTWgkUDSubOk= github.com/onsi/gomega v1.33.1/go.mod h1:U4R44UsT+9eLIaYRB2a5qajjtQYn0hauxvRm16AVYg0= github.com/opencontainers/runc v1.1.13 h1:98S2srgG9vw0zWcDpFMn5TRrh8kLxa/5OFUstuUhmRs= github.com/opencontainers/runc v1.1.13/go.mod h1:R016aXacfp/gwQBYw2FDGa9m+n6atbLWrYY8hNMT/sA= -github.com/opencontainers/runtime-spec v1.0.3-0.20220909204839-494a5a6aca78 h1:R5M2qXZiK/mWPMT4VldCOiSL9HIAMuxQZWdG0CSM5+4= -github.com/opencontainers/runtime-spec v1.0.3-0.20220909204839-494a5a6aca78/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-spec v1.2.0 h1:z97+pHb3uELt/yiAWD691HNHQIF07bE7dzrbT927iTk= github.com/opencontainers/runtime-spec v1.2.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -98,8 +87,6 @@ golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE= -golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg= golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4= golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -109,15 +96,12 @@ golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo= golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc= -golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM= golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -144,8 +128,6 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= -k8s.io/mount-utils v0.31.1 h1:f8UrH9kRynljmdNGM6BaCvFUON5ZPKDgE+ltmYqI4wA= -k8s.io/mount-utils v0.31.1/go.mod h1:HV/VYBUGqYUj4vt82YltzpWvgv8FPg0G9ItyInT3NPU= k8s.io/mount-utils v0.31.2 h1:Q0ygX92Lj9d1wcObAzj+JZ4oE7CNKZrqSOn1XcIS+y4= k8s.io/mount-utils v0.31.2/go.mod h1:HV/VYBUGqYUj4vt82YltzpWvgv8FPg0G9ItyInT3NPU= k8s.io/utils v0.0.0-20240921022957-49e7df575cb6 h1:MDF6h2H/h4tbzmtIKTuctcwZmY0tY9mD9fNT47QO6HI= diff --git a/internal/api/volume.go b/internal/api/volume.go index 8357bf4..128cecf 100644 --- a/internal/api/volume.go +++ b/internal/api/volume.go @@ -2,22 +2,20 @@ package api import ( "context" + "log/slog" "time" - "github.com/go-kit/log" - "github.com/go-kit/log/level" - "github.com/hetznercloud/csi-driver/internal/csi" "github.com/hetznercloud/csi-driver/internal/volumes" "github.com/hetznercloud/hcloud-go/v2/hcloud" ) type VolumeService struct { - logger log.Logger + logger *slog.Logger client *hcloud.Client } -func NewVolumeService(logger log.Logger, client *hcloud.Client) *VolumeService { +func NewVolumeService(logger *slog.Logger, client *hcloud.Client) *VolumeService { return &VolumeService{ logger: logger, client: client, @@ -27,8 +25,8 @@ func NewVolumeService(logger log.Logger, client *hcloud.Client) *VolumeService { func (s *VolumeService) All(ctx context.Context) ([]*csi.Volume, error) { hcloudVolumes, err := s.client.Volume.All(ctx) if err != nil { - level.Info(s.logger).Log( - "msg", "failed to get volumes", + s.logger.Info( + "failed to get volumes", "err", err, ) return nil, err @@ -42,8 +40,8 @@ func (s *VolumeService) All(ctx context.Context) ([]*csi.Volume, error) { } func (s *VolumeService) Create(ctx context.Context, opts volumes.CreateOpts) (*csi.Volume, error) { - level.Info(s.logger).Log( - "msg", "creating volume", + s.logger.Info( + "creating volume", "volume-name", opts.Name, "volume-size", opts.MinSize, "volume-location", opts.Location, @@ -55,8 +53,8 @@ func (s *VolumeService) Create(ctx context.Context, opts volumes.CreateOpts) (*c Location: &hcloud.Location{Name: opts.Location}, }) if err != nil { - level.Info(s.logger).Log( - "msg", "failed to create volume", + s.logger.Info( + "failed to create volume", "volume-name", opts.Name, "err", err, ) @@ -67,8 +65,8 @@ func (s *VolumeService) Create(ctx context.Context, opts volumes.CreateOpts) (*c } if err := s.client.Action.WaitFor(ctx, result.Action); err != nil { - level.Info(s.logger).Log( - "msg", "failed to create volume", + s.logger.Info( + "failed to create volume", "volume-name", opts.Name, "err", err, ) @@ -82,16 +80,16 @@ func (s *VolumeService) Create(ctx context.Context, opts volumes.CreateOpts) (*c func (s *VolumeService) GetByID(ctx context.Context, id int64) (*csi.Volume, error) { hcloudVolume, _, err := s.client.Volume.GetByID(ctx, id) if err != nil { - level.Info(s.logger).Log( - "msg", "failed to get volume", + s.logger.Info( + "failed to get volume", "volume-id", id, "err", err, ) return nil, err } if hcloudVolume == nil { - level.Info(s.logger).Log( - "msg", "volume not found", + s.logger.Info( + "volume not found", "volume-id", id, ) return nil, volumes.ErrVolumeNotFound @@ -102,16 +100,16 @@ func (s *VolumeService) GetByID(ctx context.Context, id int64) (*csi.Volume, err func (s *VolumeService) GetByName(ctx context.Context, name string) (*csi.Volume, error) { hcloudVolume, _, err := s.client.Volume.GetByName(ctx, name) if err != nil { - level.Info(s.logger).Log( - "msg", "failed to get volume", + s.logger.Info( + "failed to get volume", "volume-name", name, "err", err, ) return nil, err } if hcloudVolume == nil { - level.Info(s.logger).Log( - "msg", "volume not found", + s.logger.Info( + "volume not found", "volume-name", name, ) return nil, volumes.ErrVolumeNotFound @@ -120,30 +118,30 @@ func (s *VolumeService) GetByName(ctx context.Context, name string) (*csi.Volume } func (s *VolumeService) Delete(ctx context.Context, volume *csi.Volume) error { - level.Info(s.logger).Log( - "msg", "deleting volume", + s.logger.Info( + "deleting volume", "volume-id", volume.ID, ) hcloudVolume, _, err := s.client.Volume.GetByID(ctx, volume.ID) if err != nil { - level.Info(s.logger).Log( - "msg", "failed to get volume", + s.logger.Info( + "failed to get volume", "volume-id", volume.ID, "err", err, ) return err } if hcloudVolume == nil { - level.Info(s.logger).Log( - "msg", "volume to delete not found", + s.logger.Info( + "volume to delete not found", "volume-id", volume.ID, ) return volumes.ErrVolumeNotFound } if hcloudVolume.Server != nil { - level.Info(s.logger).Log( - "msg", "volume is attached to a server", + s.logger.Info( + "volume is attached to a server", "volume-id", volume.ID, "server-id", hcloudVolume.Server.ID, ) @@ -151,8 +149,8 @@ func (s *VolumeService) Delete(ctx context.Context, volume *csi.Volume) error { } if _, err := s.client.Volume.Delete(ctx, hcloudVolume); err != nil { - level.Info(s.logger).Log( - "msg", "failed to delete volume", + s.logger.Info( + "failed to delete volume", "volume-id", volume.ID, "err", err, ) @@ -161,8 +159,8 @@ func (s *VolumeService) Delete(ctx context.Context, volume *csi.Volume) error { } return err } - level.Info(s.logger).Log( - "msg", "volume deleted", + s.logger.Info( + "volume deleted", "volume-id", volume.ID, ) @@ -170,24 +168,24 @@ func (s *VolumeService) Delete(ctx context.Context, volume *csi.Volume) error { } func (s *VolumeService) Attach(ctx context.Context, volume *csi.Volume, server *csi.Server) error { - level.Info(s.logger).Log( - "msg", "attaching volume", + s.logger.Info( + "attaching volume", "volume-id", volume.ID, "server-id", server.ID, ) hcloudVolume, _, err := s.client.Volume.GetByID(ctx, volume.ID) if err != nil { - level.Info(s.logger).Log( - "msg", "failed to get volume", + s.logger.Info( + "failed to get volume", "volume-id", volume.ID, "err", err, ) return err } if hcloudVolume == nil { - level.Info(s.logger).Log( - "msg", "volume to attach not found", + s.logger.Info( + "volume to attach not found", "volume-id", volume.ID, ) return volumes.ErrVolumeNotFound @@ -195,8 +193,8 @@ func (s *VolumeService) Attach(ctx context.Context, volume *csi.Volume, server * hcloudServer, _, err := s.client.Server.GetByID(ctx, server.ID) if err != nil { - level.Info(s.logger).Log( - "msg", "failed to get server", + s.logger.Info( + "failed to get server", "volume-id", volume.ID, "server-id", server.ID, "err", err, @@ -204,8 +202,8 @@ func (s *VolumeService) Attach(ctx context.Context, volume *csi.Volume, server * return err } if hcloudServer == nil { - level.Info(s.logger).Log( - "msg", "server to attach volume to not found", + s.logger.Info( + "server to attach volume to not found", "volume-id", volume.ID, "server-id", server.ID, ) @@ -214,15 +212,15 @@ func (s *VolumeService) Attach(ctx context.Context, volume *csi.Volume, server * if hcloudVolume.Server != nil { if hcloudVolume.Server.ID == hcloudServer.ID { - level.Info(s.logger).Log( - "msg", "volume is already attached to this server", + s.logger.Info( + "volume is already attached to this server", "volume-id", volume.ID, "server-id", server.ID, ) return nil } - level.Info(s.logger).Log( - "msg", "volume is already attached to another server", + s.logger.Info( + "volume is already attached to another server", "volume-id", volume.ID, "server-id", hcloudVolume.Server.ID, ) @@ -231,8 +229,8 @@ func (s *VolumeService) Attach(ctx context.Context, volume *csi.Volume, server * action, _, err := s.client.Volume.Attach(ctx, hcloudVolume, hcloudServer) if err != nil { - level.Info(s.logger).Log( - "msg", "failed to attach volume", + s.logger.Info( + "failed to attach volume", "volume-id", volume.ID, "server-id", server.ID, "err", err, @@ -250,8 +248,8 @@ func (s *VolumeService) Attach(ctx context.Context, volume *csi.Volume, server * } time.Sleep(3 * time.Second) // We know that the Attach action will take some time, so we wait 3 seconds before starting polling the action status. Within these 3 seconds the volume attach action may be already finished. if err := s.client.Action.WaitFor(ctx, action); err != nil { - level.Info(s.logger).Log( - "msg", "failed to attach volume", + s.logger.Info( + "failed to attach volume", "volume-id", volume.ID, "server-id", server.ID, "err", err, @@ -263,14 +261,14 @@ func (s *VolumeService) Attach(ctx context.Context, volume *csi.Volume, server * func (s *VolumeService) Detach(ctx context.Context, volume *csi.Volume, server *csi.Server) error { if server != nil { - level.Info(s.logger).Log( - "msg", "detaching volume from server", + s.logger.Info( + "detaching volume from server", "volume-id", volume.ID, "server-id", server.ID, ) } else { - level.Info(s.logger).Log( - "msg", "detaching volume from any server", + s.logger.Info( + "detaching volume from any server", "volume-id", volume.ID, ) } @@ -278,31 +276,31 @@ func (s *VolumeService) Detach(ctx context.Context, volume *csi.Volume, server * hcloudVolume, _, err := s.client.Volume.GetByID(ctx, volume.ID) if err != nil { if hcloud.IsError(err, hcloud.ErrorCodeNotFound) { - level.Info(s.logger).Log( - "msg", "volume to detach not found", + s.logger.Info( + "volume to detach not found", "volume-id", volume.ID, "err", err, ) return volumes.ErrVolumeNotFound } - level.Info(s.logger).Log( - "msg", "failed to get volume to detach", + s.logger.Info( + "failed to get volume to detach", "volume-id", volume.ID, "err", err, ) return err } if hcloudVolume == nil { - level.Info(s.logger).Log( - "msg", "volume to detach not found", + s.logger.Info( + "volume to detach not found", "volume-id", volume.ID, "err", err, ) return volumes.ErrVolumeNotFound } if hcloudVolume.Server == nil { - level.Info(s.logger).Log( - "msg", "volume not attached to a server", + s.logger.Info( + "volume not attached to a server", "volume-id", volume.ID, ) return volumes.ErrNotAttached @@ -311,8 +309,8 @@ func (s *VolumeService) Detach(ctx context.Context, volume *csi.Volume, server * // If a server is provided, only detach if the volume is actually attached // to that server. if server != nil && hcloudVolume.Server.ID != server.ID { - level.Info(s.logger).Log( - "msg", "volume not attached to provided server", + s.logger.Info( + "volume not attached to provided server", "volume-id", volume.ID, "detach-from-server-id", server.ID, "attached-to-server-id", hcloudVolume.Server.ID, @@ -322,8 +320,8 @@ func (s *VolumeService) Detach(ctx context.Context, volume *csi.Volume, server * action, _, err := s.client.Volume.Detach(ctx, hcloudVolume) if err != nil { - level.Info(s.logger).Log( - "msg", "failed to detach volume", + s.logger.Info( + "failed to detach volume", "volume-id", volume.ID, "err", err, ) @@ -334,8 +332,8 @@ func (s *VolumeService) Detach(ctx context.Context, volume *csi.Volume, server * } if err := s.client.Action.WaitFor(ctx, action); err != nil { - level.Info(s.logger).Log( - "msg", "failed to detach volume", + s.logger.Info( + "failed to detach volume", "volume-id", volume.ID, "err", err, ) @@ -345,40 +343,37 @@ func (s *VolumeService) Detach(ctx context.Context, volume *csi.Volume, server * } func (s *VolumeService) Resize(ctx context.Context, volume *csi.Volume, size int) error { - logger := log.With(s.logger, - "volume-id", volume.ID, - "requested-size", size, - ) + logger := s.logger.With("volume-id", volume.ID, "requested-size", size) - level.Info(logger).Log( - "msg", "resize volume", + logger.Info( + "resize volume", ) hcloudVolume, _, err := s.client.Volume.GetByID(ctx, volume.ID) if err != nil { - level.Info(logger).Log("msg", "failed to get volume", "err", err) + logger.Info("failed to get volume", "err", err) return err } if hcloudVolume == nil { - level.Info(logger).Log("msg", "volume to resize not found") + logger.Info("volume to resize not found") return volumes.ErrVolumeNotFound } - logger = log.With(logger, "current-size", hcloudVolume.Size) + logger = logger.With("current-size", hcloudVolume.Size) if hcloudVolume.Size >= size { - level.Info(logger).Log("msg", "volume size is already larger or equal than the requested size") + logger.Info("volume size is already larger or equal than the requested size") return volumes.ErrVolumeSizeAlreadyReached } action, _, err := s.client.Volume.Resize(ctx, hcloudVolume, size) if err != nil { - level.Info(logger).Log("msg", "failed to resize volume", "err", err) + logger.Info("failed to resize volume", "err", err) return err } if err = s.client.Action.WaitFor(ctx, action); err != nil { - level.Info(logger).Log("msg", "failed to resize volume", "err", err) + logger.Info("failed to resize volume", "err", err) return err } return nil diff --git a/internal/api/volume_test.go b/internal/api/volume_test.go index bc0e44c..28c5521 100644 --- a/internal/api/volume_test.go +++ b/internal/api/volume_test.go @@ -5,10 +5,10 @@ import ( "net/http/httptest" "testing" - "github.com/go-kit/log" "github.com/stretchr/testify/assert" "github.com/hetznercloud/csi-driver/internal/csi" + "github.com/hetznercloud/csi-driver/internal/testutil" "github.com/hetznercloud/csi-driver/internal/volumes" "github.com/hetznercloud/hcloud-go/v2/hcloud" "github.com/hetznercloud/hcloud-go/v2/hcloud/exp/mockutil" @@ -28,7 +28,7 @@ func makeTestVolumeService(t *testing.T, requests []mockutil.Request) (*VolumeSe hcloud.WithPollOpts(hcloud.PollOpts{BackoffFunc: hcloud.ConstantBackoff(0)}), ) - volumeService := NewVolumeService(log.NewNopLogger(), testClient) + volumeService := NewVolumeService(testutil.NewNopLogger(), testClient) return volumeService, testServer.Close } diff --git a/internal/app/app.go b/internal/app/app.go index c4d4354..7118240 100644 --- a/internal/app/app.go +++ b/internal/app/app.go @@ -4,14 +4,13 @@ import ( "context" "errors" "fmt" + "log/slog" "net" "os" "strconv" "strings" "time" - "github.com/go-kit/log" - "github.com/go-kit/log/level" "github.com/prometheus/client_golang/prometheus" "google.golang.org/grpc" @@ -22,26 +21,32 @@ import ( "github.com/hetznercloud/hcloud-go/v2/hcloud/metadata" ) -func parseLogLevel(lvl string) level.Option { - switch lvl { +func parseLogLevel(lvl string) slog.Level { + switch strings.ToLower(lvl) { case "debug": - return level.AllowDebug() + return slog.LevelDebug case "info": - return level.AllowInfo() + return slog.LevelInfo case "warn": - return level.AllowWarn() + return slog.LevelWarn case "error": - return level.AllowError() + return slog.LevelError default: - return level.AllowInfo() + return slog.LevelInfo } } // CreateLogger prepares a logger according to LOG_LEVEL environment variable. -func CreateLogger() log.Logger { - logger := log.NewLogfmtLogger(log.NewSyncWriter(os.Stdout)) - logger = level.NewFilter(logger, parseLogLevel(os.Getenv("LOG_LEVEL"))) - return log.With(logger, "ts", log.DefaultTimestampUTC) +func CreateLogger() *slog.Logger { + logLevel := parseLogLevel(os.Getenv("LOG_LEVEL")) + options := slog.HandlerOptions{ + AddSource: true, + Level: logLevel, + } + th := slog.NewTextHandler(os.Stdout, &options) + logger := slog.New(th) + + return logger } // CreateListener creates and binds the unix socket in location specified by the CSI_ENDPOINT environment variable. @@ -64,7 +69,7 @@ func CreateListener() (net.Listener, error) { // CreateMetrics prepares a metrics client pointing at METRICS_ENDPOINT environment variable (will fallback) // It will start the metrics HTTP listener depending on the ENABLE_METRICS environment variable. -func CreateMetrics(logger log.Logger) *metrics.Metrics { +func CreateMetrics(logger *slog.Logger) *metrics.Metrics { metricsEndpoint := os.Getenv("METRICS_ENDPOINT") if metricsEndpoint == "" { // Use a default endpoint @@ -72,7 +77,7 @@ func CreateMetrics(logger log.Logger) *metrics.Metrics { } m := metrics.New( - log.With(logger, "component", "metrics-service"), + logger, metricsEndpoint, ) @@ -81,15 +86,15 @@ func CreateMetrics(logger log.Logger) *metrics.Metrics { var err error enableMetrics, err = strconv.ParseBool(enableMetricsEnv) if err != nil { - level.Error(logger).Log( - "msg", "ENABLE_METRICS can only contain a boolean value, true or false", + logger.Error( + "ENABLE_METRICS can only contain a boolean value, true or false", "err", err, ) os.Exit(1) } } else { - level.Warn(logger).Log( - "msg", "the environment variable ENABLE_METRICS should be set to true, you can disable metrics by setting this env to false. Not specifying the ENV is deprecated. With v1.9.0 we will change the default to false and in v1.10.0 we will fail on start when the ENABLE_METRICS is not specified.", + logger.Warn( + "the environment variable ENABLE_METRICS should be set to true, you can disable metrics by setting this env to false. Not specifying the ENV is deprecated. With v1.9.0 we will change the default to false and in v1.10.0 we will fail on start when the ENABLE_METRICS is not specified.", ) } if enableMetrics { @@ -100,7 +105,7 @@ func CreateMetrics(logger log.Logger) *metrics.Metrics { } // CreateHcloudClient creates a hcloud.Client using various environment variables to guide configuration -func CreateHcloudClient(metricsRegistry *prometheus.Registry, logger log.Logger) (*hcloud.Client, error) { +func CreateHcloudClient(metricsRegistry *prometheus.Registry, logger *slog.Logger) (*hcloud.Client, error) { // apiToken can be set via HCLOUD_TOKEN (preferred) or HCLOUD_TOKEN_FILE apiToken, err := envutil.LookupEnvWithFile("HCLOUD_TOKEN") if err != nil { @@ -111,7 +116,7 @@ func CreateHcloudClient(metricsRegistry *prometheus.Registry, logger log.Logger) } if len(apiToken) != 64 { - level.Warn(logger).Log("msg", fmt.Sprintf("unrecognized token format, expected 64 characters, got %d, proceeding anyway", len(apiToken))) + logger.Warn(fmt.Sprintf("unrecognized token format, expected 64 characters, got %d, proceeding anyway", len(apiToken))) } opts := []hcloud.ClientOption{ @@ -134,8 +139,8 @@ func CreateHcloudClient(metricsRegistry *prometheus.Registry, logger log.Logger) if err != nil || tmp < 1 { return nil, errors.New("entered polling interval configuration is not a integer that is higher than 1") } - level.Info(logger).Log( - "msg", "got custom configuration for polling interval", + logger.Info( + "got custom configuration for polling interval", "interval", customPollingInterval, ) @@ -154,12 +159,12 @@ func CreateHcloudClient(metricsRegistry *prometheus.Registry, logger log.Logger) } // GetServer retrieves the hcloud server the application is running on. -func GetServer(logger log.Logger, hcloudClient *hcloud.Client, metadataClient *metadata.Client) (*hcloud.Server, error) { +func GetServer(logger *slog.Logger, hcloudClient *hcloud.Client, metadataClient *metadata.Client) (*hcloud.Server, error) { hcloudServerID, err := getServerID(logger, hcloudClient, metadataClient) if err != nil { return nil, err } - level.Debug(logger).Log("msg", "fetching server") + logger.Debug("fetching server") server, _, err := hcloudClient.Server.GetByID(context.Background(), hcloudServerID) if err != nil { return nil, err @@ -172,19 +177,19 @@ func GetServer(logger log.Logger, hcloudClient *hcloud.Client, metadataClient *m return nil, errors.New("could not determine server") } - level.Info(logger).Log("msg", "fetched server", "server-name", server.Name) + logger.Info("fetched server", "server-name", server.Name) return server, nil } -func getServerID(logger log.Logger, hcloudClient *hcloud.Client, metadataClient *metadata.Client) (int64, error) { +func getServerID(logger *slog.Logger, hcloudClient *hcloud.Client, metadataClient *metadata.Client) (int64, error) { if s := os.Getenv("HCLOUD_SERVER_ID"); s != "" { id, err := strconv.ParseInt(s, 10, 64) if err != nil { return 0, fmt.Errorf("invalid server id in HCLOUD_SERVER_ID env var: %s", err) } - level.Debug(logger).Log( - "msg", "using server id from HCLOUD_SERVER_ID env var", + logger.Debug( + "using server id from HCLOUD_SERVER_ID env var", "server-id", id, ) return id, nil @@ -196,20 +201,20 @@ func getServerID(logger log.Logger, hcloudClient *hcloud.Client, metadataClient return 0, fmt.Errorf("error while getting server through node name: %s", err) } if server != nil { - level.Debug(logger).Log( - "msg", "using server name from KUBE_NODE_NAME env var", + logger.Debug( + "using server name from KUBE_NODE_NAME env var", "server-id", server.ID, ) return server.ID, nil } - level.Debug(logger).Log( - "msg", "server not found by name, fallback to metadata service", + logger.Debug( + "server not found by name, fallback to metadata service", "err", err, ) } - level.Debug(logger).Log( - "msg", "getting instance id from metadata service", + logger.Debug( + "getting instance id from metadata service", ) id, err := metadataClient.InstanceID() if err != nil { @@ -218,26 +223,25 @@ func getServerID(logger log.Logger, hcloudClient *hcloud.Client, metadataClient return id, nil } -func CreateGRPCServer(logger log.Logger, metricsInterceptor grpc.UnaryServerInterceptor) *grpc.Server { - logger = log.With(logger, "component", "grpc-server") +func CreateGRPCServer(logger *slog.Logger, metricsInterceptor grpc.UnaryServerInterceptor) *grpc.Server { requestLogger := func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) { isProbe := info.FullMethod == "/csi.v1.Identity/Probe" if !isProbe { - level.Debug(logger).Log( - "msg", "handling request", + logger.Debug( + "handling request", "method", info.FullMethod, "req", req, ) } resp, err := handler(ctx, req) if err != nil { - level.Error(logger).Log( - "msg", "handler failed", + logger.Error( + "handler failed", "err", err, ) } else if !isProbe { - level.Debug(logger).Log("msg", "finished handling request", "method", info.FullMethod, "err", err) + logger.Debug("finished handling request", "method", info.FullMethod, "err", err) } return resp, err } diff --git a/internal/driver/controller.go b/internal/driver/controller.go index c1df8d5..6396729 100644 --- a/internal/driver/controller.go +++ b/internal/driver/controller.go @@ -4,11 +4,10 @@ import ( "context" "errors" "fmt" + "log/slog" "strconv" proto "github.com/container-storage-interface/spec/lib/go/csi" - "github.com/go-kit/log" - "github.com/go-kit/log/level" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" @@ -19,13 +18,13 @@ import ( type ControllerService struct { proto.UnimplementedControllerServer - logger log.Logger + logger *slog.Logger volumeService volumes.Service location string } func NewControllerService( - logger log.Logger, + logger *slog.Logger, volumeService volumes.Service, location string, ) *ControllerService { @@ -72,8 +71,8 @@ func (s *ControllerService) CreateVolume(ctx context.Context, req *proto.CreateV Location: location, }) if err != nil { - level.Error(s.logger).Log( - "msg", "failed to create volume", + s.logger.Error( + "failed to create volume", "err", err, ) code := codes.Internal @@ -83,8 +82,8 @@ func (s *ControllerService) CreateVolume(ctx context.Context, req *proto.CreateV } return nil, status.Error(code, fmt.Sprintf("failed to create volume: %s", err)) } - level.Info(s.logger).Log( - "msg", "created volume", + s.logger.Info( + "created volume", "volume-id", volume.ID, "volume-name", volume.Name, ) diff --git a/internal/driver/controller_test.go b/internal/driver/controller_test.go index 46e3452..8b78171 100644 --- a/internal/driver/controller_test.go +++ b/internal/driver/controller_test.go @@ -6,12 +6,12 @@ import ( "testing" proto "github.com/container-storage-interface/spec/lib/go/csi" - "github.com/go-kit/log" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" "github.com/hetznercloud/csi-driver/internal/csi" "github.com/hetznercloud/csi-driver/internal/mock" + "github.com/hetznercloud/csi-driver/internal/testutil" "github.com/hetznercloud/csi-driver/internal/volumes" ) @@ -24,7 +24,7 @@ type controllerServiceTestEnv struct { } func newControllerServiceTestEnv() *controllerServiceTestEnv { - logger := log.NewNopLogger() + logger := testutil.NewNopLogger() volumeService := &mock.VolumeService{} return &controllerServiceTestEnv{ diff --git a/internal/driver/identity.go b/internal/driver/identity.go index fb36f8f..332e20e 100644 --- a/internal/driver/identity.go +++ b/internal/driver/identity.go @@ -2,23 +2,23 @@ package driver import ( "context" + "log/slog" "sync" proto "github.com/container-storage-interface/spec/lib/go/csi" - "github.com/go-kit/log" "github.com/golang/protobuf/ptypes/wrappers" ) type IdentityService struct { proto.UnimplementedIdentityServer - logger log.Logger + logger *slog.Logger readyMu sync.RWMutex ready bool } -func NewIdentityService(logger log.Logger) *IdentityService { +func NewIdentityService(logger *slog.Logger) *IdentityService { return &IdentityService{ logger: logger, } diff --git a/internal/driver/identity_test.go b/internal/driver/identity_test.go index 6cea6f7..b7ec7a6 100644 --- a/internal/driver/identity_test.go +++ b/internal/driver/identity_test.go @@ -5,7 +5,8 @@ import ( "testing" proto "github.com/container-storage-interface/spec/lib/go/csi" - "github.com/go-kit/log" + + "github.com/hetznercloud/csi-driver/internal/testutil" ) var _ proto.IdentityServer = (*IdentityService)(nil) @@ -19,7 +20,7 @@ func newIdentityServerTestEnv() identityServiceTestEnv { return identityServiceTestEnv{ ctx: context.Background(), service: NewIdentityService( - log.NewNopLogger(), + testutil.NewNopLogger(), ), } } diff --git a/internal/driver/node.go b/internal/driver/node.go index 2510842..5b084ea 100644 --- a/internal/driver/node.go +++ b/internal/driver/node.go @@ -3,9 +3,9 @@ package driver import ( "context" "fmt" + "log/slog" proto "github.com/container-storage-interface/spec/lib/go/csi" - "github.com/go-kit/log" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" @@ -15,7 +15,7 @@ import ( type NodeService struct { proto.UnimplementedNodeServer - logger log.Logger + logger *slog.Logger serverID string serverLocation string volumeMountService volumes.MountService @@ -24,7 +24,7 @@ type NodeService struct { } func NewNodeService( - logger log.Logger, + logger *slog.Logger, serverID string, serverLocation string, volumeMountService volumes.MountService, diff --git a/internal/driver/node_test.go b/internal/driver/node_test.go index 6336be2..624c2af 100644 --- a/internal/driver/node_test.go +++ b/internal/driver/node_test.go @@ -6,11 +6,11 @@ import ( "testing" proto "github.com/container-storage-interface/spec/lib/go/csi" - "github.com/go-kit/log" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" "github.com/hetznercloud/csi-driver/internal/mock" + "github.com/hetznercloud/csi-driver/internal/testutil" "github.com/hetznercloud/csi-driver/internal/volumes" ) @@ -32,7 +32,7 @@ func newNodeServerTestEnv() nodeServiceTestEnv { return nodeServiceTestEnv{ ctx: context.Background(), service: NewNodeService( - log.NewNopLogger(), + testutil.NewNopLogger(), "1", "loc", volumeMountService, diff --git a/internal/driver/sanity_test.go b/internal/driver/sanity_test.go index fb62633..4309430 100644 --- a/internal/driver/sanity_test.go +++ b/internal/driver/sanity_test.go @@ -5,13 +5,13 @@ import ( "context" "errors" "fmt" + "log/slog" "net" "os" "sync" "testing" proto "github.com/container-storage-interface/spec/lib/go/csi" - "github.com/go-kit/log" "github.com/kubernetes-csi/csi-test/v5/pkg/sanity" "google.golang.org/grpc" @@ -31,26 +31,29 @@ func TestSanity(t *testing.T) { } defer os.Remove(endpoint) - logger := log.NewLogfmtLogger(log.NewSyncWriter(os.Stdout)) - logger = log.With(logger, "ts", log.DefaultTimestampUTC) + th := slog.NewTextHandler(os.Stdout, nil) + logger := slog.New(th) volumeService := volumes.NewIdempotentService( - log.With(logger, "component", "idempotent-volume-service"), + logger.With("component", "idempotent-volume-service"), &sanityVolumeService{}, ) volumeMountService := &sanityMountService{} volumeResizeService := &sanityResizeService{} volumeStatsService := &sanityStatsService{} + controllerService := NewControllerService( - log.With(logger, "component", "driver-controller-service"), + logger.With("component", "driver-controller-service"), volumeService, "testloc", ) + identityService := NewIdentityService( - log.With(logger, "component", "driver-identity-service"), + logger.With("component", "driver-identity-service"), ) + nodeService := NewNodeService( - log.With(logger, "component", "driver-node-service"), + logger.With("component", "driver-node-service"), "123456", "loc", volumeMountService, diff --git a/internal/metrics/metrics.go b/internal/metrics/metrics.go index 3767848..54833af 100644 --- a/internal/metrics/metrics.go +++ b/internal/metrics/metrics.go @@ -1,10 +1,9 @@ package metrics import ( + "log/slog" "net/http" - "github.com/go-kit/log" - "github.com/go-kit/log/level" grpcprom "github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/collectors" @@ -16,14 +15,14 @@ import ( // // It exposes gRPC and Go Runtime metrics. type Metrics struct { - logger log.Logger + logger *slog.Logger addr string reg *prometheus.Registry grpcMetrics *grpcprom.ServerMetrics goMetrics prometheus.Collector } -func New(logger log.Logger, addr string) *Metrics { +func New(logger *slog.Logger, addr string) *Metrics { metrics := &Metrics{ logger: logger, addr: addr, @@ -34,15 +33,15 @@ func New(logger log.Logger, addr string) *Metrics { goMetrics: collectors.NewGoCollector(), } - level.Debug(metrics.logger).Log( - "msg", "registering metrics with registry", + metrics.logger.Debug( + "registering metrics with registry", ) metrics.reg.MustRegister(metrics.goMetrics) metrics.reg.MustRegister(metrics.grpcMetrics) - level.Debug(metrics.logger).Log( - "msg", "registered metrics", + metrics.logger.Debug( + "registered metrics", ) return metrics @@ -67,15 +66,15 @@ func (s *Metrics) Registry() *prometheus.Registry { func (s *Metrics) Serve() { httpServer := &http.Server{Handler: promhttp.HandlerFor(s.reg, promhttp.HandlerOpts{}), Addr: s.addr} - level.Debug(s.logger).Log( - "msg", "starting prometheus http server", + s.logger.Debug( + "starting prometheus http server", "addr", s.addr, ) go func() { if err := httpServer.ListenAndServe(); err != nil { - level.Error(s.logger).Log( - "msg", "Unable to start the prometheus http server", + s.logger.Error( + "Unable to start the prometheus http server", "err", err, ) } diff --git a/internal/testutil/testutil.go b/internal/testutil/testutil.go new file mode 100644 index 0000000..4c0aaac --- /dev/null +++ b/internal/testutil/testutil.go @@ -0,0 +1,11 @@ +package testutil + +import ( + "io" + "log/slog" +) + +func NewNopLogger() *slog.Logger { + th := slog.NewTextHandler(io.Discard, nil) + return slog.New(th) +} diff --git a/internal/volumes/cryptsetup.go b/internal/volumes/cryptsetup.go index 9b7a020..48bf8f2 100644 --- a/internal/volumes/cryptsetup.go +++ b/internal/volumes/cryptsetup.go @@ -2,20 +2,18 @@ package volumes import ( "fmt" + "log/slog" "os/exec" "strings" - - "github.com/go-kit/log" - "github.com/go-kit/log/level" ) const cryptsetupExecuable = "cryptsetup" type CryptSetup struct { - logger log.Logger + logger *slog.Logger } -func NewCryptSetup(logger log.Logger) *CryptSetup { +func NewCryptSetup(logger *slog.Logger) *CryptSetup { return &CryptSetup{logger: logger} } @@ -31,8 +29,8 @@ func (cs *CryptSetup) IsActive(luksDeviceName string) (bool, error) { } func (cs *CryptSetup) Format(devicePath string, passphrase string) error { - level.Info(cs.logger).Log( - "msg", "formatting LUKS device", + cs.logger.Info( + "formatting LUKS device", "devicePath", devicePath, ) output, _, err := commandWithStdin(passphrase, cryptsetupExecuable, "luksFormat", "--type", "luks1", devicePath) @@ -50,8 +48,8 @@ func (cs *CryptSetup) Open(devicePath string, luksDeviceName string, passphrase if active { return nil } - level.Info(cs.logger).Log( - "msg", "opening LUKS device", + cs.logger.Info( + "opening LUKS device", "devicePath", devicePath, "luksDeviceName", luksDeviceName, ) @@ -70,8 +68,8 @@ func (cs *CryptSetup) Close(luksDeviceName string) error { if !active { return nil } - level.Info(cs.logger).Log( - "msg", "closing LUKS device", + cs.logger.Info( + "closing LUKS device", "luksDeviceName", luksDeviceName, ) output, _, err := command(cryptsetupExecuable, "luksClose", luksDeviceName) @@ -82,8 +80,8 @@ func (cs *CryptSetup) Close(luksDeviceName string) error { } func (cs *CryptSetup) Resize(luksDeviceName string) error { - level.Info(cs.logger).Log( - "msg", "resizing LUKS device", + cs.logger.Info( + "resizing LUKS device", "luksDeviceName", luksDeviceName, ) output, _, err := command(cryptsetupExecuable, "resize", luksDeviceName) diff --git a/internal/volumes/idempotency.go b/internal/volumes/idempotency.go index 8fa150b..c437788 100644 --- a/internal/volumes/idempotency.go +++ b/internal/volumes/idempotency.go @@ -2,20 +2,18 @@ package volumes import ( "context" - - "github.com/go-kit/log" - "github.com/go-kit/log/level" + "log/slog" "github.com/hetznercloud/csi-driver/internal/csi" ) // IdempotentService wraps a volume service and provides idempotency as required by the CSI spec. type IdempotentService struct { - logger log.Logger + logger *slog.Logger volumeService Service } -func NewIdempotentService(logger log.Logger, volumeService Service) *IdempotentService { +func NewIdempotentService(logger *slog.Logger, volumeService Service) *IdempotentService { return &IdempotentService{ logger: logger, volumeService: volumeService, @@ -23,8 +21,8 @@ func NewIdempotentService(logger log.Logger, volumeService Service) *IdempotentS } func (s *IdempotentService) Create(ctx context.Context, opts CreateOpts) (*csi.Volume, error) { - level.Info(s.logger).Log( - "msg", "creating volume", + s.logger.Info( + "creating volume", "name", opts.Name, "min-size", opts.MinSize, "max-size", opts.MaxSize, @@ -34,37 +32,37 @@ func (s *IdempotentService) Create(ctx context.Context, opts CreateOpts) (*csi.V volume, err := s.volumeService.Create(ctx, opts) if err == nil { - level.Info(s.logger).Log( - "msg", "volume created", + s.logger.Info( + "volume created", "volume-id", volume.ID, ) return volume, nil } if err == ErrVolumeAlreadyExists { - level.Info(s.logger).Log( - "msg", "another volume with that name does already exist", + s.logger.Info( + "another volume with that name does already exist", "name", opts.Name, ) existingVolume, err := s.volumeService.GetByName(ctx, opts.Name) if err != nil { - level.Error(s.logger).Log( - "msg", "failed to get existing volume", + s.logger.Error( + "failed to get existing volume", "name", opts.Name, "err", err, ) return nil, err } if existingVolume == nil { - level.Error(s.logger).Log( - "msg", "existing volume disappeared", + s.logger.Error( + "existing volume disappeared", "name", opts.Name, ) return nil, ErrVolumeAlreadyExists } if existingVolume.Size < opts.MinSize { - level.Info(s.logger).Log( - "msg", "existing volume is too small", + s.logger.Info( + "existing volume is too small", "name", opts.Name, "min-size", opts.MinSize, "actual-size", existingVolume.Size, @@ -72,8 +70,8 @@ func (s *IdempotentService) Create(ctx context.Context, opts CreateOpts) (*csi.V return nil, ErrVolumeAlreadyExists } if opts.MaxSize > 0 && existingVolume.Size > opts.MaxSize { - level.Info(s.logger).Log( - "msg", "existing volume is too large", + s.logger.Info( + "existing volume is too large", "name", opts.Name, "max-size", opts.MaxSize, "actual-size", existingVolume.Size, @@ -81,8 +79,8 @@ func (s *IdempotentService) Create(ctx context.Context, opts CreateOpts) (*csi.V return nil, ErrVolumeAlreadyExists } if existingVolume.Location != opts.Location { - level.Info(s.logger).Log( - "msg", "existing volume is in different location", + s.logger.Info( + "existing volume is in different location", "name", opts.Name, "location", opts.Location, "actual-location", existingVolume.Location, diff --git a/internal/volumes/idempotency_test.go b/internal/volumes/idempotency_test.go index 01e5426..67fa333 100644 --- a/internal/volumes/idempotency_test.go +++ b/internal/volumes/idempotency_test.go @@ -5,10 +5,9 @@ import ( "io" "testing" - "github.com/go-kit/log" - "github.com/hetznercloud/csi-driver/internal/csi" "github.com/hetznercloud/csi-driver/internal/mock" + "github.com/hetznercloud/csi-driver/internal/testutil" "github.com/hetznercloud/csi-driver/internal/volumes" ) @@ -37,7 +36,7 @@ func TestIdempotentServiceCreateNew(t *testing.T) { }, } - service := volumes.NewIdempotentService(log.NewNopLogger(), volumeService) + service := volumes.NewIdempotentService(testutil.NewNopLogger(), volumeService) volume, err := service.Create(context.Background(), creatingOpts) if err != nil { @@ -65,7 +64,7 @@ func TestIdempotentServiceCreateExisting(t *testing.T) { }, } - service := volumes.NewIdempotentService(log.NewNopLogger(), volumeService) + service := volumes.NewIdempotentService(testutil.NewNopLogger(), volumeService) volume, err := service.Create(context.Background(), volumes.CreateOpts{ Name: "test", @@ -91,7 +90,7 @@ func TestIdempotentServiceCreateExistingError(t *testing.T) { }, } - service := volumes.NewIdempotentService(log.NewNopLogger(), volumeService) + service := volumes.NewIdempotentService(testutil.NewNopLogger(), volumeService) _, err := service.Create(context.Background(), volumes.CreateOpts{ Name: "test", @@ -144,7 +143,7 @@ func TestIdempotentServiceCreateExistingNotFitting(t *testing.T) { }, } - service := volumes.NewIdempotentService(log.NewNopLogger(), volumeService) + service := volumes.NewIdempotentService(testutil.NewNopLogger(), volumeService) for _, testCase := range testCases { t.Run(testCase.Name, func(t *testing.T) { @@ -167,7 +166,7 @@ func TestIdempotentServiceCreateExistingNotFitting(t *testing.T) { func TestIdempotentServiceDelete(t *testing.T) { volumeService := &mock.VolumeService{} - service := volumes.NewIdempotentService(log.NewNopLogger(), volumeService) + service := volumes.NewIdempotentService(testutil.NewNopLogger(), volumeService) testCases := []struct { Name string @@ -240,7 +239,7 @@ func TestIdempotentServiceDeleteVolumeNotFound(t *testing.T) { }, } - service := volumes.NewIdempotentService(log.NewNopLogger(), volumeService) + service := volumes.NewIdempotentService(testutil.NewNopLogger(), volumeService) err := service.Delete(context.Background(), &csi.Volume{}) if err != nil { @@ -258,7 +257,7 @@ func TestIdempotentServiceDeleteError(t *testing.T) { }, } - service := volumes.NewIdempotentService(log.NewNopLogger(), volumeService) + service := volumes.NewIdempotentService(testutil.NewNopLogger(), volumeService) err := service.Delete(context.Background(), &csi.Volume{}) if err != io.EOF { @@ -273,7 +272,7 @@ func TestIdempotentServiceAttach(t *testing.T) { }, } - service := volumes.NewIdempotentService(log.NewNopLogger(), volumeService) + service := volumes.NewIdempotentService(testutil.NewNopLogger(), volumeService) err := service.Attach(context.Background(), &csi.Volume{}, &csi.Server{}) if err != nil { @@ -296,7 +295,7 @@ func TestIdempotentServiceAttachAlreadyAttachedSameServer(t *testing.T) { }, } - service := volumes.NewIdempotentService(log.NewNopLogger(), volumeService) + service := volumes.NewIdempotentService(testutil.NewNopLogger(), volumeService) err := service.Attach(context.Background(), &csi.Volume{}, &csi.Server{ID: 1}) if err != nil { @@ -319,7 +318,7 @@ func TestIdempotentServiceAttachAlreadyAttachedDifferentServer(t *testing.T) { }, } - service := volumes.NewIdempotentService(log.NewNopLogger(), volumeService) + service := volumes.NewIdempotentService(testutil.NewNopLogger(), volumeService) err := service.Attach(context.Background(), &csi.Volume{}, &csi.Server{ID: 1}) if err != volumes.ErrAttached { @@ -334,7 +333,7 @@ func TestIdempotentServiceDetach(t *testing.T) { }, } - service := volumes.NewIdempotentService(log.NewNopLogger(), volumeService) + service := volumes.NewIdempotentService(testutil.NewNopLogger(), volumeService) err := service.Detach(context.Background(), &csi.Volume{}, &csi.Server{}) if err != nil { @@ -349,7 +348,7 @@ func TestIdempotentServiceDetachNotAttached(t *testing.T) { }, } - service := volumes.NewIdempotentService(log.NewNopLogger(), volumeService) + service := volumes.NewIdempotentService(testutil.NewNopLogger(), volumeService) err := service.Detach(context.Background(), &csi.Volume{}, &csi.Server{}) if err != nil { @@ -364,7 +363,7 @@ func TestIdempotentServiceDetachAttachedToDifferentServer(t *testing.T) { }, } - service := volumes.NewIdempotentService(log.NewNopLogger(), volumeService) + service := volumes.NewIdempotentService(testutil.NewNopLogger(), volumeService) err := service.Detach(context.Background(), &csi.Volume{}, &csi.Server{}) if err != nil { @@ -380,7 +379,7 @@ func TestIdempotentServiceExpand(t *testing.T) { }, } - service := volumes.NewIdempotentService(log.NewNopLogger(), volumeService) + service := volumes.NewIdempotentService(testutil.NewNopLogger(), volumeService) err := service.Resize(context.Background(), &csi.Volume{}, 10) if err != nil { diff --git a/internal/volumes/mount.go b/internal/volumes/mount.go index b852529..8f3a68a 100644 --- a/internal/volumes/mount.go +++ b/internal/volumes/mount.go @@ -2,12 +2,11 @@ package volumes import ( "fmt" + "log/slog" "os" "path/filepath" "strings" - "github.com/go-kit/log" - "github.com/go-kit/log/level" "github.com/moby/buildkit/frontend/dockerfile/shell" "k8s.io/mount-utils" "k8s.io/utils/exec" @@ -38,12 +37,12 @@ type MountService interface { // LinuxMountService mounts volumes on a Linux system. type LinuxMountService struct { - logger log.Logger + logger *slog.Logger mounter *mount.SafeFormatAndMount cryptSetup *CryptSetup } -func NewLinuxMountService(logger log.Logger) *LinuxMountService { +func NewLinuxMountService(logger *slog.Logger) *LinuxMountService { return &LinuxMountService{ logger: logger, mounter: &mount.SafeFormatAndMount{ @@ -123,8 +122,8 @@ func (s *LinuxMountService) Publish(targetPath string, devicePath string, opts M devicePath = luksDevicePath } - level.Info(s.logger).Log( - "msg", "publishing volume", + s.logger.Info( + "publishing volume", "target-path", targetPath, "device-path", devicePath, "fs-type", opts.FSType, @@ -159,8 +158,8 @@ func (s *LinuxMountService) Unpublish(targetPath string) error { return fmt.Errorf("failed to determine mount path for %s: %s", targetPath, err) } - level.Info(s.logger).Log( - "msg", "unpublishing volume", + s.logger.Info( + "unpublishing volume", "target-path", targetPath, "device-path", devicePath, ) diff --git a/internal/volumes/resize.go b/internal/volumes/resize.go index 188aa51..e5430f1 100644 --- a/internal/volumes/resize.go +++ b/internal/volumes/resize.go @@ -2,9 +2,8 @@ package volumes import ( "fmt" + "log/slog" - "github.com/go-kit/log" - "github.com/go-kit/log/level" "k8s.io/mount-utils" "k8s.io/utils/exec" ) @@ -16,12 +15,12 @@ type ResizeService interface { // LinuxResizeService resizes volumes on a Linux system. type LinuxResizeService struct { - logger log.Logger + logger *slog.Logger resizer *mount.ResizeFs cryptSetup *CryptSetup } -func NewLinuxResizeService(logger log.Logger) *LinuxResizeService { +func NewLinuxResizeService(logger *slog.Logger) *LinuxResizeService { return &LinuxResizeService{ logger: logger, resizer: mount.NewResizeFs(mount.SafeFormatAndMount{ @@ -38,8 +37,8 @@ func (l *LinuxResizeService) Resize(volumePath string) error { return fmt.Errorf("failed to determine mount path for %s: %s", volumePath, err) } - level.Info(l.logger).Log( - "msg", "resizing volume", + l.logger.Info( + "resizing volume", "volume-path", volumePath, "device-path", devicePath, ) diff --git a/internal/volumes/stats.go b/internal/volumes/stats.go index 34895ac..4ad6d64 100644 --- a/internal/volumes/stats.go +++ b/internal/volumes/stats.go @@ -1,7 +1,8 @@ package volumes import ( - "github.com/go-kit/log" + "log/slog" + "golang.org/x/sys/unix" ) @@ -13,10 +14,10 @@ type StatsService interface { // LinuxStatsService mounts volumes on a Linux system. type LinuxStatsService struct { - logger log.Logger + logger *slog.Logger } -func NewLinuxStatsService(logger log.Logger) *LinuxStatsService { +func NewLinuxStatsService(logger *slog.Logger) *LinuxStatsService { return &LinuxStatsService{ logger: logger, } diff --git a/test/integration/cryptsetup_test.go b/test/integration/cryptsetup_test.go index d0814ad..6199fbe 100644 --- a/test/integration/cryptsetup_test.go +++ b/test/integration/cryptsetup_test.go @@ -3,11 +3,10 @@ package integration import ( + "log/slog" "os" "testing" - "github.com/go-kit/log" - "github.com/hetznercloud/csi-driver/internal/volumes" ) @@ -16,7 +15,7 @@ func TestCryptSetup(t *testing.T) { return } - logger := log.NewLogfmtLogger(NewTestingWriter(t)) + logger := slog.New(slog.NewTextHandler(os.Stdout, nil)) cryptSetup := volumes.NewCryptSetup(logger) name := "fake" device, err := createFakeDevice(name, 32) diff --git a/test/integration/integration_test.go b/test/integration/integration_test.go index c47a492..f5e28f6 100644 --- a/test/integration/integration_test.go +++ b/test/integration/integration_test.go @@ -114,8 +114,8 @@ func formatDisk(mounter *mount.SafeFormatAndMount, device string, fstype string) return err } - // The library we use to format volumes only supports a combined "FormatAndMount" - // so we call that and immediately unmount and cleanup the temp path afterwards. + // The library we use to format volumes only supports a combined "FormatAndMount" + // so we call that and immediately unmount and cleanup the temp path afterwards. defer os.RemoveAll(tmppath) defer mounter.Unmount(tmppath) return mounter.FormatAndMount(device, tmppath, fstype, nil) diff --git a/test/integration/volumes_test.go b/test/integration/volumes_test.go index 23cf24a..3002af4 100644 --- a/test/integration/volumes_test.go +++ b/test/integration/volumes_test.go @@ -4,13 +4,13 @@ package integration import ( "fmt" + "log/slog" "math" "os" "path" "runtime" "testing" - "github.com/go-kit/log" "k8s.io/mount-utils" "k8s.io/utils/exec" @@ -103,7 +103,7 @@ func TestVolumePublishUnpublish(t *testing.T) { for _, test := range tests { t.Run(test.name, func(t *testing.T) { - logger := log.NewLogfmtLogger(NewTestingWriter(t)) + logger := slog.New(slog.NewTextHandler(os.Stdout, nil)) mountService := volumes.NewLinuxMountService(logger) mounter := &mount.SafeFormatAndMount{ Interface: mount.New(""), @@ -220,7 +220,7 @@ func TestVolumeResize(t *testing.T) { for _, test := range tests { t.Run(test.name, func(t *testing.T) { - logger := log.NewLogfmtLogger(NewTestingWriter(t)) + logger := slog.New(slog.NewTextHandler(os.Stdout, nil)) mountService := volumes.NewLinuxMountService(logger) resizeService := volumes.NewLinuxResizeService(logger) cryptSetup := volumes.NewCryptSetup(logger) @@ -324,7 +324,7 @@ func TestDetectDiskFormat(t *testing.T) { { name: "crypto_LUKS", prepare: func(mounter *mount.SafeFormatAndMount, device string) error { - logger := log.NewLogfmtLogger(NewTestingWriter(t)) + logger := slog.New(slog.NewTextHandler(os.Stdout, nil)) cryptSetup := volumes.NewCryptSetup(logger) err := cryptSetup.Format(device, "passphrase") return err -- GitLab