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

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


The following commit(s) were added to refs/heads/main by this push:
     new 3fc31ca  Revert "Honour isrecursive above listall (#6045)" (#6126)
3fc31ca is described below

commit 3fc31ca1e5a4ca3b8b6fcc1ad2e698ec91606850
Author: Nicolas Vazquez <nicovazque...@gmail.com>
AuthorDate: Wed Mar 16 23:17:02 2022 -0300

    Revert "Honour isrecursive above listall (#6045)" (#6126)
    
    This reverts commit 71056191f2bdad4be1a7eaf9bb73a7dcee3516f2.
---
 .../cloudstack/api/BaseListDomainResourcesCmd.java |  3 -
 .../cluster/KubernetesClusterManagerImpl.java      |  7 +-
 .../contrail/management/MockAccountManager.java    |  3 +-
 .../java/com/cloud/api/query/QueryManagerImpl.java | 88 ++++++++++++----------
 .../java/com/cloud/network/NetworkServiceImpl.java |  5 ++
 .../com/cloud/network/as/AutoScaleManagerImpl.java |  7 +-
 .../network/firewall/FirewallManagerImpl.java      |  7 +-
 .../network/lb/LoadBalancingRulesManagerImpl.java  | 11 ++-
 .../com/cloud/network/rules/RulesManagerImpl.java  | 12 +--
 .../cloud/network/vpc/NetworkACLServiceImpl.java   | 11 ++-
 .../java/com/cloud/network/vpc/VpcManagerImpl.java | 19 +++--
 .../network/vpn/RemoteAccessVpnManagerImpl.java    | 13 ++--
 .../cloud/network/vpn/Site2SiteVpnManagerImpl.java | 19 +++--
 .../com/cloud/server/ManagementServerImpl.java     | 14 ++--
 .../storage/snapshot/SnapshotManagerImpl.java      |  8 +-
 .../main/java/com/cloud/user/AccountManager.java   |  3 +-
 .../java/com/cloud/user/AccountManagerImpl.java    | 11 ++-
 .../cloud/vm/snapshot/VMSnapshotManagerImpl.java   |  9 ++-
 .../cloudstack/backup/BackupManagerImpl.java       |  8 +-
 .../lb/ApplicationLoadBalancerManagerImpl.java     |  9 ++-
 .../com/cloud/user/MockAccountManagerImpl.java     |  4 +-
 21 files changed, 160 insertions(+), 111 deletions(-)

diff --git 
a/api/src/main/java/org/apache/cloudstack/api/BaseListDomainResourcesCmd.java 
b/api/src/main/java/org/apache/cloudstack/api/BaseListDomainResourcesCmd.java
index e9a9e5b..7a8cee3 100644
--- 
a/api/src/main/java/org/apache/cloudstack/api/BaseListDomainResourcesCmd.java
+++ 
b/api/src/main/java/org/apache/cloudstack/api/BaseListDomainResourcesCmd.java
@@ -41,9 +41,6 @@ public abstract class BaseListDomainResourcesCmd extends 
BaseListCmd implements
 
     @Override
     public boolean isRecursive() {
-        if (listAll()) {
-            return recursive == null ? true : recursive;
-        }
         return recursive == null ? false : recursive;
     }
 
diff --git 
a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/KubernetesClusterManagerImpl.java
 
b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/KubernetesClusterManagerImpl.java
index 457d03f..e4e2a7d 100644
--- 
a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/KubernetesClusterManagerImpl.java
+++ 
b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/KubernetesClusterManagerImpl.java
@@ -94,6 +94,7 @@ import com.cloud.user.UserVO;
 import com.cloud.user.dao.SSHKeyPairDao;
 import com.cloud.user.dao.UserDao;
 import com.cloud.utils.Pair;
+import com.cloud.utils.Ternary;
 import com.cloud.utils.component.ComponentContext;
 import com.cloud.utils.component.ManagerBase;
 import com.cloud.utils.concurrency.NamedThreadFactory;
@@ -1196,11 +1197,11 @@ public class KubernetesClusterManagerImpl extends 
ManagerBase implements Kuberne
         final String keyword = cmd.getKeyword();
         List<KubernetesClusterResponse> responsesList = new 
ArrayList<KubernetesClusterResponse>();
         List<Long> permittedAccounts = new ArrayList<Long>();
-        Pair<Long, Project.ListProjectResourcesCriteria> 
domainIdRecursiveListProject = new Pair<Long, 
Project.ListProjectResourcesCriteria>(cmd.getDomainId(), null);
+        Ternary<Long, Boolean, Project.ListProjectResourcesCriteria> 
domainIdRecursiveListProject = new Ternary<Long, Boolean, 
Project.ListProjectResourcesCriteria>(cmd.getDomainId(), cmd.isRecursive(), 
null);
         accountManager.buildACLSearchParameters(caller, clusterId, 
cmd.getAccountName(), cmd.getProjectId(), permittedAccounts, 
domainIdRecursiveListProject, cmd.listAll(), false);
         Long domainId = domainIdRecursiveListProject.first();
-        Project.ListProjectResourcesCriteria listProjectResourcesCriteria = 
domainIdRecursiveListProject.second();
-        Boolean isRecursive = cmd.isRecursive();
+        Boolean isRecursive = domainIdRecursiveListProject.second();
+        Project.ListProjectResourcesCriteria listProjectResourcesCriteria = 
domainIdRecursiveListProject.third();
         Filter searchFilter = new Filter(KubernetesClusterVO.class, "id", 
true, cmd.getStartIndex(), cmd.getPageSizeVal());
         SearchBuilder<KubernetesClusterVO> sb = 
kubernetesClusterDao.createSearchBuilder();
         accountManager.buildACLSearchBuilder(sb, domainId, isRecursive, 
permittedAccounts, listProjectResourcesCriteria);
diff --git 
a/plugins/network-elements/juniper-contrail/src/test/java/org/apache/cloudstack/network/contrail/management/MockAccountManager.java
 
b/plugins/network-elements/juniper-contrail/src/test/java/org/apache/cloudstack/network/contrail/management/MockAccountManager.java
index 88a88fd..f56689a 100644
--- 
a/plugins/network-elements/juniper-contrail/src/test/java/org/apache/cloudstack/network/contrail/management/MockAccountManager.java
+++ 
b/plugins/network-elements/juniper-contrail/src/test/java/org/apache/cloudstack/network/contrail/management/MockAccountManager.java
@@ -61,6 +61,7 @@ import com.cloud.user.UserVO;
 import com.cloud.user.dao.AccountDao;
 import com.cloud.user.dao.UserDao;
 import com.cloud.utils.Pair;
+import com.cloud.utils.Ternary;
 import com.cloud.utils.component.ManagerBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
@@ -278,7 +279,7 @@ public class MockAccountManager extends ManagerBase 
implements AccountManager {
     @Override
     public void buildACLSearchParameters(Account arg0, Long arg1, String arg2,
             Long arg3, List<Long> arg4,
-            Pair<Long, ListProjectResourcesCriteria> arg5,
+            Ternary<Long, Boolean, ListProjectResourcesCriteria> arg5,
             boolean arg6, boolean arg7) {
         // TODO Auto-generated method stub
 
diff --git a/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java 
b/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java
index 6f239e9..e009aaa 100644
--- a/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java
+++ b/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java
@@ -243,6 +243,7 @@ import com.cloud.user.dao.UserDao;
 import com.cloud.utils.DateUtil;
 import com.cloud.utils.NumbersUtil;
 import com.cloud.utils.Pair;
+import com.cloud.utils.Ternary;
 import com.cloud.utils.db.Filter;
 import com.cloud.utils.db.GenericSearchBuilder;
 import com.cloud.utils.db.JoinBuilder;
@@ -576,11 +577,12 @@ public class QueryManagerImpl extends 
MutualExclusiveIdsManagerBase implements Q
     }
 
     private Pair<List<UserAccountJoinVO>, Integer> getUserListInternal(Account 
caller, List<Long> permittedAccounts, boolean listAll, Long id, Object 
username, Object type,
-            String accountName, Object state, Object keyword, Long domainId, 
boolean isRecursive, Filter searchFilter) {
-        Pair<Long, ListProjectResourcesCriteria> domainIdRecursiveListProject 
= new Pair<Long, ListProjectResourcesCriteria>(domainId, null);
+            String accountName, Object state, Object keyword, Long domainId, 
boolean recursive, Filter searchFilter) {
+        Ternary<Long, Boolean, ListProjectResourcesCriteria> 
domainIdRecursiveListProject = new Ternary<Long, Boolean, 
ListProjectResourcesCriteria>(domainId, recursive, null);
         _accountMgr.buildACLSearchParameters(caller, id, accountName, null, 
permittedAccounts, domainIdRecursiveListProject, listAll, false);
         domainId = domainIdRecursiveListProject.first();
-        ListProjectResourcesCriteria listProjectResourcesCriteria = 
domainIdRecursiveListProject.second();
+        Boolean isRecursive = domainIdRecursiveListProject.second();
+        ListProjectResourcesCriteria listProjectResourcesCriteria = 
domainIdRecursiveListProject.third();
 
         SearchBuilder<UserAccountJoinVO> sb = 
_userAccountJoinDao.createSearchBuilder();
         _accountMgr.buildACLViewSearchBuilder(sb, domainId, isRecursive, 
permittedAccounts, listProjectResourcesCriteria);
@@ -679,11 +681,11 @@ public class QueryManagerImpl extends 
MutualExclusiveIdsManagerBase implements Q
         Integer duration = cmd.getDuration();
         Long startId = cmd.getStartId();
 
-        Pair<Long, ListProjectResourcesCriteria> domainIdRecursiveListProject 
= new Pair<Long, ListProjectResourcesCriteria>(cmd.getDomainId(), null);
+        Ternary<Long, Boolean, ListProjectResourcesCriteria> 
domainIdRecursiveListProject = new Ternary<Long, Boolean, 
ListProjectResourcesCriteria>(cmd.getDomainId(), cmd.isRecursive(), null);
         _accountMgr.buildACLSearchParameters(caller, id, cmd.getAccountName(), 
cmd.getProjectId(), permittedAccounts, domainIdRecursiveListProject, 
cmd.listAll(), false);
         Long domainId = domainIdRecursiveListProject.first();
-        ListProjectResourcesCriteria listProjectResourcesCriteria = 
domainIdRecursiveListProject.second();
-        Boolean isRecursive = cmd.isRecursive();
+        Boolean isRecursive = domainIdRecursiveListProject.second();
+        ListProjectResourcesCriteria listProjectResourcesCriteria = 
domainIdRecursiveListProject.third();
 
         Filter searchFilter = new Filter(EventJoinVO.class, "createDate", 
false, cmd.getStartIndex(), cmd.getPageSizeVal());
         SearchBuilder<EventJoinVO> sb = _eventJoinDao.createSearchBuilder();
@@ -810,12 +812,12 @@ public class QueryManagerImpl extends 
MutualExclusiveIdsManagerBase implements Q
             }
         }
 
-        Pair<Long, ListProjectResourcesCriteria> domainIdRecursiveListProject 
= new Pair<Long, ListProjectResourcesCriteria>(cmd.getDomainId(), null);
+        Ternary<Long, Boolean, ListProjectResourcesCriteria> 
domainIdRecursiveListProject = new Ternary<Long, Boolean, 
ListProjectResourcesCriteria>(cmd.getDomainId(), cmd.isRecursive(), null);
 
         _accountMgr.buildACLSearchParameters(caller, null, 
cmd.getAccountName(), projectId, permittedAccounts, 
domainIdRecursiveListProject, listAll, false);
         Long domainId = domainIdRecursiveListProject.first();
-        ListProjectResourcesCriteria listProjectResourcesCriteria = 
domainIdRecursiveListProject.second();
-        Boolean isRecursive = cmd.isRecursive();
+        Boolean isRecursive = domainIdRecursiveListProject.second();
+        ListProjectResourcesCriteria listProjectResourcesCriteria = 
domainIdRecursiveListProject.third();
         Filter searchFilter = new Filter(ResourceTagJoinVO.class, 
"resourceType", false, cmd.getStartIndex(), cmd.getPageSizeVal());
 
         SearchBuilder<ResourceTagJoinVO> sb = 
_resourceTagJoinDao.createSearchBuilder();
@@ -883,11 +885,11 @@ public class QueryManagerImpl extends 
MutualExclusiveIdsManagerBase implements Q
         Account caller = CallContext.current().getCallingAccount();
         List<Long> permittedAccounts = new ArrayList<Long>();
 
-        Pair<Long, ListProjectResourcesCriteria> domainIdRecursiveListProject 
= new Pair<Long, ListProjectResourcesCriteria>(cmd.getDomainId(), null);
+        Ternary<Long, Boolean, ListProjectResourcesCriteria> 
domainIdRecursiveListProject = new Ternary<Long, Boolean, 
ListProjectResourcesCriteria>(cmd.getDomainId(), cmd.isRecursive(), null);
         _accountMgr.buildACLSearchParameters(caller, id, cmd.getAccountName(), 
cmd.getProjectId(), permittedAccounts, domainIdRecursiveListProject, 
cmd.listAll(), false);
         Long domainId = domainIdRecursiveListProject.first();
-        ListProjectResourcesCriteria listProjectResourcesCriteria = 
domainIdRecursiveListProject.second();
-        Boolean isRecursive = cmd.isRecursive();
+        Boolean isRecursive = domainIdRecursiveListProject.second();
+        ListProjectResourcesCriteria listProjectResourcesCriteria = 
domainIdRecursiveListProject.third();
 
         Filter searchFilter = new Filter(InstanceGroupJoinVO.class, "id", 
true, cmd.getStartIndex(), cmd.getPageSizeVal());
 
@@ -941,11 +943,11 @@ public class QueryManagerImpl extends 
MutualExclusiveIdsManagerBase implements Q
         Long userId = cmd.getUserId();
         Map<String, String> tags = cmd.getTags();
         Boolean display = cmd.getDisplay();
-        Pair<Long, ListProjectResourcesCriteria> domainIdRecursiveListProject 
= new Pair<Long, ListProjectResourcesCriteria>(cmd.getDomainId(), null);
+        Ternary<Long, Boolean, ListProjectResourcesCriteria> 
domainIdRecursiveListProject = new Ternary<Long, Boolean, 
ListProjectResourcesCriteria>(cmd.getDomainId(), cmd.isRecursive(), null);
         _accountMgr.buildACLSearchParameters(caller, id, cmd.getAccountName(), 
cmd.getProjectId(), permittedAccounts, domainIdRecursiveListProject, listAll, 
false);
         Long domainId = domainIdRecursiveListProject.first();
-        ListProjectResourcesCriteria listProjectResourcesCriteria = 
domainIdRecursiveListProject.second();
-        Boolean isRecursive = cmd.isRecursive();
+        Boolean isRecursive = domainIdRecursiveListProject.second();
+        ListProjectResourcesCriteria listProjectResourcesCriteria = 
domainIdRecursiveListProject.third();
 
         Filter searchFilter = new Filter(UserVmJoinVO.class, "id", true, 
cmd.getStartIndex(), cmd.getPageSizeVal());
 
@@ -1266,11 +1268,11 @@ public class QueryManagerImpl extends 
MutualExclusiveIdsManagerBase implements Q
             return listSecurityGroupRulesByVM(instanceId.longValue(), 
cmd.getStartIndex(), cmd.getPageSizeVal());
         }
 
-        Pair<Long, ListProjectResourcesCriteria> domainIdRecursiveListProject 
= new Pair<Long, ListProjectResourcesCriteria>(cmd.getDomainId(), null);
+        Ternary<Long, Boolean, ListProjectResourcesCriteria> 
domainIdRecursiveListProject = new Ternary<Long, Boolean, 
ListProjectResourcesCriteria>(cmd.getDomainId(), cmd.isRecursive(), null);
         _accountMgr.buildACLSearchParameters(caller, id, cmd.getAccountName(), 
cmd.getProjectId(), permittedAccounts, domainIdRecursiveListProject, 
cmd.listAll(), false);
         Long domainId = domainIdRecursiveListProject.first();
-        ListProjectResourcesCriteria listProjectResourcesCriteria = 
domainIdRecursiveListProject.second();
-        Boolean isRecursive = cmd.isRecursive();
+        Boolean isRecursive = domainIdRecursiveListProject.second();
+        ListProjectResourcesCriteria listProjectResourcesCriteria = 
domainIdRecursiveListProject.third();
 
         Filter searchFilter = new Filter(SecurityGroupJoinVO.class, "id", 
true, cmd.getStartIndex(), cmd.getPageSizeVal());
         SearchBuilder<SecurityGroupJoinVO> sb = 
_securityGroupJoinDao.createSearchBuilder();
@@ -1393,11 +1395,11 @@ public class QueryManagerImpl extends 
MutualExclusiveIdsManagerBase implements Q
         Account caller = CallContext.current().getCallingAccount();
         List<Long> permittedAccounts = new ArrayList<Long>();
 
-        Pair<Long, ListProjectResourcesCriteria> domainIdRecursiveListProject 
= new Pair<Long, ListProjectResourcesCriteria>(cmd.getDomainId(), null);
+        Ternary<Long, Boolean, ListProjectResourcesCriteria> 
domainIdRecursiveListProject = new Ternary<Long, Boolean, 
ListProjectResourcesCriteria>(cmd.getDomainId(), cmd.isRecursive(), null);
         _accountMgr.buildACLSearchParameters(caller, id, cmd.getAccountName(), 
cmd.getProjectId(), permittedAccounts, domainIdRecursiveListProject, 
cmd.listAll(), false);
         Long domainId = domainIdRecursiveListProject.first();
-        ListProjectResourcesCriteria listProjectResourcesCriteria = 
domainIdRecursiveListProject.second();
-        Boolean isRecursive = cmd.isRecursive();
+        Boolean isRecursive = domainIdRecursiveListProject.second();
+        ListProjectResourcesCriteria listProjectResourcesCriteria = 
domainIdRecursiveListProject.third();
         Filter searchFilter = new Filter(DomainRouterJoinVO.class, "id", true, 
cmd.getStartIndex(), cmd.getPageSizeVal());
 
         SearchBuilder<DomainRouterJoinVO> sb = 
_routerJoinDao.createSearchBuilder();
@@ -1733,10 +1735,11 @@ public class QueryManagerImpl extends 
MutualExclusiveIdsManagerBase implements Q
         User callingUser = CallContext.current().getCallingUser();
         List<Long> permittedAccounts = new ArrayList<Long>();
 
-        Pair<Long, ListProjectResourcesCriteria> domainIdRecursiveListProject 
= new Pair<Long, ListProjectResourcesCriteria>(domainId, null);
+        Ternary<Long, Boolean, ListProjectResourcesCriteria> 
domainIdRecursiveListProject = new Ternary<Long, Boolean, 
ListProjectResourcesCriteria>(domainId, isRecursive, null);
         _accountMgr.buildACLSearchParameters(caller, id, accountName, 
projectId, permittedAccounts, domainIdRecursiveListProject, listAll, true);
         domainId = domainIdRecursiveListProject.first();
-        ListProjectResourcesCriteria listProjectResourcesCriteria = 
domainIdRecursiveListProject.second();
+        isRecursive = domainIdRecursiveListProject.second();
+        ListProjectResourcesCriteria listProjectResourcesCriteria = 
domainIdRecursiveListProject.third();
 
         Filter searchFilter = new Filter(ProjectInvitationJoinVO.class, "id", 
true, startIndex, pageSizeVal);
         SearchBuilder<ProjectInvitationJoinVO> sb = 
_projectInvitationJoinDao.createSearchBuilder();
@@ -2047,11 +2050,11 @@ public class QueryManagerImpl extends 
MutualExclusiveIdsManagerBase implements Q
 
         List<Long> ids = getIdsListFromCmd(cmd.getId(), cmd.getIds());
 
-        Pair<Long, ListProjectResourcesCriteria> domainIdRecursiveListProject 
= new Pair<Long, ListProjectResourcesCriteria>(cmd.getDomainId(), null);
+        Ternary<Long, Boolean, ListProjectResourcesCriteria> 
domainIdRecursiveListProject = new Ternary<Long, Boolean, 
ListProjectResourcesCriteria>(cmd.getDomainId(), cmd.isRecursive(), null);
         _accountMgr.buildACLSearchParameters(caller, id, cmd.getAccountName(), 
cmd.getProjectId(), permittedAccounts, domainIdRecursiveListProject, 
cmd.listAll(), false);
         Long domainId = domainIdRecursiveListProject.first();
-        ListProjectResourcesCriteria listProjectResourcesCriteria = 
domainIdRecursiveListProject.second();
-        Boolean isRecursive = cmd.isRecursive();
+        Boolean isRecursive = domainIdRecursiveListProject.second();
+        ListProjectResourcesCriteria listProjectResourcesCriteria = 
domainIdRecursiveListProject.third();
         Filter searchFilter = new Filter(VolumeJoinVO.class, "created", false, 
cmd.getStartIndex(), cmd.getPageSizeVal());
 
         // hack for now, this should be done better but due to needing a join I
@@ -2319,6 +2322,8 @@ public class QueryManagerImpl extends 
MutualExclusiveIdsManagerBase implements Q
                 if (domainId == null) {
                     domainId = caller.getDomainId();
                 }
+                // mark recursive
+                isRecursive = true;
             } else if (!callerIsAdmin || domainId == null) {
                 accountId = caller.getAccountId();
             }
