Skip to content

Commit

Permalink
implement vsphere InstanceMetadataByProviderID function
Browse files Browse the repository at this point in the history
  • Loading branch information
gongguan committed May 20, 2020
1 parent cf154e9 commit 24fe349
Showing 1 changed file with 47 additions and 9 deletions.
56 changes: 47 additions & 9 deletions staging/src/k8s.io/legacy-cloud-providers/vsphere/vsphere.go
Expand Up @@ -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
}
Expand Down Expand Up @@ -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.
Expand Down

0 comments on commit 24fe349

Please sign in to comment.