From f29aef8b7040ed8a7e70fa779a7db8644d0549bc Mon Sep 17 00:00:00 2001 From: Wei Zhou Date: Sun, 17 Oct 2021 03:25:24 +0200 Subject: [PATCH] VPC: support LB in multiple vpc tiers if LB provider is VpcVirtualRouter (#5580) * VPC: support LB in multiple vpc tiers if LB provider is VpcVirtualRouter * server: fix unit test CreateNetworkOfferingTest failures [ERROR] Tests run: 10, Failures: 0, Errors: 10, Skipped: 0, Time elapsed: 13.902 s <<< FAILURE! - in org.apache.cloudstack.networkoffering.CreateNetworkOfferingTest [ERROR] createIsolatedNtwkOffWithVlan(org.apache.cloudstack.networkoffering.CreateNetworkOfferingTest) Time elapsed: 0.662 s <<< ERROR! org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'loadBalancerDaoImpl': Invocation of init method failed; nested exception is java.lang.NullPointerException at org.apache.cloudstack.networkoffering.CreateNetworkOfferingTest.setUp(CreateNetworkOfferingTest.java:110) Caused by: java.lang.NullPointerException at org.apache.cloudstack.networkoffering.CreateNetworkOfferingTest.setUp(CreateNetworkOfferingTest.java:110) * update #5580: use java.util.Optional * update #5580: create method listByNetworkIdOrVpcIdAndScheme --- .../cloud/network/dao/LoadBalancerDao.java | 4 +++ .../network/dao/LoadBalancerDaoImpl.java | 32 +++++++++++++++++++ .../cloud/network/rules/FirewallRules.java | 7 ++-- .../network/rules/LoadBalancingRules.java | 6 ++-- .../ChildTestConfiguration.java | 9 ++++-- ui/src/views/network/VpcTiersTab.vue | 2 +- 6 files changed, 51 insertions(+), 9 deletions(-) diff --git a/engine/schema/src/main/java/com/cloud/network/dao/LoadBalancerDao.java b/engine/schema/src/main/java/com/cloud/network/dao/LoadBalancerDao.java index c639ef78632..8b4d438a48d 100644 --- a/engine/schema/src/main/java/com/cloud/network/dao/LoadBalancerDao.java +++ b/engine/schema/src/main/java/com/cloud/network/dao/LoadBalancerDao.java @@ -27,6 +27,10 @@ public interface LoadBalancerDao extends GenericDao { List listByNetworkIdAndScheme(long networkId, Scheme scheme); + List listByVpcIdAndScheme(long vpcId, Scheme scheme); + + List listByNetworkIdOrVpcIdAndScheme(long networkId, Long vpcId, Scheme scheme); + List listInTransitionStateByNetworkIdAndScheme(long networkId, Scheme scheme); boolean isLoadBalancerRulesMappedToVmGuestIp(long instanceId, String instanceIp, long networkId); diff --git a/engine/schema/src/main/java/com/cloud/network/dao/LoadBalancerDaoImpl.java b/engine/schema/src/main/java/com/cloud/network/dao/LoadBalancerDaoImpl.java index 932c5c68a2d..95d6a1b7125 100644 --- a/engine/schema/src/main/java/com/cloud/network/dao/LoadBalancerDaoImpl.java +++ b/engine/schema/src/main/java/com/cloud/network/dao/LoadBalancerDaoImpl.java @@ -18,6 +18,7 @@ package com.cloud.network.dao; import java.util.List; +import javax.annotation.PostConstruct; import javax.inject.Inject; import com.cloud.network.rules.FirewallRule; @@ -35,11 +36,25 @@ import com.cloud.utils.db.SearchCriteria.Op; public class LoadBalancerDaoImpl extends GenericDaoBase implements LoadBalancerDao { private final SearchBuilder ListByIp; protected final SearchBuilder TransitionStateSearch; + private SearchBuilder ListByVpcId; @Inject protected FirewallRulesCidrsDao _portForwardingRulesCidrsDao; @Inject LoadBalancerVMMapDao _loadBalancerVMMapDao; + @Inject + NetworkDao _networkDao; + + @PostConstruct + void init() { + ListByVpcId = createSearchBuilder(); + ListByVpcId.and("networkId", ListByVpcId.entity().getNetworkId(), SearchCriteria.Op.EQ); + ListByVpcId.and("scheme", ListByVpcId.entity().getScheme(), SearchCriteria.Op.EQ); + SearchBuilder networkSearch = _networkDao.createSearchBuilder(); + networkSearch.and("vpcId", networkSearch.entity().getVpcId(), SearchCriteria.Op.EQ); + ListByVpcId.join("network", networkSearch, networkSearch.entity().getId(), ListByVpcId.entity().getNetworkId(), JoinBuilder.JoinType.INNER); + ListByVpcId.done(); + } protected LoadBalancerDaoImpl() { ListByIp = createSearchBuilder(); @@ -70,6 +85,23 @@ public class LoadBalancerDaoImpl extends GenericDaoBase im return listBy(sc); } + @Override + public List listByVpcIdAndScheme(long vpcId, Scheme scheme) { + SearchCriteria sc = ListByVpcId.create(); + sc.setJoinParameters("network", "vpcId", vpcId); + sc.setParameters("scheme", scheme); + return listBy(sc); + } + + @Override + public List listByNetworkIdOrVpcIdAndScheme(long networkId, Long vpcId, Scheme scheme) { + if (vpcId != null) { + return listByVpcIdAndScheme(vpcId, scheme); + } else { + return listByNetworkIdAndScheme(networkId, scheme); + } + } + @Override public List listInTransitionStateByNetworkIdAndScheme(long networkId, Scheme scheme) { SearchCriteria sc = TransitionStateSearch.create(); diff --git a/server/src/main/java/com/cloud/network/rules/FirewallRules.java b/server/src/main/java/com/cloud/network/rules/FirewallRules.java index b36ce810ac0..e995f143e0e 100644 --- a/server/src/main/java/com/cloud/network/rules/FirewallRules.java +++ b/server/src/main/java/com/cloud/network/rules/FirewallRules.java @@ -58,8 +58,9 @@ public class FirewallRules extends RuleApplier { if (_purpose == Purpose.LoadBalancing) { LoadBalancerDao loadBalancerDao = visitor.getVirtualNetworkApplianceFactory().getLoadBalancerDao(); - // for load balancer we have to resend all lb rules for the network - final List lbs = loadBalancerDao.listByNetworkIdAndScheme(_network.getId(), Scheme.Public); + // for load balancer we have to resend all lb rules for the network or vpc + final List lbs = loadBalancerDao.listByNetworkIdOrVpcIdAndScheme(_network.getId(), _network.getVpcId(), Scheme.Public); + _loadbalancingRules = new ArrayList(); LoadBalancingRulesManager lbMgr = visitor.getVirtualNetworkApplianceFactory().getLbMgr(); @@ -91,4 +92,4 @@ public class FirewallRules extends RuleApplier { public Purpose getPurpose() { return _purpose; } -} \ No newline at end of file +} diff --git a/server/src/main/java/com/cloud/network/rules/LoadBalancingRules.java b/server/src/main/java/com/cloud/network/rules/LoadBalancingRules.java index ad9e0130d9c..428ea80292c 100644 --- a/server/src/main/java/com/cloud/network/rules/LoadBalancingRules.java +++ b/server/src/main/java/com/cloud/network/rules/LoadBalancingRules.java @@ -50,8 +50,8 @@ public class LoadBalancingRules extends RuleApplier { _router = router; LoadBalancerDao loadBalancerDao = visitor.getVirtualNetworkApplianceFactory().getLoadBalancerDao(); - // For load balancer we have to resend all lb rules for the network - final List lbs = loadBalancerDao.listByNetworkIdAndScheme(_network.getId(), Scheme.Public); + // For load balancer we have to resend all lb rules for the network or vpc + final List lbs = loadBalancerDao.listByNetworkIdOrVpcIdAndScheme(_network.getId(), _network.getVpcId(), Scheme.Public); // We are cleaning it before because all the rules have to be sent to the router. _rules.clear(); @@ -76,4 +76,4 @@ public class LoadBalancingRules extends RuleApplier { public List getRules() { return _rules; } -} \ No newline at end of file +} diff --git a/server/src/test/java/org/apache/cloudstack/networkoffering/ChildTestConfiguration.java b/server/src/test/java/org/apache/cloudstack/networkoffering/ChildTestConfiguration.java index 3ffec4cd020..6beba0b212e 100644 --- a/server/src/test/java/org/apache/cloudstack/networkoffering/ChildTestConfiguration.java +++ b/server/src/test/java/org/apache/cloudstack/networkoffering/ChildTestConfiguration.java @@ -54,7 +54,7 @@ import com.cloud.network.dao.FirewallRulesCidrsDaoImpl; import com.cloud.network.dao.FirewallRulesDaoImpl; import com.cloud.network.dao.FirewallRulesDcidrsDaoImpl; import com.cloud.network.dao.IPAddressDaoImpl; -import com.cloud.network.dao.LoadBalancerDaoImpl; +import com.cloud.network.dao.LoadBalancerDao; import com.cloud.network.dao.NetworkDao; import com.cloud.network.dao.NetworkDomainDaoImpl; import com.cloud.network.dao.NetworkServiceMapDaoImpl; @@ -132,7 +132,7 @@ import org.springframework.core.type.filter.TypeFilter; DataCenterDetailsDaoImpl.class, NicSecondaryIpDaoImpl.class, UserIpv6AddressDaoImpl.class, UserDaoImpl.class, NicDaoImpl.class, NetworkDomainDaoImpl.class, HostDetailsDaoImpl.class, HostTagsDaoImpl.class, ClusterDaoImpl.class, FirewallRulesDaoImpl.class, FirewallRulesCidrsDaoImpl.class, FirewallRulesDcidrsDaoImpl.class, PhysicalNetworkDaoImpl.class, PhysicalNetworkTrafficTypeDaoImpl.class, PhysicalNetworkServiceProviderDaoImpl.class, - LoadBalancerDaoImpl.class, NetworkServiceMapDaoImpl.class, PrimaryDataStoreDaoImpl.class, StoragePoolDetailsDaoImpl.class, + NetworkServiceMapDaoImpl.class, PrimaryDataStoreDaoImpl.class, StoragePoolDetailsDaoImpl.class, PortableIpRangeDaoImpl.class, RegionDaoImpl.class, PortableIpDaoImpl.class, AccountGuestVlanMapDaoImpl.class, ImageStoreDaoImpl.class, ImageStoreDetailsDaoImpl.class}, includeFilters = {@Filter(value = ChildTestConfiguration.Library.class, type = FilterType.CUSTOM)}, useDefaultFilters = false) @@ -344,6 +344,11 @@ public class return Mockito.mock(StorageManager.class); } + @Bean + public LoadBalancerDao loadBalancerDao() { + return Mockito.mock(LoadBalancerDao.class); + } + public static class Library implements TypeFilter { @Override diff --git a/ui/src/views/network/VpcTiersTab.vue b/ui/src/views/network/VpcTiersTab.vue index ea36560b0bb..e6a4b798e62 100644 --- a/ui/src/views/network/VpcTiersTab.vue +++ b/ui/src/views/network/VpcTiersTab.vue @@ -462,7 +462,7 @@ export default { }, lbProviderMap: { publicLb: { - vpc: ['VpcVirtualRouter', 'Netscaler'] + vpc: ['Netscaler'] } }, publicLBExists: false