@@ -2434,11 +2439,11 @@ public class QueryManagerImpl extends 
MutualExclusiveIdsManagerBase implements Q
 
         List<Long> permittedAccounts = new ArrayList<Long>();
 
-        Pair<Long, ListProjectResourcesCriteria> domainIdRecursiveListProject 
= new Pair<Long, ListProjectResourcesCriteria>(cmd.getDomainId(), null);
+        Ternary<Long, Boolean, ListProjectResourcesCriteria> 
domainIdRecursiveListProject = new Ternary<Long, Boolean, 
ListProjectResourcesCriteria>(cmd.getDomainId(), cmd.isRecursive(), null);
         _accountMgr.buildACLSearchParameters(caller, null, 
cmd.getAccountName(), null, permittedAccounts, domainIdRecursiveListProject, 
cmd.listAll(), false);
         Long domainId = domainIdRecursiveListProject.first();
-        ListProjectResourcesCriteria listProjectResourcesCriteria = 
domainIdRecursiveListProject.second();
-        Boolean isRecursive = cmd.isRecursive();
+        Boolean isRecursive = domainIdRecursiveListProject.second();
+        ListProjectResourcesCriteria listProjectResourcesCriteria = 
domainIdRecursiveListProject.third();
 
         Filter searchFilter = new Filter(AsyncJobJoinVO.class, "id", true, 
cmd.getStartIndex(), cmd.getPageSizeVal());
         SearchBuilder<AsyncJobJoinVO> sb = _jobJoinDao.createSearchBuilder();
