Skip to content

Commit

Permalink
Merge pull request #74919 from pivotal-k8s/vsphere-windows-uuid
Browse files Browse the repository at this point in the history
Fix Windows to read VM UUIDs from serial numbers
  • Loading branch information
k8s-ci-robot committed Mar 25, 2019
2 parents 9518d52 + 33bfe74 commit e1f8d1e
Show file tree
Hide file tree
Showing 4 changed files with 41 additions and 31 deletions.
23 changes: 23 additions & 0 deletions pkg/cloudprovider/providers/vsphere/vsphere_util.go
Expand Up @@ -48,6 +48,7 @@ const (
DummyDiskName = "kube-dummyDisk.vmdk"
ProviderPrefix = "vsphere://"
vSphereConfFileEnvVar = "VSPHERE_CONF_FILE"
UUIDPrefix = "VMware-"
)

// GetVSphere reads vSphere configuration from system environment and construct vSphere object
Expand Down Expand Up @@ -675,3 +676,25 @@ func GetNodeUUID(node *v1.Node) (string, error) {
}
return GetUUIDFromProviderID(node.Spec.ProviderID), nil
}

func GetVMUUID() (string, error) {
uuidFromFile, err := getRawUUID()
if err != nil {
return "", fmt.Errorf("error retrieving vm uuid: %s", err)
}
//strip leading and trailing white space and new line char
uuid := strings.TrimSpace(uuidFromFile)
// check the uuid starts with "VMware-"
if !strings.HasPrefix(uuid, UUIDPrefix) {
return "", fmt.Errorf("Failed to match Prefix, UUID read from the file is %v", uuidFromFile)
}
// Strip the prefix and white spaces and -
uuid = strings.Replace(uuid[len(UUIDPrefix):(len(uuid))], " ", "", -1)
uuid = strings.Replace(uuid, "-", "", -1)
if len(uuid) != 32 {
return "", fmt.Errorf("Length check failed, UUID read from the file is %v", uuidFromFile)
}
// need to add dashes, e.g. "564d395e-d807-e18a-cb25-b79f65eb2b9f"
uuid = fmt.Sprintf("%s-%s-%s-%s-%s", uuid[0:8], uuid[8:12], uuid[12:16], uuid[16:20], uuid[20:32])
return uuid, nil
}
28 changes: 4 additions & 24 deletions pkg/cloudprovider/providers/vsphere/vsphere_util_linux.go
Expand Up @@ -19,35 +19,15 @@ limitations under the License.
package vsphere

import (
"fmt"
"io/ioutil"
"strings"
)

const (
UUIDPath = "/sys/class/dmi/id/product_serial"
UUIDPrefix = "VMware-"
)
const UUIDPath = "/sys/class/dmi/id/product_serial"

func GetVMUUID() (string, error) {
func getRawUUID() (string, error) {
id, err := ioutil.ReadFile(UUIDPath)
if err != nil {
return "", fmt.Errorf("error retrieving vm uuid: %s", err)
}
uuidFromFile := string(id[:])
//strip leading and trailing white space and new line char
uuid := strings.TrimSpace(uuidFromFile)
// check the uuid starts with "VMware-"
if !strings.HasPrefix(uuid, UUIDPrefix) {
return "", fmt.Errorf("Failed to match Prefix, UUID read from the file is %v", uuidFromFile)
}
// Strip the prefix and white spaces and -
uuid = strings.Replace(uuid[len(UUIDPrefix):(len(uuid))], " ", "", -1)
uuid = strings.Replace(uuid, "-", "", -1)
if len(uuid) != 32 {
return "", fmt.Errorf("Length check failed, UUID read from the file is %v", uuidFromFile)
return "", err
}
// need to add dashes, e.g. "564d395e-d807-e18a-cb25-b79f65eb2b9f"
uuid = fmt.Sprintf("%s-%s-%s-%s-%s", uuid[0:8], uuid[8:12], uuid[12:16], uuid[16:20], uuid[20:32])
return uuid, nil
return string(id), nil
}
Expand Up @@ -20,6 +20,6 @@ package vsphere

import "fmt"

func GetVMUUID() (string, error) {
func getRawUUID() (string, error) {
return "", fmt.Errorf("Retrieving VM UUID on this build is not implemented.")
}
19 changes: 13 additions & 6 deletions pkg/cloudprovider/providers/vsphere/vsphere_util_windows.go
Expand Up @@ -24,14 +24,21 @@ import (
"strings"
)

func GetVMUUID() (string, error) {
result, err := exec.Command("wmic", "csproduct", "get", "UUID").Output()
func getRawUUID() (string, error) {
result, err := exec.Command("wmic", "bios", "get", "serialnumber").Output()
if err != nil {
return "", fmt.Errorf("error retrieving vm uuid: %s", err)
return "", err
}
fields := strings.Fields(string(result))
if len(fields) != 2 {
lines := strings.FieldsFunc(string(result), func(r rune) bool {
switch r {
case '\n', '\r':
return true
default:
return false
}
})
if len(lines) != 2 {
return "", fmt.Errorf("received unexpected value retrieving vm uuid: %q", string(result))
}
return fields[1], nil
return lines[1], nil
}

0 comments on commit e1f8d1e

Please sign in to comment.