Skip to content

Commit 6b10dc1

Browse files
authored
fix: detangle code and unmount old vols on start (#43)
* chore: update node-driver-registrar to v2.13.0 * fix: remove post start hook * fix: add function that unmounts rclone mounts * chore: cleanup code * chore: helm updates
1 parent 13f42e5 commit 6b10dc1

File tree

11 files changed

+183
-490
lines changed

11 files changed

+183
-490
lines changed

cmd/csi-rclone-plugin/main.go

Lines changed: 74 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,12 @@ import (
44
"flag"
55
"fmt"
66
"os"
7+
"time"
78

8-
"github.com/SwissDataScienceCenter/csi-rclone/pkg/kube"
99
"github.com/SwissDataScienceCenter/csi-rclone/pkg/rclone"
1010
"github.com/spf13/cobra"
11+
"k8s.io/klog"
12+
mountUtils "k8s.io/mount-utils"
1113
)
1214

1315
var (
@@ -21,54 +23,107 @@ func init() {
2123

2224
func main() {
2325

24-
cmd := &cobra.Command{
26+
root := &cobra.Command{
2527
Use: "rclone",
2628
Short: "CSI based rclone driver",
2729
}
2830

2931
runCmd := &cobra.Command{
3032
Use: "run",
3133
Short: "Start the CSI driver.",
34+
}
35+
root.AddCommand(runCmd)
36+
37+
runNode := &cobra.Command{
38+
Use: "node",
39+
Short: "Start the CSI driver node service - expected to run in a daemonset on every node.",
3240
Run: func(cmd *cobra.Command, args []string) {
33-
handle()
41+
handleNode()
3442
},
3543
}
36-
cmd.AddCommand(runCmd)
37-
38-
runCmd.PersistentFlags().StringVar(&nodeID, "nodeid", "", "node id")
39-
runCmd.MarkPersistentFlagRequired("nodeid")
40-
41-
runCmd.PersistentFlags().StringVar(&endpoint, "endpoint", "", "CSI endpoint")
42-
runCmd.MarkPersistentFlagRequired("endpoint")
44+
runNode.PersistentFlags().StringVar(&nodeID, "nodeid", "", "node id")
45+
runNode.MarkPersistentFlagRequired("nodeid")
46+
runNode.PersistentFlags().StringVar(&endpoint, "endpoint", "", "CSI endpoint")
47+
runNode.MarkPersistentFlagRequired("endpoint")
48+
runCmd.AddCommand(runNode)
49+
runController := &cobra.Command{
50+
Use: "controller",
51+
Short: "Start the CSI driver controller.",
52+
Run: func(cmd *cobra.Command, args []string) {
53+
handleController()
54+
},
55+
}
56+
runController.PersistentFlags().StringVar(&nodeID, "nodeid", "", "node id")
57+
runController.MarkPersistentFlagRequired("nodeid")
58+
runController.PersistentFlags().StringVar(&endpoint, "endpoint", "", "CSI endpoint")
59+
runController.MarkPersistentFlagRequired("endpoint")
60+
runCmd.AddCommand(runController)
4361

4462
versionCmd := &cobra.Command{
4563
Use: "version",
4664
Short: "Prints information about this version of csi rclone plugin",
4765
Run: func(cmd *cobra.Command, args []string) {
48-
fmt.Printf(`csi-rclone plugin
49-
Version: %s
50-
`, rclone.DriverVersion)
66+
fmt.Printf("csi-rclone plugin Version: %s", rclone.DriverVersion)
5167
},
5268
}
53-
cmd.AddCommand(versionCmd)
69+
root.AddCommand(versionCmd)
5470

55-
cmd.ParseFlags(os.Args[1:])
56-
if err := cmd.Execute(); err != nil {
71+
root.ParseFlags(os.Args[1:])
72+
if err := root.Execute(); err != nil {
5773
fmt.Fprintf(os.Stderr, "%s", err.Error())
5874
os.Exit(1)
5975
}
6076

6177
os.Exit(0)
6278
}
6379

64-
func handle() {
65-
kubeClient, err := kube.GetK8sClient()
80+
func handleNode() {
81+
err := unmountOldVols()
82+
if err != nil {
83+
klog.Warningf("There was an error when trying to unmount old volumes: %v", err)
84+
}
85+
d := rclone.NewDriver(nodeID, endpoint)
86+
ns, err := rclone.NewNodeServer(d.CSIDriver)
6687
if err != nil {
6788
panic(err)
6889
}
69-
d := rclone.NewDriver(nodeID, endpoint, kubeClient)
90+
d.WithNodeServer(ns)
7091
err = d.Run()
7192
if err != nil {
7293
panic(err)
7394
}
7495
}
96+
97+
func handleController() {
98+
d := rclone.NewDriver(nodeID, endpoint)
99+
cs := rclone.NewControllerServer(d.CSIDriver)
100+
d.WithControllerServer(cs)
101+
err := d.Run()
102+
if err != nil {
103+
panic(err)
104+
}
105+
}
106+
107+
// unmountOldVols is used to unmount volumes after a restart on a node
108+
func unmountOldVols() error {
109+
const mountType = "fuse.rclone"
110+
const unmountTimeout = time.Second * 5
111+
klog.Info("Checking for existing mounts")
112+
mounter := mountUtils.Mounter{}
113+
mounts, err := mounter.List()
114+
if err != nil {
115+
return err
116+
}
117+
for _, mount := range mounts {
118+
if mount.Type != mountType {
119+
continue
120+
}
121+
err := mounter.UnmountWithForce(mount.Path, unmountTimeout)
122+
if err != nil {
123+
klog.Warningf("Failed to unmount %s because of %v.", mount.Path, err)
124+
continue
125+
}
126+
klog.Infof("Sucessfully unmounted %s", mount.Path)
127+
}
128+
return nil
129+
}

deploy/csi-rclone/templates/csi-controller-rclone.yaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ spec:
5959
- name: rclone
6060
args:
6161
- run
62+
- controller
6263
- --nodeid=$(NODE_ID)
6364
- --endpoint=$(CSI_ENDPOINT)
6465
env:
@@ -93,7 +94,7 @@ spec:
9394
name: socket-dir
9495
- name: liveness-probe
9596
imagePullPolicy: Always
96-
image: registry.k8s.io/sig-storage/livenessprobe:v2.11.0
97+
image: registry.k8s.io/sig-storage/livenessprobe:v2.15.0
9798
args:
9899
- --csi-address=/csi/csi.sock
99100
volumeMounts:

deploy/csi-rclone/templates/csi-nodeplugin-rclone.yaml

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ spec:
6060
- name: rclone
6161
args:
6262
- run
63+
- node
6364
- --nodeid=$(NODE_ID)
6465
- --endpoint=$(CSI_ENDPOINT)
6566
env:
@@ -77,14 +78,6 @@ spec:
7778
value: {{ .Values.logLevel | default "NOTICE" | quote }}
7879
image: {{ .Values.csiNodepluginRclone.rclone.image.repository }}:{{ .Values.csiNodepluginRclone.rclone.image.tag | default .Chart.AppVersion }}
7980
imagePullPolicy: {{ .Values.csiNodepluginRclone.rclone.imagePullPolicy }}
80-
# TODO: check if necessary
81-
lifecycle:
82-
postStart:
83-
exec:
84-
command:
85-
- /bin/sh
86-
- -c
87-
- mount -t fuse.rclone | while read -r mount; do umount $(echo $mount | awk {print $3}) ; done
8881
resources:
8982
{{- toYaml .Values.csiControllerRclone.rclone.resources | nindent 12 }}
9083
securityContext: {{- toYaml .Values.csiNodepluginRclone.rclone.containerSecurityContext

deploy/csi-rclone/values.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ csiNodepluginRclone:
3131
nodeDriverRegistrar:
3232
image:
3333
repository: registry.k8s.io/sig-storage/csi-node-driver-registrar
34-
tag: v2.12.0
34+
tag: v2.13.0
3535
imagePullPolicy: IfNotPresent
3636
rclone:
3737
containerSecurityContext:

devenv/nix/goModule.nix

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ let
55
pname = "csi-rclone-pvc-1";
66
version = "0.2.0";
77
src = ../../.;
8-
vendorHash = "sha256-q1tfnO5B6U9c+Ve+kpOfnWGvbdShgkPXvR7axsA7O5Y=";
8+
vendorHash = "sha256-14l9ybbaHRs+rlcSABBwpUXe9TNlP1HoCNZCvdYiOmk=";
99
# CGO = 0;
1010
# preBuild = ''
1111
# whoami

go.mod

Lines changed: 16 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,52 @@
11
module github.com/SwissDataScienceCenter/csi-rclone
22

3-
go 1.18
3+
go 1.23.0
4+
5+
toolchain go1.23.4
46

57
require (
68
github.com/container-storage-interface/spec v1.9.0
9+
github.com/fernet/fernet-go v0.0.0-20240119011108-303da6aec611
10+
github.com/google/uuid v1.4.0
711
github.com/kubernetes-csi/csi-test/v5 v5.2.0
812
github.com/kubernetes-csi/drivers v1.0.2
13+
github.com/onsi/ginkgo/v2 v2.13.1
14+
github.com/onsi/gomega v1.30.0
915
github.com/spf13/cobra v1.1.1
1016
golang.org/x/net v0.17.0
1117
google.golang.org/grpc v1.58.1
18+
gopkg.in/ini.v1 v1.67.0
1219
k8s.io/api v0.20.4
1320
k8s.io/apimachinery v0.20.4
1421
k8s.io/client-go v0.20.4
1522
k8s.io/klog v1.0.0
16-
k8s.io/kubernetes v1.20.4
17-
k8s.io/utils v0.0.0-20231127182322-b307cd553661
23+
k8s.io/mount-utils v0.32.1
24+
k8s.io/utils v0.0.0-20241210054802-24370beab758
1825
)
1926

2027
require (
21-
github.com/davecgh/go-spew v1.1.1 // indirect
22-
github.com/fernet/fernet-go v0.0.0-20240119011108-303da6aec611 // indirect
23-
github.com/go-logr/logr v1.3.0 // indirect
28+
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
29+
github.com/go-logr/logr v1.4.2 // indirect
2430
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect
2531
github.com/gogo/protobuf v1.3.1 // indirect
2632
github.com/golang/glog v1.1.0 // indirect
2733
github.com/golang/protobuf v1.5.3 // indirect
2834
github.com/google/go-cmp v0.6.0 // indirect
2935
github.com/google/gofuzz v1.1.0 // indirect
3036
github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 // indirect
31-
github.com/google/uuid v1.4.0 // indirect
3237
github.com/googleapis/gnostic v0.4.1 // indirect
3338
github.com/imdario/mergo v0.3.7 // indirect
3439
github.com/inconshreveable/mousetrap v1.0.0 // indirect
3540
github.com/json-iterator/go v1.1.10 // indirect
3641
github.com/kubernetes-csi/csi-lib-utils v0.3.1 // indirect
42+
github.com/moby/sys/mountinfo v0.7.2 // indirect
43+
github.com/moby/sys/userns v0.1.0 // indirect
3744
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
3845
github.com/modern-go/reflect2 v1.0.1 // indirect
39-
github.com/onsi/ginkgo/v2 v2.13.1 // indirect
40-
github.com/onsi/gomega v1.30.0 // indirect
4146
github.com/spf13/pflag v1.0.5 // indirect
42-
github.com/stretchr/testify v1.8.4 // indirect
4347
golang.org/x/crypto v0.14.0 // indirect
4448
golang.org/x/oauth2 v0.10.0 // indirect
45-
golang.org/x/sys v0.14.0 // indirect
49+
golang.org/x/sys v0.26.0 // indirect
4650
golang.org/x/term v0.13.0 // indirect
4751
golang.org/x/text v0.13.0 // indirect
4852
golang.org/x/time v0.5.0 // indirect
@@ -51,42 +55,9 @@ require (
5155
google.golang.org/genproto/googleapis/rpc v0.0.0-20230803162519-f966b187b2e5 // indirect
5256
google.golang.org/protobuf v1.31.0 // indirect
5357
gopkg.in/inf.v0 v0.9.1 // indirect
54-
gopkg.in/ini.v1 v1.67.0 // indirect
5558
gopkg.in/yaml.v2 v2.4.0 // indirect
5659
gopkg.in/yaml.v3 v3.0.1 // indirect
57-
k8s.io/klog/v2 v2.110.1 // indirect
60+
k8s.io/klog/v2 v2.130.1 // indirect
5861
sigs.k8s.io/structured-merge-diff/v4 v4.0.2 // indirect
5962
sigs.k8s.io/yaml v1.2.0 // indirect
6063
)
61-
62-
replace (
63-
k8s.io/api => k8s.io/api v0.20.4
64-
k8s.io/apiextensions-apiserver => k8s.io/apiextensions-apiserver v0.20.4
65-
k8s.io/apimachinery => k8s.io/apimachinery v0.20.4
66-
k8s.io/apiserver => k8s.io/apiserver v0.20.4
67-
k8s.io/cli-runtime => k8s.io/cli-runtime v0.20.4
68-
k8s.io/client-go => k8s.io/client-go v0.20.4
69-
k8s.io/cloud-provider => k8s.io/cloud-provider v0.20.4
70-
k8s.io/cluster-bootstrap => k8s.io/cluster-bootstrap v0.20.4
71-
k8s.io/code-generator => k8s.io/code-generator v0.20.4
72-
k8s.io/component-base => k8s.io/component-base v0.20.4
73-
k8s.io/component-helpers => k8s.io/component-helpers v0.20.4
74-
k8s.io/controller-manager => k8s.io/controller-manager v0.20.4
75-
k8s.io/cri-api => k8s.io/cri-api v0.20.4
76-
k8s.io/csi-translation-lib => k8s.io/csi-translation-lib v0.20.4
77-
k8s.io/dynamic-resource-allocation => k8s.io/dynamic-resource-allocation v0.20.4
78-
k8s.io/endpointslice => k8s.io/endpointslice v0.20.4
79-
k8s.io/kube-aggregator => k8s.io/kube-aggregator v0.20.4
80-
k8s.io/kube-controller-manager => k8s.io/kube-controller-manager v0.20.4
81-
k8s.io/kube-proxy => k8s.io/kube-proxy v0.20.4
82-
k8s.io/kube-scheduler => k8s.io/kube-scheduler v0.20.4
83-
k8s.io/kubectl => k8s.io/kubectl v0.20.4
84-
k8s.io/kubelet => k8s.io/kubelet v0.20.4
85-
k8s.io/legacy-cloud-providers => k8s.io/legacy-cloud-providers v0.20.4
86-
k8s.io/metrics => k8s.io/metrics v0.20.4
87-
k8s.io/mount-utils => k8s.io/mount-utils v0.20.4
88-
k8s.io/pod-security-admission => k8s.io/pod-security-admission v0.20.4
89-
k8s.io/sample-apiserver => k8s.io/sample-apiserver v0.20.4
90-
k8s.io/sample-cli-plugin => k8s.io/sample-cli-plugin v0.20.4
91-
k8s.io/sample-controller => k8s.io/sample-controller v0.20.4
92-
)

0 commit comments

Comments
 (0)