@@ -2452,9 +2457,9 @@ public class QueryManagerImpl extends 
MutualExclusiveIdsManagerBase implements Q
 
         if (listProjectResourcesCriteria != null) {
 
-            if (listProjectResourcesCriteria == 
ListProjectResourcesCriteria.ListProjectResourcesOnly) {
+            if (listProjectResourcesCriteria == 
Project.ListProjectResourcesCriteria.ListProjectResourcesOnly) {
                 sb.and("type", sb.entity().getAccountType(), 
SearchCriteria.Op.EQ);
-            } else if (listProjectResourcesCriteria == 
ListProjectResourcesCriteria.SkipProjectResources) {
+            } else if (listProjectResourcesCriteria == 
Project.ListProjectResourcesCriteria.SkipProjectResources) {
                 sb.and("type", sb.entity().getAccountType(), 
SearchCriteria.Op.NEQ);
             }
 
@@ -3560,9 +3565,9 @@ public class QueryManagerImpl extends 
MutualExclusiveIdsManagerBase implements Q
         }
 
         List<Long> permittedAccountIds = new ArrayList<Long>();
-        Pair<Long, ListProjectResourcesCriteria> domainIdRecursiveListProject 
= new Pair<Long, ListProjectResourcesCriteria>(cmd.getDomainId(), null);
+        Ternary<Long, Boolean, ListProjectResourcesCriteria> 
domainIdRecursiveListProject = new Ternary<Long, Boolean, 
ListProjectResourcesCriteria>(cmd.getDomainId(), cmd.isRecursive(), null);
         _accountMgr.buildACLSearchParameters(caller, id, cmd.getAccountName(), 
cmd.getProjectId(), permittedAccountIds, domainIdRecursiveListProject, listAll, 
false);
-        ListProjectResourcesCriteria listProjectResourcesCriteria = 
domainIdRecursiveListProject.second();
+        ListProjectResourcesCriteria listProjectResourcesCriteria = 
domainIdRecursiveListProject.third();
         List<Account> permittedAccounts = new ArrayList<Account>();
         for (Long accountId : permittedAccountIds) {
             permittedAccounts.add(_accountMgr.getAccount(accountId));
@@ -3902,9 +3907,9 @@ public class QueryManagerImpl extends 
MutualExclusiveIdsManagerBase implements Q
         }
 
         List<Long> permittedAccountIds = new ArrayList<Long>();
-        Pair<Long, ListProjectResourcesCriteria> domainIdRecursiveListProject 
= new Pair<Long, ListProjectResourcesCriteria>(cmd.getDomainId(), null);
+        Ternary<Long, Boolean, ListProjectResourcesCriteria> 
domainIdRecursiveListProject = new Ternary<Long, Boolean, 
ListProjectResourcesCriteria>(cmd.getDomainId(), cmd.isRecursive(), null);
         _accountMgr.buildACLSearchParameters(caller, id, cmd.getAccountName(), 
cmd.getProjectId(), permittedAccountIds, domainIdRecursiveListProject, listAll, 
false);
-        ListProjectResourcesCriteria listProjectResourcesCriteria = 
domainIdRecursiveListProject.second();
+        ListProjectResourcesCriteria listProjectResourcesCriteria = 
domainIdRecursiveListProject.third();
         List<Account> permittedAccounts = new ArrayList<Account>();
         for (Long accountId : permittedAccountIds) {
             permittedAccounts.add(_accountMgr.getAccount(accountId));
@@ -4019,12 +4024,13 @@ public class QueryManagerImpl extends 
MutualExclusiveIdsManagerBase implements Q
         }
 
         List<Long> permittedAccounts = new ArrayList<Long>();
-        Pair<Long, ListProjectResourcesCriteria> domainIdRecursiveListProject 
= new Pair<Long, ListProjectResourcesCriteria>(domainId, null);
+        Ternary<Long, Boolean, ListProjectResourcesCriteria> ternary = new 
Ternary<Long, Boolean, ListProjectResourcesCriteria>(domainId, isRecursive, 
null);
 
-        _accountMgr.buildACLSearchParameters(caller, affinityGroupId, 
accountName, projectId, permittedAccounts, domainIdRecursiveListProject, 
listAll, false);
+        _accountMgr.buildACLSearchParameters(caller, affinityGroupId, 
accountName, projectId, permittedAccounts, ternary, listAll, false);
 
-        domainId = domainIdRecursiveListProject.first();
-        ListProjectResourcesCriteria listProjectResourcesCriteria = 
domainIdRecursiveListProject.second();
+        domainId = ternary.first();
+        isRecursive = ternary.second();
+        ListProjectResourcesCriteria listProjectResourcesCriteria = 
ternary.third();
 
         Filter searchFilter = new Filter(AffinityGroupJoinVO.class, ID_FIELD, 
true, startIndex, pageSize);
 
@@ -4092,9 +4098,9 @@ public class QueryManagerImpl extends 
MutualExclusiveIdsManagerBase implements Q
         }
 
         if (listProjectResourcesCriteria != null) {
-            if (listProjectResourcesCriteria == 
ListProjectResourcesCriteria.ListProjectResourcesOnly) {
+            if (listProjectResourcesCriteria == 
Project.ListProjectResourcesCriteria.ListProjectResourcesOnly) {
                 sb.and("accountType", sb.entity().getAccountType(), 
SearchCriteria.Op.EQ);
-            } else if (listProjectResourcesCriteria == 
ListProjectResourcesCriteria.SkipProjectResources) {
+            } else if (listProjectResourcesCriteria == 
Project.ListProjectResourcesCriteria.SkipProjectResources) {
                 sb.and("accountType", sb.entity().getAccountType(), 
SearchCriteria.Op.NEQ);
             }
         }
diff --git a/server/src/main/java/com/cloud/network/NetworkServiceImpl.java 
b/server/src/main/java/com/cloud/network/NetworkServiceImpl.java
index 9d7e4e0..c68bcbb 100644
--- a/server/src/main/java/com/cloud/network/NetworkServiceImpl.java
+++ b/server/src/main/java/com/cloud/network/NetworkServiceImpl.java
@@ -1612,6 +1612,7 @@ public class NetworkServiceImpl extends ManagerBase 
implements NetworkService, C
         Long physicalNetworkId = cmd.getPhysicalNetworkId();
         List<String> supportedServicesStr = cmd.getSupportedServices();
         Boolean restartRequired = cmd.isRestartRequired();
+        boolean listAll = cmd.listAll();
         boolean isRecursive = cmd.isRecursive();
         Boolean specifyIpRanges = cmd.isSpecifyIpRanges();
         Long vpcId = cmd.getVpcId();
@@ -1691,6 +1692,10 @@ public class NetworkServiceImpl extends ManagerBase 
implements NetworkService, C
             path = _domainDao.findById(caller.getDomainId()).getPath();
         }
 
