Skip to content

Commit 8cf2987

Browse files
committed
Fix listNetworks queries & clean up the code
1 parent c3b3fe2 commit 8cf2987

File tree

1 file changed

+103
-122
lines changed

1 file changed

+103
-122
lines changed

server/src/main/java/com/cloud/network/NetworkServiceImpl.java

Lines changed: 103 additions & 122 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@
7575
import org.apache.cloudstack.network.dao.NetworkPermissionDao;
7676
import org.apache.cloudstack.network.element.InternalLoadBalancerElementService;
7777
import org.apache.commons.collections.CollectionUtils;
78+
import org.apache.commons.lang3.BooleanUtils;
7879
import org.apache.commons.lang3.EnumUtils;
7980
import org.apache.commons.lang3.ObjectUtils;
8081
import org.apache.commons.lang3.StringUtils;
@@ -2329,14 +2330,14 @@ public Pair<List<? extends Network>, Integer> searchForNetworks(ListNetworksCmd
23292330
if (permittedAccounts.isEmpty()) {
23302331
SearchBuilder<DomainVO> domainSearch = _domainDao.createSearchBuilder();
23312332
domainSearch.and("path", domainSearch.entity().getPath(), SearchCriteria.Op.LIKE);
2332-
sb.join("domainSearch", domainSearch, sb.entity().getDomainId(), domainSearch.entity().getId(), JoinBuilder.JoinType.INNER);
2333+
sb.join("domain", domainSearch, sb.entity().getDomainId(), domainSearch.entity().getId(), JoinBuilder.JoinType.INNER);
23332334
}
23342335

23352336
SearchBuilder<AccountVO> accountSearch = _accountDao.createSearchBuilder();
23362337
accountSearch.and("typeNEQ", accountSearch.entity().getType(), SearchCriteria.Op.NEQ);
23372338
accountSearch.and("typeEQ", accountSearch.entity().getType(), SearchCriteria.Op.EQ);
23382339

2339-
sb.join("accountSearch", accountSearch, sb.entity().getAccountId(), accountSearch.entity().getId(), JoinBuilder.JoinType.INNER);
2340+
sb.join("account", accountSearch, sb.entity().getAccountId(), accountSearch.entity().getId(), JoinBuilder.JoinType.INNER);
23402341

23412342
if (associatedNetworkId != null) {
23422343
SearchBuilder<NetworkDetailVO> associatedNetworkSearch = _networkDetailsDao.createSearchBuilder();
@@ -2345,73 +2346,28 @@ public Pair<List<? extends Network>, Integer> searchForNetworks(ListNetworksCmd
23452346
sb.join("associatedNetworkSearch", associatedNetworkSearch, sb.entity().getId(), associatedNetworkSearch.entity().getResourceId(), JoinBuilder.JoinType.INNER);
23462347
}
23472348

2348-
SearchCriteria<NetworkVO> mainSearchCriteria = createNetworkSearchCriteria(sb, keyword, id, isSystem, zoneId,
2349-
guestIpType, trafficType, physicalNetworkId, networkOfferingId, aclType, restartRequired,
2350-
specifyIpRanges, vpcId, tags, display, vlanId, associatedNetworkId);
2351-
SearchCriteria<NetworkVO> additionalSearchCriteria = _networksDao.createSearchCriteria();
2352-
2353-
if (isSystem == null || !isSystem) {
2354-
if (!permittedAccounts.isEmpty()) {
2355-
if (Arrays.asList(Network.NetworkFilter.Account, Network.NetworkFilter.AccountDomain, Network.NetworkFilter.All).contains(networkFilter)) {
2356-
//get account level networks
2357-
additionalSearchCriteria.addOr("id", SearchCriteria.Op.SC,
2358-
getAccountSpecificNetworksSearchCriteria(sb, permittedAccounts, skipProjectNetworks));
2359-
}
2360-
if (domainId != null && Arrays.asList(Network.NetworkFilter.Domain, Network.NetworkFilter.AccountDomain, Network.NetworkFilter.All).contains(networkFilter)) {
2361-
//get domain level networks
2362-
SearchCriteria<NetworkVO> domainLevelSC = getDomainLevelNetworksSearchCriteria(sb, domainId, false);
2363-
if (domainLevelSC != null) {
2364-
additionalSearchCriteria.addOr("id", SearchCriteria.Op.SC, domainLevelSC);
2365-
}
2366-
}
2367-
if (Arrays.asList(Network.NetworkFilter.Shared, Network.NetworkFilter.All).contains(networkFilter)) {
2368-
// get shared networks
2369-
SearchCriteria<NetworkVO> sharedNetworksSC = getSharedNetworksSearchCriteria(sb, permittedAccounts);
2370-
if (sharedNetworksSC != null) {
2371-
additionalSearchCriteria.addOr("id", SearchCriteria.Op.SC, sharedNetworksSC);
2372-
}
2373-
}
2374-
} else {
2375-
if (Arrays.asList(Network.NetworkFilter.Account, Network.NetworkFilter.AccountDomain, Network.NetworkFilter.All).contains(networkFilter)) {
2376-
//add account specific networks
2377-
additionalSearchCriteria.addOr("id", SearchCriteria.Op.SC,
2378-
getAccountSpecificNetworksByDomainPathSearchCriteria(sb, path, isRecursive,
2379-
skipProjectNetworks));
2380-
}
2381-
if (Arrays.asList(Network.NetworkFilter.Domain, Network.NetworkFilter.AccountDomain, Network.NetworkFilter.All).contains(networkFilter)) {
2382-
//add domain specific networks of domain + parent domains
2383-
SearchCriteria<NetworkVO> domainSpecificNetworksByDomainPathSC =
2384-
getDomainSpecificNetworksByDomainPathSearchCriteria(sb, path, isRecursive);
2385-
if (domainSpecificNetworksByDomainPathSC != null) {
2386-
additionalSearchCriteria.addOr("id", SearchCriteria.Op.SC, domainSpecificNetworksByDomainPathSC);
2387-
}
2388-
//add networks of subdomains
2389-
if (domainId == null) {
2390-
SearchCriteria<NetworkVO> domainLevelSC = getDomainLevelNetworksSearchCriteria(sb, caller.getDomainId(), true);
2391-
if (domainLevelSC != null) {
2392-
additionalSearchCriteria.addOr("id", SearchCriteria.Op.SC, domainLevelSC);
2393-
}
2394-
}
2395-
}
2396-
if (Arrays.asList(Network.NetworkFilter.Shared, Network.NetworkFilter.All).contains(networkFilter)) {
2397-
// get shared networks
2398-
SearchCriteria<NetworkVO> sharedNetworksSC = getSharedNetworksByDomainPathSearchCriteria(sb, path, isRecursive);
2399-
if (sharedNetworksSC != null) {
2400-
additionalSearchCriteria.addOr("id", SearchCriteria.Op.SC, sharedNetworksSC);
2401-
}
2402-
}
2403-
}
2404-
if (CollectionUtils.isNotEmpty(additionalSearchCriteria.getValues())) {
2405-
mainSearchCriteria.addAnd("id", SearchCriteria.Op.SC, additionalSearchCriteria);
2406-
}
2349+
Pair<List<NetworkVO>, Integer> result = new Pair<>(new ArrayList<>(), 0);
2350+
if (BooleanUtils.isTrue(isSystem)) {
2351+
SearchCriteria<NetworkVO> sc = createNetworkSearchCriteria(sb, keyword, id, isSystem, zoneId, guestIpType, trafficType,
2352+
physicalNetworkId, networkOfferingId, null, restartRequired, specifyIpRanges,
2353+
vpcId, tags, display, vlanId, associatedNetworkId);
2354+
addProjectNetworksConditionToSearch(sc, true);
2355+
result = _networksDao.searchAndCount(sc, searchFilter);
24072356
} else {
2408-
if (skipProjectNetworks) {
2409-
mainSearchCriteria.setJoinParameters("accountSearch", "typeNEQ", Account.Type.PROJECT);
2410-
} else {
2411-
mainSearchCriteria.setJoinParameters("accountSearch", "typeEQ", Account.Type.PROJECT);
2357+
SearchCriteria<NetworkVO> additionalSC = _networksDao.createSearchCriteria();
2358+
2359+
addAccountSpecificNetworksToSearch(additionalSC, sb, networkFilter, skipProjectNetworks, permittedAccounts, path, isRecursive);
2360+
addDomainSpecificNetworksToSearch(additionalSC, sb, networkFilter, permittedAccounts, domainId, path, isRecursive);
2361+
addSharedNetworksToSearch(additionalSC, sb, networkFilter, permittedAccounts, path, isRecursive);
2362+
2363+
if (CollectionUtils.isNotEmpty(additionalSC.getValues())) {
2364+
SearchCriteria<NetworkVO> sc = createNetworkSearchCriteria(sb, keyword, id, isSystem, zoneId, guestIpType,
2365+
trafficType, physicalNetworkId, networkOfferingId, aclType, restartRequired, specifyIpRanges, vpcId,
2366+
tags, display, vlanId, associatedNetworkId);
2367+
sc.addAnd("id", SearchCriteria.Op.SC, additionalSC);
2368+
result = _networksDao.searchAndCount(sc, searchFilter);
24122369
}
24132370
}
2414-
Pair<List<NetworkVO>, Integer> result = _networksDao.searchAndCount(mainSearchCriteria, searchFilter);
24152371
List<NetworkVO> networksToReturn = result.first();
24162372

24172373
if (supportedServicesStr != null && !supportedServicesStr.isEmpty() && !networksToReturn.isEmpty()) {
@@ -2458,6 +2414,66 @@ public Pair<List<? extends Network>, Integer> searchForNetworks(ListNetworksCmd
24582414
return new Pair<>(result.first(), result.second());
24592415
}
24602416

2417+
private void addAccountSpecificNetworksToSearch(SearchCriteria<NetworkVO> additionalSC, SearchBuilder<NetworkVO> sb,
2418+
Network.NetworkFilter networkFilter, boolean skipProjectNetworks,
2419+
List<Long> permittedAccounts, String path, boolean isRecursive) {
2420+
if (!Arrays.asList(Network.NetworkFilter.Account, Network.NetworkFilter.AccountDomain, Network.NetworkFilter.All).contains(networkFilter)) {
2421+
return;
2422+
}
2423+
2424+
SearchCriteria<NetworkVO> accountSC = sb.create();
2425+
accountSC.addAnd("aclType", SearchCriteria.Op.EQ, ACLType.Account.toString());
2426+
if (permittedAccounts.isEmpty()) {
2427+
if (path != null) {
2428+
// accountSC's WHERE clause gets OR-included in additionalSC's WHERE clause, which then gets AND-included
2429+
// in the main search criteria's WHERE clause. If we added the path filter as join parameters, it would not
2430+
// be present in the main search criteria. This is a way to add a condition that would normally go to accountSC's
2431+
// join parameters to its WHERE clause.
2432+
accountSC.getJoin("domain").addAnd("path", SearchCriteria.Op.LIKE, isRecursive ? path + "%" : path);
2433+
accountSC.addAnd("id", SearchCriteria.Op.SC, accountSC.getJoin("domain"));
2434+
}
2435+
} else {
2436+
accountSC.addAnd("accountId", SearchCriteria.Op.IN, permittedAccounts.toArray());
2437+
}
2438+
addProjectNetworksConditionToSearch(accountSC, skipProjectNetworks);
2439+
additionalSC.addOr("id", SearchCriteria.Op.SC, accountSC);
2440+
}
2441+
2442+
private void addDomainSpecificNetworksToSearch(SearchCriteria<NetworkVO> additionalSC, SearchBuilder<NetworkVO> sb, Network.NetworkFilter networkFilter,
2443+
List<Long> permittedAccounts, Long domainId, String path, boolean isRecursive) {
2444+
if (!Arrays.asList(Network.NetworkFilter.Domain, Network.NetworkFilter.AccountDomain, Network.NetworkFilter.All).contains(networkFilter)) {
2445+
return;
2446+
}
2447+
2448+
if (permittedAccounts.isEmpty()) {
2449+
// Add domain specific networks of domain + parent domains
2450+
addDomainNetworksByDomainPathToSearch(additionalSC, sb, path, isRecursive);
2451+
if (domainId == null) {
2452+
// Add networks of subdomains
2453+
Account caller = CallContext.current().getCallingAccount();
2454+
addDomainLevelNetworksToSearch(additionalSC, sb, caller.getDomainId(), true);
2455+
}
2456+
} else {
2457+
if (domainId != null) {
2458+
// Add domain level networks
2459+
addDomainLevelNetworksToSearch(additionalSC, sb, domainId, false);
2460+
}
2461+
}
2462+
}
2463+
2464+
private void addSharedNetworksToSearch(SearchCriteria<NetworkVO> additionalSC, SearchBuilder<NetworkVO> sb, Network.NetworkFilter networkFilter,
2465+
List<Long> permittedAccounts, String path, boolean isRecursive) {
2466+
if (!Arrays.asList(Network.NetworkFilter.Shared, Network.NetworkFilter.All).contains(networkFilter)) {
2467+
return;
2468+
}
2469+
2470+
if (permittedAccounts.isEmpty()) {
2471+
addSharedNetworksByDomainPathToSearch(additionalSC, sb, path, isRecursive);
2472+
} else {
2473+
addSharedNetworksByAccountsToSearch(additionalSC, sb, permittedAccounts);
2474+
}
2475+
}
2476+
24612477
private SearchCriteria<NetworkVO> createNetworkSearchCriteria(SearchBuilder<NetworkVO> sb, String keyword, Long id,
24622478
Boolean isSystem, Long zoneId, String guestIpType, String trafficType, Long physicalNetworkId,
24632479
Long networkOfferingId, String aclType, Boolean restartRequired,
@@ -2543,7 +2559,8 @@ private SearchCriteria<NetworkVO> createNetworkSearchCriteria(SearchBuilder<Netw
25432559
return sc;
25442560
}
25452561

2546-
private SearchCriteria<NetworkVO> getDomainLevelNetworksSearchCriteria(SearchBuilder<NetworkVO> sb, long domainId, boolean parentDomainsOnly) {
2562+
private void addDomainLevelNetworksToSearch(SearchCriteria<NetworkVO> additionalSC, SearchBuilder<NetworkVO> sb,
2563+
long domainId, boolean parentDomainsOnly) {
25472564
List<Long> networkIds = new ArrayList<>();
25482565
Set<Long> allowedDomains = _domainMgr.getDomainParentIds(domainId);
25492566
List<NetworkDomainVO> maps = _networkDomainDao.listDomainNetworkMapByDomain(allowedDomains.toArray());
@@ -2560,53 +2577,15 @@ private SearchCriteria<NetworkVO> getDomainLevelNetworksSearchCriteria(SearchBui
25602577

25612578
if (!networkIds.isEmpty()) {
25622579
SearchCriteria<NetworkVO> domainSC = sb.create();
2563-
domainSC.setJoinParameters("accountSearch", "typeNEQ", Account.Type.PROJECT);
25642580
domainSC.addAnd("id", SearchCriteria.Op.IN, networkIds.toArray());
25652581
domainSC.addAnd("aclType", SearchCriteria.Op.EQ, ACLType.Domain.toString());
2566-
return domainSC;
2582+
addProjectNetworksConditionToSearch(domainSC, true);
2583+
additionalSC.addOr("id", SearchCriteria.Op.SC, domainSC);
25672584
}
2568-
return null;
2569-
}
2570-
2571-
private SearchCriteria<NetworkVO> getAccountSpecificNetworksSearchCriteria(SearchBuilder<NetworkVO> sb,
2572-
List<Long> permittedAccounts, boolean skipProjectNetworks) {
2573-
SearchCriteria<NetworkVO> accountSC = sb.create();
2574-
if (skipProjectNetworks) {
2575-
accountSC.setJoinParameters("accountSearch", "typeNEQ", Account.Type.PROJECT);
2576-
} else {
2577-
accountSC.setJoinParameters("accountSearch", "typeEQ", Account.Type.PROJECT);
2578-
}
2579-
if (!permittedAccounts.isEmpty()) {
2580-
accountSC.addAnd("accountId", SearchCriteria.Op.IN, permittedAccounts.toArray());
2581-
}
2582-
accountSC.addAnd("aclType", SearchCriteria.Op.EQ, ACLType.Account.toString());
2583-
return accountSC;
25842585
}
25852586

2586-
private SearchCriteria<NetworkVO> getAccountSpecificNetworksByDomainPathSearchCriteria(SearchBuilder<NetworkVO> sb,
2587-
String path, boolean isRecursive, boolean skipProjectNetworks) {
2588-
SearchCriteria<NetworkVO> accountSC = sb.create();
2589-
if (skipProjectNetworks) {
2590-
accountSC.setJoinParameters("accountSearch", "typeNEQ", Account.Type.PROJECT);
2591-
} else {
2592-
accountSC.setJoinParameters("accountSearch", "typeEQ", Account.Type.PROJECT);
2593-
}
2594-
accountSC.addAnd("aclType", SearchCriteria.Op.EQ, ACLType.Account.toString());
2595-
2596-
if (path != null) {
2597-
if (isRecursive) {
2598-
accountSC.setJoinParameters("domainSearch", "path", path + "%");
2599-
} else {
2600-
accountSC.setJoinParameters("domainSearch", "path", path);
2601-
}
2602-
}
2603-
2604-
return accountSC;
2605-
}
2606-
2607-
private SearchCriteria<NetworkVO> getDomainSpecificNetworksByDomainPathSearchCriteria(SearchBuilder<NetworkVO> sb,
2608-
String path, boolean isRecursive) {
2609-
2587+
private void addDomainNetworksByDomainPathToSearch(SearchCriteria<NetworkVO> additionalSC, SearchBuilder<NetworkVO> sb,
2588+
String path, boolean isRecursive) {
26102589
Set<Long> allowedDomains = new HashSet<>();
26112590
if (path != null) {
26122591
if (isRecursive) {
@@ -2620,33 +2599,36 @@ private SearchCriteria<NetworkVO> getDomainSpecificNetworksByDomainPathSearchCri
26202599
List<Long> networkIds = new ArrayList<>();
26212600

26222601
List<NetworkDomainVO> maps = _networkDomainDao.listDomainNetworkMapByDomain(allowedDomains.toArray());
2623-
26242602
for (NetworkDomainVO map : maps) {
26252603
networkIds.add(map.getNetworkId());
26262604
}
26272605

26282606
if (!networkIds.isEmpty()) {
26292607
SearchCriteria<NetworkVO> domainSC = sb.create();
2630-
domainSC.setJoinParameters("accountSearch", "typeNEQ", Account.Type.PROJECT);
26312608
domainSC.addAnd("id", SearchCriteria.Op.IN, networkIds.toArray());
26322609
domainSC.addAnd("aclType", SearchCriteria.Op.EQ, ACLType.Domain.toString());
2633-
return domainSC;
2610+
addProjectNetworksConditionToSearch(domainSC, true);
2611+
additionalSC.addOr("id", SearchCriteria.Op.SC, domainSC);
26342612
}
2635-
return null;
26362613
}
26372614

2638-
private SearchCriteria<NetworkVO> getSharedNetworksSearchCriteria(SearchBuilder<NetworkVO> sb, List<Long> permittedAccounts) {
2615+
private void addProjectNetworksConditionToSearch(SearchCriteria<NetworkVO> sc, boolean skipProjectNetworks) {
2616+
sc.getJoin("account").addAnd("type", skipProjectNetworks ? Op.NEQ : Op.EQ, Account.Type.PROJECT);
2617+
sc.addAnd("id", Op.SC, sc.getJoin("account"));
2618+
}
2619+
2620+
private void addSharedNetworksByAccountsToSearch(SearchCriteria<NetworkVO> additionalSC, SearchBuilder<NetworkVO> sb,
2621+
List<Long> permittedAccounts) {
26392622
List<Long> sharedNetworkIds = _networkPermissionDao.listPermittedNetworkIdsByAccounts(permittedAccounts);
26402623
if (!sharedNetworkIds.isEmpty()) {
26412624
SearchCriteria<NetworkVO> ssc = sb.create();
2642-
ssc.setJoinParameters("accountSearch", "typeNEQ", Account.Type.PROJECT);
26432625
ssc.addAnd("id", SearchCriteria.Op.IN, sharedNetworkIds.toArray());
2644-
return ssc;
2626+
addProjectNetworksConditionToSearch(ssc, true);
2627+
additionalSC.addOr("id", SearchCriteria.Op.SC, ssc);
26452628
}
2646-
return null;
26472629
}
26482630

2649-
private SearchCriteria<NetworkVO> getSharedNetworksByDomainPathSearchCriteria(SearchBuilder<NetworkVO> sb, String path, boolean isRecursive) {
2631+
private void addSharedNetworksByDomainPathToSearch(SearchCriteria<NetworkVO> additionalSC, SearchBuilder<NetworkVO> sb, String path, boolean isRecursive) {
26502632
Set<Long> allowedDomains = new HashSet<>();
26512633
if (path != null) {
26522634
if (isRecursive) {
@@ -2656,7 +2638,7 @@ private SearchCriteria<NetworkVO> getSharedNetworksByDomainPathSearchCriteria(Se
26562638
allowedDomains.add(domain.getId());
26572639
}
26582640
}
2659-
List<Long> allowedDomainsList = new ArrayList<Long>(allowedDomains);
2641+
List<Long> allowedDomainsList = new ArrayList<>(allowedDomains);
26602642

26612643
if (!allowedDomainsList.isEmpty()) {
26622644
GenericSearchBuilder<AccountVO, Long> accountIdSearch = _accountDao.createSearchBuilder(Long.class);
@@ -2670,12 +2652,11 @@ private SearchCriteria<NetworkVO> getSharedNetworksByDomainPathSearchCriteria(Se
26702652
List<Long> sharedNetworkIds = _networkPermissionDao.listPermittedNetworkIdsByAccounts(allowedAccountsList);
26712653
if (!sharedNetworkIds.isEmpty()) {
26722654
SearchCriteria<NetworkVO> ssc = sb.create();
2673-
ssc.setJoinParameters("accountSearch", "typeNEQ", Account.Type.PROJECT);
26742655
ssc.addAnd("id", SearchCriteria.Op.IN, sharedNetworkIds.toArray());
2675-
return ssc;
2656+
addProjectNetworksConditionToSearch(ssc, true);
2657+
additionalSC.addOr("id", SearchCriteria.Op.SC, ssc);
26762658
}
26772659
}
2678-
return null;
26792660
}
26802661

26812662
@Override

0 commit comments

Comments
 (0)