123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- // +build windows
- /*
- 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 azure_dd
- import (
- "encoding/json"
- "fmt"
- "strconv"
- "strings"
- "k8s.io/klog"
- "k8s.io/kubernetes/pkg/util/mount"
- )
- func scsiHostRescan(io ioHandler, exec mount.Exec) {
- cmd := "Update-HostStorageCache"
- output, err := exec.Run("powershell", "/c", cmd)
- if err != nil {
- klog.Errorf("Update-HostStorageCache failed in scsiHostRescan, error: %v, output: %q", err, string(output))
- }
- }
- // search Windows disk number by LUN
- func findDiskByLun(lun int, iohandler ioHandler, exec mount.Exec) (string, error) {
- cmd := `Get-Disk | select number, location | ConvertTo-Json`
- output, err := exec.Run("powershell", "/c", cmd)
- if err != nil {
- klog.Errorf("Get-Disk failed in findDiskByLun, error: %v, output: %q", err, string(output))
- return "", err
- }
- if len(output) < 10 {
- return "", fmt.Errorf("Get-Disk output is too short, output: %q", string(output))
- }
- var data []map[string]interface{}
- if err = json.Unmarshal(output, &data); err != nil {
- klog.Errorf("Get-Disk output is not a json array, output: %q", string(output))
- return "", err
- }
- for _, v := range data {
- if jsonLocation, ok := v["location"]; ok {
- if location, ok := jsonLocation.(string); ok {
- if !strings.Contains(location, " LUN ") {
- continue
- }
- arr := strings.Split(location, " ")
- arrLen := len(arr)
- if arrLen < 3 {
- klog.Warningf("unexpected json structure from Get-Disk, location: %q", jsonLocation)
- continue
- }
- klog.V(4).Infof("found a disk, locatin: %q, lun: %q", location, arr[arrLen-1])
- //last element of location field is LUN number, e.g.
- // "location": "Integrated : Adapter 3 : Port 0 : Target 0 : LUN 1"
- l, err := strconv.Atoi(arr[arrLen-1])
- if err != nil {
- klog.Warningf("cannot parse element from data structure, location: %q, element: %q", location, arr[arrLen-1])
- continue
- }
- if l == lun {
- klog.V(4).Infof("found a disk and lun, locatin: %q, lun: %d", location, lun)
- if d, ok := v["number"]; ok {
- if diskNum, ok := d.(float64); ok {
- klog.V(2).Infof("azureDisk Mount: got disk number(%d) by LUN(%d)", int(diskNum), lun)
- return fmt.Sprintf(winDiskNumFormat, int(diskNum)), nil
- }
- klog.Warningf("LUN(%d) found, but could not get disk number(%q), location: %q", lun, d, location)
- }
- return "", fmt.Errorf("LUN(%d) found, but could not get disk number, location: %q", lun, location)
- }
- }
- }
- }
- return "", nil
- }
- func formatIfNotFormatted(disk string, fstype string, exec mount.Exec) {
- if err := mount.ValidateDiskNumber(disk); err != nil {
- klog.Errorf("azureDisk Mount: formatIfNotFormatted failed, err: %v\n", err)
- return
- }
- if len(fstype) == 0 {
- // Use 'NTFS' as the default
- fstype = "NTFS"
- }
- cmd := fmt.Sprintf("Get-Disk -Number %s | Where partitionstyle -eq 'raw' | Initialize-Disk -PartitionStyle MBR -PassThru", disk)
- cmd += fmt.Sprintf(" | New-Partition -AssignDriveLetter -UseMaximumSize | Format-Volume -FileSystem %s -Confirm:$false", fstype)
- output, err := exec.Run("powershell", "/c", cmd)
- if err != nil {
- klog.Errorf("azureDisk Mount: Get-Disk failed, error: %v, output: %q", err, string(output))
- } else {
- klog.Infof("azureDisk Mount: Disk successfully formatted, disk: %q, fstype: %q\n", disk, fstype)
- }
- }
|