+        if (listAll && domainId == null) {
+            isRecursive = true;
+        }
+
         Filter searchFilter = new Filter(NetworkVO.class, "id", false, null, 
null);
         SearchBuilder<NetworkVO> sb = _networksDao.createSearchBuilder();
 
diff --git 
a/server/src/main/java/com/cloud/network/as/AutoScaleManagerImpl.java 
b/server/src/main/java/com/cloud/network/as/AutoScaleManagerImpl.java
index f109214..ec46b8c 100644
--- a/server/src/main/java/com/cloud/network/as/AutoScaleManagerImpl.java
+++ b/server/src/main/java/com/cloud/network/as/AutoScaleManagerImpl.java
@@ -107,6 +107,7 @@ import com.cloud.user.dao.AccountDao;
 import com.cloud.user.dao.UserDao;
 import com.cloud.uservm.UserVm;
 import com.cloud.utils.Pair;
+import com.cloud.utils.Ternary;
 import com.cloud.utils.component.ComponentContext;
 import com.cloud.utils.component.ManagerBase;
 import com.cloud.utils.db.DB;
@@ -644,11 +645,13 @@ public class AutoScaleManagerImpl<Type> extends 
ManagerBase implements AutoScale
             long pageSizeVal = cmd.getPageSizeVal();
             Account caller = CallContext.current().getCallingAccount();
 
-            Pair<Long, ListProjectResourcesCriteria> 
domainIdRecursiveListProject = new Pair<Long, 
ListProjectResourcesCriteria>(domainId, null);
+            Ternary<Long, Boolean, ListProjectResourcesCriteria> 
domainIdRecursiveListProject = new Ternary<Long, Boolean,
+                    ListProjectResourcesCriteria>(domainId, isRecursive, null);
             _accountMgr.buildACLSearchParameters(caller, id, accountName, 
null, permittedAccounts, domainIdRecursiveListProject,
                     listAll, false);
             domainId = domainIdRecursiveListProject.first();
-            ListProjectResourcesCriteria listProjectResourcesCriteria = 
domainIdRecursiveListProject.second();
+            isRecursive = domainIdRecursiveListProject.second();
+            ListProjectResourcesCriteria listProjectResourcesCriteria = 
domainIdRecursiveListProject.third();
             _accountMgr.buildACLSearchBuilder(searchBuilder, domainId, 
isRecursive, permittedAccounts, listProjectResourcesCriteria);
             searchFilter = new Filter(entityClass, "id", false, startIndex, 
pageSizeVal);
         }
diff --git 
a/server/src/main/java/com/cloud/network/firewall/FirewallManagerImpl.java 
b/server/src/main/java/com/cloud/network/firewall/FirewallManagerImpl.java
index 21f6d6a..a4dba0b 100644
--- a/server/src/main/java/com/cloud/network/firewall/FirewallManagerImpl.java
+++ b/server/src/main/java/com/cloud/network/firewall/FirewallManagerImpl.java
@@ -80,6 +80,7 @@ import com.cloud.user.Account;
 import com.cloud.user.AccountManager;
 import com.cloud.user.DomainManager;
 import com.cloud.utils.Pair;
+import com.cloud.utils.Ternary;
 import com.cloud.utils.component.ManagerBase;
 import com.cloud.utils.db.DB;
 import com.cloud.utils.db.Filter;
@@ -281,11 +282,11 @@ public class FirewallManagerImpl extends ManagerBase 
implements FirewallService,
             _accountMgr.checkAccess(caller, null, true, ipAddressVO);
         }
 
-        Pair<Long, ListProjectResourcesCriteria> domainIdRecursiveListProject 
= new Pair<Long, ListProjectResourcesCriteria>(cmd.getDomainId(), null);
+        Ternary<Long, Boolean, ListProjectResourcesCriteria> 
domainIdRecursiveListProject = new Ternary<Long, Boolean, 
ListProjectResourcesCriteria>(cmd.getDomainId(), cmd.isRecursive(), null);
         _accountMgr.buildACLSearchParameters(caller, id, cmd.getAccountName(), 
cmd.getProjectId(), permittedAccounts, domainIdRecursiveListProject, 
cmd.listAll(), false);
         Long domainId = domainIdRecursiveListProject.first();
-        ListProjectResourcesCriteria listProjectResourcesCriteria = 
domainIdRecursiveListProject.second();
-        Boolean isRecursive = cmd.isRecursive();
+        Boolean isRecursive = domainIdRecursiveListProject.second();
+        ListProjectResourcesCriteria listProjectResourcesCriteria = 
domainIdRecursiveListProject.third();
 
         Filter filter = new Filter(FirewallRuleVO.class, "id", false, 
cmd.getStartIndex(), cmd.getPageSizeVal());
         SearchBuilder<FirewallRuleVO> sb = _firewallDao.createSearchBuilder();
diff --git 
a/server/src/main/java/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java 
b/server/src/main/java/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java
index 510dbe1..d7dcb91 100644
--- 
a/server/src/main/java/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java
+++ 
b/server/src/main/java/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java
@@ -144,6 +144,7 @@ import com.cloud.user.dao.AccountDao;
 import com.cloud.user.dao.UserDao;
 import com.cloud.uservm.UserVm;
 import com.cloud.utils.Pair;
+import com.cloud.utils.Ternary;
 import com.cloud.utils.component.ManagerBase;
 import com.cloud.utils.db.DB;
 import com.cloud.utils.db.EntityManager;
@@ -2324,11 +2325,13 @@ public class LoadBalancingRulesManagerImpl<Type> 
extends ManagerBase implements
         Account caller = CallContext.current().getCallingAccount();
         List<Long> permittedAccounts = new ArrayList<Long>();
 
-        Pair<Long, ListProjectResourcesCriteria> domainIdRecursiveListProject 
= new Pair<Long, ListProjectResourcesCriteria>(cmd.getDomainId(), null);
-        _accountMgr.buildACLSearchParameters(caller, id, cmd.getAccountName(), 
cmd.getProjectId(), permittedAccounts, domainIdRecursiveListProject, 
cmd.listAll(), false);
+        Ternary<Long, Boolean, ListProjectResourcesCriteria> 
domainIdRecursiveListProject = new Ternary<Long, Boolean, 
ListProjectResourcesCriteria>(
+                cmd.getDomainId(), cmd.isRecursive(), null);
+        _accountMgr.buildACLSearchParameters(caller, id, cmd.getAccountName(), 
cmd.getProjectId(), permittedAccounts,
+                domainIdRecursiveListProject, cmd.listAll(), false);
         Long domainId = domainIdRecursiveListProject.first();
-        ListProjectResourcesCriteria listProjectResourcesCriteria = 
domainIdRecursiveListProject.second();
-        Boolean isRecursive = cmd.isRecursive();
+        Boolean isRecursive = domainIdRecursiveListProject.second();
+        ListProjectResourcesCriteria listProjectResourcesCriteria = 
domainIdRecursiveListProject.third();
 
         Filter searchFilter = new Filter(LoadBalancerVO.class, "id", true, 
cmd.getStartIndex(), cmd.getPageSizeVal());
         SearchBuilder<LoadBalancerVO> sb = _lbDao.createSearchBuilder();
diff --git a/server/src/main/java/com/cloud/network/rules/RulesManagerImpl.java 
b/server/src/main/java/com/cloud/network/rules/RulesManagerImpl.java
index 21dd055..c16eeb6 100644
--- a/server/src/main/java/com/cloud/network/rules/RulesManagerImpl.java
+++ b/server/src/main/java/com/cloud/network/rules/RulesManagerImpl.java
@@ -74,6 +74,7 @@ import com.cloud.user.AccountManager;
 import com.cloud.user.DomainManager;
 import com.cloud.uservm.UserVm;
 import com.cloud.utils.Pair;
+import com.cloud.utils.Ternary;
 import com.cloud.utils.component.ManagerBase;
 import com.cloud.utils.db.DB;
 import com.cloud.utils.db.EntityManager;
@@ -834,11 +835,11 @@ public class RulesManagerImpl extends ManagerBase 
implements RulesManager, Rules
             _accountMgr.checkAccess(caller, null, true, ipAddressVO);
         }
 
-        Pair<Long, ListProjectResourcesCriteria> domainIdRecursiveListProject 
= new Pair<Long, ListProjectResourcesCriteria>(cmd.getDomainId(), null);
+        Ternary<Long, Boolean, ListProjectResourcesCriteria> 
domainIdRecursiveListProject = new Ternary<Long, Boolean, 
ListProjectResourcesCriteria>(cmd.getDomainId(), cmd.isRecursive(), null);
         _accountMgr.buildACLSearchParameters(caller, id, cmd.getAccountName(), 
cmd.getProjectId(), permittedAccounts, domainIdRecursiveListProject, 
cmd.listAll(), false);
         Long domainId = domainIdRecursiveListProject.first();
-        ListProjectResourcesCriteria listProjectResourcesCriteria = 
domainIdRecursiveListProject.second();
-        Boolean isRecursive = cmd.isRecursive();
+        Boolean isRecursive = domainIdRecursiveListProject.second();
+        ListProjectResourcesCriteria listProjectResourcesCriteria = 
domainIdRecursiveListProject.third();
 
         Filter filter = new Filter(PortForwardingRuleVO.class, "id", false, 
cmd.getStartIndex(), cmd.getPageSizeVal());
         SearchBuilder<PortForwardingRuleVO> sb = 
