This is an automated email from the ASF dual-hosted git repository.

joao pushed a commit to branch 4.18
in repository https://gitbox.apache.org/repos/asf/cloudstack.git


The following commit(s) were added to refs/heads/4.18 by this push:
     new a5508acc54d server: fix haproxy misconfiguration after VPC VR start 
(#8881)
a5508acc54d is described below

commit a5508acc54d1638ba469f4d7ce9898b81b5209d0
Author: Wei Zhou <[email protected]>
AuthorDate: Fri Apr 5 20:01:08 2024 +0200

    server: fix haproxy misconfiguration after VPC VR start (#8881)
---
 .../router/VirtualNetworkApplianceManagerImpl.java | 49 +++++++++++++---------
 .../VpcVirtualNetworkApplianceManagerImpl.java     | 26 ++++++++++++
 2 files changed, 56 insertions(+), 19 deletions(-)

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 d208021e833..3093c56f03b 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 @@ Configurable, StateListener<VirtualMachine.State, 
VirtualMachine.Event, VirtualM
                 }
             }
 
-            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 @@ Configurable, StateListener<VirtualMachine.State, 
VirtualMachine.Event, VirtualM
         }
     }
 
+    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 74b0dddfd45..1c1dc568b2c 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.Site2SiteVpnConnection;
 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 @@ public class VpcVirtualNetworkApplianceManagerImpl extends 
VirtualNetworkApplian
     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 @@ public class VpcVirtualNetworkApplianceManagerImpl 
extends VirtualNetworkApplian
                 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) {

Reply via email to