From 94b45a9e847a002bb6f6e43a11dcf83782e103df Mon Sep 17 00:00:00 2001 From: Abrar Shivani Date: Mon, 20 Nov 2017 21:38:20 -0800 Subject: [PATCH] Fix session out issue while creating volume and error message coming up while attaching the volume --- .../providers/vsphere/nodemanager.go | 23 +++++++++++++++++-- .../providers/vsphere/vsphere.go | 14 +++++++---- .../providers/vsphere/vsphere_util.go | 11 ++++++--- 3 files changed, 39 insertions(+), 9 deletions(-) diff --git a/pkg/cloudprovider/providers/vsphere/nodemanager.go b/pkg/cloudprovider/providers/vsphere/nodemanager.go index 493ea61045..da84998942 100644 --- a/pkg/cloudprovider/providers/vsphere/nodemanager.go +++ b/pkg/cloudprovider/providers/vsphere/nodemanager.go @@ -265,14 +265,33 @@ func (nm *NodeManager) GetNodeInfo(nodeName k8stypes.NodeName) (NodeInfo, error) return *nodeInfo, nil } -func (nm *NodeManager) GetNodeDetails() []NodeDetails { +func (nm *NodeManager) GetNodeDetails() ([]NodeDetails, error) { nm.nodeInfoLock.RLock() defer nm.nodeInfoLock.RUnlock() var nodeDetails []NodeDetails + vsphereSessionRefreshMap := make(map[string]bool) + + // Create context + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + for nodeName, nodeInfo := range nm.nodeInfoMap { nodeDetails = append(nodeDetails, NodeDetails{nodeName, nodeInfo.vm}) + if vsphereSessionRefreshMap[nodeInfo.vcServer] { + continue + } + vsphereInstance := nm.vsphereInstanceMap[nodeInfo.vcServer] + if vsphereInstance == nil { + err := fmt.Errorf("vSphereInstance for vc server %q not found while looking for vm %q", nodeInfo.vcServer, nodeInfo.vm) + return nil, err + } + err := vsphereInstance.conn.Connect(ctx) + if err != nil { + return nil, err + } + vsphereSessionRefreshMap[nodeInfo.vcServer] = true } - return nodeDetails + return nodeDetails, nil } func (nm *NodeManager) addNodeInfo(nodeName string, nodeInfo *NodeInfo) { diff --git a/pkg/cloudprovider/providers/vsphere/vsphere.go b/pkg/cloudprovider/providers/vsphere/vsphere.go index 77f80e2354..0139015fc3 100644 --- a/pkg/cloudprovider/providers/vsphere/vsphere.go +++ b/pkg/cloudprovider/providers/vsphere/vsphere.go @@ -639,7 +639,8 @@ func (vs *VSphere) InstanceID(nodeName k8stypes.NodeName) (string, error) { instanceID, err := instanceIDInternal() if err != nil { - isManagedObjectNotFoundError, err := vs.retry(nodeName, err) + var isManagedObjectNotFoundError bool + isManagedObjectNotFoundError, err = vs.retry(nodeName, err) if isManagedObjectNotFoundError { if err == nil { glog.V(4).Infof("InstanceID: Found node %q", convertToString(nodeName)) @@ -729,14 +730,17 @@ func (vs *VSphere) AttachDisk(vmDiskPath string, storagePolicyName string, nodeN requestTime := time.Now() diskUUID, err = attachDiskInternal(vmDiskPath, storagePolicyName, nodeName) if err != nil { - isManagedObjectNotFoundError, err := vs.retry(nodeName, err) + var isManagedObjectNotFoundError bool + isManagedObjectNotFoundError, err = vs.retry(nodeName, err) if isManagedObjectNotFoundError { if err == nil { glog.V(4).Infof("AttachDisk: Found node %q", convertToString(nodeName)) diskUUID, err = attachDiskInternal(vmDiskPath, storagePolicyName, nodeName) + glog.V(4).Infof("AttachDisk: Retry: diskUUID %s, err +%v", convertToString(nodeName), diskUUID, err) } } } + glog.V(4).Infof("AttachDisk executed for node %s and volume %s with diskUUID %s. Err: %s", convertToString(nodeName), vmDiskPath, diskUUID, err) vclib.RecordvSphereMetric(vclib.OperationAttachVolume, requestTime, err) return diskUUID, err } @@ -792,7 +796,8 @@ func (vs *VSphere) DetachDisk(volPath string, nodeName k8stypes.NodeName) error requestTime := time.Now() err := detachDiskInternal(volPath, nodeName) if err != nil { - isManagedObjectNotFoundError, err := vs.retry(nodeName, err) + var isManagedObjectNotFoundError bool + isManagedObjectNotFoundError, err = vs.retry(nodeName, err) if isManagedObjectNotFoundError { if err == nil { err = detachDiskInternal(volPath, nodeName) @@ -847,7 +852,8 @@ func (vs *VSphere) DiskIsAttached(volPath string, nodeName k8stypes.NodeName) (b requestTime := time.Now() isAttached, err := diskIsAttachedInternal(volPath, nodeName) if err != nil { - isManagedObjectNotFoundError, err := vs.retry(nodeName, err) + var isManagedObjectNotFoundError bool + isManagedObjectNotFoundError, err = vs.retry(nodeName, err) if isManagedObjectNotFoundError { if err == vclib.ErrNoVMFound { isAttached, err = false, nil diff --git a/pkg/cloudprovider/providers/vsphere/vsphere_util.go b/pkg/cloudprovider/providers/vsphere/vsphere_util.go index efedb06213..1fa88ef743 100644 --- a/pkg/cloudprovider/providers/vsphere/vsphere_util.go +++ b/pkg/cloudprovider/providers/vsphere/vsphere_util.go @@ -187,8 +187,13 @@ func getAccessibleDatastores(ctx context.Context, nodeVmDetail *NodeDetails, nod // Get all datastores accessible for the virtual machine object. func getSharedDatastoresInK8SCluster(ctx context.Context, dc *vclib.Datacenter, nodeManager *NodeManager) ([]*vclib.DatastoreInfo, error) { - nodeVmDetails := nodeManager.GetNodeDetails() - if nodeVmDetails == nil || len(nodeVmDetails) == 0 { + nodeVmDetails, err := nodeManager.GetNodeDetails() + if err != nil { + glog.Errorf("Error while obtaining Kubernetes node nodeVmDetail details. error : %+v", err) + return nil, err + } + + if len(nodeVmDetails) == 0 { msg := fmt.Sprintf("Kubernetes node nodeVmDetail details is empty. nodeVmDetails : %+v", nodeVmDetails) glog.Error(msg) return nil, fmt.Errorf(msg) @@ -210,7 +215,7 @@ func getSharedDatastoresInK8SCluster(ctx context.Context, dc *vclib.Datacenter, } } glog.V(9).Infof("sharedDatastores : %+v", sharedDatastores) - sharedDatastores, err := getDatastoresForEndpointVC(ctx, dc, sharedDatastores) + sharedDatastores, err = getDatastoresForEndpointVC(ctx, dc, sharedDatastores) if err != nil { glog.Errorf("Failed to get shared datastores from endpoint VC. err: %+v", err) return nil, err