_portForwardingDao.createSearchBuilder();
@@ -1050,10 +1051,11 @@ public class RulesManagerImpl extends ManagerBase 
implements RulesManager, Rules
             _accountMgr.checkAccess(caller, null, true, ipAddressVO);
         }
 
-        Pair<Long, ListProjectResourcesCriteria> domainIdRecursiveListProject 
= new Pair<Long, ListProjectResourcesCriteria>(domainId, null);
+        Ternary<Long, Boolean, ListProjectResourcesCriteria> 
domainIdRecursiveListProject = new Ternary<Long, Boolean, 
ListProjectResourcesCriteria>(domainId, isRecursive, null);
         _accountMgr.buildACLSearchParameters(caller, id, accountName, 
projectId, permittedAccounts, domainIdRecursiveListProject, listAll, false);
         domainId = domainIdRecursiveListProject.first();
-        ListProjectResourcesCriteria listProjectResourcesCriteria = 
domainIdRecursiveListProject.second();
+        isRecursive = domainIdRecursiveListProject.second();
+        ListProjectResourcesCriteria listProjectResourcesCriteria = 
domainIdRecursiveListProject.third();
 
         Filter filter = new Filter(PortForwardingRuleVO.class, "id", false, 
start, size);
         SearchBuilder<FirewallRuleVO> sb = _firewallDao.createSearchBuilder();
diff --git 
a/server/src/main/java/com/cloud/network/vpc/NetworkACLServiceImpl.java 
b/server/src/main/java/com/cloud/network/vpc/NetworkACLServiceImpl.java
index d601aae..53e113f 100644
--- a/server/src/main/java/com/cloud/network/vpc/NetworkACLServiceImpl.java
+++ b/server/src/main/java/com/cloud/network/vpc/NetworkACLServiceImpl.java
@@ -61,6 +61,7 @@ import com.cloud.user.Account;
 import com.cloud.user.AccountManager;
 import com.cloud.user.User;
 import com.cloud.utils.Pair;
+import com.cloud.utils.Ternary;
 import com.cloud.utils.component.ManagerBase;
 import com.cloud.utils.db.EntityManager;
 import com.cloud.utils.db.Filter;
@@ -180,10 +181,11 @@ public class NetworkACLServiceImpl extends ManagerBase 
implements NetworkACLServ
             final String accountName = cmd.getAccountName();
             final Long projectId = cmd.getProjectId();
             final boolean listAll = cmd.listAll();
-            final Pair<Long, ListProjectResourcesCriteria> 
domainIdRecursiveListProject = new Pair<Long, 
ListProjectResourcesCriteria>(domainId, null);
+            final Ternary<Long, Boolean, ListProjectResourcesCriteria> 
domainIdRecursiveListProject = new Ternary<Long, Boolean, 
ListProjectResourcesCriteria>(domainId, isRecursive, null);
             _accountMgr.buildACLSearchParameters(caller, id, accountName, 
projectId, permittedAccounts, domainIdRecursiveListProject, listAll, false);
             domainId = domainIdRecursiveListProject.first();
-            final ListProjectResourcesCriteria listProjectResourcesCriteria = 
domainIdRecursiveListProject.second();
+            isRecursive = domainIdRecursiveListProject.second();
+            final ListProjectResourcesCriteria listProjectResourcesCriteria = 
domainIdRecursiveListProject.third();
             final SearchBuilder<VpcVO> sbVpc = _vpcDao.createSearchBuilder();
             _accountMgr.buildACLSearchBuilder(sbVpc, domainId, isRecursive, 
permittedAccounts, listProjectResourcesCriteria);
             final SearchCriteria<VpcVO> scVpc = sbVpc.create();
@@ -739,10 +741,11 @@ public class NetworkACLServiceImpl extends ManagerBase 
implements NetworkACLServ
             final String accountName = cmd.getAccountName();
             final Long projectId = cmd.getProjectId();
             final boolean listAll = cmd.listAll();
-            final Pair<Long, ListProjectResourcesCriteria> 
domainIdRecursiveListProject = new Pair<Long, 
ListProjectResourcesCriteria>(domainId, null);
+            final Ternary<Long, Boolean, ListProjectResourcesCriteria> 
domainIdRecursiveListProject = new Ternary<Long, Boolean, 
ListProjectResourcesCriteria>(domainId, isRecursive, null);
             _accountMgr.buildACLSearchParameters(caller, id, accountName, 
projectId, permittedAccounts, domainIdRecursiveListProject, listAll, false);
             domainId = domainIdRecursiveListProject.first();
-            final ListProjectResourcesCriteria listProjectResourcesCriteria = 
domainIdRecursiveListProject.second();
+            isRecursive = domainIdRecursiveListProject.second();
+            final ListProjectResourcesCriteria listProjectResourcesCriteria = 
domainIdRecursiveListProject.third();
             final SearchBuilder<VpcVO> sbVpc = _vpcDao.createSearchBuilder();
             _accountMgr.buildACLSearchBuilder(sbVpc, domainId, isRecursive, 
permittedAccounts, listProjectResourcesCriteria);
             final SearchCriteria<VpcVO> scVpc = sbVpc.create();
diff --git a/server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java 
b/server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java
index 44aee70..8aabcc0 100644
--- a/server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java
+++ b/server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java
@@ -128,6 +128,7 @@ import com.cloud.user.User;
 import com.cloud.utils.NumbersUtil;
 import com.cloud.utils.Pair;
 import com.cloud.utils.StringUtils;
+import com.cloud.utils.Ternary;
 import com.cloud.utils.component.ManagerBase;
 import com.cloud.utils.concurrency.NamedThreadFactory;
 import com.cloud.utils.db.DB;
@@ -1195,10 +1196,12 @@ public class VpcManagerImpl extends ManagerBase 
implements VpcManager, VpcProvis
             final Boolean display) {
         final Account caller = CallContext.current().getCallingAccount();
         final List<Long> permittedAccounts = new ArrayList<Long>();
-        final Pair<Long, ListProjectResourcesCriteria> 
domainIdRecursiveListProject = new Pair<Long, 
ListProjectResourcesCriteria>(domainId,null);
+        final Ternary<Long, Boolean, ListProjectResourcesCriteria> 
domainIdRecursiveListProject = new Ternary<Long, Boolean, 
ListProjectResourcesCriteria>(domainId, isRecursive,
+                null);
         _accountMgr.buildACLSearchParameters(caller, id, accountName, 
projectId, permittedAccounts, domainIdRecursiveListProject, listAll, false);
         domainId = domainIdRecursiveListProject.first();
-        final ListProjectResourcesCriteria listProjectResourcesCriteria = 
domainIdRecursiveListProject.second();
+        isRecursive = domainIdRecursiveListProject.second();
+        final ListProjectResourcesCriteria listProjectResourcesCriteria = 
domainIdRecursiveListProject.third();
         final Filter searchFilter = new Filter(VpcVO.class, "created", false, 
null, null);
 
         final SearchBuilder<VpcVO> sb = _vpcDao.createSearchBuilder();
@@ -2103,10 +2106,12 @@ public class VpcManagerImpl extends ManagerBase 
implements VpcManager, VpcProvis
         final Long projectId = cmd.getProjectId();
 
         final Filter searchFilter = new Filter(VpcGatewayVO.class, "id", 
false, cmd.getStartIndex(), cmd.getPageSizeVal());
-        final Pair<Long, ListProjectResourcesCriteria> 
domainIdRecursiveListProject = new Pair<Long, 
ListProjectResourcesCriteria>(domainId, null);
+        final Ternary<Long, Boolean, ListProjectResourcesCriteria> 
domainIdRecursiveListProject = new Ternary<Long, Boolean, 
ListProjectResourcesCriteria>(domainId, isRecursive,
+                null);
         _accountMgr.buildACLSearchParameters(caller, id, accountName, 
projectId, permittedAccounts, domainIdRecursiveListProject, listAll, false);
         domainId = domainIdRecursiveListProject.first();
-        final ListProjectResourcesCriteria listProjectResourcesCriteria = 
domainIdRecursiveListProject.second();
+        isRecursive = domainIdRecursiveListProject.second();
+        final ListProjectResourcesCriteria listProjectResourcesCriteria = 
domainIdRecursiveListProject.third();
 
         final SearchBuilder<VpcGatewayVO> sb = 
_vpcGatewayDao.createSearchBuilder();
         _accountMgr.buildACLSearchBuilder(sb, domainId, isRecursive, 
permittedAccounts, listProjectResourcesCriteria);
@@ -2350,10 +2355,12 @@ public class VpcManagerImpl extends ManagerBase 
implements VpcManager, VpcProvis
         final Long projectId = cmd.getProjectId();
         final String state = cmd.getState();
 
-        final Pair<Long, ListProjectResourcesCriteria> 
domainIdRecursiveListProject = new Pair<Long, 
ListProjectResourcesCriteria>(domainId, null);
+        final Ternary<Long, Boolean, ListProjectResourcesCriteria> 
domainIdRecursiveListProject = new Ternary<Long, Boolean, 
ListProjectResourcesCriteria>(domainId, isRecursive,
+                null);
         _accountMgr.buildACLSearchParameters(caller, id, accountName, 
projectId, permittedAccounts, domainIdRecursiveListProject, listAll, false);
         domainId = domainIdRecursiveListProject.first();
-        final ListProjectResourcesCriteria listProjectResourcesCriteria = 
domainIdRecursiveListProject.second();
+        isRecursive = domainIdRecursiveListProject.second();
+        final ListProjectResourcesCriteria listProjectResourcesCriteria = 
domainIdRecursiveListProject.third();
         final Filter searchFilter = new Filter(StaticRouteVO.class, "created", 
false, cmd.getStartIndex(), cmd.getPageSizeVal());
 
         final SearchBuilder<StaticRouteVO> sb = 
_staticRouteDao.createSearchBuilder();
diff --git 
a/server/src/main/java/com/cloud/network/vpn/RemoteAccessVpnManagerImpl.java 
b/server/src/main/java/com/cloud/network/vpn/RemoteAccessVpnManagerImpl.java
index b8831f6..61d247d 100644
--- a/server/src/main/java/com/cloud/network/vpn/RemoteAccessVpnManagerImpl.java
+++ b/server/src/main/java/com/cloud/network/vpn/RemoteAccessVpnManagerImpl.java
@@ -78,6 +78,7 @@ import com.cloud.user.dao.AccountDao;
 import com.cloud.utils.NumbersUtil;
 import com.cloud.utils.Pair;
 import com.cloud.utils.PasswordGenerator;
+import com.cloud.utils.Ternary;
 import com.cloud.utils.component.ManagerBase;
 import com.cloud.utils.db.DB;
 import com.cloud.utils.db.Filter;
@@ -644,11 +645,11 @@ public class RemoteAccessVpnManagerImpl extends 
ManagerBase implements RemoteAcc
         Account caller = CallContext.current().getCallingAccount();
         List<Long> permittedAccounts = new ArrayList<>();
 
-        Pair<Long, ListProjectResourcesCriteria> domainIdRecursiveListProject 
= new Pair<>(cmd.getDomainId(), null);
+        Ternary<Long, Boolean, ListProjectResourcesCriteria> 
domainIdRecursiveListProject = new Ternary<>(cmd.getDomainId(), 
cmd.isRecursive(), null);
         _accountMgr.buildACLSearchParameters(caller, id, cmd.getAccountName(), 
cmd.getProjectId(), permittedAccounts, domainIdRecursiveListProject, 
cmd.listAll(), false);
         Long domainId = domainIdRecursiveListProject.first();
-        ListProjectResourcesCriteria listProjectResourcesCriteria = 
domainIdRecursiveListProject.second();
-        Boolean isRecursive = cmd.isRecursive();
+        Boolean isRecursive = domainIdRecursiveListProject.second();
+        ListProjectResourcesCriteria listProjectResourcesCriteria = 
domainIdRecursiveListProject.third();
         Filter searchFilter = new Filter(VpnUserVO.class, "username", true, 
cmd.getStartIndex(), cmd.getPageSizeVal());
         SearchBuilder<VpnUserVO> sb = _vpnUsersDao.createSearchBuilder();
         _accountMgr.buildACLSearchBuilder(sb, domainId, isRecursive, 
permittedAccounts, listProjectResourcesCriteria);
@@ -702,11 +703,11 @@ public class RemoteAccessVpnManagerImpl extends 
ManagerBase implements RemoteAcc
             _accountMgr.checkAccess(caller, null, true, publicIp);
         }
 
