-
Notifications
You must be signed in to change notification settings - Fork 0
/
unmount.go
96 lines (75 loc) · 2.89 KB
/
unmount.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
package s3driver
import (
"code.cloudfoundry.org/dockerdriver"
"code.cloudfoundry.org/dockerdriver/driverhttp"
"code.cloudfoundry.org/lager"
"errors"
"fmt"
"github.com/kahing/goofys/api"
)
func (d *S3Driver) Unmount(env dockerdriver.Env, unmountRequest dockerdriver.UnmountRequest) dockerdriver.ErrorResponse {
logger := env.Logger().Session("unmount", lager.Data{"volume": unmountRequest.Name})
if unmountRequest.Name == "" {
return dockerdriver.ErrorResponse{Err: "Missing mandatory 'volume_name'"}
}
d.volumesLock.Lock()
defer d.volumesLock.Unlock()
volume, ok := d.volumes[unmountRequest.Name]
if !ok {
logger.Error("failed-no-such-volume-found", fmt.Errorf("could not find volume %s", unmountRequest.Name))
return dockerdriver.ErrorResponse{Err: fmt.Sprintf("Volume '%s' not found", unmountRequest.Name)}
}
if volume.Mountpoint == "" {
errText := "Volume not previously mounted"
logger.Error("failed-mountpoint-not-assigned", errors.New(errText))
return dockerdriver.ErrorResponse{Err: errText}
}
if volume.MountCount == 1 {
if err := d.unmount(driverhttp.EnvWithLogger(logger, env).Logger(), unmountRequest.Name, volume.Mountpoint, volume.Name); err != nil {
return dockerdriver.ErrorResponse{Err: err.Error()}
}
}
volume.MountCount--
logger.Info("volume-ref-count-decremented", lager.Data{"name": volume.Name, "count": volume.MountCount})
if volume.MountCount < 1 {
delete(d.volumes, unmountRequest.Name)
}
if err := d.persistState(driverhttp.EnvWithLogger(logger, env)); err != nil {
return dockerdriver.ErrorResponse{Err: fmt.Sprintf("failed to persist state when unmounting: %s", err.Error())}
}
return dockerdriver.ErrorResponse{}
}
func (d *S3Driver) unmount(logger lager.Logger, name, mountPath, volumeName string) error {
logger = logger.Session("unmount")
logger.Info("start")
defer logger.Info("end")
exists, err := d.mountChecker.Exists(mountPath)
if err != nil {
logger.Error("failed-proc-mounts-check", err, lager.Data{"mountpoint": mountPath})
return err
}
if !exists {
err := d.os.Remove(mountPath)
if err != nil {
errText := fmt.Sprintf("Volume %s does not exist (path: %s) and unable to remove mount directory", name, mountPath)
logger.Info("mountpoint-not-found", lager.Data{"msg": errText})
return errors.New(errText)
}
errText := fmt.Sprintf("Volume %s does not exist (path: %s)", name, mountPath)
logger.Info("mountpoint-not-found", lager.Data{"msg": errText})
return errors.New(errText)
}
logger.Info("unmount-volume-folder", lager.Data{"mountpath": mountPath})
err = goofys.TryUnmount(mountPath)
if err != nil {
logger.Error("unmount-failed", err)
return fmt.Errorf("Error unmounting volume: %s", err.Error())
}
err = d.os.Remove(mountPath)
if err != nil {
logger.Error("remove-mountpoint-failed", err)
return fmt.Errorf("Error removing mountpoint: %s", err.Error())
}
logger.Info("unmounted-volume")
return nil
}