diff --git a/.golangci.yaml b/.golangci.yaml index 67e3da00ce08a90fba81ea8fae7bafa6f5a2c073..2536f8f92d696531d9308ec1300beda22888bb1d 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 75849ffe50b7bc062443d952e2544e9e5b9fa685..b610195a5aa398894d0386cfc6363330367d2ae7 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 533009cd446d8a67f5b27ced2af71781b4a6a690..27a5c76902f33e93d57ff9e227d98cfab5f0ad64 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 086e718dbc1f8ed151d29f9b0307c402164e081a..772ec47e03dfd04752a1232edf16a070af64246f 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 a2488f64c94631eaa647a725eeb900be759efeaa..050ca10313b945baf0c94ae1da5b8a2536745407 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 3c617880b6d9d44c9eabc4a45f4782b119a6c176..8873d9ad718c98e386d1ac0e27ff5f4cd5a04263 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 8357bf4662f04726823cd926c62d0df3dc0794f2..128cecf473b99f72ce58ad437490937b8a86d780 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 bc0e44c8d34f1f4b77bbda5f4410ab4bfda59ef7..28c55210b84086639a5b42cb30b5aae4c20b21b1 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 c4d4354d4cf79c4cbb121e3a67c411c961f095ee..7118240e054e14099dfb2f4f599ab6c637c87387 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 c1df8d50becf04e0cfc67c8458bd6a32563b0f2c..639672919295895514b15d83ba93fb18751dd40e 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 46e3452d893b0ac714e60f11844a9f786c31b812..8b781714cb0a13033c3ad04b606f213b8d995c47 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 fb36f8fd901a41fcd69dcd19983413f9b4cb0c2a..332e20eaa4832ae5d0a8c93210896333e971f52d 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 6cea6f717d382542a967bf7bf959fa17278d6c8d..b7ec7a65513999b8bbcd0107f948a198c9c5a554 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 25108423851bd84ff50e49176d0f9425e58bd44b..5b084ea1022198be27ad798c4c5b9c65e63d6658 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 6336be2044fd15190b99658204a3a96443fb1a03..624c2afc9da46e5fa282960739af184d789ae24b 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 fb6263311d127c827cec97378c185a59fae5c463..430943095d681d3a1e0a2b3ab0455dc63ac96c5b 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 37678486498ad1ada156d86b14f0ebee9dd9cc29..54833af5f7140e4170cb0a916434669e5d302bbc 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 0000000000000000000000000000000000000000..4c0aaacfeb5456e62061a66070ea0b934458cfa9 --- /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 9b7a0208c5c37b51c3b8e7371e89dabc453c181b..48bf8f25b58270cfbd08cbf1086f78d632913f91 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 8fa150bf601f5dc4d1e48b959f87b6a06b2cb086..c437788276523b261c58dce067e2c0275009f03e 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 01e5426546b7007558499b41f978f030e2d0bd1c..67fa333e448beff137e7b947ecc76621f4ad7f82 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 b852529bfb1eb24ea1040813e49b423c6a74931c..8f3a68afeb7d00fbb3255db0c209d8cf8d414671 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 188aa51fd15719415c38c9a166fb66503577b81c..e5430f1b53ed79c8c241cd2ba05b951c5bc43db4 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 34895acc3e715229d2a5e2f5f501a90d8b2797cc..4ad6d64495814c7df37bdbfde854fc21a87c554c 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 d0814ad0bbbeec791bc7feda04caf1d1e2c3280b..6199fbe67690bfd9e8858583967f52f9c008cd91 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 c47a4922e7c06b43ae0f02488146d7a631322279..f5e28f6360e0b7bea568ed80bdc9d604ca28a400 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 23cf24ab8f6d5bc9465074bd4cff4747d576b63a..3002af44590787e4b5c2f2f15b90a36bd16e7280 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