-        Pair<Long, ListProjectResourcesCriteria> domainIdRecursiveListProject 
= new Pair<>(cmd.getDomainId(), null);
+        Ternary<Long, Boolean, ListProjectResourcesCriteria> 
domainIdRecursiveListProject = new Ternary<>(cmd.getDomainId(), 
cmd.isRecursive(), null);
         _accountMgr.buildACLSearchParameters(caller, null, 
cmd.getAccountName(), cmd.getProjectId(), permittedAccounts, 
domainIdRecursiveListProject, cmd.listAll(), false);
         Long domainId = domainIdRecursiveListProject.first();
-        ListProjectResourcesCriteria listProjectResourcesCriteria = 
domainIdRecursiveListProject.second();
-        Boolean isRecursive = cmd.isRecursive();
+        Boolean isRecursive = domainIdRecursiveListProject.second();
+        ListProjectResourcesCriteria listProjectResourcesCriteria = 
domainIdRecursiveListProject.third();
 
         Filter filter = new Filter(RemoteAccessVpnVO.class, "serverAddressId", 
false, cmd.getStartIndex(), cmd.getPageSizeVal());
         SearchBuilder<RemoteAccessVpnVO> sb = 
_remoteAccessVpnDao.createSearchBuilder();
diff --git 
a/server/src/main/java/com/cloud/network/vpn/Site2SiteVpnManagerImpl.java 
b/server/src/main/java/com/cloud/network/vpn/Site2SiteVpnManagerImpl.java
index 4ce515e..8b20072 100644
--- a/server/src/main/java/com/cloud/network/vpn/Site2SiteVpnManagerImpl.java
+++ b/server/src/main/java/com/cloud/network/vpn/Site2SiteVpnManagerImpl.java
@@ -71,6 +71,7 @@ import com.cloud.user.AccountManager;
 import com.cloud.user.dao.AccountDao;
 import com.cloud.utils.NumbersUtil;
 import com.cloud.utils.Pair;
+import com.cloud.utils.Ternary;
 import com.cloud.utils.component.ManagerBase;
 import com.cloud.utils.db.DB;
 import com.cloud.utils.db.Filter;
@@ -634,10 +635,12 @@ public class Site2SiteVpnManagerImpl extends ManagerBase 
implements Site2SiteVpn
         Account caller = CallContext.current().getCallingAccount();
         List<Long> permittedAccounts = new ArrayList<Long>();
 
-        Pair<Long, ListProjectResourcesCriteria> domainIdRecursiveListProject 
= new Pair<Long, ListProjectResourcesCriteria>(domainId, null);
+        Ternary<Long, Boolean, ListProjectResourcesCriteria> 
domainIdRecursiveListProject = new Ternary<Long, Boolean,
+                ListProjectResourcesCriteria>(domainId, isRecursive, null);
         _accountMgr.buildACLSearchParameters(caller, id, accountName, 
cmd.getProjectId(), permittedAccounts, domainIdRecursiveListProject, listAll, 
false);
         domainId = domainIdRecursiveListProject.first();
-        ListProjectResourcesCriteria listProjectResourcesCriteria = 
domainIdRecursiveListProject.second();
+        isRecursive = domainIdRecursiveListProject.second();
+        ListProjectResourcesCriteria listProjectResourcesCriteria = 
domainIdRecursiveListProject.third();
         Filter searchFilter = new Filter(Site2SiteCustomerGatewayVO.class, 
"id", false, startIndex, pageSizeVal);
 
         SearchBuilder<Site2SiteCustomerGatewayVO> sb = 
_customerGatewayDao.createSearchBuilder();
@@ -677,10 +680,12 @@ public class Site2SiteVpnManagerImpl extends ManagerBase 
implements Site2SiteVpn
         Account caller = CallContext.current().getCallingAccount();
         List<Long> permittedAccounts = new ArrayList<Long>();
 
-        Pair<Long, ListProjectResourcesCriteria> domainIdRecursiveListProject 
= new Pair<Long, ListProjectResourcesCriteria>(domainId, null);
+        Ternary<Long, Boolean, ListProjectResourcesCriteria> 
domainIdRecursiveListProject = new Ternary<Long, Boolean,
+                ListProjectResourcesCriteria>(domainId, isRecursive, null);
         _accountMgr.buildACLSearchParameters(caller, id, accountName, 
cmd.getProjectId(), permittedAccounts, domainIdRecursiveListProject, listAll, 
false);
         domainId = domainIdRecursiveListProject.first();
-        ListProjectResourcesCriteria listProjectResourcesCriteria = 
domainIdRecursiveListProject.second();
+        isRecursive = domainIdRecursiveListProject.second();
+        ListProjectResourcesCriteria listProjectResourcesCriteria = 
domainIdRecursiveListProject.third();
         Filter searchFilter = new Filter(Site2SiteVpnGatewayVO.class, "id", 
false, startIndex, pageSizeVal);
 
         SearchBuilder<Site2SiteVpnGatewayVO> sb = 
_vpnGatewayDao.createSearchBuilder();
@@ -725,10 +730,12 @@ public class Site2SiteVpnManagerImpl extends ManagerBase 
implements Site2SiteVpn
         Account caller = CallContext.current().getCallingAccount();
         List<Long> permittedAccounts = new ArrayList<Long>();
 
-        Pair<Long, ListProjectResourcesCriteria> domainIdRecursiveListProject 
= new Pair<Long, ListProjectResourcesCriteria>(domainId, null);
+        Ternary<Long, Boolean, ListProjectResourcesCriteria> 
domainIdRecursiveListProject = new Ternary<Long, Boolean,
+                ListProjectResourcesCriteria>(domainId, isRecursive, null);
         _accountMgr.buildACLSearchParameters(caller, id, accountName, 
cmd.getProjectId(), permittedAccounts, domainIdRecursiveListProject, listAll, 
false);
         domainId = domainIdRecursiveListProject.first();
-        ListProjectResourcesCriteria listProjectResourcesCriteria = 
domainIdRecursiveListProject.second();
+        isRecursive = domainIdRecursiveListProject.second();
+        ListProjectResourcesCriteria listProjectResourcesCriteria = 
domainIdRecursiveListProject.third();
         Filter searchFilter = new Filter(Site2SiteVpnConnectionVO.class, "id", 
false, startIndex, pageSizeVal);
 
         SearchBuilder<Site2SiteVpnConnectionVO> sb = 
_vpnConnectionDao.createSearchBuilder();
diff --git a/server/src/main/java/com/cloud/server/ManagementServerImpl.java 
b/server/src/main/java/com/cloud/server/ManagementServerImpl.java
index 815c70e..b71bfc8 100644
--- a/server/src/main/java/com/cloud/server/ManagementServerImpl.java
+++ b/server/src/main/java/com/cloud/server/ManagementServerImpl.java
@@ -2226,14 +2226,16 @@ public class ManagementServerImpl extends ManagerBase 
implements ManagementServe
         final Filter searchFilter = new Filter(IPAddressVO.class, "address", 
false, null, null);
         final SearchBuilder<IPAddressVO> sb = 
