@@ -18,7 +18,14 @@ import (
18
18
"go.uber.org/zap/zapcore"
19
19
)
20
20
21
- var logger * zap.Logger
21
+ var (
22
+ logger * zap.Logger
23
+ MakeDir = os .MkdirAll
24
+ RemoveFile = os .Remove
25
+ UnixSocketListener = func (network , address string ) (net.Listener , error ) {
26
+ return net .Listen (network , address )
27
+ }
28
+ )
22
29
23
30
func init () {
24
31
_ = flag .Set ("logtostderr" , "true" ) // #nosec G104: Attempt to set flags for logging to stderr only on best-effort basis.Error cannot be usefully handled.
@@ -50,24 +57,24 @@ func setupSocket() (net.Listener, error) {
50
57
socketPath := filepath .Join (constants .SocketDir , constants .SocketFile )
51
58
52
59
// Ensure the socket directory exists
53
- if err := os . MkdirAll (constants .SocketDir , 0750 ); err != nil {
54
- logger .Fatal ("Failed to create socket directory" , zap .String ("dir" , constants .SocketDir ), zap .Error (err ))
60
+ if err := MakeDir (constants .SocketDir , 0750 ); err != nil {
61
+ logger .Error ("Failed to create socket directory" , zap .String ("dir" , constants .SocketDir ), zap .Error (err ))
55
62
return nil , err
56
63
}
57
64
58
65
// Check for socket file
59
66
if _ , err := os .Stat (socketPath ); err == nil {
60
- if err := os . Remove (socketPath ); err != nil {
67
+ if err := RemoveFile (socketPath ); err != nil {
61
68
logger .Warn ("Failed to remove existing socket file" , zap .String ("path" , socketPath ), zap .Error (err ))
62
69
}
63
70
} else if ! os .IsNotExist (err ) {
64
71
logger .Warn ("Could not stat socket file" , zap .String ("path" , socketPath ), zap .Error (err ))
65
72
}
66
73
67
74
logger .Info ("Creating unix socket listener..." , zap .String ("path" , socketPath ))
68
- listener , err := net . Listen ("unix" , socketPath )
75
+ listener , err := UnixSocketListener ("unix" , socketPath )
69
76
if err != nil {
70
- logger .Fatal ("Failed to create unix socket listener" , zap .String ("path" , socketPath ), zap .Error (err ))
77
+ logger .Error ("Failed to create unix socket listener" , zap .String ("path" , socketPath ), zap .Error (err ))
71
78
return nil , err
72
79
}
73
80
return listener , nil
@@ -90,17 +97,21 @@ func handleSignals() {
90
97
}
91
98
92
99
func newRouter () * gin.Engine {
100
+ utils := & mounterUtils.MounterOptsUtils {}
101
+ parser := & DefaultMounterArgsParser {}
102
+
93
103
// Create gin router
94
104
router := gin .Default ()
95
- router .POST ("/api/cos/mount" , handleCosMount ())
96
- router .POST ("/api/cos/unmount" , handleCosUnmount ())
105
+ router .POST ("/api/cos/mount" , handleCosMount (utils , parser ))
106
+ router .POST ("/api/cos/unmount" , handleCosUnmount (utils ))
97
107
return router
98
108
}
99
109
100
- func main () {
101
- listener , err := setupSocket ()
110
+ func startService ( setupSocketFunc func () (net. Listener , error ), router http. Handler , handleSignalsFunc func ()) error {
111
+ listener , err := setupSocketFunc ()
102
112
if err != nil {
103
- logger .Fatal ("Failed to create socket" )
113
+ logger .Error ("Failed to create socket" , zap .Error (err ))
114
+ return err
104
115
}
105
116
// Close the listener at the end
106
117
defer func () {
@@ -109,23 +120,31 @@ func main() {
109
120
}
110
121
}()
111
122
112
- handleSignals ()
123
+ handleSignalsFunc ()
113
124
114
125
logger .Info ("Starting cos-csi-mounter service..." )
115
126
116
- router := newRouter ()
117
-
118
127
// Serve HTTP requests over Unix socket
119
128
server := & http.Server {
120
129
Handler : router ,
121
130
ReadHeaderTimeout : 3 * time .Second ,
122
131
}
123
132
if err := server .Serve (listener ); err != nil {
124
- logger .Fatal ("Error while serving HTTP requests:" , zap .Error (err ))
133
+ logger .Error ("Error while serving HTTP requests:" , zap .Error (err ))
134
+ return err
135
+ }
136
+ return nil
137
+ }
138
+
139
+ func main () {
140
+ err := startService (setupSocket , newRouter (), handleSignals )
141
+ if err != nil {
142
+ logger .Error ("cos-csi-mounter exited with error" , zap .Error (err ))
143
+ os .Exit (1 )
125
144
}
126
145
}
127
146
128
- func handleCosMount () gin.HandlerFunc {
147
+ func handleCosMount (mounter mounterUtils. MounterUtils , parser MounterArgsParser ) gin.HandlerFunc {
129
148
return func (c * gin.Context ) {
130
149
var request MountRequest
131
150
@@ -150,16 +169,15 @@ func handleCosMount() gin.HandlerFunc {
150
169
}
151
170
152
171
// validate mounter args
153
- args , err := request . ParseMounterArgs ( )
172
+ args , err := parser . Parse ( request )
154
173
if err != nil {
155
174
logger .Error ("failed to parse mounter args" , zap .Any ("mounter" , request .Mounter ), zap .Error (err ))
156
175
157
176
c .JSON (http .StatusBadRequest , gin.H {"error" : fmt .Sprintf ("invalid args for mounter: %v" , err )})
158
177
return
159
178
}
160
179
161
- utils := mounterUtils.MounterOptsUtils {}
162
- err = utils .FuseMount (request .Path , request .Mounter , args )
180
+ err = mounter .FuseMount (request .Path , request .Mounter , args )
163
181
if err != nil {
164
182
logger .Error ("mount failed: " , zap .Error (err ))
165
183
c .JSON (http .StatusInternalServerError , gin.H {"error" : fmt .Sprintf ("mount failed: %v" , err )})
@@ -171,7 +189,7 @@ func handleCosMount() gin.HandlerFunc {
171
189
}
172
190
}
173
191
174
- func handleCosUnmount () gin.HandlerFunc {
192
+ func handleCosUnmount (mounter mounterUtils. MounterUtils ) gin.HandlerFunc {
175
193
return func (c * gin.Context ) {
176
194
var request struct {
177
195
Path string `json:"path"`
@@ -185,8 +203,7 @@ func handleCosUnmount() gin.HandlerFunc {
185
203
186
204
logger .Info ("New unmount request with values: " , zap .String ("Path" , request .Path ))
187
205
188
- utils := mounterUtils.MounterOptsUtils {}
189
- err := utils .FuseUnmount (request .Path )
206
+ err := mounter .FuseUnmount (request .Path )
190
207
if err != nil {
191
208
logger .Error ("unmount failed: " , zap .Error (err ))
192
209
c .JSON (http .StatusInternalServerError , gin.H {"error" : fmt .Sprintf ("unmount failed :%v" , err )})
0 commit comments