@@ -144,7 +144,7 @@ func (m Manager) Get(name string) (vol Volume, err error) {
144
144
}
145
145
146
146
147
- func (m Manager ) Create (name string , sizeInBytes int64 ) error {
147
+ func (m Manager ) Create (name string , sizeInBytes int64 , uid , gid int , mode uint32 ) error {
148
148
err := validateName (name )
149
149
if err != nil {
150
150
return errors .Wrapf (err ,
@@ -166,17 +166,20 @@ func (m Manager) Create(name string, sizeInBytes int64) error {
166
166
167
167
}
168
168
169
- // create vessel
169
+ // create data file
170
170
dataFilePath := filepath .Join (m .dataDir , name )
171
171
dataFileInfo , err := os .Create (dataFilePath )
172
172
if err != nil {
173
+ _ = os .Remove (dataFilePath ) // attempt to cleanup
174
+
173
175
return errors .Wrapf (err ,
174
176
"Error creating volume '%s' - cannot create datafile '%s'" ,
175
177
name , dataFilePath )
176
178
}
177
179
178
180
err = dataFileInfo .Truncate (sizeInBytes )
179
181
if err != nil {
182
+ _ = os .Remove (dataFilePath ) // attempt to cleanup
180
183
return errors .Wrapf (err ,
181
184
"Error creating volume '%s' - cannot allocate '%s' bytes" ,
182
185
name , sizeInBytes )
@@ -186,30 +189,73 @@ func (m Manager) Create(name string, sizeInBytes int64) error {
186
189
mkfsCmd := exec .Command ("mkfs.ext4" , "-F" , dataFilePath )
187
190
_ , err = mkfsCmd .Output ()
188
191
if err != nil {
192
+ _ = os .Remove (dataFilePath ) // attempt to cleanup
189
193
return errors .Wrapf (err ,
190
194
"Error creating volume '%s' - cannot format datafile as ext4 filesystem" ,
191
195
name , sizeInBytes )
192
196
}
193
197
198
+ // At this point we're done - last step is to adjust ownership if required.
199
+ if uid >= 0 || gid >= 0 {
200
+ lease := "driver"
201
+
202
+ mountPath , err := m .Mount (name , lease )
203
+ if err != nil {
204
+ _ = os .Remove (dataFilePath ) // attempt to cleanup
205
+ return errors .Wrapf (err ,
206
+ "Error creating volume '%s' - cannot mount volume to adjust its root owner/permissions" ,
207
+ name , sizeInBytes )
208
+ }
209
+
210
+ if mode > 0 {
211
+ err = os .Chmod (mountPath , os .FileMode (mode ))
212
+ if err != nil {
213
+ _ = m .UnMount (name , lease )
214
+ _ = os .Remove (dataFilePath ) // attempt to cleanup
215
+ return errors .Wrapf (err ,
216
+ "Error creating volume '%s' - cannot adjust volume root permissions" ,
217
+ name , sizeInBytes )
218
+ }
219
+ }
220
+ err = os .Chown (mountPath , uid , gid )
221
+ if err != nil {
222
+ _ = m .UnMount (name , lease )
223
+ _ = os .Remove (dataFilePath ) // attempt to cleanup
224
+ return errors .Wrapf (err ,
225
+ "Error creating volume '%s' - cannot adjust volume root owner" ,
226
+ name , sizeInBytes )
227
+ }
228
+
229
+ err = m .UnMount (name , lease )
230
+ if err != nil {
231
+ _ = os .Remove (dataFilePath ) // attempt to cleanup
232
+ return errors .Wrapf (err ,
233
+ "Error creating volume '%s' - cannot unmount volume after adjusting its root owner/permissions" ,
234
+ name , sizeInBytes )
235
+ }
236
+ }
237
+
194
238
return nil
195
239
}
196
240
197
- func (m Manager ) Mount (name string , lease string ) (* string , error ) {
241
+ func (m Manager ) Mount (name string , lease string ) (string , error ) {
242
+ var failedResult string
243
+
198
244
err := validateName (name )
199
245
if err != nil {
200
- return nil , errors .Wrapf (err ,
246
+ return failedResult , errors .Wrapf (err ,
201
247
"Error mounting volume '%s' - invalid volume name" ,
202
248
name )
203
249
}
204
250
205
251
vol , err := m .getVolume (name )
206
252
if err != nil {
207
- return nil , errors .Wrapf (err , "Error mounting volume '%s' - cannot get its metadata" , name )
253
+ return failedResult , errors .Wrapf (err , "Error mounting volume '%s' - cannot get its metadata" , name )
208
254
}
209
255
210
256
isAlreadyMounted , err := vol .IsMounted () // checking mount status early before we record a lease
211
257
if err != nil {
212
- return nil , errors .Wrapf (err , "Error mounting volume '%s' - cannot check its mount status" , name )
258
+ return failedResult , errors .Wrapf (err , "Error mounting volume '%s' - cannot check its mount status" , name )
213
259
}
214
260
215
261
_ , err = os .Stat (vol .StateDir )
@@ -218,7 +264,7 @@ func (m Manager) Mount(name string, lease string) (*string, error) {
218
264
if os .IsNotExist (err ) {
219
265
err = os .MkdirAll (vol .StateDir , 0755 )
220
266
if err != nil {
221
- return nil , errors .Wrapf (err ,
267
+ return failedResult , errors .Wrapf (err ,
222
268
"Error mounting volume '%s' - cannot create its state dir" ,
223
269
name )
224
270
}
@@ -229,34 +275,36 @@ func (m Manager) Mount(name string, lease string) (*string, error) {
229
275
_ , err = os .Stat (leaseFile )
230
276
if err != nil {
231
277
if ! os .IsNotExist (err ) {
232
- return nil , errors .Wrapf (err ,
278
+ return failedResult , errors .Wrapf (err ,
233
279
"Error mounting volume '%s' - cannot access lease file '%s'" ,
234
280
name , leaseFile )
235
281
}
236
282
}
237
283
_ , err = os .Create (leaseFile )
238
284
if err != nil {
239
- return nil , errors .Wrapf (err ,
285
+ return failedResult , errors .Wrapf (err ,
240
286
"Error mounting volume '%s' - cannot create lease file '%s'" ,
241
287
name , lease )
242
288
}
243
289
244
290
if ! isAlreadyMounted {
245
291
err = os .Mkdir (vol .MountPointPath , 0777 )
246
292
if err != nil {
247
- return nil , errors .Wrapf (err ,
293
+ _ = os .Remove (leaseFile ) // attempt to cleanup
294
+ return failedResult , errors .Wrapf (err ,
248
295
"Error mounting volume '%s' - cannot create mount point dir" ,
249
296
name )
250
297
}
251
298
mountCmd := exec .Command ("mount" , vol .DataFilePath , vol .MountPointPath )
252
299
_ , err = mountCmd .Output ()
253
300
if err != nil {
254
- return nil , errors .Wrapf (err ,
301
+ _ = os .Remove (leaseFile ) // attempt to cleanup
302
+ return failedResult , errors .Wrapf (err ,
255
303
"Error mounting volume '%s' - cannot mount vessel '%s' at '%s'" ,
256
304
name , vol .DataFilePath , vol .MountPointPath )
257
305
}
258
306
}
259
- return & vol .MountPointPath , nil
307
+ return vol .MountPointPath , nil
260
308
}
261
309
262
310
func (m Manager ) UnMount (name string , lease string ) error {
0 commit comments