_publicIpAddressDao.createSearchBuilder();
         Long domainId = null;
-        Boolean isRecursive = cmd.listAll();
+        Boolean isRecursive = null;
         final List<Long> permittedAccounts = new ArrayList<>();
         ListProjectResourcesCriteria listProjectResourcesCriteria = null;
         if (isAllocated || (vlanType == VlanType.VirtualNetwork && 
(caller.getType() != Account.Type.ADMIN || cmd.getDomainId() != null))) {
-            final Pair<Long, Project.ListProjectResourcesCriteria> 
domainIdRecursiveListProject = new Pair<>(cmd.getDomainId(), null);
+            final Ternary<Long, Boolean, ListProjectResourcesCriteria> 
domainIdRecursiveListProject = new Ternary<>(cmd.getDomainId(), 
cmd.isRecursive(),
+                    null);
             _accountMgr.buildACLSearchParameters(caller, cmd.getId(), 
cmd.getAccountName(), cmd.getProjectId(), permittedAccounts, 
domainIdRecursiveListProject, cmd.listAll(), false);
             domainId = domainIdRecursiveListProject.first();
-            listProjectResourcesCriteria = 
domainIdRecursiveListProject.second();
+            isRecursive = domainIdRecursiveListProject.second();
+            listProjectResourcesCriteria = 
domainIdRecursiveListProject.third();
             _accountMgr.buildACLSearchBuilder(sb, domainId, isRecursive, 
permittedAccounts, listProjectResourcesCriteria);
         }
 
@@ -4210,11 +4212,11 @@ public class ManagementServerImpl extends ManagerBase 
implements ManagementServe
         final Account caller = getCaller();
         final List<Long> permittedAccounts = new ArrayList<Long>();
 
-        final Pair<Long, Project.ListProjectResourcesCriteria> 
domainIdRecursiveListProject = new Pair<Long, 
Project.ListProjectResourcesCriteria>(cmd.getDomainId(), null);
+        final Ternary<Long, Boolean, ListProjectResourcesCriteria> 
domainIdRecursiveListProject = new Ternary<Long, Boolean, 
ListProjectResourcesCriteria>(cmd.getDomainId(), cmd.isRecursive(), null);
         _accountMgr.buildACLSearchParameters(caller, null, 
cmd.getAccountName(), cmd.getProjectId(), permittedAccounts, 
domainIdRecursiveListProject, cmd.listAll(), false);
         final Long domainId = domainIdRecursiveListProject.first();
-        final ListProjectResourcesCriteria listProjectResourcesCriteria = 
domainIdRecursiveListProject.second();
-        final Boolean isRecursive = cmd.isRecursive();
+        final Boolean isRecursive = domainIdRecursiveListProject.second();
+        final ListProjectResourcesCriteria listProjectResourcesCriteria = 
domainIdRecursiveListProject.third();
         final SearchBuilder<SSHKeyPairVO> sb = 
_sshKeyPairDao.createSearchBuilder();
         _accountMgr.buildACLSearchBuilder(sb, domainId, isRecursive, 
permittedAccounts, listProjectResourcesCriteria);
         final Filter searchFilter = new Filter(SSHKeyPairVO.class, "id", 
false, cmd.getStartIndex(), cmd.getPageSizeVal());
diff --git 
a/server/src/main/java/com/cloud/storage/snapshot/SnapshotManagerImpl.java 
b/server/src/main/java/com/cloud/storage/snapshot/SnapshotManagerImpl.java
index 4458c63..63adac2 100755
--- a/server/src/main/java/com/cloud/storage/snapshot/SnapshotManagerImpl.java
+++ b/server/src/main/java/com/cloud/storage/snapshot/SnapshotManagerImpl.java
@@ -126,6 +126,7 @@ import com.cloud.utils.DateUtil;
 import com.cloud.utils.DateUtil.IntervalType;
 import com.cloud.utils.NumbersUtil;
 import com.cloud.utils.Pair;
+import com.cloud.utils.Ternary;
 import com.cloud.utils.concurrency.NamedThreadFactory;
 import com.cloud.utils.db.DB;
 import com.cloud.utils.db.Filter;
@@ -657,11 +658,12 @@ public class SnapshotManagerImpl extends 
MutualExclusiveIdsManagerBase implement
 
         List<Long> ids = getIdsListFromCmd(cmd.getId(), cmd.getIds());
 
-        Pair<Long, ListProjectResourcesCriteria> domainIdRecursiveListProject 
= new Pair<Long, ListProjectResourcesCriteria>(cmd.getDomainId(), null);
+        Ternary<Long, Boolean, ListProjectResourcesCriteria> 
domainIdRecursiveListProject = new Ternary<Long, Boolean, 
ListProjectResourcesCriteria>(cmd.getDomainId(),
+                cmd.isRecursive(), null);
         _accountMgr.buildACLSearchParameters(caller, id, cmd.getAccountName(), 
cmd.getProjectId(), permittedAccounts, domainIdRecursiveListProject, 
cmd.listAll(), false);
         Long domainId = domainIdRecursiveListProject.first();
-        ListProjectResourcesCriteria listProjectResourcesCriteria = 
domainIdRecursiveListProject.second();
-        Boolean isRecursive = cmd.isRecursive();
+        Boolean isRecursive = domainIdRecursiveListProject.second();
+        ListProjectResourcesCriteria listProjectResourcesCriteria = 
domainIdRecursiveListProject.third();
 
         Filter searchFilter = new Filter(SnapshotVO.class, "created", false, 
cmd.getStartIndex(), cmd.getPageSizeVal());
         SearchBuilder<SnapshotVO> sb = _snapshotDao.createSearchBuilder();
diff --git a/server/src/main/java/com/cloud/user/AccountManager.java 
b/server/src/main/java/com/cloud/user/AccountManager.java
index 6a96859..a4913fe 100644
--- a/server/src/main/java/com/cloud/user/AccountManager.java
+++ b/server/src/main/java/com/cloud/user/AccountManager.java
@@ -33,6 +33,7 @@ import com.cloud.exception.ConcurrentOperationException;
 import com.cloud.exception.ResourceUnavailableException;
 import com.cloud.projects.Project.ListProjectResourcesCriteria;
 import com.cloud.utils.Pair;
+import com.cloud.utils.Ternary;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 
@@ -95,7 +96,7 @@ public interface AccountManager extends AccountService, 
Configurable {
             ListProjectResourcesCriteria listProjectResourcesCriteria);
 
     void buildACLSearchParameters(Account caller, Long id, String accountName, 
Long projectId, List<Long> permittedAccounts,
-            Pair<Long, ListProjectResourcesCriteria> 
domainIdRecursiveListProject, boolean listAll, boolean forProjectInvitation);
+            Ternary<Long, Boolean, ListProjectResourcesCriteria> 
domainIdRecursiveListProject, boolean listAll, boolean forProjectInvitation);
 
     void buildACLViewSearchCriteria(SearchCriteria<? extends 
ControlledViewEntity> sc, Long domainId, boolean isRecursive, List<Long> 
permittedAccounts,
             ListProjectResourcesCriteria listProjectResourcesCriteria);
diff --git a/server/src/main/java/com/cloud/user/AccountManagerImpl.java 
b/server/src/main/java/com/cloud/user/AccountManagerImpl.java
index 98d69bd..9f760e6 100644
--- a/server/src/main/java/com/cloud/user/AccountManagerImpl.java
+++ b/server/src/main/java/com/cloud/user/AccountManagerImpl.java
@@ -153,6 +153,7 @@ import com.cloud.user.dao.UserDao;
 import com.cloud.utils.ConstantTimeComparator;
 import com.cloud.utils.NumbersUtil;
 import com.cloud.utils.Pair;
+import com.cloud.utils.Ternary;
 import com.cloud.utils.component.Manager;
 import com.cloud.utils.component.ManagerBase;
 import com.cloud.utils.concurrency.NamedThreadFactory;
@@ -2768,7 +2769,7 @@ public class AccountManagerImpl extends ManagerBase 
implements AccountManager, M
     //TODO: deprecate this to use the new buildACLSearchParameters with 
