7575import org .apache .cloudstack .network .dao .NetworkPermissionDao ;
7676import org .apache .cloudstack .network .element .InternalLoadBalancerElementService ;
7777import org .apache .commons .collections .CollectionUtils ;
78+ import org .apache .commons .lang3 .BooleanUtils ;
7879import org .apache .commons .lang3 .EnumUtils ;
7980import org .apache .commons .lang3 .ObjectUtils ;
8081import 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