From 255f056614e2f4328fda4539628adbd4e8aee05b Mon Sep 17 00:00:00 2001 From: Leah Hanson Date: Fri, 16 Nov 2018 14:56:23 -0500 Subject: [PATCH] Support retrieving the VM UUID on Windows Signed-off-by: Ben Moss --- pkg/cloudprovider/providers/vsphere/BUILD | 3 ++ .../providers/vsphere/vsphere_util.go | 26 --------- .../providers/vsphere/vsphere_util_linux.go | 53 +++++++++++++++++++ .../vsphere/vsphere_util_unsupported.go | 25 +++++++++ .../providers/vsphere/vsphere_util_windows.go | 37 +++++++++++++ 5 files changed, 118 insertions(+), 26 deletions(-) create mode 100644 pkg/cloudprovider/providers/vsphere/vsphere_util_linux.go create mode 100644 pkg/cloudprovider/providers/vsphere/vsphere_util_unsupported.go create mode 100644 pkg/cloudprovider/providers/vsphere/vsphere_util_windows.go diff --git a/pkg/cloudprovider/providers/vsphere/BUILD b/pkg/cloudprovider/providers/vsphere/BUILD index 3eb30f03eb..11fd2fc5eb 100644 --- a/pkg/cloudprovider/providers/vsphere/BUILD +++ b/pkg/cloudprovider/providers/vsphere/BUILD @@ -13,6 +13,9 @@ go_library( "nodemanager.go", "vsphere.go", "vsphere_util.go", + "vsphere_util_linux.go", + "vsphere_util_unsupported.go", + "vsphere_util_windows.go", ], importpath = "k8s.io/kubernetes/pkg/cloudprovider/providers/vsphere", deps = [ diff --git a/pkg/cloudprovider/providers/vsphere/vsphere_util.go b/pkg/cloudprovider/providers/vsphere/vsphere_util.go index 8ef73978a2..2b1364b843 100644 --- a/pkg/cloudprovider/providers/vsphere/vsphere_util.go +++ b/pkg/cloudprovider/providers/vsphere/vsphere_util.go @@ -20,7 +20,6 @@ import ( "context" "errors" "fmt" - "io/ioutil" "os" "path/filepath" "regexp" @@ -44,8 +43,6 @@ const ( Folder = "Folder" VirtualMachine = "VirtualMachine" DummyDiskName = "kube-dummyDisk.vmdk" - UUIDPath = "/sys/class/dmi/id/product_serial" - UUIDPrefix = "VMware-" ProviderPrefix = "vsphere://" vSphereConfFileEnvVar = "VSPHERE_CONF_FILE" ) @@ -534,29 +531,6 @@ func (vs *VSphere) GetNodeNameFromProviderID(providerID string) (string, error) return nodeName, nil } -func GetVMUUID() (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) - } - // 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 -} - func GetUUIDFromProviderID(providerID string) string { return strings.TrimPrefix(providerID, ProviderPrefix) } diff --git a/pkg/cloudprovider/providers/vsphere/vsphere_util_linux.go b/pkg/cloudprovider/providers/vsphere/vsphere_util_linux.go new file mode 100644 index 0000000000..596bf9a106 --- /dev/null +++ b/pkg/cloudprovider/providers/vsphere/vsphere_util_linux.go @@ -0,0 +1,53 @@ +// +build linux + +/* +Copyright 2018 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 + +import ( + "fmt" + "io/ioutil" + "strings" +) + +const ( + UUIDPath = "/sys/class/dmi/id/product_serial" + UUIDPrefix = "VMware-" +) + +func GetVMUUID() (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) + } + // 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 +} diff --git a/pkg/cloudprovider/providers/vsphere/vsphere_util_unsupported.go b/pkg/cloudprovider/providers/vsphere/vsphere_util_unsupported.go new file mode 100644 index 0000000000..ca6eb66b23 --- /dev/null +++ b/pkg/cloudprovider/providers/vsphere/vsphere_util_unsupported.go @@ -0,0 +1,25 @@ +// +build !windows,!linux + +/* +Copyright 2018 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 + +import "fmt" + +func GetVMUUID() (string, error) { + return "", fmt.Errorf("Retrieving VM UUID on this build is not implemented.") +} diff --git a/pkg/cloudprovider/providers/vsphere/vsphere_util_windows.go b/pkg/cloudprovider/providers/vsphere/vsphere_util_windows.go new file mode 100644 index 0000000000..9b27642787 --- /dev/null +++ b/pkg/cloudprovider/providers/vsphere/vsphere_util_windows.go @@ -0,0 +1,37 @@ +// +build windows + +/* +Copyright 2018 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 + +import ( + "fmt" + "os/exec" + "strings" +) + +func GetVMUUID() (string, error) { + result, err := exec.Command("wmic", "csproduct", "get", "UUID").Output() + if err != nil { + return "", fmt.Errorf("error retrieving vm uuid: %s", err) + } + fields := strings.Fields(string(result)) + if len(fields) != 2 { + return "", fmt.Errorf("received unexpected value retrieving vm uuid: %q", string(result)) + } + return fields[1], nil +}