mirror of https://github.com/k3s-io/k3s
Merge pull request #66619 from w-leads/feature/vcp-shutdown-taint
Automatic merge from submit-queue (batch tested with PRs 66225, 66648, 65799, 66630, 66619). If you want to cherry-pick this change to another branch, please follow the instructions <a href="https://github.com/kubernetes/community/blob/master/contributors/devel/cherry-picks.md">here</a>. Implement InstanceShutdownByProviderID for vSphere CP **What this PR does / why we need it**: To detach volumes from shutdown nodes #66181 **Which issue(s) this PR fixes** *(optional, in `fixes #<issue number>(, fixes #<issue_number>, ...)` format, will close the issue(s) when PR gets merged)*: Fixes # **Special notes for your reviewer**: **Release note**: ```release-note NONE ```pull/8/head
commit
c7603b069d
|
@ -677,23 +677,11 @@ func convertToK8sType(vmName string) k8stypes.NodeName {
|
|||
// InstanceExistsByProviderID returns true if the instance with the given provider id still exists and is running.
|
||||
// If false is returned with no error, the instance will be immediately deleted by the cloud controller manager.
|
||||
func (vs *VSphere) InstanceExistsByProviderID(ctx context.Context, providerID string) (bool, error) {
|
||||
var nodeName string
|
||||
nodes, err := vs.nodeManager.GetNodeDetails()
|
||||
nodeName, err := vs.GetNodeNameFromProviderID(providerID)
|
||||
if err != nil {
|
||||
glog.Errorf("Error while obtaining Kubernetes node nodeVmDetail details. error : %+v", err)
|
||||
glog.Errorf("Error while getting nodename for providerID %s", providerID)
|
||||
return false, err
|
||||
}
|
||||
for _, node := range nodes {
|
||||
// ProviderID is UUID for nodes v1.9.3+
|
||||
if node.VMUUID == GetUUIDFromProviderID(providerID) || node.NodeName == providerID {
|
||||
nodeName = node.NodeName
|
||||
break
|
||||
}
|
||||
}
|
||||
if nodeName == "" {
|
||||
msg := fmt.Sprintf("Error while obtaining Kubernetes nodename for providerID %s.", providerID)
|
||||
return false, errors.New(msg)
|
||||
}
|
||||
_, err = vs.InstanceID(ctx, convertToK8sType(nodeName))
|
||||
if err == nil {
|
||||
return true, nil
|
||||
|
@ -704,7 +692,31 @@ func (vs *VSphere) InstanceExistsByProviderID(ctx context.Context, providerID st
|
|||
|
||||
// InstanceShutdownByProviderID returns true if the instance is in safe state to detach volumes
|
||||
func (vs *VSphere) InstanceShutdownByProviderID(ctx context.Context, providerID string) (bool, error) {
|
||||
return false, cloudprovider.NotImplemented
|
||||
nodeName, err := vs.GetNodeNameFromProviderID(providerID)
|
||||
if err != nil {
|
||||
glog.Errorf("Error while getting nodename for providerID %s", providerID)
|
||||
return false, err
|
||||
}
|
||||
|
||||
vsi, err := vs.getVSphereInstance(convertToK8sType(nodeName))
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
// Ensure client is logged in and session is valid
|
||||
if err := vs.nodeManager.vcConnect(ctx, vsi); err != nil {
|
||||
return false, err
|
||||
}
|
||||
vm, err := vs.getVMFromNodeName(ctx, convertToK8sType(nodeName))
|
||||
if err != nil {
|
||||
glog.Errorf("Failed to get VM object for node: %q. err: +%v", nodeName, err)
|
||||
return false, err
|
||||
}
|
||||
isActive, err := vm.IsActive(ctx)
|
||||
if err != nil {
|
||||
glog.Errorf("Failed to check whether node %q is active. err: %+v.", nodeName, err)
|
||||
return false, err
|
||||
}
|
||||
return !isActive, nil
|
||||
}
|
||||
|
||||
// InstanceID returns the cloud provider ID of the node with the specified Name.
|
||||
|
|
|
@ -522,6 +522,27 @@ func (vs *VSphere) IsDummyVMPresent(vmName string) (bool, error) {
|
|||
return isDummyVMPresent, nil
|
||||
}
|
||||
|
||||
func (vs *VSphere) GetNodeNameFromProviderID(providerID string) (string, error) {
|
||||
var nodeName string
|
||||
nodes, err := vs.nodeManager.GetNodeDetails()
|
||||
if err != nil {
|
||||
glog.Errorf("Error while obtaining Kubernetes node nodeVmDetail details. error : %+v", err)
|
||||
return "", err
|
||||
}
|
||||
for _, node := range nodes {
|
||||
// ProviderID is UUID for nodes v1.9.3+
|
||||
if node.VMUUID == GetUUIDFromProviderID(providerID) || node.NodeName == providerID {
|
||||
nodeName = node.NodeName
|
||||
break
|
||||
}
|
||||
}
|
||||
if nodeName == "" {
|
||||
msg := fmt.Sprintf("Error while obtaining Kubernetes nodename for providerID %s.", providerID)
|
||||
return "", errors.New(msg)
|
||||
}
|
||||
return nodeName, nil
|
||||
}
|
||||
|
||||
func GetVMUUID() (string, error) {
|
||||
id, err := ioutil.ReadFile(UUIDPath)
|
||||
if err != nil {
|
||||
|
|
Loading…
Reference in New Issue