in pkg/cloudprovider/vsphere/nodemanager.go [181:340]
func (nm *NodeManager) DiscoverNode(nodeID string, searchBy cm.FindVM) error {
ctx := context.Background()
vmDI, err := nm.shakeOutNodeIDLookup(ctx, nodeID, searchBy)
if err != nil {
klog.Errorf("shakeOutNodeIDLookup failed. Err=%v", err)
return err
}
if vmDI.UUID == "" {
return errors.New("discovered VM UUID is empty")
}
var oVM mo.VirtualMachine
err = vmDI.VM.Properties(ctx, vmDI.VM.Reference(), []string{"guest", "summary"}, &oVM)
if err != nil {
klog.Errorf("Error collecting properties for vm=%+v in vc=%s and datacenter=%s: %v",
vmDI.VM, vmDI.VcServer, vmDI.DataCenter.Name(), err)
return err
}
if oVM.Guest == nil {
return errors.New("VirtualMachine Guest property was nil")
}
if oVM.Guest.HostName == "" {
return errors.New("VM Guest hostname is empty")
}
tenantRef := vmDI.VcServer
if vmDI.TenantRef != "" {
tenantRef = vmDI.TenantRef
}
vcInstance := nm.connectionManager.VsphereInstanceMap[tenantRef]
ipFamilies := []string{vcfg.DefaultIPFamily}
if vcInstance != nil {
ipFamilies = vcInstance.Cfg.IPFamilyPriority
} else {
klog.Warningf("Unable to find vcInstance for %s. Defaulting to ipv4.", tenantRef)
}
var internalNetworkSubnets []*net.IPNet
var externalNetworkSubnets []*net.IPNet
var excludeInternalNetworkSubnets []*net.IPNet
var excludeExternalNetworkSubnets []*net.IPNet
var internalVMNetworkName string
var externalVMNetworkName string
if nm.cfg != nil {
internalNetworkSubnets, err = parseCIDRs(nm.cfg.Nodes.InternalNetworkSubnetCIDR)
if err != nil {
return err
}
externalNetworkSubnets, err = parseCIDRs(nm.cfg.Nodes.ExternalNetworkSubnetCIDR)
if err != nil {
return err
}
excludeInternalNetworkSubnets, err = parseCIDRs(nm.cfg.Nodes.ExcludeInternalNetworkSubnetCIDR)
if err != nil {
return err
}
excludeExternalNetworkSubnets, err = parseCIDRs(nm.cfg.Nodes.ExcludeExternalNetworkSubnetCIDR)
if err != nil {
return err
}
internalVMNetworkName = nm.cfg.Nodes.InternalVMNetworkName
externalVMNetworkName = nm.cfg.Nodes.ExternalVMNetworkName
}
addrs := []v1.NodeAddress{}
klog.V(2).Infof("Adding Hostname: %s", oVM.Guest.HostName)
v1helper.AddToNodeAddresses(&addrs,
v1.NodeAddress{
Type: v1.NodeHostName,
Address: oVM.Guest.HostName,
},
)
nonVNICDevices := collectNonVNICDevices(oVM.Guest.Net)
for _, v := range nonVNICDevices {
klog.V(6).Infof("internalVMNetworkName = %s", internalVMNetworkName)
klog.V(6).Infof("externalVMNetworkName = %s", externalVMNetworkName)
klog.V(6).Infof("v.Network = %s", v.Network)
if (internalVMNetworkName != "" && !strings.EqualFold(internalVMNetworkName, v.Network)) &&
(externalVMNetworkName != "" && !strings.EqualFold(externalVMNetworkName, v.Network)) {
klog.V(4).Infof("Skipping device because vNIC Network=%s doesn't match internal=%s or external=%s network names",
v.Network, internalVMNetworkName, externalVMNetworkName)
}
}
existingNetworkNames := toNetworkNames(nonVNICDevices)
if internalVMNetworkName != "" && externalVMNetworkName != "" {
if !ArrayContainsCaseInsensitive(existingNetworkNames, internalVMNetworkName) &&
!ArrayContainsCaseInsensitive(existingNetworkNames, externalVMNetworkName) {
return fmt.Errorf("unable to find suitable IP address for node")
}
}
ipAddrNetworkNames := toIPAddrNetworkNames(nonVNICDevices)
nonLocalhostIPs := excludeLocalhostIPs(ipAddrNetworkNames)
for _, ipFamily := range ipFamilies {
klog.V(6).Infof("ipFamily: %q nonLocalhostIPs: %q", ipFamily, nonLocalhostIPs)
discoveredInternal, discoveredExternal := discoverIPs(
nonLocalhostIPs,
ipFamily,
internalNetworkSubnets,
externalNetworkSubnets,
excludeInternalNetworkSubnets,
excludeExternalNetworkSubnets,
internalVMNetworkName,
externalVMNetworkName,
)
klog.V(6).Infof("ipFamily: %q discovered Internal: %q discoveredExternal: %q",
ipFamily, discoveredInternal, discoveredExternal)
if discoveredInternal != nil {
v1helper.AddToNodeAddresses(&addrs,
v1.NodeAddress{Type: v1.NodeInternalIP, Address: discoveredInternal.ipAddr},
)
}
if discoveredExternal != nil {
v1helper.AddToNodeAddresses(&addrs,
v1.NodeAddress{Type: v1.NodeExternalIP, Address: discoveredExternal.ipAddr},
)
}
if len(oVM.Guest.Net) > 0 {
if discoveredInternal == nil && discoveredExternal == nil {
return fmt.Errorf("unable to find suitable IP address for node %s with IP family %s", nodeID, ipFamilies)
}
}
}
klog.V(2).Infof("Found node %s as vm=%+v in vc=%s and datacenter=%s",
nodeID, vmDI.VM, vmDI.VcServer, vmDI.DataCenter.Name())
klog.V(2).Info("Hostname: ", oVM.Guest.HostName, " UUID: ", vmDI.UUID)
os := "unknown"
if g, ok := GuestOSLookup[oVM.Summary.Config.GuestId]; ok {
os = g
}
// store instance type in nodeinfo map
instanceType := fmt.Sprintf("vsphere-vm.cpu-%d.mem-%dgb.os-%s",
oVM.Summary.Config.NumCpu,
(oVM.Summary.Config.MemorySizeMB / 1024),
os,
)
nodeInfo := &NodeInfo{tenantRef: tenantRef, dataCenter: vmDI.DataCenter, vm: vmDI.VM, vcServer: vmDI.VcServer,
UUID: vmDI.UUID, NodeName: vmDI.NodeName, NodeType: instanceType, NodeAddresses: addrs}
nm.addNodeInfo(nodeInfo)
return nil
}