From c15336e97aef45e05e8027a9e2858d36ce451df6 Mon Sep 17 00:00:00 2001 From: Abrar Shivani Date: Thu, 19 Apr 2018 14:24:40 -0700 Subject: [PATCH] Fix upgrade to Kubernetes v1.9.3+ --- pkg/cloudprovider/providers/vsphere/BUILD | 1 + .../providers/vsphere/nodemanager.go | 6 ++- .../providers/vsphere/vsphere.go | 3 +- .../providers/vsphere/vsphere_util.go | 41 +++++++++++++++++-- 4 files changed, 46 insertions(+), 5 deletions(-) diff --git a/pkg/cloudprovider/providers/vsphere/BUILD b/pkg/cloudprovider/providers/vsphere/BUILD index dad06a27135..0566d806411 100644 --- a/pkg/cloudprovider/providers/vsphere/BUILD +++ b/pkg/cloudprovider/providers/vsphere/BUILD @@ -20,6 +20,7 @@ go_library( "//pkg/cloudprovider/providers/vsphere/vclib:go_default_library", "//pkg/cloudprovider/providers/vsphere/vclib/diskmanagers:go_default_library", "//pkg/controller:go_default_library", + "//pkg/util/version:go_default_library", "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/vmware/govmomi/vim25:go_default_library", "//vendor/github.com/vmware/govmomi/vim25/mo:go_default_library", diff --git a/pkg/cloudprovider/providers/vsphere/nodemanager.go b/pkg/cloudprovider/providers/vsphere/nodemanager.go index ed927d9e0b7..4979d605871 100644 --- a/pkg/cloudprovider/providers/vsphere/nodemanager.go +++ b/pkg/cloudprovider/providers/vsphere/nodemanager.go @@ -76,7 +76,11 @@ func (nm *NodeManager) DiscoverNode(node *v1.Node) error { var globalErr *error queueChannel = make(chan *VmSearch, QUEUE_SIZE) - nodeUUID := GetUUIDFromProviderID(node.Spec.ProviderID) + nodeUUID, err := GetNodeUUID(node) + if err != nil { + glog.Errorf("Node Discovery failed to get node uuid for node %s with error: %v", node.Name, err) + return err + } glog.V(4).Infof("Discovering node %s with uuid %s", node.ObjectMeta.Name, nodeUUID) diff --git a/pkg/cloudprovider/providers/vsphere/vsphere.go b/pkg/cloudprovider/providers/vsphere/vsphere.go index 0aa61e3f4f8..47f18701409 100644 --- a/pkg/cloudprovider/providers/vsphere/vsphere.go +++ b/pkg/cloudprovider/providers/vsphere/vsphere.go @@ -587,7 +587,8 @@ func (vs *VSphere) InstanceExistsByProviderID(ctx context.Context, providerID st return false, err } for _, node := range nodes { - if node.VMUUID == GetUUIDFromProviderID(providerID) { + // ProviderID is UUID for nodes v1.9.3+ + if node.VMUUID == GetUUIDFromProviderID(providerID) || node.NodeName == providerID { nodeName = node.NodeName break } diff --git a/pkg/cloudprovider/providers/vsphere/vsphere_util.go b/pkg/cloudprovider/providers/vsphere/vsphere_util.go index 20077a43ccc..bc575838e84 100644 --- a/pkg/cloudprovider/providers/vsphere/vsphere_util.go +++ b/pkg/cloudprovider/providers/vsphere/vsphere_util.go @@ -29,13 +29,14 @@ import ( "fmt" - "path/filepath" - "github.com/vmware/govmomi/vim25/mo" "io/ioutil" + "k8s.io/api/core/v1" k8stypes "k8s.io/apimachinery/pkg/types" "k8s.io/kubernetes/pkg/cloudprovider/providers/vsphere/vclib" "k8s.io/kubernetes/pkg/cloudprovider/providers/vsphere/vclib/diskmanagers" + "k8s.io/kubernetes/pkg/util/version" + "path/filepath" ) const ( @@ -472,7 +473,12 @@ func (vs *VSphere) checkDiskAttached(ctx context.Context, nodes []k8stypes.NodeN if err != nil { return nodesToRetry, err } - nodeUUID := strings.ToLower(GetUUIDFromProviderID(node.Spec.ProviderID)) + nodeUUID, err := GetNodeUUID(&node) + if err != nil { + glog.Errorf("Node Discovery failed to get node uuid for node %s with error: %v", node.Name, err) + return nodesToRetry, err + } + nodeUUID = strings.ToLower(nodeUUID) glog.V(9).Infof("Verifying volume for node %s with nodeuuid %q: %s", nodeName, nodeUUID, vmMoMap) vclib.VerifyVolumePathsForVM(vmMoMap[nodeUUID], nodeVolumes[nodeName], convertToString(nodeName), attached) } @@ -542,3 +548,32 @@ func GetVMUUID() (string, error) { func GetUUIDFromProviderID(providerID string) string { return strings.TrimPrefix(providerID, ProviderPrefix) } + +func IsUUIDSupportedNode(node *v1.Node) (bool, error) { + newVersion, err := version.ParseSemantic("v1.9.4") + if err != nil { + glog.Errorf("Failed to determine whether node %+v is old with error %v", node, err) + return false, err + } + nodeVersion, err := version.ParseSemantic(node.Status.NodeInfo.KubeletVersion) + if err != nil { + glog.Errorf("Failed to determine whether node %+v is old with error %v", node, err) + return false, err + } + if nodeVersion.LessThan(newVersion) { + return true, nil + } + return false, nil +} + +func GetNodeUUID(node *v1.Node) (string, error) { + oldNode, err := IsUUIDSupportedNode(node) + if err != nil { + glog.Errorf("Failed to get node UUID for node %+v with error %v", node, err) + return "", err + } + if oldNode { + return node.Status.NodeInfo.SystemUUID, nil + } + return GetUUIDFromProviderID(node.Spec.ProviderID), nil +}