diff --git a/Dockerfile b/Dockerfile index 94f181a..6e7aa40 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,20 +1,20 @@ -FROM golang:1.19-alpine as gobuild - +FROM --platform=$BUILDPLATFORM golang:1.23-alpine AS gobuild +ARG TARGETOS +ARG TARGETARCH WORKDIR /build ADD go.mod go.sum /build/ RUN go mod download -x ADD cmd /build/cmd ADD pkg /build/pkg -RUN CGO_ENABLED=0 GOOS=linux go build -a -ldflags '-extldflags "-static"' -o ./s3driver ./cmd/s3driver +RUN CGO_ENABLED=0 GOOS=${TARGETOS} GOARCH=${TARGETARCH} go build -a -ldflags '-extldflags "-static"' -o ./s3driver ./cmd/s3driver -FROM alpine:3.17 +FROM alpine:3.20 LABEL maintainers="Vitaliy Filippov " LABEL description="csi-s3 slim image" - -RUN apk add --no-cache fuse mailcap rclone -RUN apk add --no-cache -X http://dl-cdn.alpinelinux.org/alpine/edge/community s3fs-fuse - -ADD https://github.com/yandex-cloud/geesefs/releases/latest/download/geesefs-linux-amd64 /usr/bin/geesefs +ARG TARGETOS +ARG TARGETARCH +RUN apk add --no-cache fuse mailcap rclone s3fs-fuse +ADD https://github.com/yandex-cloud/geesefs/releases/latest/download/geesefs-${TARGETOS}-${TARGETARCH} /usr/bin/geesefs RUN chmod 755 /usr/bin/geesefs COPY --from=gobuild /build/s3driver /s3driver diff --git a/cmd/s3driver/main.go b/cmd/s3driver/main.go index e7bd579..115e14c 100644 --- a/cmd/s3driver/main.go +++ b/cmd/s3driver/main.go @@ -18,28 +18,27 @@ package main import ( "flag" + "k8s.io/klog/v2" "log" "os" "github.com/yandex-cloud/k8s-csi-s3/pkg/driver" ) -func init() { - flag.Set("logtostderr", "true") -} - var ( endpoint = flag.String("endpoint", "unix://tmp/csi.sock", "CSI endpoint") nodeID = flag.String("nodeid", "", "node id") ) func main() { + klog.InitFlags(flag.CommandLine) + flag.Set("logtostderr", "true") flag.Parse() - driver, err := driver.New(*nodeID, *endpoint) + d, err := driver.New(*nodeID, *endpoint) if err != nil { log.Fatal(err) } - driver.Run() + d.Run() os.Exit(0) } diff --git a/go.mod b/go.mod index 089a40b..d80a58e 100644 --- a/go.mod +++ b/go.mod @@ -1,29 +1,48 @@ module github.com/yandex-cloud/k8s-csi-s3 -go 1.15 +go 1.23 require ( - github.com/container-storage-interface/spec v1.1.0 - github.com/coreos/go-systemd/v22 v22.5.0 // indirect - github.com/godbus/dbus/v5 v5.0.4 // indirect - github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b - github.com/golang/protobuf v1.1.0 // indirect - github.com/kubernetes-csi/csi-lib-utils v0.6.1 // indirect + github.com/container-storage-interface/spec v1.10.0 + github.com/coreos/go-systemd/v22 v22.5.0 + github.com/godbus/dbus/v5 v5.1.0 + github.com/kubernetes-csi/csi-lib-utils v0.19.0 github.com/kubernetes-csi/csi-test v2.0.0+incompatible - github.com/kubernetes-csi/drivers v1.0.2 - github.com/minio/minio-go/v7 v7.0.5 - github.com/mitchellh/go-ps v0.0.0-20170309133038-4fdf99ab2936 + github.com/minio/minio-go/v7 v7.0.80 + github.com/mitchellh/go-ps v1.0.0 github.com/onsi/ginkgo v1.5.0 - github.com/onsi/gomega v1.4.0 - github.com/spf13/afero v1.2.1 // indirect - golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a // indirect - golang.org/x/net v0.0.0-20200707034311-ab3426394381 - golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6 // indirect - golang.org/x/sys v0.0.0-20200922070232-aee5d888a860 // indirect - google.golang.org/genproto v0.0.0-20180716172848-2731d4fa720b // indirect - google.golang.org/grpc v1.13.0 - k8s.io/apimachinery v0.0.0-20180714051327-705cfa51a97f // indirect - k8s.io/klog v0.2.0 // indirect - k8s.io/kubernetes v1.13.4 - k8s.io/utils v0.0.0-20180703210027-ab9069044f32 // indirect + github.com/onsi/gomega v1.33.1 + golang.org/x/net v0.30.0 + google.golang.org/grpc v1.67.1 + k8s.io/klog/v2 v2.130.1 + k8s.io/mount-utils v0.31.2 +) + +require ( + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/go-ini/ini v1.67.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect + github.com/goccy/go-json v0.10.3 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/go-cmp v0.6.0 // indirect + github.com/google/pprof v0.0.0-20240525223248-4bfdf5a9a2af // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/klauspost/compress v1.17.11 // indirect + github.com/klauspost/cpuid/v2 v2.2.8 // indirect + github.com/kr/text v0.2.0 // indirect + github.com/minio/md5-simd v1.1.2 // indirect + github.com/moby/sys/mountinfo v0.7.2 // indirect + github.com/moby/sys/userns v0.1.0 // indirect + github.com/onsi/ginkgo/v2 v2.19.0 // indirect + github.com/opencontainers/runc v1.2.1 // indirect + github.com/rs/xid v1.6.0 // indirect + golang.org/x/crypto v0.28.0 // indirect + golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect + golang.org/x/sys v0.26.0 // indirect + golang.org/x/text v0.19.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 // indirect + google.golang.org/protobuf v1.35.1 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect + k8s.io/utils v0.0.0-20241104163129-6fe5fd82f078 // indirect ) diff --git a/go.sum b/go.sum index 23c5826..ba69e29 100644 --- a/go.sum +++ b/go.sum @@ -1,116 +1,99 @@ -github.com/container-storage-interface/spec v1.1.0 h1:qPsTqtR1VUPvMPeK0UnCZMtXaKGyyLPG8gj/wG6VqMs= -github.com/container-storage-interface/spec v1.1.0/go.mod h1:6URME8mwIBbpVyZV93Ce5St17xBiQJQY67NDsuohiy4= +github.com/container-storage-interface/spec v1.10.0 h1:YkzWPV39x+ZMTa6Ax2czJLLwpryrQ+dPesB34mrRMXA= +github.com/container-storage-interface/spec v1.10.0/go.mod h1:DtUvaQszPml1YJfIK7c00mlv6/g4wNMLanLgiUbKFRI= github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/godbus/dbus/v5 v5.0.4 h1:9349emZab16e7zQvpmsbtjc18ykshndd8y2PG3sgJbA= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +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/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/go-ini/ini v1.67.0 h1:z6ZrTEZqSWOTyH2FlglNbNgARyHG8oLW9gMELqKr06A= +github.com/go-ini/ini v1.67.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= +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= +github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= +github.com/goccy/go-json v0.10.3 h1:KZ5WoDbxAIgm2HNbYckL0se1fHD6rz5j4ywS6ebzDqA= +github.com/goccy/go-json v0.10.3/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/protobuf v1.1.0 h1:0iH4Ffd/meGoXqF2lSAhZHt8X+cPgkfn/cb6Cce5Vpc= -github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/json-iterator/go v1.1.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/klauspost/cpuid v1.2.3/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= -github.com/klauspost/cpuid v1.3.1 h1:5JNjFYYQrZeKRJ0734q51WCEEn2huer72Dc7K+R/b6s= -github.com/klauspost/cpuid v1.3.1/go.mod h1:bYW4mA6ZgKPob1/Dlai2LviZJO7KGI3uoWLd42rAQw4= -github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/kubernetes-csi/csi-lib-utils v0.6.1 h1:+AZ58SRSRWh2vmMoWAAGcv7x6fIyBMpyCXAgIc9kT28= -github.com/kubernetes-csi/csi-lib-utils v0.6.1/go.mod h1:GVmlUmxZ+SUjVLXicRFjqWUUvWez0g0Y78zNV9t7KfQ= +github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= +github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/pprof v0.0.0-20240525223248-4bfdf5a9a2af h1:kmjWCqn2qkEml422C2Rrd27c3VGxi6a/6HNq8QmHRKM= +github.com/google/pprof v0.0.0-20240525223248-4bfdf5a9a2af/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= +github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= +github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.2.8 h1:+StwCXwm9PdpiEkPyzBXIy+M9KUb4ODm0Zarf1kS5BM= +github.com/klauspost/cpuid/v2 v2.2.8/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kubernetes-csi/csi-lib-utils v0.19.0 h1:3sT8mL9+St2acyrEtuR7CQ5L78GR4lgsb+sfon9tGfA= +github.com/kubernetes-csi/csi-lib-utils v0.19.0/go.mod h1:lBuMKvoyd8c3EG+itmnVWApLDHnLkU7ibxxZSPuOw0M= github.com/kubernetes-csi/csi-test v2.0.0+incompatible h1:ia04uVFUM/J9n/v3LEMn3rEG6FmKV5BH9QLw7H68h44= github.com/kubernetes-csi/csi-test v2.0.0+incompatible/go.mod h1:YxJ4UiuPWIhMBkxUKY5c267DyA0uDZ/MtAimhx/2TA0= -github.com/kubernetes-csi/drivers v1.0.2 h1:kaEAMfo+W5YFr23yedBIY+NGnNjr6/PbPzx7N4GYgiQ= -github.com/kubernetes-csi/drivers v1.0.2/go.mod h1:V6rHbbSLCZGaQoIZ8MkyDtoXtcKXZM0F7N3bkloDCOY= -github.com/minio/md5-simd v1.1.0 h1:QPfiOqlZH+Cj9teu0t9b1nTBfPbyTl16Of5MeuShdK4= -github.com/minio/md5-simd v1.1.0/go.mod h1:XpBqgZULrMYD3R+M28PcmP0CkI7PEMzB3U77ZrKZ0Gw= -github.com/minio/minio-go/v7 v7.0.5 h1:I2NIJ2ojwJqD/YByemC1M59e1b4FW9kS7NlOar7HPV4= -github.com/minio/minio-go/v7 v7.0.5/go.mod h1:TA0CQCjJZHM5SJj9IjqR0NmpmQJ6bCbXifAJ3mUU6Hw= -github.com/minio/sha256-simd v0.1.1 h1:5QHSlgo3nt5yKOJrC7W8w7X+NFl8cMPZm96iu8kKUJU= -github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= -github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-ps v0.0.0-20170309133038-4fdf99ab2936 h1:kw1v0NlnN+GZcU8Ma8CLF2Zzgjfx95gs3/GN3vYAPpo= -github.com/mitchellh/go-ps v0.0.0-20170309133038-4fdf99ab2936/go.mod h1:r1VsdOzOPt1ZSrGZWFoNhsAedKnEd6r9Np1+5blZCWk= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34= +github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= +github.com/minio/minio-go/v7 v7.0.80 h1:2mdUHXEykRdY/BigLt3Iuu1otL0JTogT0Nmltg0wujk= +github.com/minio/minio-go/v7 v7.0.80/go.mod h1:84gmIilaX4zcvAWWzJ5Z1WI5axN+hAbM5w25xf8xvC0= +github.com/mitchellh/go-ps v1.0.0 h1:i6ampVEEF4wQFF+bkYfwYgY+F/uYJDktmvLPf7qIgjc= +github.com/mitchellh/go-ps v1.0.0/go.mod h1:J4lOc8z8yJs6vUwklHw2XEIiT4z4C40KtWVN3nvg8Pg= +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/moby/sys/userns v0.1.0 h1:tVLXkFOxVu9A64/yh59slHVv9ahO9UIev4JZusOLG/g= +github.com/moby/sys/userns v0.1.0/go.mod h1:IHUYgu/kao6N8YZlp9Cf444ySSvCmDlmzUcYfDHOl28= github.com/onsi/ginkgo v1.5.0 h1:uZr+v/TFDdYkdA+j02sPO1kA5owrfjBGCJAogfIyThE= github.com/onsi/ginkgo v1.5.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/gomega v1.4.0 h1:p/ZBjQI9G/VwoPrslo/sqS6R5vHU9Od60+axIiP6WuQ= -github.com/onsi/gomega v1.4.0/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/rs/xid v1.2.1 h1:mhH9Nq+C1fY2l1XIpgxIiUOfNpRBYH1kKcr+qfKgjRc= -github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a h1:pa8hGb/2YqsZKovtsgrwcDH1RZhVbTKCjLp47XpqCDs= -github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/spf13/afero v1.2.1 h1:qgMbHoJbPbw579P+1zVY+6n4nIFuIchaIjzZ/I/Yq8M= -github.com/spf13/afero v1.2.1/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a h1:vclmkQCjlDX5OydZ9wv8rBCcS0QyQY66Mpf/7BZbInM= -golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20200707034311-ab3426394381 h1:VXak5I6aEWmAXeQjA+QSZzlgNrpq9mjcfDemuexIKsU= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6 h1:bjcUS9ztw9kFmmIxJInhon/0Is3p+EHBKNgquIzo1OI= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200922070232-aee5d888a860 h1:YEu4SMq7D0cmT7CBbXfcH0NZeuChAXwsHe/9XueUO6o= -golang.org/x/sys v0.0.0-20200922070232-aee5d888a860/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -google.golang.org/genproto v0.0.0-20180716172848-2731d4fa720b h1:mXqBiicV0B+k8wzFNkKeNBRL7LyRV5xG0s+S6ffLb/E= -google.golang.org/genproto v0.0.0-20180716172848-2731d4fa720b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/grpc v1.13.0 h1:bHIbVsCwmvbArgCJmLdgOdHFXlKqTOVjbibbS19cXHc= -google.golang.org/grpc v1.13.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +github.com/onsi/ginkgo/v2 v2.19.0 h1:9Cnnf7UHo57Hy3k6/m5k3dRfGTMXGvxhHFvkDTCTpvA= +github.com/onsi/ginkgo/v2 v2.19.0/go.mod h1:rlwLi9PilAFJ8jCg9UE1QP6VBpd6/xj3SRC0d6TU0To= +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.2.1 h1:mQkmeFSUxqFaVmvIn1VQPeQIKpHFya5R07aJw0DKQa8= +github.com/opencontainers/runc v1.2.1/go.mod h1:/PXzF0h531HTMsYQnmxXkBD7YaGShm/2zcRB79dksUc= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/rs/xid v1.6.0 h1:fV591PaemRlL6JfRxGDEPl69wICngIQ3shQtzfy2gxU= +github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw= +golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= +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/sys v0.5.0/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/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM= +golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 h1:XVhgTWWV3kGQlwJHR3upFWZeTsei6Oks1apkZSeonIE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= +google.golang.org/grpc v1.67.1 h1:zWnc1Vrcno+lHZCOofnIMvycFcc0QRGIzm9dhnDX68E= +google.golang.org/grpc v1.67.1/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA= +google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA= +google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/ini.v1 v1.57.0 h1:9unxIsFcTt4I55uWluz+UmL95q4kdJ0buvQ1ZIqVQww= -gopkg.in/ini.v1 v1.57.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -k8s.io/apimachinery v0.0.0-20180714051327-705cfa51a97f h1:mjXiDUfs+4mhzRTLNTkAfQS9lqJCXQN/fIcMysNGW/Y= -k8s.io/apimachinery v0.0.0-20180714051327-705cfa51a97f/go.mod h1:ccL7Eh7zubPUSh9A3USN90/OzHNSVN6zxzde07TDCL0= -k8s.io/klog v0.2.0 h1:0ElL0OHzF3N+OhoJTL0uca20SxtYt4X4+bzHeqrB83c= -k8s.io/klog v0.2.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= -k8s.io/kubernetes v1.13.4 h1:gQqFv/pH8hlbznLXQUsi8s5zqYnv0slmUDl/yVA0EWc= -k8s.io/kubernetes v1.13.4/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= -k8s.io/utils v0.0.0-20180703210027-ab9069044f32 h1:Bhn4kFG8fxBouj05v9Y7bOYXKGYfnpmqiTXGgPCmPr8= -k8s.io/utils v0.0.0-20180703210027-ab9069044f32/go.mod h1:8k8uAuAQ0rXslZKaEWd0c3oVhZz7sSzSiPnVZayjIX0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +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.2 h1:Q0ygX92Lj9d1wcObAzj+JZ4oE7CNKZrqSOn1XcIS+y4= +k8s.io/mount-utils v0.31.2/go.mod h1:HV/VYBUGqYUj4vt82YltzpWvgv8FPg0G9ItyInT3NPU= +k8s.io/utils v0.0.0-20241104163129-6fe5fd82f078 h1:jGnCPejIetjiy2gqaJ5V0NLwTpF4wbQ6cZIItJCSHno= +k8s.io/utils v0.0.0-20241104163129-6fe5fd82f078/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= diff --git a/pkg/driver/controllerserver.go b/pkg/driver/controllerserver.go index 4ce6d86..3518485 100644 --- a/pkg/driver/controllerserver.go +++ b/pkg/driver/controllerserver.go @@ -21,27 +21,28 @@ import ( "encoding/hex" "fmt" "io" + "k8s.io/klog/v2" "path" "strings" + "github.com/container-storage-interface/spec/lib/go/csi" "github.com/yandex-cloud/k8s-csi-s3/pkg/mounter" "github.com/yandex-cloud/k8s-csi-s3/pkg/s3" - "github.com/golang/glog" "golang.org/x/net/context" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" - - "github.com/container-storage-interface/spec/lib/go/csi" - csicommon "github.com/kubernetes-csi/drivers/pkg/csi-common" ) type controllerServer struct { - *csicommon.DefaultControllerServer + d *CSIDriver + csi.UnimplementedControllerServer } +var _ csi.ControllerServer = &controllerServer{} + func (cs *controllerServer) CreateVolume(ctx context.Context, req *csi.CreateVolumeRequest) (*csi.CreateVolumeResponse, error) { params := req.GetParameters() - capacityBytes := int64(req.GetCapacityRange().GetRequiredBytes()) + capacityBytes := req.GetCapacityRange().GetRequiredBytes() volumeID := sanitizeVolumeID(req.GetName()) bucketName := volumeID prefix := "" @@ -53,8 +54,8 @@ func (cs *controllerServer) CreateVolume(ctx context.Context, req *csi.CreateVol volumeID = path.Join(bucketName, prefix) } - if err := cs.Driver.ValidateControllerServiceRequest(csi.ControllerServiceCapability_RPC_CREATE_DELETE_VOLUME); err != nil { - glog.V(3).Infof("invalid create volume req: %v", req) + if err := cs.d.ValidateControllerServiceRequest(csi.ControllerServiceCapability_RPC_CREATE_DELETE_VOLUME); err != nil { + klog.V(3).Infof("invalid create volume req: %v", req) return nil, err } @@ -66,7 +67,7 @@ func (cs *controllerServer) CreateVolume(ctx context.Context, req *csi.CreateVol return nil, status.Error(codes.InvalidArgument, "Volume Capabilities missing in request") } - glog.V(4).Infof("Got a request to create volume %s", volumeID) + klog.V(4).Infof("Got a request to create volume %s", volumeID) client, err := s3.NewClientFromSecret(req.GetSecrets()) if err != nil { @@ -88,23 +89,29 @@ func (cs *controllerServer) CreateVolume(ctx context.Context, req *csi.CreateVol return nil, fmt.Errorf("failed to create prefix %s: %v", prefix, err) } - glog.V(4).Infof("create volume %s", volumeID) + klog.V(4).Infof("create volume %s", volumeID) // DeleteVolume lacks VolumeContext, but publish&unpublish requests have it, // so we don't need to store additional metadata anywhere - context := make(map[string]string) + volumeCtx := make(map[string]string) for k, v := range params { - context[k] = v + volumeCtx[k] = v } - context["capacity"] = fmt.Sprintf("%v", capacityBytes) + volumeCtx["capacity"] = fmt.Sprintf("%v", capacityBytes) return &csi.CreateVolumeResponse{ Volume: &csi.Volume{ VolumeId: volumeID, CapacityBytes: capacityBytes, - VolumeContext: context, + VolumeContext: volumeCtx, }, }, nil } +func (cs *controllerServer) ControllerGetCapabilities(context.Context, *csi.ControllerGetCapabilitiesRequest) (*csi.ControllerGetCapabilitiesResponse, error) { + return &csi.ControllerGetCapabilitiesResponse{ + Capabilities: cs.d.Cap, + }, nil +} + func (cs *controllerServer) DeleteVolume(ctx context.Context, req *csi.DeleteVolumeRequest) (*csi.DeleteVolumeResponse, error) { volumeID := req.GetVolumeId() bucketName, prefix := volumeIDToBucketPrefix(volumeID) @@ -114,11 +121,11 @@ func (cs *controllerServer) DeleteVolume(ctx context.Context, req *csi.DeleteVol return nil, status.Error(codes.InvalidArgument, "Volume ID missing in request") } - if err := cs.Driver.ValidateControllerServiceRequest(csi.ControllerServiceCapability_RPC_CREATE_DELETE_VOLUME); err != nil { - glog.V(3).Infof("Invalid delete volume req: %v", req) + if err := cs.d.ValidateControllerServiceRequest(csi.ControllerServiceCapability_RPC_CREATE_DELETE_VOLUME); err != nil { + klog.V(3).Infof("Invalid delete volume req: %v", req) return nil, err } - glog.V(4).Infof("Deleting volume %s", volumeID) + klog.V(4).Infof("Deleting volume %s", volumeID) client, err := s3.NewClientFromSecret(req.GetSecrets()) if err != nil { @@ -131,12 +138,12 @@ func (cs *controllerServer) DeleteVolume(ctx context.Context, req *csi.DeleteVol if err := client.RemoveBucket(bucketName); err != nil && err.Error() != "The specified bucket does not exist" { deleteErr = err } - glog.V(4).Infof("Bucket %s removed", bucketName) + klog.V(4).Infof("Bucket %s removed", bucketName) } else { if err := client.RemovePrefix(bucketName, prefix); err != nil { deleteErr = fmt.Errorf("unable to remove prefix: %w", err) } - glog.V(4).Infof("Prefix %s removed", prefix) + klog.V(4).Infof("Prefix %s removed", prefix) } if deleteErr != nil { @@ -191,10 +198,6 @@ func (cs *controllerServer) ValidateVolumeCapabilities(ctx context.Context, req }, nil } -func (cs *controllerServer) ControllerExpandVolume(ctx context.Context, req *csi.ControllerExpandVolumeRequest) (*csi.ControllerExpandVolumeResponse, error) { - return &csi.ControllerExpandVolumeResponse{}, status.Error(codes.Unimplemented, "ControllerExpandVolume is not implemented") -} - func sanitizeVolumeID(volumeID string) string { volumeID = strings.ToLower(volumeID) if len(volumeID) > 63 { diff --git a/pkg/driver/csidriver.go b/pkg/driver/csidriver.go new file mode 100644 index 0000000..ce88d32 --- /dev/null +++ b/pkg/driver/csidriver.go @@ -0,0 +1,106 @@ +package driver + +import ( + "github.com/container-storage-interface/spec/lib/go/csi" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + "k8s.io/klog/v2" +) + +// https://github.com/kubernetes-csi/csi-driver-smb/blob/master/pkg/csi-common/driver.go + +type CSIDriver struct { + Name string + NodeID string + Version string + Cap []*csi.ControllerServiceCapability + VC []*csi.VolumeCapability_AccessMode + NSCap []*csi.NodeServiceCapability +} + +// Creates a NewCSIDriver object. Assumes vendor version is equal to driver version & +// does not support optional driver plugin info manifest field. Refer to CSI spec for more details. +func NewCSIDriver(name string, v string, nodeID string) *CSIDriver { + if name == "" { + klog.Errorf("Driver name missing") + return nil + } + + if nodeID == "" { + klog.Errorf("NodeID missing") + return nil + } + // TODO version format and validation + if len(v) == 0 { + klog.Errorf("Version argument missing, now skip it") + //return nil + } + + driver := CSIDriver{ + Name: name, + Version: v, + NodeID: nodeID, + } + + return &driver +} + +func (d *CSIDriver) ValidateControllerServiceRequest(c csi.ControllerServiceCapability_RPC_Type) error { + if c == csi.ControllerServiceCapability_RPC_UNKNOWN { + return nil + } + + for _, cap := range d.Cap { + if c == cap.GetRpc().GetType() { + return nil + } + } + return status.Error(codes.InvalidArgument, c.String()) +} + +func (d *CSIDriver) ValidateNodeServiceRequest(c csi.NodeServiceCapability_RPC_Type) error { + if c == csi.NodeServiceCapability_RPC_UNKNOWN { + return nil + } + + for _, cap := range d.NSCap { + if c == cap.GetRpc().GetType() { + return nil + } + } + return status.Error(codes.InvalidArgument, c.String()) +} + +func (d *CSIDriver) AddControllerServiceCapabilities(cl []csi.ControllerServiceCapability_RPC_Type) { + var csc []*csi.ControllerServiceCapability + + for _, c := range cl { + klog.Infof("Enabling controller service capability: %v", c.String()) + csc = append(csc, NewControllerServiceCapability(c)) + } + + d.Cap = csc +} + +func (d *CSIDriver) AddNodeServiceCapabilities(nl []csi.NodeServiceCapability_RPC_Type) { + var nsc []*csi.NodeServiceCapability + for _, n := range nl { + klog.V(2).Infof("Enabling node service capability: %v", n.String()) + nsc = append(nsc, NewNodeServiceCapability(n)) + } + d.NSCap = nsc +} + +func (d *CSIDriver) AddVolumeCapabilityAccessModes(vc []csi.VolumeCapability_AccessMode_Mode) []*csi.VolumeCapability_AccessMode { + var vca []*csi.VolumeCapability_AccessMode + for _, c := range vc { + klog.Infof("Enabling volume access mode: %v", c.String()) + vca = append(vca, NewVolumeCapabilityAccessMode(c)) + } + d.VC = vca + return vca +} + +func (d *CSIDriver) GetVolumeCapabilityAccessModes() []*csi.VolumeCapability_AccessMode { + return d.VC +} diff --git a/pkg/driver/csidriver_utils.go b/pkg/driver/csidriver_utils.go new file mode 100644 index 0000000..c4c1f75 --- /dev/null +++ b/pkg/driver/csidriver_utils.go @@ -0,0 +1,65 @@ +package driver + +import ( + "context" + "fmt" + "github.com/container-storage-interface/spec/lib/go/csi" + "github.com/kubernetes-csi/csi-lib-utils/protosanitizer" + "google.golang.org/grpc" + "k8s.io/klog/v2" + "strings" +) + +// https://github.com/kubernetes-csi/csi-driver-smb/blob/master/pkg/csi-common/utils.go + +func ParseEndpoint(ep string) (string, string, error) { + if strings.HasPrefix(strings.ToLower(ep), "unix://") || strings.HasPrefix(strings.ToLower(ep), "tcp://") { + s := strings.SplitN(ep, "://", 2) + if s[1] != "" { + return s[0], s[1], nil + } + } + return "", "", fmt.Errorf("Invalid endpoint: %v", ep) +} + +func NewVolumeCapabilityAccessMode(mode csi.VolumeCapability_AccessMode_Mode) *csi.VolumeCapability_AccessMode { + return &csi.VolumeCapability_AccessMode{Mode: mode} +} + +func NewControllerServiceCapability(cap csi.ControllerServiceCapability_RPC_Type) *csi.ControllerServiceCapability { + return &csi.ControllerServiceCapability{ + Type: &csi.ControllerServiceCapability_Rpc{ + Rpc: &csi.ControllerServiceCapability_RPC{ + Type: cap, + }, + }, + } +} + +func NewNodeServiceCapability(cap csi.NodeServiceCapability_RPC_Type) *csi.NodeServiceCapability { + return &csi.NodeServiceCapability{ + Type: &csi.NodeServiceCapability_Rpc{ + Rpc: &csi.NodeServiceCapability_RPC{ + Type: cap, + }, + }, + } +} + +func getLogLevel(method string) int32 { + return 2 +} + +func logGRPC(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) { + level := klog.Level(getLogLevel(info.FullMethod)) + klog.V(level).Infof("GRPC call: %s", info.FullMethod) + klog.V(level).Infof("GRPC request: %s", protosanitizer.StripSecrets(req)) + + resp, err := handler(ctx, req) + if err != nil { + klog.Errorf("GRPC error: %v", err) + } else { + klog.V(level).Infof("GRPC response: %s", protosanitizer.StripSecrets(resp)) + } + return resp, err +} diff --git a/pkg/driver/driver.go b/pkg/driver/driver.go index 8c7307c..8f6cc7f 100644 --- a/pkg/driver/driver.go +++ b/pkg/driver/driver.go @@ -18,18 +18,21 @@ package driver import ( "github.com/container-storage-interface/spec/lib/go/csi" - "github.com/golang/glog" - - csicommon "github.com/kubernetes-csi/drivers/pkg/csi-common" + "github.com/yandex-cloud/k8s-csi-s3/pkg/endpoint" + "google.golang.org/grpc" + "k8s.io/klog/v2" + "sync" ) -type driver struct { - driver *csicommon.CSIDriver +type Driver struct { endpoint string ids *identityServer ns *nodeServer cs *controllerServer + + driver *CSIDriver + gcs *groupControllerServer } var ( @@ -38,51 +41,96 @@ var ( ) // New initializes the driver -func New(nodeID string, endpoint string) (*driver, error) { - d := csicommon.NewCSIDriver(driverName, vendorVersion, nodeID) +func New(nodeID string, endpoint string) (*Driver, error) { + d := NewCSIDriver(driverName, vendorVersion, nodeID) if d == nil { - glog.Fatalln("Failed to initialize CSI Driver.") + klog.Fatalln("Failed to initialize CSI Driver.") } - s3Driver := &driver{ + s3Driver := &Driver{ endpoint: endpoint, driver: d, } return s3Driver, nil } -func (s3 *driver) newIdentityServer(d *csicommon.CSIDriver) *identityServer { - return &identityServer{ - DefaultIdentityServer: csicommon.NewDefaultIdentityServer(d), - } +func (s3 *Driver) newIdentityServer(d *CSIDriver) *identityServer { + return &identityServer{d: d} } -func (s3 *driver) newControllerServer(d *csicommon.CSIDriver) *controllerServer { - return &controllerServer{ - DefaultControllerServer: csicommon.NewDefaultControllerServer(d), - } +func (s3 *Driver) newControllerServer(d *CSIDriver) *controllerServer { + return &controllerServer{d: d} } -func (s3 *driver) newNodeServer(d *csicommon.CSIDriver) *nodeServer { - return &nodeServer{ - DefaultNodeServer: csicommon.NewDefaultNodeServer(d), - } +func (s3 *Driver) newNodeServer(d *CSIDriver) *nodeServer { + return &nodeServer{d: d} +} + +func NewNonBlockingGRPCServer() *NonBlockingGRPCServer { + return &NonBlockingGRPCServer{} +} + +type NonBlockingGRPCServer struct { + wg sync.WaitGroup + server *grpc.Server + cleanup func() +} + +func (s *NonBlockingGRPCServer) Start(endpoint string, ids csi.IdentityServer, cs csi.ControllerServer, ns csi.NodeServer, gcs csi.GroupControllerServer) { + s.wg.Add(1) + go s.serve(endpoint, ids, cs, ns, gcs) + return } -func (s3 *driver) Run() { - glog.Infof("Driver: %v ", driverName) - glog.Infof("Version: %v ", vendorVersion) +func (s3 *Driver) Run() { + klog.Infof("Driver: %v ", driverName) + klog.Infof("Version: %v ", vendorVersion) // Initialize default library driver s3.driver.AddControllerServiceCapabilities([]csi.ControllerServiceCapability_RPC_Type{csi.ControllerServiceCapability_RPC_CREATE_DELETE_VOLUME}) s3.driver.AddVolumeCapabilityAccessModes([]csi.VolumeCapability_AccessMode_Mode{csi.VolumeCapability_AccessMode_MULTI_NODE_MULTI_WRITER}) + s3.driver.AddNodeServiceCapabilities([]csi.NodeServiceCapability_RPC_Type{ + csi.NodeServiceCapability_RPC_STAGE_UNSTAGE_VOLUME, + csi.NodeServiceCapability_RPC_EXPAND_VOLUME, + }) // Create GRPC servers s3.ids = s3.newIdentityServer(s3.driver) s3.ns = s3.newNodeServer(s3.driver) s3.cs = s3.newControllerServer(s3.driver) + s3.gcs = s3.newGroupControllerServer() + + s := NewNonBlockingGRPCServer() + s.Start(s3.endpoint, s3.ids, s3.cs, s3.ns, s3.gcs) + s.wg.Wait() +} + +func (s *NonBlockingGRPCServer) serve(ep string, ids csi.IdentityServer, cs csi.ControllerServer, ns csi.NodeServer, gcs csi.GroupControllerServer) { + listener, cleanup, err := endpoint.Listen(ep) + if err != nil { + klog.Fatalf("Failed to listen: %v", err) + } + + opts := []grpc.ServerOption{ + grpc.UnaryInterceptor(logGRPC), + } + server := grpc.NewServer(opts...) + s.server = server + s.cleanup = cleanup + + if ids != nil { + csi.RegisterIdentityServer(server, ids) + } + if cs != nil { + csi.RegisterControllerServer(server, cs) + } + if ns != nil { + csi.RegisterNodeServer(server, ns) + } + if gcs != nil { + csi.RegisterGroupControllerServer(server, gcs) + } - s := csicommon.NewNonBlockingGRPCServer() - s.Start(s3.endpoint, s3.ids, s3.cs, s3.ns) - s.Wait() + klog.Infof("Listening for connections on address: %#v", listener.Addr()) + server.Serve(listener) } diff --git a/pkg/driver/group_controller_server.go b/pkg/driver/group_controller_server.go new file mode 100644 index 0000000..f3d1018 --- /dev/null +++ b/pkg/driver/group_controller_server.go @@ -0,0 +1,11 @@ +package driver + +import "github.com/container-storage-interface/spec/lib/go/csi" + +type groupControllerServer struct { + csi.UnimplementedGroupControllerServer +} + +func (s3 *Driver) newGroupControllerServer() *groupControllerServer { + return &groupControllerServer{} +} diff --git a/pkg/driver/identityserver.go b/pkg/driver/identityserver.go index eeed71d..ff400f9 100644 --- a/pkg/driver/identityserver.go +++ b/pkg/driver/identityserver.go @@ -17,9 +17,49 @@ limitations under the License. package driver import ( - csicommon "github.com/kubernetes-csi/drivers/pkg/csi-common" + "context" + "github.com/container-storage-interface/spec/lib/go/csi" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + "google.golang.org/protobuf/types/known/wrapperspb" ) type identityServer struct { - *csicommon.DefaultIdentityServer + d *CSIDriver + csi.UnimplementedIdentityServer +} + +func (i *identityServer) GetPluginInfo(context.Context, *csi.GetPluginInfoRequest) (*csi.GetPluginInfoResponse, error) { + if i.d.Name == "" { + return nil, status.Error(codes.Unavailable, "Driver name not configured") + } + + if i.d.Version == "" { + return nil, status.Error(codes.Unavailable, "Driver is missing version") + } + + return &csi.GetPluginInfoResponse{ + Name: i.d.Name, + VendorVersion: i.d.Version, + }, nil +} + +func (i *identityServer) GetPluginCapabilities(context.Context, *csi.GetPluginCapabilitiesRequest) (*csi.GetPluginCapabilitiesResponse, error) { + return &csi.GetPluginCapabilitiesResponse{ + Capabilities: []*csi.PluginCapability{ + { + Type: &csi.PluginCapability_Service_{ + Service: &csi.PluginCapability_Service{ + Type: csi.PluginCapability_Service_CONTROLLER_SERVICE, + }, + }, + }, + }, + }, nil +} + +func (i *identityServer) Probe(context.Context, *csi.ProbeRequest) (*csi.ProbeResponse, error) { + return &csi.ProbeResponse{ + Ready: wrapperspb.Bool(true), + }, nil } diff --git a/pkg/driver/nodeserver.go b/pkg/driver/nodeserver.go index 68a20fe..fcd03ed 100644 --- a/pkg/driver/nodeserver.go +++ b/pkg/driver/nodeserver.go @@ -17,7 +17,10 @@ limitations under the License. package driver import ( + "context" "fmt" + "k8s.io/klog/v2" + "k8s.io/mount-utils" "os" "os/exec" "regexp" @@ -25,19 +28,15 @@ import ( "github.com/yandex-cloud/k8s-csi-s3/pkg/mounter" "github.com/yandex-cloud/k8s-csi-s3/pkg/s3" - "github.com/golang/glog" - "golang.org/x/net/context" "github.com/container-storage-interface/spec/lib/go/csi" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" - "k8s.io/kubernetes/pkg/util/mount" - - csicommon "github.com/kubernetes-csi/drivers/pkg/csi-common" ) type nodeServer struct { - *csicommon.DefaultNodeServer + d *CSIDriver + csi.UnimplementedNodeServer } func getMeta(bucketName, prefix string, context map[string]string) *s3.FSMeta { @@ -50,7 +49,7 @@ func getMeta(bucketName, prefix string, context map[string]string) *s3.FSMeta { for _, opt := range re.FindAll([]byte(mountOptStr), -1) { // Unquote options opt = re2.ReplaceAllFunc(opt, func(q []byte) []byte { - return re3.ReplaceAll(q[1 : len(q)-1], []byte("$1")) + return re3.ReplaceAll(q[1:len(q)-1], []byte("$1")) }) mountOptions = append(mountOptions, string(opt)) } @@ -91,16 +90,16 @@ func (ns *nodeServer) NodePublishVolume(ctx context.Context, req *csi.NodePublis if notMnt { // Staged mount is dead by some reason. Revive it bucketName, prefix := volumeIDToBucketPrefix(volumeID) - s3, err := s3.NewClientFromSecret(req.GetSecrets()) + s3Client, err := s3.NewClientFromSecret(req.GetSecrets()) if err != nil { return nil, fmt.Errorf("failed to initialize S3 client: %s", err) } meta := getMeta(bucketName, prefix, req.VolumeContext) - mounter, err := mounter.New(meta, s3.Config) + mnter, err := mounter.New(meta, s3Client.Config) if err != nil { return nil, err } - if err := mounter.Mount(stagingTargetPath, volumeID); err != nil { + if err := mnter.Mount(ctx, stagingTargetPath, volumeID); err != nil { return nil, err } } @@ -118,18 +117,18 @@ func (ns *nodeServer) NodePublishVolume(ctx context.Context, req *csi.NodePublis mountFlags := req.GetVolumeCapability().GetMount().GetMountFlags() attrib := req.GetVolumeContext() - glog.V(4).Infof("target %v\nreadonly %v\nvolumeId %v\nattributes %v\nmountflags %v\n", + klog.V(4).Infof("target %v\nreadonly %v\nvolumeId %v\nattributes %v\nmountflags %v\n", targetPath, readOnly, volumeID, attrib, mountFlags) cmd := exec.Command("mount", "--bind", stagingTargetPath, targetPath) cmd.Stderr = os.Stderr - glog.V(3).Infof("Binding volume %v from %v to %v", volumeID, stagingTargetPath, targetPath) + klog.V(3).Infof("Binding volume %v from %v to %v", volumeID, stagingTargetPath, targetPath) out, err := cmd.Output() if err != nil { - return nil, fmt.Errorf("Error running mount --bind %v %v: %s", stagingTargetPath, targetPath, out) + return nil, fmt.Errorf("error running mount --bind %v %v: %s", stagingTargetPath, targetPath, out) } - glog.V(4).Infof("s3: volume %s successfully mounted to %s", volumeID, targetPath) + klog.V(4).Infof("s3: volume %s successfully mounted to %s", volumeID, targetPath) return &csi.NodePublishVolumeResponse{}, nil } @@ -149,7 +148,7 @@ func (ns *nodeServer) NodeUnpublishVolume(ctx context.Context, req *csi.NodeUnpu if err := mounter.Unmount(targetPath); err != nil { return nil, status.Error(codes.Internal, err.Error()) } - glog.V(4).Infof("s3: volume %s has been unmounted.", volumeID) + klog.V(4).Infof("s3: volume %s has been unmounted.", volumeID) return &csi.NodeUnpublishVolumeResponse{}, nil } @@ -185,11 +184,11 @@ func (ns *nodeServer) NodeStageVolume(ctx context.Context, req *csi.NodeStageVol } meta := getMeta(bucketName, prefix, req.VolumeContext) - mounter, err := mounter.New(meta, client.Config) + mnter, err := mounter.New(meta, client.Config) if err != nil { return nil, err } - if err := mounter.Mount(stagingTargetPath, volumeID); err != nil { + if err := mnter.Mount(ctx, stagingTargetPath, volumeID); err != nil { return nil, err } @@ -222,33 +221,19 @@ func (ns *nodeServer) NodeUnstageVolume(ctx context.Context, req *csi.NodeUnstag if !exists { err = mounter.FuseUnmount(stagingTargetPath) } - glog.V(4).Infof("s3: volume %s has been unmounted from stage path %v.", volumeID, stagingTargetPath) + klog.V(4).Infof("s3: volume %s has been unmounted from stage path %v.", volumeID, stagingTargetPath) return &csi.NodeUnstageVolumeResponse{}, nil } // NodeGetCapabilities returns the supported capabilities of the node server func (ns *nodeServer) NodeGetCapabilities(ctx context.Context, req *csi.NodeGetCapabilitiesRequest) (*csi.NodeGetCapabilitiesResponse, error) { - // currently there is a single NodeServer capability according to the spec - nscap := &csi.NodeServiceCapability{ - Type: &csi.NodeServiceCapability_Rpc{ - Rpc: &csi.NodeServiceCapability_RPC{ - Type: csi.NodeServiceCapability_RPC_STAGE_UNSTAGE_VOLUME, - }, - }, - } - + klog.V(4) return &csi.NodeGetCapabilitiesResponse{ - Capabilities: []*csi.NodeServiceCapability{ - nscap, - }, + Capabilities: ns.d.NSCap, }, nil } -func (ns *nodeServer) NodeExpandVolume(ctx context.Context, req *csi.NodeExpandVolumeRequest) (*csi.NodeExpandVolumeResponse, error) { - return &csi.NodeExpandVolumeResponse{}, status.Error(codes.Unimplemented, "NodeExpandVolume is not implemented") -} - func checkMount(targetPath string) (bool, error) { notMnt, err := mount.New("").IsLikelyNotMountPoint(targetPath) if err != nil { @@ -263,3 +248,9 @@ func checkMount(targetPath string) (bool, error) { } return notMnt, nil } + +func (ns *nodeServer) NodeGetInfo(context.Context, *csi.NodeGetInfoRequest) (*csi.NodeGetInfoResponse, error) { + return &csi.NodeGetInfoResponse{ + NodeId: ns.d.NodeID, + }, nil +} diff --git a/pkg/endpoint/endpoint.go b/pkg/endpoint/endpoint.go new file mode 100644 index 0000000..25b9593 --- /dev/null +++ b/pkg/endpoint/endpoint.go @@ -0,0 +1,43 @@ +package endpoint + +import ( + "fmt" + "net" + "os" + "strings" +) + +// https://github.com/kubernetes-csi/csi-driver-host-path/blob/master/internal/endpoint/endpoint.go + +func Parse(ep string) (string, string, error) { + if strings.HasPrefix(strings.ToLower(ep), "unix://") || strings.HasPrefix(strings.ToLower(ep), "tcp://") { + s := strings.SplitN(ep, "://", 2) + if s[1] != "" { + return s[0], s[1], nil + } + return "", "", fmt.Errorf("Invalid endpoint: %v", ep) + } + // Assume everything else is a file path for a Unix Domain Socket. + return "unix", ep, nil +} + +func Listen(endpoint string) (net.Listener, func(), error) { + proto, addr, err := Parse(endpoint) + if err != nil { + return nil, nil, err + } + + cleanup := func() {} + if proto == "unix" { + addr = "/" + addr + if err := os.Remove(addr); err != nil && !os.IsNotExist(err) { //nolint: vetshadow + return nil, nil, fmt.Errorf("%s: %q", addr, err) + } + cleanup = func() { + os.Remove(addr) + } + } + + l, err := net.Listen(proto, addr) + return l, cleanup, err +} diff --git a/pkg/mounter/geesefs.go b/pkg/mounter/geesefs.go index 04a467b..a3b54fd 100644 --- a/pkg/mounter/geesefs.go +++ b/pkg/mounter/geesefs.go @@ -2,19 +2,19 @@ package mounter import ( "fmt" + "golang.org/x/net/context" + "k8s.io/klog/v2" "os" "strings" "time" systemd "github.com/coreos/go-systemd/v22/dbus" dbus "github.com/godbus/dbus/v5" - "github.com/golang/glog" - "github.com/yandex-cloud/k8s-csi-s3/pkg/s3" ) const ( - geesefsCmd = "geesefs" + geesefsCmd = "geesefs" ) // Implements Mounter @@ -88,7 +88,7 @@ type execCmd struct { UncleanIsFailure bool } -func (geesefs *geesefsMounter) Mount(target, volumeID string) error { +func (geesefs *geesefsMounter) Mount(ctx context.Context, target, volumeID string) error { fullPath := fmt.Sprintf("%s:%s", geesefs.meta.BucketName, geesefs.meta.Prefix) var args []string if geesefs.region != "" { @@ -141,7 +141,7 @@ func (geesefs *geesefsMounter) Mount(target, volumeID string) error { } conn, err := systemd.New() if err != nil { - glog.Errorf("Failed to connect to systemd dbus service: %v, starting geesefs directly", err) + klog.Errorf("Failed to connect to systemd dbus service: %v, starting geesefs directly", err) return geesefs.MountDirect(target, args) } defer conn.Close() @@ -153,25 +153,25 @@ func (geesefs *geesefsMounter) Mount(target, volumeID string) error { if pluginDir == "" { pluginDir = "/var/lib/kubelet/plugins/ru.yandex.s3.csi" } - args = append([]string{pluginDir+"/geesefs", "-f", "-o", "allow_other", "--endpoint", geesefs.endpoint}, args...) - glog.Info("Starting geesefs using systemd: "+strings.Join(args, " ")) - unitName := "geesefs-"+systemd.PathBusEscape(volumeID)+".service" + args = append([]string{pluginDir + "/geesefs", "-f", "-o", "allow_other", "--endpoint", geesefs.endpoint}, args...) + klog.Info("Starting geesefs using systemd: " + strings.Join(args, " ")) + unitName := "geesefs-" + systemd.PathBusEscape(volumeID) + ".service" newProps := []systemd.Property{ - systemd.Property{ - Name: "Description", - Value: dbus.MakeVariant("GeeseFS mount for Kubernetes volume "+volumeID), + { + Name: "Description", + Value: dbus.MakeVariant("GeeseFS mount for Kubernetes volume " + volumeID), }, systemd.PropExecStart(args, false), - systemd.Property{ - Name: "Environment", - Value: dbus.MakeVariant([]string{ "AWS_ACCESS_KEY_ID="+geesefs.accessKeyID, "AWS_SECRET_ACCESS_KEY="+geesefs.secretAccessKey }), + { + Name: "Environment", + Value: dbus.MakeVariant([]string{"AWS_ACCESS_KEY_ID=" + geesefs.accessKeyID, "AWS_SECRET_ACCESS_KEY=" + geesefs.secretAccessKey}), }, - systemd.Property{ - Name: "CollectMode", + { + Name: "CollectMode", Value: dbus.MakeVariant("inactive-or-failed"), }, } - unitProps, err := conn.GetAllProperties(unitName) + unitProps, err := conn.GetAllPropertiesContext(ctx, unitName) if err == nil { // Unit already exists if s, ok := unitProps["ActiveState"].(string); ok && (s == "active" || s == "activating" || s == "reloading") { @@ -188,7 +188,7 @@ func (geesefs *geesefsMounter) Mount(target, volumeID string) error { // FIXME This may mean that the same bucket&path are used for multiple PVs. Support it somehow return fmt.Errorf( "GeeseFS for volume %v is already mounted on host, but"+ - " in a different directory. We want %v, but it's in %v", + " in a different directory. We want %v, but it's in %v", volumeID, target, curPath, ) } diff --git a/pkg/mounter/mounter.go b/pkg/mounter/mounter.go index d190f20..51d2443 100644 --- a/pkg/mounter/mounter.go +++ b/pkg/mounter/mounter.go @@ -3,7 +3,8 @@ package mounter import ( "errors" "fmt" - "io/ioutil" + "golang.org/x/net/context" + "k8s.io/klog/v2" "math" "os" "os/exec" @@ -12,9 +13,8 @@ import ( "time" systemd "github.com/coreos/go-systemd/v22/dbus" - "github.com/golang/glog" "github.com/mitchellh/go-ps" - "k8s.io/kubernetes/pkg/util/mount" + "k8s.io/mount-utils" "github.com/yandex-cloud/k8s-csi-s3/pkg/s3" ) @@ -22,16 +22,16 @@ import ( // Mounter interface which can be implemented // by the different mounter types type Mounter interface { - Mount(target, volumeID string) error + Mount(ctx context.Context, target, volumeID string) error } const ( - s3fsMounterType = "s3fs" - geesefsMounterType = "geesefs" - rcloneMounterType = "rclone" - TypeKey = "mounter" - BucketKey = "bucket" - OptionsKey = "options" + s3fsMounterType = "s3fs" + geesefsMounterType = "geesefs" + rcloneMounterType = "rclone" + TypeKey = "mounter" + BucketKey = "bucket" + OptionsKey = "options" ) // New returns a new mounter depending on the mounterType parameter @@ -62,7 +62,7 @@ func fuseMount(path string, command string, args []string, envs []string) error cmd.Stderr = os.Stderr // cmd.Environ() returns envs inherited from the current process cmd.Env = append(cmd.Environ(), envs...) - glog.V(3).Infof("Mounting fuse with command: %s and args: %s", command, args) + klog.V(3).Infof("Mounting fuse with command: %s and args: %s", command, args) out, err := cmd.Output() if err != nil { @@ -82,15 +82,15 @@ func Unmount(path string) error { func SystemdUnmount(volumeID string) (bool, error) { conn, err := systemd.New() if err != nil { - glog.Errorf("Failed to connect to systemd dbus service: %v", err) + klog.Errorf("Failed to connect to systemd dbus service: %v", err) return false, err } defer conn.Close() - unitName := "geesefs-"+systemd.PathBusEscape(volumeID)+".service" - units, err := conn.ListUnitsByNames([]string{ unitName }) - glog.Errorf("Got %v", units) + unitName := "geesefs-" + systemd.PathBusEscape(volumeID) + ".service" + units, err := conn.ListUnitsByNames([]string{unitName}) + klog.Errorf("Got %v", units) if err != nil { - glog.Errorf("Failed to list systemd unit by name %v: %v", unitName, err) + klog.Errorf("Failed to list systemd unit by name %v: %v", unitName, err) return false, err } if len(units) == 0 || units[0].ActiveState == "inactive" || units[0].ActiveState == "failed" { @@ -102,12 +102,12 @@ func SystemdUnmount(volumeID string) (bool, error) { _, err = conn.StopUnit(unitName, "replace", resCh) if err != nil { - glog.Errorf("Failed to stop systemd unit (%s): %v", unitName, err) + klog.Errorf("Failed to stop systemd unit (%s): %v", unitName, err) return false, err } res := <-resCh // wait until is stopped - glog.Infof("Systemd unit is stopped with result (%s): %s", unitName, res) + klog.Infof("Systemd unit is stopped with result (%s): %s", unitName, res) return true, nil } @@ -119,14 +119,14 @@ func FuseUnmount(path string) error { // as fuse quits immediately, we will try to wait until the process is done process, err := FindFuseMountProcess(path) if err != nil { - glog.Errorf("Error getting PID of fuse mount: %s", err) + klog.Errorf("Error getting PID of fuse mount: %s", err) return nil } if process == nil { - glog.Warningf("Unable to find PID of fuse mount %s, it must have finished already", path) + klog.Warningf("Unable to find PID of fuse mount %s, it must have finished already", path) return nil } - glog.Infof("Found fuse pid %v of mount %s, checking if it still runs", process.Pid, path) + klog.Infof("Found fuse pid %v of mount %s, checking if it still runs", process.Pid, path) return waitForProcess(process, 20) } @@ -134,11 +134,11 @@ func waitForMount(path string, timeout time.Duration) error { var elapsed time.Duration var interval = 10 * time.Millisecond for { - notMount, err := mount.New("").IsNotMountPoint(path) + isMount, err := mount.New("").IsMountPoint(path) if err != nil { return err } - if !notMount { + if isMount { return nil } time.Sleep(interval) @@ -157,11 +157,11 @@ func FindFuseMountProcess(path string) (*os.Process, error) { for _, p := range processes { cmdLine, err := getCmdLine(p.Pid()) if err != nil { - glog.Errorf("Unable to get cmdline of PID %v: %s", p.Pid(), err) + klog.Errorf("Unable to get cmdline of PID %v: %s", p.Pid(), err) continue } if strings.Contains(cmdLine, path) { - glog.Infof("Found matching pid %v on path %s", p.Pid(), path) + klog.Infof("Found matching pid %v on path %s", p.Pid(), path) return os.FindProcess(p.Pid()) } } @@ -172,21 +172,21 @@ func waitForProcess(p *os.Process, limit int) error { for backoff := 0; backoff < limit; backoff++ { cmdLine, err := getCmdLine(p.Pid) if err != nil { - glog.Warningf("Error checking cmdline of PID %v, assuming it is dead: %s", p.Pid, err) + klog.Warningf("Error checking cmdline of PID %v, assuming it is dead: %s", p.Pid, err) p.Wait() return nil } if cmdLine == "" { - glog.Warning("Fuse process seems dead, returning") + klog.Warning("Fuse process seems dead, returning") p.Wait() return nil } if err := p.Signal(syscall.Signal(0)); err != nil { - glog.Warningf("Fuse process does not seem active or we are unprivileged: %s", err) + klog.Warningf("Fuse process does not seem active or we are unprivileged: %s", err) p.Wait() return nil } - glog.Infof("Fuse process with PID %v still active, waiting...", p.Pid) + klog.Infof("Fuse process with PID %v still active, waiting...", p.Pid) time.Sleep(time.Duration(math.Pow(1.5, float64(backoff))*100) * time.Millisecond) } p.Release() @@ -195,7 +195,7 @@ func waitForProcess(p *os.Process, limit int) error { func getCmdLine(pid int) (string, error) { cmdLineFile := fmt.Sprintf("/proc/%v/cmdline", pid) - cmdLine, err := ioutil.ReadFile(cmdLineFile) + cmdLine, err := os.ReadFile(cmdLineFile) if err != nil { return "", err } diff --git a/pkg/mounter/rclone.go b/pkg/mounter/rclone.go index fd30c99..050d83e 100644 --- a/pkg/mounter/rclone.go +++ b/pkg/mounter/rclone.go @@ -2,6 +2,7 @@ package mounter import ( "fmt" + "golang.org/x/net/context" "path" "github.com/yandex-cloud/k8s-csi-s3/pkg/s3" @@ -30,7 +31,7 @@ func newRcloneMounter(meta *s3.FSMeta, cfg *s3.Config) (Mounter, error) { }, nil } -func (rclone *rcloneMounter) Mount(target, volumeID string) error { +func (rclone *rcloneMounter) Mount(ctx context.Context, target, volumeID string) error { args := []string{ "mount", fmt.Sprintf(":s3:%s", path.Join(rclone.meta.BucketName, rclone.meta.Prefix)), diff --git a/pkg/mounter/s3fs.go b/pkg/mounter/s3fs.go index 3cc4df0..2fca83c 100644 --- a/pkg/mounter/s3fs.go +++ b/pkg/mounter/s3fs.go @@ -2,6 +2,7 @@ package mounter import ( "fmt" + "golang.org/x/net/context" "os" "github.com/yandex-cloud/k8s-csi-s3/pkg/s3" @@ -28,7 +29,7 @@ func newS3fsMounter(meta *s3.FSMeta, cfg *s3.Config) (Mounter, error) { }, nil } -func (s3fs *s3fsMounter) Mount(target, volumeID string) error { +func (s3fs *s3fsMounter) Mount(ctx context.Context, target, volumeID string) error { if err := writes3fsPass(s3fs.pwFileContent); err != nil { return err } diff --git a/pkg/s3/client.go b/pkg/s3/client.go index b025569..54a77d7 100644 --- a/pkg/s3/client.go +++ b/pkg/s3/client.go @@ -5,12 +5,12 @@ import ( "context" "crypto/tls" "fmt" + "k8s.io/klog/v2" "net/http" "net/url" "strconv" "sync/atomic" - "github.com/golang/glog" "github.com/minio/minio-go/v7" "github.com/minio/minio-go/v7/pkg/credentials" ) @@ -115,7 +115,7 @@ func (client *s3Client) RemovePrefix(bucketName string, prefix string) error { return client.minio.RemoveObject(client.ctx, bucketName, prefix, minio.RemoveObjectOptions{}) } - glog.Warningf("removeObjects failed with: %s, will try removeObjectsOneByOne", err) + klog.Warningf("removeObjects failed with: %s, will try removeObjectsOneByOne", err) if err = client.removeObjectsOneByOne(bucketName, prefix); err == nil { return client.minio.RemoveObject(client.ctx, bucketName, prefix, minio.RemoveObjectOptions{}) @@ -131,7 +131,7 @@ func (client *s3Client) RemoveBucket(bucketName string) error { return client.minio.RemoveBucket(client.ctx, bucketName) } - glog.Warningf("removeObjects failed with: %s, will try removeObjectsOneByOne", err) + klog.Warningf("removeObjects failed with: %s, will try removeObjectsOneByOne", err) if err = client.removeObjectsOneByOne(bucketName, ""); err == nil { return client.minio.RemoveBucket(client.ctx, bucketName) @@ -160,7 +160,7 @@ func (client *s3Client) removeObjects(bucketName, prefix string) error { }() if listErr != nil { - glog.Error("Error listing objects", listErr) + klog.Error("Error listing objects", listErr) return listErr } @@ -172,7 +172,7 @@ func (client *s3Client) removeObjects(bucketName, prefix string) error { errorCh := client.minio.RemoveObjects(client.ctx, bucketName, objectsCh, opts) haveErrWhenRemoveObjects := false for e := range errorCh { - glog.Errorf("Failed to remove object %s, error: %s", e.ObjectName, e.Err) + klog.Errorf("Failed to remove object %s, error: %s", e.ObjectName, e.Err) haveErrWhenRemoveObjects = true } if haveErrWhenRemoveObjects { @@ -207,7 +207,7 @@ func (client *s3Client) removeObjectsOneByOne(bucketName, prefix string) error { }() if listErr != nil { - glog.Error("Error listing objects", listErr) + klog.Error("Error listing objects", listErr) return listErr } @@ -217,7 +217,7 @@ func (client *s3Client) removeObjectsOneByOne(bucketName, prefix string) error { err := client.minio.RemoveObject(client.ctx, bucketName, obj.Key, minio.RemoveObjectOptions{VersionID: obj.VersionID}) if err != nil { - glog.Errorf("Failed to remove object %s, error: %s", obj.Key, err) + klog.Errorf("Failed to remove object %s, error: %s", obj.Key, err) atomic.AddInt64(&removeErrors, 1) } <-guardCh