server: fix haproxy misconfiguration after VPC VR start (#8881)
diff --git a/server/src/main/java/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java b/server/src/main/java/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
index d208021..3093c56 100644
--- a/server/src/main/java/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
+++ b/server/src/main/java/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
@@ -2578,25 +2578,7 @@
}
}
- final List<LoadBalancerVO> lbs = _loadBalancerDao.listByNetworkIdAndScheme(guestNetworkId, Scheme.Public);
- final List<LoadBalancingRule> lbRules = new ArrayList<LoadBalancingRule>();
- if (_networkModel.isProviderSupportServiceInNetwork(guestNetworkId, Service.Lb, provider)) {
- // Re-apply load balancing rules
- for (final LoadBalancerVO lb : lbs) {
- final List<LbDestination> dstList = _lbMgr.getExistingDestinations(lb.getId());
- final List<LbStickinessPolicy> policyList = _lbMgr.getStickinessPolicies(lb.getId());
- final List<LbHealthCheckPolicy> hcPolicyList = _lbMgr.getHealthCheckPolicies(lb.getId());
- final Ip sourceIp = _networkModel.getPublicIpAddress(lb.getSourceIpAddressId()).getAddress();
- final LbSslCert sslCert = _lbMgr.getLbSslCert(lb.getId());
- final LoadBalancingRule loadBalancing = new LoadBalancingRule(lb, dstList, policyList, hcPolicyList, sourceIp, sslCert, lb.getLbProtocol());
- lbRules.add(loadBalancing);
- }
- }
-
- s_logger.debug("Found " + lbRules.size() + " load balancing rule(s) to apply as a part of domR " + router + " start.");
- if (!lbRules.isEmpty()) {
- _commandSetupHelper.createApplyLoadBalancingRulesCommands(lbRules, router, cmds, guestNetworkId);
- }
+ createApplyLoadBalancingRulesCommands(cmds, router, provider, guestNetworkId);
}
// Reapply dhcp and dns configuration.
final Network guestNetwork = _networkDao.findById(guestNetworkId);
@@ -2623,6 +2605,35 @@
}
}
+ private void createApplyLoadBalancingRulesCommands(final Commands cmds, final DomainRouterVO router, final Provider provider, final Long guestNetworkId) {
+ if (router.getVpcId() != null) {
+ return;
+ }
+ final List<LoadBalancerVO> lbs = _loadBalancerDao.listByNetworkIdAndScheme(guestNetworkId, Scheme.Public);
+ final List<LoadBalancingRule> lbRules = new ArrayList<LoadBalancingRule>();
+ if (_networkModel.isProviderSupportServiceInNetwork(guestNetworkId, Service.Lb, provider)) {
+ // Re-apply load balancing rules
+ createLoadBalancingRulesList(lbRules, lbs);
+ }
+
+ s_logger.debug("Found " + lbRules.size() + " load balancing rule(s) to apply as a part of domR " + router + " start.");
+ if (!lbRules.isEmpty()) {
+ _commandSetupHelper.createApplyLoadBalancingRulesCommands(lbRules, router, cmds, guestNetworkId);
+ }
+ }
+
+ protected void createLoadBalancingRulesList(List<LoadBalancingRule> lbRules, final List<LoadBalancerVO> lbs) {
+ for (final LoadBalancerVO lb : lbs) {
+ final List<LbDestination> dstList = _lbMgr.getExistingDestinations(lb.getId());
+ final List<LbStickinessPolicy> policyList = _lbMgr.getStickinessPolicies(lb.getId());
+ final List<LbHealthCheckPolicy> hcPolicyList = _lbMgr.getHealthCheckPolicies(lb.getId());
+ final Ip sourceIp = _networkModel.getPublicIpAddress(lb.getSourceIpAddressId()).getAddress();
+ final LbSslCert sslCert = _lbMgr.getLbSslCert(lb.getId());
+ final LoadBalancingRule loadBalancing = new LoadBalancingRule(lb, dstList, policyList, hcPolicyList, sourceIp, sslCert, lb.getLbProtocol());
+ lbRules.add(loadBalancing);
+ }
+ }
+
private void createDefaultEgressFirewallRule(final List<FirewallRule> rules, final long networkId) {
final NetworkVO network = _networkDao.findById(networkId);
final NetworkOfferingVO offering = _networkOfferingDao.findById(network.getNetworkOfferingId());
diff --git a/server/src/main/java/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java b/server/src/main/java/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java
index 74b0ddd..1c1dc56 100644
--- a/server/src/main/java/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java
+++ b/server/src/main/java/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java
@@ -64,10 +64,14 @@
import com.cloud.network.VirtualRouterProvider;
import com.cloud.network.addr.PublicIp;
import com.cloud.network.dao.IPAddressVO;
+import com.cloud.network.dao.LoadBalancerDao;
+import com.cloud.network.dao.LoadBalancerVO;
import com.cloud.network.dao.MonitoringServiceVO;
import com.cloud.network.dao.NetworkVO;
import com.cloud.network.dao.RemoteAccessVpnVO;
import com.cloud.network.dao.Site2SiteVpnConnectionVO;
+import com.cloud.network.lb.LoadBalancingRule;
+import com.cloud.network.rules.LoadBalancerContainer.Scheme;
import com.cloud.network.vpc.NetworkACLItemDao;
import com.cloud.network.vpc.NetworkACLItemVO;
import com.cloud.network.vpc.NetworkACLManager;
@@ -129,6 +133,8 @@
private EntityManager _entityMgr;
@Inject
protected HypervisorGuruManager _hvGuruMgr;
+ @Inject
+ private LoadBalancerDao loadBalancerDao;
@Override
public boolean configure(final String name, final Map<String, Object> params) throws ConfigurationException {
@@ -522,12 +528,32 @@
cmds.addCommand(finishCmd);
}
+ createApplyLoadBalancingRulesCommandsForVpc(cmds, domainRouterVO, provider, guestNics);
+
// Add network usage commands
cmds.addCommands(usageCmds);
}
return true;
}
+ private void createApplyLoadBalancingRulesCommandsForVpc(final Commands cmds, DomainRouterVO domainRouterVO, Provider provider,
+ List<Pair<Nic, Network>> guestNics) {
+ final List<LoadBalancerVO> lbs = loadBalancerDao.listByVpcIdAndScheme(domainRouterVO.getVpcId(), Scheme.Public);
+ final List<LoadBalancingRule> lbRules = new ArrayList<>();
+ createLoadBalancingRulesList(lbRules, lbs);
+ s_logger.debug("Found " + lbRules.size() + " load balancing rule(s) to apply as a part of VPC VR " + domainRouterVO + " start.");
+ if (!lbRules.isEmpty()) {
+ for (final Pair<Nic, Network> nicNtwk : guestNics) {
+ final Nic guestNic = nicNtwk.first();
+ final long guestNetworkId = guestNic.getNetworkId();
+ if (_networkModel.isProviderSupportServiceInNetwork(guestNetworkId, Service.Lb, provider)) {
+ _commandSetupHelper.createApplyLoadBalancingRulesCommands(lbRules, domainRouterVO, cmds, guestNetworkId);
+ break;
+ }
+ }
+ }
+ }
+
@Override
protected List<MonitoringServiceVO> getDefaultServicesToMonitor(NetworkVO network) {
if (network.getTrafficType() == TrafficType.Public) {