Do not check vmSetName when getting node IP

pull/8/head
Pengfei Ni 2018-05-08 22:42:42 +08:00
parent a743392937
commit f427d279fe
4 changed files with 28 additions and 24 deletions

View File

@ -850,7 +850,7 @@ func (f *fakeVMSet) GetIPByNodeName(name, vmSetName string) (string, string, err
return ip, "", nil return ip, "", nil
} }
func (f *fakeVMSet) GetPrimaryInterface(nodeName, vmSetName string) (network.Interface, error) { func (f *fakeVMSet) GetPrimaryInterface(nodeName string) (network.Interface, error) {
return network.Interface{}, fmt.Errorf("unimplemented") return network.Interface{}, fmt.Errorf("unimplemented")
} }

View File

@ -289,7 +289,7 @@ outer:
} }
func (az *Cloud) getIPForMachine(nodeName types.NodeName) (string, string, error) { func (az *Cloud) getIPForMachine(nodeName types.NodeName) (string, string, error) {
return az.vmSet.GetIPByNodeName(string(nodeName), "") return az.vmSet.GetIPByNodeName(string(nodeName))
} }
var polyTable = crc32.MakeTable(crc32.Koopman) var polyTable = crc32.MakeTable(crc32.Koopman)
@ -429,8 +429,8 @@ func (as *availabilitySet) GetPrimaryVMSetName() string {
} }
// GetIPByNodeName gets machine private IP and public IP by node name. // GetIPByNodeName gets machine private IP and public IP by node name.
func (as *availabilitySet) GetIPByNodeName(name, vmSetName string) (string, string, error) { func (as *availabilitySet) GetIPByNodeName(name string) (string, string, error) {
nic, err := as.GetPrimaryInterface(name, vmSetName) nic, err := as.GetPrimaryInterface(name)
if err != nil { if err != nil {
return "", "", err return "", "", err
} }
@ -554,8 +554,13 @@ func (as *availabilitySet) GetVMSetNames(service *v1.Service, nodes []*v1.Node)
return availabilitySetNames, nil return availabilitySetNames, nil
} }
// GetPrimaryInterface gets machine primary network interface by node name and vmSet. // GetPrimaryInterface gets machine primary network interface by node name.
func (as *availabilitySet) GetPrimaryInterface(nodeName, vmSetName string) (network.Interface, error) { func (as *availabilitySet) GetPrimaryInterface(nodeName string) (network.Interface, error) {
return as.getPrimaryInterfaceWithVMSet(nodeName, "")
}
// getPrimaryInterfaceWithVMSet gets machine primary network interface by node name and vmSet.
func (as *availabilitySet) getPrimaryInterfaceWithVMSet(nodeName, vmSetName string) (network.Interface, error) {
var machine compute.VirtualMachine var machine compute.VirtualMachine
machine, err := as.GetVirtualMachineWithRetry(types.NodeName(nodeName)) machine, err := as.GetVirtualMachineWithRetry(types.NodeName(nodeName))
@ -573,8 +578,13 @@ func (as *availabilitySet) GetPrimaryInterface(nodeName, vmSetName string) (netw
return network.Interface{}, err return network.Interface{}, err
} }
// Check availability set. // Check availability set name. Note that vmSetName is empty string when getting
// Backends of Standard load balancer could belong to multiple VMAS, so we don't check vmSet for it. // the Node's IP address. While vmSetName is not empty, it should be checked with
// Node's real availability set name:
// - For basic SKU load balancer, errNotInVMSet should be returned if the node's
// availability set is mismatched with vmSetName.
// - For standard SKU load balancer, backend could belong to multiple VMAS, so we
// don't check vmSet for it.
if vmSetName != "" && !as.useStandardLoadBalancer() { if vmSetName != "" && !as.useStandardLoadBalancer() {
expectedAvailabilitySetName := as.getAvailabilitySetID(vmSetName) expectedAvailabilitySetName := as.getAvailabilitySetID(vmSetName)
if machine.AvailabilitySet == nil || !strings.EqualFold(*machine.AvailabilitySet.ID, expectedAvailabilitySetName) { if machine.AvailabilitySet == nil || !strings.EqualFold(*machine.AvailabilitySet.ID, expectedAvailabilitySetName) {
@ -598,7 +608,7 @@ func (as *availabilitySet) GetPrimaryInterface(nodeName, vmSetName string) (netw
// participating in the specified LoadBalancer Backend Pool. // participating in the specified LoadBalancer Backend Pool.
func (as *availabilitySet) ensureHostInPool(serviceName string, nodeName types.NodeName, backendPoolID string, vmSetName string, isInternal bool) error { func (as *availabilitySet) ensureHostInPool(serviceName string, nodeName types.NodeName, backendPoolID string, vmSetName string, isInternal bool) error {
vmName := mapNodeNameToVMName(nodeName) vmName := mapNodeNameToVMName(nodeName)
nic, err := as.GetPrimaryInterface(vmName, vmSetName) nic, err := as.getPrimaryInterfaceWithVMSet(vmName, vmSetName)
if err != nil { if err != nil {
if err == errNotInVMSet { if err == errNotInVMSet {
glog.V(3).Infof("ensureHostInPool skips node %s because it is not in the vmSet %s", nodeName, vmSetName) glog.V(3).Infof("ensureHostInPool skips node %s because it is not in the vmSet %s", nodeName, vmSetName)

View File

@ -35,9 +35,9 @@ type VMSet interface {
// GetInstanceTypeByNodeName gets the instance type by node name. // GetInstanceTypeByNodeName gets the instance type by node name.
GetInstanceTypeByNodeName(name string) (string, error) GetInstanceTypeByNodeName(name string) (string, error)
// GetIPByNodeName gets machine private IP and public IP by node name. // GetIPByNodeName gets machine private IP and public IP by node name.
GetIPByNodeName(name, vmSetName string) (string, string, error) GetIPByNodeName(name string) (string, string, error)
// GetPrimaryInterface gets machine primary network interface by node name and vmSet. // GetPrimaryInterface gets machine primary network interface by node name.
GetPrimaryInterface(nodeName, vmSetName string) (network.Interface, error) GetPrimaryInterface(nodeName string) (network.Interface, error)
// GetNodeNameByProviderID gets the node name by provider ID. // GetNodeNameByProviderID gets the node name by provider ID.
GetNodeNameByProviderID(providerID string) (types.NodeName, error) GetNodeNameByProviderID(providerID string) (types.NodeName, error)

View File

@ -247,10 +247,10 @@ func (ss *scaleSet) GetPrimaryVMSetName() string {
// GetIPByNodeName gets machine private IP and public IP by node name. // GetIPByNodeName gets machine private IP and public IP by node name.
// TODO(feiskyer): Azure vmss doesn't support associating a public IP to single virtual machine yet, // TODO(feiskyer): Azure vmss doesn't support associating a public IP to single virtual machine yet,
// fix this after it is supported. // fix this after it is supported.
func (ss *scaleSet) GetIPByNodeName(nodeName, vmSetName string) (string, string, error) { func (ss *scaleSet) GetIPByNodeName(nodeName string) (string, string, error) {
nic, err := ss.GetPrimaryInterface(nodeName, vmSetName) nic, err := ss.GetPrimaryInterface(nodeName)
if err != nil { if err != nil {
glog.Errorf("error: ss.GetIPByNodeName(%s), GetPrimaryInterface(%q, %q), err=%v", nodeName, nodeName, vmSetName, err) glog.Errorf("error: ss.GetIPByNodeName(%s), GetPrimaryInterface(%q), err=%v", nodeName, nodeName, err)
return "", "", err return "", "", err
} }
@ -418,7 +418,7 @@ func (ss *scaleSet) GetVMSetNames(service *v1.Service, nodes []*v1.Node) (vmSetN
} }
// GetPrimaryInterface gets machine primary network interface by node name and vmSet. // GetPrimaryInterface gets machine primary network interface by node name and vmSet.
func (ss *scaleSet) GetPrimaryInterface(nodeName, vmSetName string) (network.Interface, error) { func (ss *scaleSet) GetPrimaryInterface(nodeName string) (network.Interface, error) {
managedByAS, err := ss.isNodeManagedByAvailabilitySet(nodeName) managedByAS, err := ss.isNodeManagedByAvailabilitySet(nodeName)
if err != nil { if err != nil {
glog.Errorf("Failed to check isNodeManagedByAvailabilitySet: %v", err) glog.Errorf("Failed to check isNodeManagedByAvailabilitySet: %v", err)
@ -426,7 +426,7 @@ func (ss *scaleSet) GetPrimaryInterface(nodeName, vmSetName string) (network.Int
} }
if managedByAS { if managedByAS {
// vm is managed by availability set. // vm is managed by availability set.
return ss.availabilitySet.GetPrimaryInterface(nodeName, "") return ss.availabilitySet.GetPrimaryInterface(nodeName)
} }
ssName, instanceID, vm, err := ss.getVmssVM(nodeName) ssName, instanceID, vm, err := ss.getVmssVM(nodeName)
@ -435,12 +435,6 @@ func (ss *scaleSet) GetPrimaryInterface(nodeName, vmSetName string) (network.Int
return network.Interface{}, err return network.Interface{}, err
} }
// Check scale set name.
// Backends of Standard load balancer could belong to multiple VMSS, so we don't check vmSet for it.
if !strings.EqualFold(ssName, vmSetName) && !ss.useStandardLoadBalancer() {
return network.Interface{}, errNotInVMSet
}
primaryInterfaceID, err := ss.getPrimaryInterfaceID(vm) primaryInterfaceID, err := ss.getPrimaryInterfaceID(vm)
if err != nil { if err != nil {
glog.Errorf("error: ss.GetPrimaryInterface(%s), ss.getPrimaryInterfaceID(), err=%v", nodeName, err) glog.Errorf("error: ss.GetPrimaryInterface(%s), ss.getPrimaryInterfaceID(), err=%v", nodeName, err)
@ -699,7 +693,7 @@ func (ss *scaleSet) EnsureHostsInPool(serviceName string, nodes []*v1.Node, back
} }
for ssName, instanceIDs := range scalesets { for ssName, instanceIDs := range scalesets {
// Only add nodes belonging to specified vmSet to basic LB backends. // Only add nodes belonging to specified vmSet for basic SKU LB.
if !ss.useStandardLoadBalancer() && !strings.EqualFold(ssName, vmSetName) { if !ss.useStandardLoadBalancer() && !strings.EqualFold(ssName, vmSetName) {
continue continue
} }