2018-01-09 18:57:14 +00:00
|
|
|
/*
|
|
|
|
Copyright 2017 The Kubernetes Authors.
|
|
|
|
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
you may not use this file except in compliance with the License.
|
|
|
|
You may obtain a copy of the License at
|
|
|
|
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
See the License for the specific language governing permissions and
|
|
|
|
limitations under the License.
|
|
|
|
*/
|
|
|
|
|
|
|
|
package iscsi
|
|
|
|
|
|
|
|
import (
|
|
|
|
"encoding/json"
|
|
|
|
"fmt"
|
|
|
|
"strings"
|
|
|
|
|
2018-03-06 22:33:18 +00:00
|
|
|
"github.com/container-storage-interface/spec/lib/go/csi/v0"
|
2018-01-09 18:57:14 +00:00
|
|
|
"k8s.io/kubernetes/pkg/util/mount"
|
|
|
|
"k8s.io/kubernetes/pkg/volume/util"
|
|
|
|
)
|
|
|
|
|
|
|
|
func getISCSIInfo(req *csi.NodePublishVolumeRequest) (*iscsiDisk, error) {
|
|
|
|
volName := req.GetVolumeId()
|
|
|
|
tp := req.GetVolumeAttributes()["targetPortal"]
|
|
|
|
iqn := req.GetVolumeAttributes()["iqn"]
|
|
|
|
lun := req.GetVolumeAttributes()["lun"]
|
|
|
|
if tp == "" || iqn == "" || lun == "" {
|
|
|
|
return nil, fmt.Errorf("iSCSI target information is missing")
|
|
|
|
}
|
|
|
|
|
|
|
|
portalList := req.GetVolumeAttributes()["portals"]
|
|
|
|
secretParams := req.GetVolumeAttributes()["secret"]
|
|
|
|
secret := parseSecret(secretParams)
|
|
|
|
|
|
|
|
portal := portalMounter(tp)
|
|
|
|
var bkportal []string
|
|
|
|
bkportal = append(bkportal, portal)
|
|
|
|
|
|
|
|
portals := []string{}
|
|
|
|
if err := json.Unmarshal([]byte(portalList), &portals); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
for _, portal := range portals {
|
|
|
|
bkportal = append(bkportal, portalMounter(string(portal)))
|
|
|
|
}
|
|
|
|
|
|
|
|
iface := req.GetVolumeAttributes()["iscsiInterface"]
|
|
|
|
initiatorName := req.GetVolumeAttributes()["initiatorName"]
|
|
|
|
chapDiscovery := false
|
|
|
|
if req.GetVolumeAttributes()["discoveryCHAPAuth"] == "true" {
|
|
|
|
chapDiscovery = true
|
|
|
|
}
|
|
|
|
|
|
|
|
chapSession := false
|
|
|
|
if req.GetVolumeAttributes()["sessionCHAPAuth"] == "true" {
|
|
|
|
chapSession = true
|
|
|
|
}
|
|
|
|
|
|
|
|
return &iscsiDisk{
|
|
|
|
VolName: volName,
|
|
|
|
Portals: bkportal,
|
|
|
|
Iqn: iqn,
|
|
|
|
lun: lun,
|
|
|
|
Iface: iface,
|
|
|
|
chap_discovery: chapDiscovery,
|
|
|
|
chap_session: chapSession,
|
|
|
|
secret: secret,
|
|
|
|
InitiatorName: initiatorName}, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func getISCSIDiskMounter(iscsiInfo *iscsiDisk, req *csi.NodePublishVolumeRequest) *iscsiDiskMounter {
|
|
|
|
readOnly := req.GetReadonly()
|
|
|
|
fsType := req.GetVolumeCapability().GetMount().GetFsType()
|
|
|
|
mountOptions := req.GetVolumeCapability().GetMount().GetMountFlags()
|
|
|
|
|
|
|
|
return &iscsiDiskMounter{
|
|
|
|
iscsiDisk: iscsiInfo,
|
|
|
|
fsType: fsType,
|
|
|
|
readOnly: readOnly,
|
|
|
|
mountOptions: mountOptions,
|
|
|
|
mounter: &mount.SafeFormatAndMount{Interface: mount.New(""), Exec: mount.NewOsExec()},
|
|
|
|
exec: mount.NewOsExec(),
|
|
|
|
targetPath: req.GetTargetPath(),
|
|
|
|
deviceUtil: util.NewDeviceHandler(util.NewIOHandler()),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func getISCSIDiskUnmounter(req *csi.NodeUnpublishVolumeRequest) *iscsiDiskUnmounter {
|
|
|
|
return &iscsiDiskUnmounter{
|
|
|
|
iscsiDisk: &iscsiDisk{
|
|
|
|
VolName: req.GetVolumeId(),
|
|
|
|
},
|
|
|
|
mounter: mount.New(""),
|
|
|
|
exec: mount.NewOsExec(),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func portalMounter(portal string) string {
|
|
|
|
if !strings.Contains(portal, ":") {
|
|
|
|
portal = portal + ":3260"
|
|
|
|
}
|
|
|
|
return portal
|
|
|
|
}
|
|
|
|
|
|
|
|
func parseSecret(secretParams string) map[string]string {
|
|
|
|
var secret map[string]string
|
|
|
|
if err := json.Unmarshal([]byte(secretParams), &secret); err != nil {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
return secret
|
|
|
|
}
|
|
|
|
|
|
|
|
type iscsiDisk struct {
|
|
|
|
Portals []string
|
|
|
|
Iqn string
|
|
|
|
lun string
|
|
|
|
Iface string
|
|
|
|
chap_discovery bool
|
|
|
|
chap_session bool
|
|
|
|
secret map[string]string
|
|
|
|
InitiatorName string
|
|
|
|
VolName string
|
|
|
|
}
|
|
|
|
|
|
|
|
type iscsiDiskMounter struct {
|
|
|
|
*iscsiDisk
|
|
|
|
readOnly bool
|
|
|
|
fsType string
|
|
|
|
mountOptions []string
|
|
|
|
mounter *mount.SafeFormatAndMount
|
|
|
|
exec mount.Exec
|
|
|
|
deviceUtil util.DeviceUtil
|
|
|
|
targetPath string
|
|
|
|
}
|
|
|
|
|
|
|
|
type iscsiDiskUnmounter struct {
|
|
|
|
*iscsiDisk
|
|
|
|
mounter mount.Interface
|
|
|
|
exec mount.Exec
|
|
|
|
}
|