mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-25 12:43:23 +00:00
Merge pull request #80911 from pivotal-k8s/vsphere-windows-volumes
Add support for vSphere volume mount/attach on Windows
This commit is contained in:
commit
77277d3abf
@ -14,6 +14,9 @@ go_library(
|
|||||||
"vsphere_volume.go",
|
"vsphere_volume.go",
|
||||||
"vsphere_volume_block.go",
|
"vsphere_volume_block.go",
|
||||||
"vsphere_volume_util.go",
|
"vsphere_volume_util.go",
|
||||||
|
"vsphere_volume_util_linux.go",
|
||||||
|
"vsphere_volume_util_unsupported.go",
|
||||||
|
"vsphere_volume_util_windows.go",
|
||||||
],
|
],
|
||||||
importpath = "k8s.io/kubernetes/pkg/volume/vsphere_volume",
|
importpath = "k8s.io/kubernetes/pkg/volume/vsphere_volume",
|
||||||
deps = [
|
deps = [
|
||||||
|
@ -22,6 +22,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
"runtime"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"k8s.io/api/core/v1"
|
"k8s.io/api/core/v1"
|
||||||
@ -207,12 +208,17 @@ func (plugin *vsphereVolumePlugin) GetDeviceMountRefs(deviceMountPath string) ([
|
|||||||
|
|
||||||
// MountDevice mounts device to global mount point.
|
// MountDevice mounts device to global mount point.
|
||||||
func (attacher *vsphereVMDKAttacher) MountDevice(spec *volume.Spec, devicePath string, deviceMountPath string) error {
|
func (attacher *vsphereVMDKAttacher) MountDevice(spec *volume.Spec, devicePath string, deviceMountPath string) error {
|
||||||
|
klog.Info("vsphere MountDevice", devicePath, deviceMountPath)
|
||||||
mounter := attacher.host.GetMounter(vsphereVolumePluginName)
|
mounter := attacher.host.GetMounter(vsphereVolumePluginName)
|
||||||
notMnt, err := mounter.IsLikelyNotMountPoint(deviceMountPath)
|
notMnt, err := mounter.IsLikelyNotMountPoint(deviceMountPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if os.IsNotExist(err) {
|
if os.IsNotExist(err) {
|
||||||
if err := os.MkdirAll(deviceMountPath, 0750); err != nil {
|
dir := deviceMountPath
|
||||||
klog.Errorf("Failed to create directory at %#v. err: %s", deviceMountPath, err)
|
if runtime.GOOS == "windows" {
|
||||||
|
dir = filepath.Dir(deviceMountPath)
|
||||||
|
}
|
||||||
|
if err := os.MkdirAll(dir, 0750); err != nil {
|
||||||
|
klog.Errorf("Failed to create directory at %#v. err: %s", dir, err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
notMnt = true
|
notMnt = true
|
||||||
|
@ -22,6 +22,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
"runtime"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"k8s.io/api/core/v1"
|
"k8s.io/api/core/v1"
|
||||||
@ -241,9 +242,13 @@ func (b *vsphereVolumeMounter) SetUpAt(dir string, mounterArgs volume.MounterArg
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := os.MkdirAll(dir, 0750); err != nil {
|
if runtime.GOOS != "windows" {
|
||||||
klog.V(4).Infof("Could not create directory %s: %v", dir, err)
|
// On Windows, Mount will create the parent of dir and mklink (create a symbolic link) at dir later, so don't create a
|
||||||
return err
|
// directory at dir now. Otherwise mklink will error: "Cannot create a file when that file already exists".
|
||||||
|
if err := os.MkdirAll(dir, 0750); err != nil {
|
||||||
|
klog.Errorf("Could not create directory %s: %v", dir, err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
options := []string{"bind"}
|
options := []string{"bind"}
|
||||||
|
@ -29,7 +29,6 @@ import (
|
|||||||
cloudprovider "k8s.io/cloud-provider"
|
cloudprovider "k8s.io/cloud-provider"
|
||||||
volumehelpers "k8s.io/cloud-provider/volume/helpers"
|
volumehelpers "k8s.io/cloud-provider/volume/helpers"
|
||||||
"k8s.io/klog"
|
"k8s.io/klog"
|
||||||
"k8s.io/kubernetes/pkg/util/mount"
|
|
||||||
"k8s.io/kubernetes/pkg/volume"
|
"k8s.io/kubernetes/pkg/volume"
|
||||||
volumeutil "k8s.io/kubernetes/pkg/volume/util"
|
volumeutil "k8s.io/kubernetes/pkg/volume/util"
|
||||||
"k8s.io/legacy-cloud-providers/vsphere"
|
"k8s.io/legacy-cloud-providers/vsphere"
|
||||||
@ -77,16 +76,6 @@ type VolumeSpec struct {
|
|||||||
Labels map[string]string
|
Labels map[string]string
|
||||||
}
|
}
|
||||||
|
|
||||||
func verifyDevicePath(path string) (string, error) {
|
|
||||||
if pathExists, err := mount.PathExists(path); err != nil {
|
|
||||||
return "", fmt.Errorf("Error checking if path exists: %v", err)
|
|
||||||
} else if pathExists {
|
|
||||||
return path, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
return "", nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// CreateVolume creates a vSphere volume.
|
// CreateVolume creates a vSphere volume.
|
||||||
func (util *VsphereDiskUtil) CreateVolume(v *vsphereVolumeProvisioner, selectedNode *v1.Node, selectedZone []string) (volSpec *VolumeSpec, err error) {
|
func (util *VsphereDiskUtil) CreateVolume(v *vsphereVolumeProvisioner, selectedNode *v1.Node, selectedZone []string) (volSpec *VolumeSpec, err error) {
|
||||||
var fstype string
|
var fstype string
|
||||||
|
35
pkg/volume/vsphere_volume/vsphere_volume_util_linux.go
Normal file
35
pkg/volume/vsphere_volume/vsphere_volume_util_linux.go
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
// +build linux
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright 2019 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 vsphere_volume
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"k8s.io/kubernetes/pkg/util/mount"
|
||||||
|
)
|
||||||
|
|
||||||
|
func verifyDevicePath(path string) (string, error) {
|
||||||
|
if pathExists, err := mount.PathExists(path); err != nil {
|
||||||
|
return "", fmt.Errorf("Error checking if path exists: %v", err)
|
||||||
|
} else if pathExists {
|
||||||
|
return path, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return "", nil
|
||||||
|
}
|
25
pkg/volume/vsphere_volume/vsphere_volume_util_unsupported.go
Normal file
25
pkg/volume/vsphere_volume/vsphere_volume_util_unsupported.go
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
// +build !linux,!windows
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright 2019 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 vsphere_volume
|
||||||
|
|
||||||
|
import "errors"
|
||||||
|
|
||||||
|
func verifyDevicePath(path string) (string, error) {
|
||||||
|
return "", errors.New("unsupported")
|
||||||
|
}
|
63
pkg/volume/vsphere_volume/vsphere_volume_util_windows.go
Normal file
63
pkg/volume/vsphere_volume/vsphere_volume_util_windows.go
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
// +build windows
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright 2019 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 vsphere_volume
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"os/exec"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"k8s.io/klog"
|
||||||
|
)
|
||||||
|
|
||||||
|
type diskInfoResult struct {
|
||||||
|
Number json.Number
|
||||||
|
SerialNumber string
|
||||||
|
}
|
||||||
|
|
||||||
|
func verifyDevicePath(path string) (string, error) {
|
||||||
|
if !strings.Contains(path, diskByIDPath) {
|
||||||
|
// If this volume has already been mounted then
|
||||||
|
// its devicePath will have already been converted to a disk number
|
||||||
|
klog.V(4).Infof("Found vSphere disk attached with disk number %v", path)
|
||||||
|
return path, nil
|
||||||
|
}
|
||||||
|
cmd := exec.Command("powershell", "/c", "Get-Disk | Select Number, SerialNumber | ConvertTo-JSON")
|
||||||
|
output, err := cmd.Output()
|
||||||
|
if err != nil {
|
||||||
|
klog.Errorf("Get-Disk failed, error: %v, output: %q", err, string(output))
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
var results []diskInfoResult
|
||||||
|
if err = json.Unmarshal(output, &results); err != nil {
|
||||||
|
klog.Errorf("Failed to unmarshal Get-Disk json, output: %q", string(output))
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
serialNumber := strings.TrimPrefix(path, diskByIDPath+diskSCSIPrefix)
|
||||||
|
for _, v := range results {
|
||||||
|
if v.SerialNumber == serialNumber {
|
||||||
|
klog.V(4).Infof("Found vSphere disk attached with serial %v", serialNumber)
|
||||||
|
return v.Number.String(), nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return "", fmt.Errorf("unable to find vSphere disk with serial %v", serialNumber)
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user