|
|
@@ -14,6 +14,7 @@ import (
|
|
|
// Vendors
|
|
|
"iscsi"
|
|
|
"util"
|
|
|
+
|
|
|
"github.com/Sirupsen/logrus"
|
|
|
"github.com/docker/go-plugins-helpers/volume"
|
|
|
)
|
|
|
@@ -21,7 +22,7 @@ import (
|
|
|
var iSCSI iscsi.ISCSIPlugin
|
|
|
|
|
|
type iscsiVolume struct {
|
|
|
- Host string
|
|
|
+ Host string
|
|
|
TargetIQN string
|
|
|
|
|
|
Options []string
|
|
|
@@ -269,6 +270,7 @@ func (d *iscsiDriver) Capabilities() *volume.CapabilitiesResponse {
|
|
|
// Local Functions
|
|
|
func (d *iscsiDriver) mountVolume(v *iscsiVolume) error {
|
|
|
// Discover iSCSI LUNs
|
|
|
+ logrus.Debugf("Discovering %s", v.Host)
|
|
|
err := iSCSI.DiscoverLUNs(v.Host)
|
|
|
if err != nil {
|
|
|
return err
|
|
|
@@ -276,6 +278,7 @@ func (d *iscsiDriver) mountVolume(v *iscsiVolume) error {
|
|
|
|
|
|
if !iSCSI.TargetLoggedIn(v.TargetIQN) {
|
|
|
// Login to iSCSI Target
|
|
|
+ logrus.Debugf("Logging in %s", v.TargetIQN)
|
|
|
err = iSCSI.LoginTarget(v.TargetIQN, v.Host)
|
|
|
if err != nil {
|
|
|
return err
|
|
|
@@ -318,6 +321,7 @@ func (d *iscsiDriver) mountVolume(v *iscsiVolume) error {
|
|
|
device := strings.TrimSuffix(out, "\n")
|
|
|
|
|
|
// FSCK
|
|
|
+ logrus.Debugf("Checking %s", device)
|
|
|
cmd = "e2fsck -p " + device
|
|
|
out, errMsg = util.ExecuteCommandString(cmd)
|
|
|
|
|
|
@@ -330,6 +334,7 @@ func (d *iscsiDriver) mountVolume(v *iscsiVolume) error {
|
|
|
}
|
|
|
|
|
|
// Mount
|
|
|
+ logrus.Debugf("Mounting %s", device)
|
|
|
cmd = "mount -o discard " + device + " " + v.Mountpoint
|
|
|
out, errMsg = util.ExecuteCommandString(cmd)
|
|
|
|
|
|
@@ -341,14 +346,47 @@ func (d *iscsiDriver) mountVolume(v *iscsiVolume) error {
|
|
|
return err
|
|
|
}
|
|
|
|
|
|
+ // Get MountPoint
|
|
|
+ cmd = "chroot /host docker plugin ls --no-trunc | grep volume-iscsi | awk '{print $1;}' | tr -d '\n'"
|
|
|
+ out, errMsg = util.ExecuteCommandString(cmd)
|
|
|
+ mountPath := "/opt/docker/system/docker/plugins/" + out + "/propagated-mount/"
|
|
|
+ mountPoint := strings.Replace(v.Mountpoint, "/var/lib/docker/volumes/", mountPath, -1)
|
|
|
+
|
|
|
+ // Link
|
|
|
+ logrus.Debugf("Linking %s", v.TargetIQN)
|
|
|
+ cmd = "ln -s " + mountPoint + " /host/mnt/iSCSI_" + v.TargetIQN
|
|
|
+ out, errMsg = util.ExecuteCommandString(cmd)
|
|
|
+
|
|
|
+ if len(out) > 0 {
|
|
|
+ logrus.Debug(out)
|
|
|
+ }
|
|
|
+ if len(errMsg) > 0 {
|
|
|
+ err := fmt.Errorf("Unable to Link to Mounted Volume: %s", errMsg)
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
return nil
|
|
|
}
|
|
|
|
|
|
func (d *iscsiDriver) unmountVolume(v *iscsiVolume) error {
|
|
|
- // Unmount
|
|
|
- cmd := "umount " + v.Mountpoint
|
|
|
+ // Unlink
|
|
|
+ logrus.Debugf("Unlinking %s", v.TargetIQN)
|
|
|
+ cmd := "rm -f /host/mnt/iSCSI_" + v.TargetIQN
|
|
|
out, errMsg := util.ExecuteCommandString(cmd)
|
|
|
|
|
|
+ if len(out) > 0 {
|
|
|
+ logrus.Debug(out)
|
|
|
+ }
|
|
|
+ if len(errMsg) > 0 {
|
|
|
+ err := fmt.Errorf("Unable to Remove Link: %s", errMsg)
|
|
|
+ logrus.Info(err)
|
|
|
+ }
|
|
|
+
|
|
|
+ // Unmount
|
|
|
+ logrus.Debugf("Unmounting %s", v.Mountpoint)
|
|
|
+ cmd = "umount " + v.Mountpoint
|
|
|
+ out, errMsg = util.ExecuteCommandString(cmd)
|
|
|
+
|
|
|
if len(out) > 0 {
|
|
|
logrus.Debug(out)
|
|
|
}
|
|
|
@@ -359,6 +397,7 @@ func (d *iscsiDriver) unmountVolume(v *iscsiVolume) error {
|
|
|
|
|
|
if iSCSI.TargetLoggedIn(v.TargetIQN) {
|
|
|
// Logout from iSCSI Target
|
|
|
+ logrus.Debugf("Logging out %s", v.TargetIQN)
|
|
|
err := iSCSI.LogoutTarget(v.TargetIQN, v.Host)
|
|
|
if err != nil {
|
|
|
return err
|
|
|
@@ -380,4 +419,3 @@ func (d *iscsiDriver) saveState() {
|
|
|
logrus.WithField("savestate", d.statePath).Error(err)
|
|
|
}
|
|
|
}
|
|
|
-
|