func()

in azure/azure_loadbalancer.go [1511:1595]


func (az *Cloud) checkLoadBalancerResourcesConflicted(
	lb *network.LoadBalancer,
	frontendIPConfigID string,
	service *v1.Service,
) error {
	if service.Spec.Ports == nil {
		return nil
	}
	ports := service.Spec.Ports

	for _, port := range ports {
		if lb.LoadBalancingRules != nil {
			for _, rule := range *lb.LoadBalancingRules {
				if rule.LoadBalancingRulePropertiesFormat != nil &&
					rule.FrontendIPConfiguration != nil &&
					rule.FrontendIPConfiguration.ID != nil &&
					strings.EqualFold(*rule.FrontendIPConfiguration.ID, frontendIPConfigID) &&
					strings.EqualFold(string(rule.Protocol), string(port.Protocol)) &&
					rule.FrontendPort != nil &&
					*rule.FrontendPort == port.Port {
					// ignore self-owned rules for unit test
					if rule.Name != nil && az.serviceOwnsRule(service, *rule.Name) {
						continue
					}
					return fmt.Errorf("checkLoadBalancerResourcesConflicted: service port %s is trying to "+
						"consume the port %d which is being referenced by an existing loadBalancing rule %s with "+
						"the same protocol %s and frontend IP config with ID %s",
						port.Name,
						*rule.FrontendPort,
						*rule.Name,
						rule.Protocol,
						*rule.FrontendIPConfiguration.ID)
				}
			}
		}

		if lb.InboundNatRules != nil {
			for _, inboundNatRule := range *lb.InboundNatRules {
				if inboundNatRule.InboundNatRulePropertiesFormat != nil &&
					inboundNatRule.FrontendIPConfiguration != nil &&
					inboundNatRule.FrontendIPConfiguration.ID != nil &&
					strings.EqualFold(*inboundNatRule.FrontendIPConfiguration.ID, frontendIPConfigID) &&
					strings.EqualFold(string(inboundNatRule.Protocol), string(port.Protocol)) &&
					inboundNatRule.FrontendPort != nil &&
					*inboundNatRule.FrontendPort == port.Port {
					return fmt.Errorf("checkLoadBalancerResourcesConflicted: service port %s is trying to "+
						"consume the port %d which is being referenced by an existing inbound NAT rule %s with "+
						"the same protocol %s and frontend IP config with ID %s",
						port.Name,
						*inboundNatRule.FrontendPort,
						*inboundNatRule.Name,
						inboundNatRule.Protocol,
						*inboundNatRule.FrontendIPConfiguration.ID)
				}
			}
		}

		if lb.InboundNatPools != nil {
			for _, pool := range *lb.InboundNatPools {
				if pool.InboundNatPoolPropertiesFormat != nil &&
					pool.FrontendIPConfiguration != nil &&
					pool.FrontendIPConfiguration.ID != nil &&
					strings.EqualFold(*pool.FrontendIPConfiguration.ID, frontendIPConfigID) &&
					strings.EqualFold(string(pool.Protocol), string(port.Protocol)) &&
					pool.FrontendPortRangeStart != nil &&
					pool.FrontendPortRangeEnd != nil &&
					*pool.FrontendPortRangeStart <= port.Port &&
					*pool.FrontendPortRangeEnd >= port.Port {
					return fmt.Errorf("checkLoadBalancerResourcesConflicted: service port %s is trying to "+
						"consume the port %d which is being in the range (%d-%d) of an existing "+
						"inbound NAT pool %s with the same protocol %s and frontend IP config with ID %s",
						port.Name,
						port.Port,
						*pool.FrontendPortRangeStart,
						*pool.FrontendPortRangeEnd,
						*pool.Name,
						pool.Protocol,
						*pool.FrontendIPConfiguration.ID)
				}
			}
		}
	}

	return nil
}