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
This commit is contained in:
Wei Zhou 2021-10-17 03:25:24 +02:00 committed by GitHub
parent a5372a98dc
commit f29aef8b70
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 51 additions and 9 deletions

View File

@ -27,6 +27,10 @@ public interface LoadBalancerDao extends GenericDao<LoadBalancerVO, Long> {
List<LoadBalancerVO> listByNetworkIdAndScheme(long networkId, Scheme scheme);
List<LoadBalancerVO> listByVpcIdAndScheme(long vpcId, Scheme scheme);
List<LoadBalancerVO> listByNetworkIdOrVpcIdAndScheme(long networkId, Long vpcId, Scheme scheme);
List<LoadBalancerVO> listInTransitionStateByNetworkIdAndScheme(long networkId, Scheme scheme);
boolean isLoadBalancerRulesMappedToVmGuestIp(long instanceId, String instanceIp, long networkId);

View File

@ -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<LoadBalancerVO, Long> implements LoadBalancerDao {
private final SearchBuilder<LoadBalancerVO> ListByIp;
protected final SearchBuilder<LoadBalancerVO> TransitionStateSearch;
private SearchBuilder<LoadBalancerVO> 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<NetworkVO> 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<LoadBalancerVO, Long> im
return listBy(sc);
}
@Override
public List<LoadBalancerVO> listByVpcIdAndScheme(long vpcId, Scheme scheme) {
SearchCriteria<LoadBalancerVO> sc = ListByVpcId.create();
sc.setJoinParameters("network", "vpcId", vpcId);
sc.setParameters("scheme", scheme);
return listBy(sc);
}
@Override
public List<LoadBalancerVO> listByNetworkIdOrVpcIdAndScheme(long networkId, Long vpcId, Scheme scheme) {
if (vpcId != null) {
return listByVpcIdAndScheme(vpcId, scheme);
} else {
return listByNetworkIdAndScheme(networkId, scheme);
}
}
@Override
public List<LoadBalancerVO> listInTransitionStateByNetworkIdAndScheme(long networkId, Scheme scheme) {
SearchCriteria<LoadBalancerVO> sc = TransitionStateSearch.create();

View File

@ -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<LoadBalancerVO> lbs = loadBalancerDao.listByNetworkIdAndScheme(_network.getId(), Scheme.Public);
// for load balancer we have to resend all lb rules for the network or vpc
final List<LoadBalancerVO> lbs = loadBalancerDao.listByNetworkIdOrVpcIdAndScheme(_network.getId(), _network.getVpcId(), Scheme.Public);
_loadbalancingRules = new ArrayList<LoadBalancingRule>();
LoadBalancingRulesManager lbMgr = visitor.getVirtualNetworkApplianceFactory().getLbMgr();
@ -91,4 +92,4 @@ public class FirewallRules extends RuleApplier {
public Purpose getPurpose() {
return _purpose;
}
}
}

View File

@ -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<LoadBalancerVO> lbs = loadBalancerDao.listByNetworkIdAndScheme(_network.getId(), Scheme.Public);
// For load balancer we have to resend all lb rules for the network or vpc
final List<LoadBalancerVO> 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<LoadBalancingRule> getRules() {
return _rules;
}
}
}

View File

@ -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

View File

@ -462,7 +462,7 @@ export default {
},
lbProviderMap: {
publicLb: {
vpc: ['VpcVirtualRouter', 'Netscaler']
vpc: ['Netscaler']
}
},
publicLBExists: false