diff --git a/staging/src/k8s.io/legacy-cloud-providers/vsphere/vsphere.go b/staging/src/k8s.io/legacy-cloud-providers/vsphere/vsphere.go index 04331ee50d2..6424b9fd59f 100644 --- a/staging/src/k8s.io/legacy-cloud-providers/vsphere/vsphere.go +++ b/staging/src/k8s.io/legacy-cloud-providers/vsphere/vsphere.go @@ -639,17 +639,25 @@ func (vs *VSphere) getVMFromNodeName(ctx context.Context, nodeName k8stypes.Node // NodeAddresses is an implementation of Instances.NodeAddresses. func (vs *VSphere) NodeAddresses(ctx context.Context, nodeName k8stypes.NodeName) ([]v1.NodeAddress, error) { - // Get local IP addresses if node is local node if vs.hostName == convertToString(nodeName) { - addrs, err := getLocalIP() - if err != nil { - return nil, err - } - // add the hostname address - nodehelpers.AddToNodeAddresses(&addrs, v1.NodeAddress{Type: v1.NodeHostName, Address: vs.hostName}) - return addrs, nil + return vs.getNodeAddressesFromLocalIP() } + return vs.getNodeAddressesFromVM(ctx, nodeName) +} +// getNodeAddressesFromLocalIP get local IP addresses if node is local node. +func (vs *VSphere) getNodeAddressesFromLocalIP() ([]v1.NodeAddress, error) { + addrs, err := getLocalIP() + if err != nil { + return nil, err + } + // add the hostname address + nodehelpers.AddToNodeAddresses(&addrs, v1.NodeAddress{Type: v1.NodeHostName, Address: vs.hostName}) + return addrs, nil +} + +// getNodeAddressesFromVM get vm IP addresses if node is vm. +func (vs *VSphere) getNodeAddressesFromVM(ctx context.Context, nodeName k8stypes.NodeName) ([]v1.NodeAddress, error) { if vs.cfg == nil { return nil, cloudprovider.InstanceNotFound } @@ -772,7 +780,37 @@ func (vs *VSphere) InstanceShutdownByProviderID(ctx context.Context, providerID // InstanceMetadataByProviderID returns metadata of the specified instance. func (vs *VSphere) InstanceMetadataByProviderID(ctx context.Context, providerID string) (*cloudprovider.InstanceMetadata, error) { - return nil, fmt.Errorf("unimplemented") + if providerID == "" { + return nil, fmt.Errorf("couldn't compute InstanceMetadata for empty providerID") + } + + // TODO dropped get nodeName by GetNodeNameFromProviderID here. If it not behave as expected, + // get nodeName by vm.GetNodeNameFromProviderID. + return vs.instanceMetadataByNodeName(ctx, convertToK8sType(providerID)) +} + +func (vs *VSphere) instanceMetadataByNodeName(ctx context.Context, nodeName k8stypes.NodeName) (*cloudprovider.InstanceMetadata, error) { + if vs.hostName == convertToString(nodeName) { + addresses, err := vs.getNodeAddressesFromLocalIP() + if err != nil { + return nil, err + } + return &cloudprovider.InstanceMetadata{ + ProviderID: vs.vmUUID, + Type: "", + NodeAddresses: addresses, + }, nil + } + + addresses, err := vs.getNodeAddressesFromVM(ctx, nodeName) + if err != nil { + return nil, err + } + return &cloudprovider.InstanceMetadata{ + ProviderID: vs.vmUUID, + Type: "", + NodeAddresses: addresses, + }, nil } // InstanceID returns the cloud provider ID of the node with the specified Name.