permittedDomains, permittedAccounts, and permittedResources as return
     @Override
     public void buildACLSearchParameters(Account caller, Long id, String 
accountName, Long projectId, List<Long> permittedAccounts,
-            Pair<Long, ListProjectResourcesCriteria> 
domainIdRecursiveListProject, boolean listAll, boolean forProjectInvitation) {
+            Ternary<Long, Boolean, ListProjectResourcesCriteria> 
domainIdRecursiveListProject, boolean listAll, boolean forProjectInvitation) {
         Long domainId = domainIdRecursiveListProject.first();
         if (domainId != null) {
             Domain domain = _domainDao.findById(domainId);
@@ -2808,9 +2809,9 @@ public class AccountManagerImpl extends ManagerBase 
implements AccountManager, M
             if (!forProjectInvitation) {
                 if (projectId == -1L) {
                     if (caller.getType() == Account.Type.ADMIN) {
-                        
domainIdRecursiveListProject.second(Project.ListProjectResourcesCriteria.ListProjectResourcesOnly);
+                        
domainIdRecursiveListProject.third(Project.ListProjectResourcesCriteria.ListProjectResourcesOnly);
                         if (listAll) {
-                            
domainIdRecursiveListProject.second(ListProjectResourcesCriteria.ListAllIncludingProjectResources);
+                            
domainIdRecursiveListProject.third(ListProjectResourcesCriteria.ListAllIncludingProjectResources);
                         }
                     } else {
                         
permittedAccounts.addAll(_projectMgr.listPermittedProjectAccounts(caller.getId()));
@@ -2832,7 +2833,7 @@ public class AccountManagerImpl extends ManagerBase 
implements AccountManager, M
             }
         } else {
             if (id == null) {
-                
domainIdRecursiveListProject.second(Project.ListProjectResourcesCriteria.SkipProjectResources);
+                
domainIdRecursiveListProject.third(Project.ListProjectResourcesCriteria.SkipProjectResources);
             }
             if (permittedAccounts.isEmpty() && domainId == null) {
                 if (caller.getType() == Account.Type.NORMAL) {
@@ -2842,10 +2843,12 @@ public class AccountManagerImpl extends ManagerBase 
implements AccountManager, M
                         permittedAccounts.add(caller.getId());
                     } else if (caller.getType() != Account.Type.ADMIN) {
                         
domainIdRecursiveListProject.first(caller.getDomainId());
+                        domainIdRecursiveListProject.second(true);
                     }
                 } else if (domainId == null) {
                     if (caller.getType() == Account.Type.DOMAIN_ADMIN) {
                         
domainIdRecursiveListProject.first(caller.getDomainId());
+                        domainIdRecursiveListProject.second(true);
                     }
                 }
             } else if (domainId != null) {
diff --git 
a/server/src/main/java/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java 
b/server/src/main/java/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java
index 9c795b0..bd66fe8 100644
--- a/server/src/main/java/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java
+++ b/server/src/main/java/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java
@@ -100,6 +100,7 @@ import com.cloud.utils.NumbersUtil;
 import com.cloud.utils.Pair;
 import com.cloud.utils.Predicate;
 import com.cloud.utils.ReflectionUse;
+import com.cloud.utils.Ternary;
 import com.cloud.utils.db.EntityManager;
 import com.cloud.utils.db.Filter;
 import com.cloud.utils.db.JoinBuilder;
@@ -226,13 +227,13 @@ public class VMSnapshotManagerImpl extends 
MutualExclusiveIdsManagerBase impleme
 
         List<Long> ids = getIdsListFromCmd(cmd.getId(), cmd.getIds());
 
-        Pair<Long, ListProjectResourcesCriteria> domainIdRecursiveListProject 
= new Pair<Long, ListProjectResourcesCriteria>(
-                cmd.getDomainId(), null);
+        Ternary<Long, Boolean, ListProjectResourcesCriteria> 
domainIdRecursiveListProject = new Ternary<Long, Boolean, 
ListProjectResourcesCriteria>(
+                cmd.getDomainId(), cmd.isRecursive(), null);
         _accountMgr.buildACLSearchParameters(caller, id, cmd.getAccountName(), 
cmd.getProjectId(), permittedAccounts, domainIdRecursiveListProject, listAll,
                 false);
         Long domainId = domainIdRecursiveListProject.first();
-        ListProjectResourcesCriteria listProjectResourcesCriteria = 
domainIdRecursiveListProject.second();
-        Boolean isRecursive = cmd.isRecursive();
+        Boolean isRecursive = domainIdRecursiveListProject.second();
+        ListProjectResourcesCriteria listProjectResourcesCriteria = 
domainIdRecursiveListProject.third();
 
         Filter searchFilter = new Filter(VMSnapshotVO.class, "created", false, 
cmd.getStartIndex(), cmd.getPageSizeVal());
         SearchBuilder<VMSnapshotVO> sb = _vmSnapshotDao.createSearchBuilder();
diff --git 
a/server/src/main/java/org/apache/cloudstack/backup/BackupManagerImpl.java 
b/server/src/main/java/org/apache/cloudstack/backup/BackupManagerImpl.java
index fe7d1ea..e341653 100644
--- a/server/src/main/java/org/apache/cloudstack/backup/BackupManagerImpl.java
+++ b/server/src/main/java/org/apache/cloudstack/backup/BackupManagerImpl.java
@@ -94,6 +94,7 @@ import com.cloud.user.AccountService;
 import com.cloud.user.User;
 import com.cloud.utils.DateUtil;
 import com.cloud.utils.Pair;
+import com.cloud.utils.Ternary;
 import com.cloud.utils.component.ComponentContext;
 import com.cloud.utils.component.ManagerBase;
 import com.cloud.utils.db.DB;
@@ -499,11 +500,12 @@ public class BackupManagerImpl extends ManagerBase 
implements BackupManager {
             }
         }
 
-        final Pair<Long, Project.ListProjectResourcesCriteria> 
domainIdRecursiveListProject = new Pair<Long, 
Project.ListProjectResourcesCriteria>(cmd.getDomainId(), null);
+        final Ternary<Long, Boolean, Project.ListProjectResourcesCriteria> 
domainIdRecursiveListProject = new Ternary<Long, Boolean, 
Project.ListProjectResourcesCriteria>(cmd.getDomainId(),
+                cmd.isRecursive(), null);
         accountManager.buildACLSearchParameters(caller, id, 
cmd.getAccountName(), cmd.getProjectId(), permittedAccounts, 
domainIdRecursiveListProject, cmd.listAll(), false);
         final Long domainId = domainIdRecursiveListProject.first();
-        Project.ListProjectResourcesCriteria listProjectResourcesCriteria = 
domainIdRecursiveListProject.second();
-        Boolean isRecursive = cmd.isRecursive();
+        final Boolean isRecursive = domainIdRecursiveListProject.second();
+        final Project.ListProjectResourcesCriteria 
listProjectResourcesCriteria = domainIdRecursiveListProject.third();
 
         final Filter searchFilter = new Filter(BackupVO.class, "id", true, 
cmd.getStartIndex(), cmd.getPageSizeVal());
         SearchBuilder<BackupVO> sb = backupDao.createSearchBuilder();
diff --git 
a/server/src/main/java/org/apache/cloudstack/network/lb/ApplicationLoadBalancerManagerImpl.java
 
b/server/src/main/java/org/apache/cloudstack/network/lb/ApplicationLoadBalancerManagerImpl.java
index c60ca45..1c9af7a 100644
--- 
a/server/src/main/java/org/apache/cloudstack/network/lb/ApplicationLoadBalancerManagerImpl.java
+++ 
b/server/src/main/java/org/apache/cloudstack/network/lb/ApplicationLoadBalancerManagerImpl.java
@@ -63,6 +63,7 @@ import com.cloud.tags.dao.ResourceTagDao;
 import com.cloud.user.Account;
 import com.cloud.user.AccountManager;
 import com.cloud.utils.Pair;
+import com.cloud.utils.Ternary;
 import com.cloud.utils.component.ManagerBase;
 import com.cloud.utils.db.DB;
 import com.cloud.utils.db.Filter;
@@ -388,13 +389,13 @@ public class ApplicationLoadBalancerManagerImpl extends 
ManagerBase implements A
         Account caller = CallContext.current().getCallingAccount();
         List<Long> permittedAccounts = new ArrayList<Long>();
 
-        final Pair<Long, ListProjectResourcesCriteria> 
domainIdRecursiveListProject = new Pair<Long, ListProjectResourcesCriteria>(
-                cmd.getDomainId(), null);
+        Ternary<Long, Boolean, ListProjectResourcesCriteria> 
domainIdRecursiveListProject = new Ternary<Long, Boolean, 
ListProjectResourcesCriteria>(
+                cmd.getDomainId(), cmd.isRecursive(), null);
         _accountMgr.buildACLSearchParameters(caller, id, cmd.getAccountName(), 
cmd.getProjectId(), permittedAccounts,
                 domainIdRecursiveListProject, cmd.listAll(), false);
         Long domainId = domainIdRecursiveListProject.first();
-        ListProjectResourcesCriteria listProjectResourcesCriteria = 
domainIdRecursiveListProject.second();
-        Boolean isRecursive = cmd.isRecursive();
+        Boolean isRecursive = domainIdRecursiveListProject.second();
+        ListProjectResourcesCriteria listProjectResourcesCriteria = 
domainIdRecursiveListProject.third();
 
         Filter searchFilter = new Filter(ApplicationLoadBalancerRuleVO.class, 
"id", true, cmd.getStartIndex(), cmd.getPageSizeVal());
         SearchBuilder<ApplicationLoadBalancerRuleVO> sb = 
_lbDao.createSearchBuilder();
diff --git a/server/src/test/java/com/cloud/user/MockAccountManagerImpl.java 
b/server/src/test/java/com/cloud/user/MockAccountManagerImpl.java
index 89b6be1..8e2dc7d 100644
--- a/server/src/test/java/com/cloud/user/MockAccountManagerImpl.java
+++ b/server/src/test/java/com/cloud/user/MockAccountManagerImpl.java
@@ -48,6 +48,7 @@ import com.cloud.offering.NetworkOffering;
 import com.cloud.offering.ServiceOffering;
 import com.cloud.projects.Project.ListProjectResourcesCriteria;
 import com.cloud.utils.Pair;
+import com.cloud.utils.Ternary;
 import com.cloud.utils.component.Manager;
 import com.cloud.utils.component.ManagerBase;
 import com.cloud.utils.db.SearchBuilder;
@@ -320,8 +321,7 @@ public class MockAccountManagerImpl extends ManagerBase 
implements Manager, Acco
     }
 
     @Override
-    public void buildACLSearchParameters(Account caller, Long id, String 
accountName, Long projectId, List<Long> permittedAccounts,
-        Pair<Long, ListProjectResourcesCriteria> domainIdRecursiveListProject, 
boolean listAll, boolean forProjectInvitation) {
+    public void buildACLSearchParameters(Account caller, Long id, String 
accountName, Long projectId, List<Long> permittedAccounts, Ternary<Long, 
Boolean, ListProjectResourcesCriteria> domainIdRecursiveListProject, boolean 
listAll, boolean forProjectInvitation) {
         // TODO Auto-generated method stub
     }
 

Reply via email to