Skip to content

Commit adf4cca

Browse files
authored
Merge pull request kubernetes#89138 from feiskyer/vmss-fix
Fix isCurrentInstance for Windows by removing the dependency of hostname
2 parents 84dc704 + 2d981b3 commit adf4cca

File tree

2 files changed

+64
-7
lines changed

2 files changed

+64
-7
lines changed

staging/src/k8s.io/legacy-cloud-providers/azure/azure_instances.go

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ package azure
2121
import (
2222
"context"
2323
"fmt"
24-
"os"
24+
"strconv"
2525
"strings"
2626

2727
v1 "k8s.io/api/core/v1"
@@ -231,18 +231,22 @@ func (az *Cloud) InstanceShutdownByProviderID(ctx context.Context, providerID st
231231
}
232232

233233
func (az *Cloud) isCurrentInstance(name types.NodeName, metadataVMName string) (bool, error) {
234-
var err error
235234
nodeName := mapNodeNameToVMName(name)
235+
236236
if az.VMType == vmTypeVMSS {
237-
// VMSS vmName is not same with hostname, use hostname instead.
238-
metadataVMName, err = os.Hostname()
239-
if err != nil {
240-
return false, err
237+
// VMSS vmName is not same with hostname, construct the node name "{computer-name-prefix}{base-36-instance-id}".
238+
// Refer https://docs.microsoft.com/en-us/azure/virtual-machine-scale-sets/virtual-machine-scale-sets-instance-ids#scale-set-vm-computer-name.
239+
if ssName, instanceID, err := extractVmssVMName(metadataVMName); err == nil {
240+
instance, err := strconv.ParseInt(instanceID, 10, 64)
241+
if err != nil {
242+
return false, fmt.Errorf("failed to parse VMSS instanceID %q: %v", instanceID, err)
243+
}
244+
metadataVMName = fmt.Sprintf("%s%06s", ssName, strconv.FormatInt(instance, 36))
241245
}
242246
}
243247

244248
metadataVMName = strings.ToLower(metadataVMName)
245-
return (metadataVMName == nodeName), err
249+
return (metadataVMName == nodeName), nil
246250
}
247251

248252
// InstanceID returns the cloud provider ID of the specified instance.

staging/src/k8s.io/legacy-cloud-providers/azure/azure_instances_test.go

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -361,3 +361,56 @@ func TestNodeAddresses(t *testing.T) {
361361
}
362362
}
363363
}
364+
365+
func TestIsCurrentInstance(t *testing.T) {
366+
cloud := &Cloud{
367+
Config: Config{
368+
VMType: vmTypeVMSS,
369+
},
370+
}
371+
testcases := []struct {
372+
nodeName string
373+
metadataVMName string
374+
expected bool
375+
expectError bool
376+
}{
377+
{
378+
nodeName: "node1",
379+
metadataVMName: "node1",
380+
expected: true,
381+
},
382+
{
383+
nodeName: "node1",
384+
metadataVMName: "node2",
385+
expected: false,
386+
},
387+
{
388+
nodeName: "vmss000001",
389+
metadataVMName: "vmss_1",
390+
expected: true,
391+
},
392+
{
393+
nodeName: "vmss_2",
394+
metadataVMName: "vmss000000",
395+
expected: false,
396+
},
397+
{
398+
nodeName: "vmss123456",
399+
metadataVMName: "vmss_$123",
400+
expected: false,
401+
expectError: true,
402+
},
403+
}
404+
405+
for i, test := range testcases {
406+
real, err := cloud.isCurrentInstance(types.NodeName(test.nodeName), test.metadataVMName)
407+
if test.expectError {
408+
if err == nil {
409+
t.Errorf("Test[%d] unexpected nil err", i)
410+
}
411+
}
412+
if real != test.expected {
413+
t.Errorf("Test[%d] unexpected isCurrentInstance result %v != %v", i, real, test.expected)
414+
}
415+
}
416+
}

0 commit comments

Comments
 (0)