Change:
What happened: An iSCSI PV with is mounted without these options. What you expected to happen: The volume is mounted with . Anything else we need to know?: iSCSI volume is mounted in and passes as : This can be fixed trivially, however, why is it mounted in at all? There is another mount attempt in , with correct mount options: This code is skipped, because the volume is already mounted. Environment: Kubernetes version (use ): today's master, v1.19.0-alpha.0.781+-dirty , do you remember why we mount stuff in ? iSCSI and FibreChannel does so, the others don't.
/sig storage

Discussion:
"strings" "testing" <del> "k8s.io/utils/exec/testing" </del> <ins> testingexec "k8s.io/utils/exec/testing" </ins> "k8s.io/utils/mount" v1 "k8s.io/api/core/v1"

if err != nil { return "", err } <del> // Simulate the global mount so that the fakeMounter returns the // expected number of mounts for the attached disk. b.mounter.Mount(globalPath, globalPath, b.fsType, nil) </del> fake.attachCalled = true return "", nil }

"k8s.io/klog" "k8s.io/utils/mount" <del> v1 "k8s.io/api/core/v1" </del> "k8s.io/kubernetes/pkg/volume" volumeutil "k8s.io/kubernetes/pkg/volume/util" )

return "", err } <del> // If the volumeMode is 'Block', plugin don't have to format the volume. // The globalPDPath will be created by operationexecutor. Just return devicePath here. klog.V(5).Infof("fc: AttachDisk volumeMode: %s, devicePath: %s", b.volumeMode, devicePath) if b.volumeMode == v1.PersistentVolumeBlock { return devicePath, nil } // mount it globalPDPath := util.MakeGlobalPDName(*b.fcDisk) if err := os.MkdirAll(globalPDPath, 0750); err != nil { return devicePath, fmt.Errorf("fc: failed to mkdir %s, error", globalPDPath) } noMnt, err := b.mounter.IsLikelyNotMountPoint(globalPDPath) if err != nil { return devicePath, fmt.Errorf("Heuristic determination of mount point failed:%v", err) } if !noMnt { klog.Infof("fc: %s already mounted", globalPDPath) return devicePath, nil } err = b.mounter.FormatAndMount(devicePath, globalPDPath, b.fsType, b.mountOptions) if err != nil { return devicePath, fmt.Errorf("fc: failed to mount fc volume %s [%s] to %s, error %v", devicePath, b.fsType, globalPDPath, err) } return devicePath, err </del> <ins> return devicePath, nil </ins> } // DetachDisk removes scsi device file such as /dev/sdX from the node.

"//pkg/kubelet/config:go_default_library", "//pkg/volume:go_default_library", "//pkg/volume/util:go_default_library", <ins> "//pkg/volume/util/types:go_default_library", </ins> "//pkg/volume/util/volumepathhandler:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",

"k8s.io/kubernetes/pkg/kubelet/config" "k8s.io/kubernetes/pkg/volume" volumeutil "k8s.io/kubernetes/pkg/volume/util" <ins> "k8s.io/kubernetes/pkg/volume/util/types" </ins> ) const (

return makeVDPDNameInternal(iscsi.plugin.host, iscsi.Portals[0], iscsi.Iqn, iscsi.Lun, iscsi.Iface) } <del> func (util *ISCSIUtil) persistISCSI(conf iscsiDisk, mnt string) error { </del> <ins> // persistISCSIFile saves iSCSI volume configuration for DetachDisk // into given directory. func (util *ISCSIUtil) persistISCSIFile(conf iscsiDisk, mnt string) error { </ins> file := filepath.Join(mnt, "iscsi.json") fp, err := os.Create(file) if err != nil {

} klog.V(5).Infof("iscsi: AttachDisk devicePath: %s", devicePath) <del> // run global mount path related operations based on volumeMode return globalPDPathOperation(b)(b, devicePath, util) </del> <ins> if err = util.persistISCSI(b); err != nil { // Return uncertain error so kubelet calls Unmount / Unmap when the pod // is deleted. return "", types.NewUncertainProgressError(err.Error()) } return devicePath, nil </ins> } <del> // globalPDPathOperation returns global mount path related operations based on volumeMode. // If the volumeMode is 'Filesystem' or not defined, plugin needs to create a dir, persist // iscsi configurations, and then format/mount the volume. // If the volumeMode is 'Block', plugin creates a dir and persists iscsi configurations. // Since volume type is block, plugin doesn't need to format/mount the volume. func globalPDPathOperation(b iscsiDiskMounter) func(iscsiDiskMounter, string, *ISCSIUtil) (string, error) { </del> <ins> // persistISCSI saves iSCSI volume configuration for DetachDisk into global // mount / map directory. func (util *ISCSIUtil) persistISCSI(b iscsiDiskMounter) error { </ins> klog.V(5).Infof("iscsi: AttachDisk volumeMode: %s", b.volumeMode) <ins> var globalPDPath string </ins> if b.volumeMode == v1.PersistentVolumeBlock { <del> // If the volumeMode is 'Block', plugin don't need to format the volume. return func(b iscsiDiskMounter, devicePath string, util *ISCSIUtil) (string, error) { globalPDPath := b.manager.MakeGlobalVDPDName(*b.iscsiDisk) // Create dir like /var/lib/kubelet/plugins/kubernetes.io/iscsi/volumeDevices/{ifaceName}/{portal-some_iqn-lun-lun_id} if err := os.MkdirAll(globalPDPath, 0750); err != nil { klog.Errorf("iscsi: failed to mkdir %s, error", globalPDPath) return "", err } // Persist iscsi disk config to json file for DetachDisk path util.persistISCSI(*(b.iscsiDisk), globalPDPath) return devicePath, nil } </del> <ins> globalPDPath = b.manager.MakeGlobalVDPDName(*b.iscsiDisk) } else { globalPDPath = b.manager.MakeGlobalPDName(*b.iscsiDisk) </ins> } <del> // If the volumeMode is 'Filesystem', plugin needs to format the volume // and mount it to globalPDPath. return func(b iscsiDiskMounter, devicePath string, util *ISCSIUtil) (string, error) { globalPDPath := b.manager.MakeGlobalPDName(*b.iscsiDisk) notMnt, err := b.mounter.IsLikelyNotMountPoint(globalPDPath) if err != nil && !os.IsNotExist(err) { return "", fmt.Errorf("Heuristic determination of mount point failed:%v", err) } // Return confirmed devicePath to caller if !notMnt { klog.Infof("iscsi: %s already mounted", globalPDPath) return devicePath, nil } // Create dir like /var/lib/kubelet/plugins/kubernetes.io/iscsi/{ifaceName}/{portal-some_iqn-lun-lun_id} if err := os.MkdirAll(globalPDPath, 0750); err != nil { klog.Errorf("iscsi: failed to mkdir %s, error", globalPDPath) return "", err } // Persist iscsi disk config to json file for DetachDisk path util.persistISCSI(*(b.iscsiDisk), globalPDPath) err = b.mounter.FormatAndMount(devicePath, globalPDPath, b.fsType, nil) if err != nil { klog.Errorf("iscsi: failed to mount iscsi volume %s [%s] to %s, error %v", devicePath, b.fsType, globalPDPath, err) } return devicePath, nil </del> <ins> if err := os.MkdirAll(globalPDPath, 0750); err != nil { klog.Errorf("iscsi: failed to mkdir %s, error", globalPDPath) return err </ins> } <ins> // Persist iscsi disk config to json file for DetachDisk path return util.persistISCSIFile(*(b.iscsiDisk), globalPDPath) </ins> } // Delete 1 block device of the form "sd*"