From d60d7e905f5e9c10f238135f5b8b06d1ac053ba9 Mon Sep 17 00:00:00 2001 From: Fabio Bertinatto Date: Fri, 22 Feb 2019 15:49:44 +0100 Subject: [PATCH] Don't fail if iface is being used by iSCSI session --- pkg/volume/iscsi/BUILD | 1 + pkg/volume/iscsi/iscsi_util.go | 14 ++++++++++++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/pkg/volume/iscsi/BUILD b/pkg/volume/iscsi/BUILD index d076457c16..41381d0bb4 100644 --- a/pkg/volume/iscsi/BUILD +++ b/pkg/volume/iscsi/BUILD @@ -27,6 +27,7 @@ go_library( "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", "//vendor/k8s.io/klog:go_default_library", + "//vendor/k8s.io/utils/exec:go_default_library", "//vendor/k8s.io/utils/keymutex:go_default_library", "//vendor/k8s.io/utils/strings:go_default_library", ], diff --git a/pkg/volume/iscsi/iscsi_util.go b/pkg/volume/iscsi/iscsi_util.go index 9e04ab2b5f..b63a4b3b5b 100644 --- a/pkg/volume/iscsi/iscsi_util.go +++ b/pkg/volume/iscsi/iscsi_util.go @@ -34,6 +34,7 @@ import ( "k8s.io/kubernetes/pkg/util/mount" "k8s.io/kubernetes/pkg/volume" volumeutil "k8s.io/kubernetes/pkg/volume/util" + utilexec "k8s.io/utils/exec" ) const ( @@ -51,6 +52,10 @@ const ( // How many seconds to wait for a multipath device if at least two paths are available. multipathDeviceTimeout = 10 + + // 'iscsiadm' error code stating that a session is logged in + // See https://github.com/open-iscsi/open-iscsi/blob/7d121d12ad6ba7783308c25ffd338a9fa0cc402b/include/iscsi_err.h#L37-L38 + iscsiadmErrorSessExists = 15 ) var ( @@ -872,8 +877,13 @@ func cloneIface(b iscsiDiskMounter, newIface string) error { // create new iface out, err = b.exec.Run("iscsiadm", "-m", "iface", "-I", newIface, "-o", "new") if err != nil { - lastErr = fmt.Errorf("iscsi: failed to create new iface: %s (%v)", string(out), err) - return lastErr + exit, ok := err.(utilexec.ExitError) + if ok && exit.ExitStatus() == iscsiadmErrorSessExists { + klog.Infof("iscsi: there is a session already logged in with iface %s", newIface) + } else { + lastErr = fmt.Errorf("iscsi: failed to create new iface: %s (%v)", string(out), err) + return lastErr + } } // update new iface records for key, val := range params {