From 2c2dfdc507bb507eba6468a9e8a00d4c5684498c Mon Sep 17 00:00:00 2001 From: Alena Prokharchyk Date: Tue, 6 Dec 2011 16:41:51 -0800 Subject: [PATCH] bug 12237: fixed listSnapshots to work correctly with projectId status 12237: resolved fixed --- .../com/cloud/network/NetworkManagerImpl.java | 48 ++++++++++++------- .../cloud/server/ManagementServerImpl.java | 38 ++++++++++----- .../storage/snapshot/SnapshotManagerImpl.java | 39 ++++++++++----- .../src/com/cloud/vm/UserVmManagerImpl.java | 1 - 4 files changed, 84 insertions(+), 42 deletions(-) diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index 066f374e08b..d2b3a12f28c 100755 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -2145,19 +2145,23 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag } //set project information + boolean skipProjectNetworks = true; if (projectId != null) { - permittedAccounts.clear(); - Project project = _projectMgr.getProject(projectId); - if (project == null) { - throw new InvalidParameterValueException("Unable to find project by id " + projectId); - } - if (!_projectMgr.canAccessProjectAccount(caller, project.getProjectAccountId())) { - throw new InvalidParameterValueException("Account " + caller + " can't access project id=" + projectId); - } - permittedAccounts.add(project.getProjectAccountId()); - } else if (caller.getType() == Account.ACCOUNT_TYPE_NORMAL){ - permittedAccounts.addAll(_projectMgr.listPermittedProjectAccounts(caller.getId())); - } + if (projectId == -1) { + permittedAccounts.addAll(_projectMgr.listPermittedProjectAccounts(caller.getId())); + } else { + permittedAccounts.clear(); + Project project = _projectMgr.getProject(projectId); + if (project == null) { + throw new InvalidParameterValueException("Unable to find project by id " + projectId); + } + if (!_projectMgr.canAccessProjectAccount(caller, project.getProjectAccountId())) { + throw new InvalidParameterValueException("Account " + caller + " can't access project id=" + projectId); + } + permittedAccounts.add(project.getProjectAccountId()); + } + skipProjectNetworks = false; + } path = _domainDao.findById(caller.getDomainId()).getPath(); @@ -2182,23 +2186,29 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag domainSearch.and("path", domainSearch.entity().getPath(), SearchCriteria.Op.LIKE); sb.join("domainSearch", domainSearch, sb.entity().getDomainId(), domainSearch.entity().getId(), JoinBuilder.JoinType.INNER); } + + if (skipProjectNetworks) { + SearchBuilder accountSearch = _accountDao.createSearchBuilder(); + accountSearch.and("type", accountSearch.entity().getType(), SearchCriteria.Op.NEQ); + sb.join("accountSearch", accountSearch, sb.entity().getAccountId(), accountSearch.entity().getId(), JoinBuilder.JoinType.INNER); + } List networksToReturn = new ArrayList(); if (isSystem == null || !isSystem) { //Get domain level networks if (domainId != null) { - networksToReturn.addAll(listDomainLevelNetworks(buildNetworkSearchCriteria(sb, keyword, id, isSystem, zoneId, guestIpType, trafficType, physicalNetworkId, aclType), searchFilter, domainId)); + networksToReturn.addAll(listDomainLevelNetworks(buildNetworkSearchCriteria(sb, keyword, id, isSystem, zoneId, guestIpType, trafficType, physicalNetworkId, aclType, skipProjectNetworks), searchFilter, domainId)); } else if (permittedAccounts.isEmpty()){ - networksToReturn.addAll(listAccountSpecificNetworksByDomainPath(buildNetworkSearchCriteria(sb, keyword, id, isSystem, zoneId, guestIpType, trafficType, physicalNetworkId, aclType), searchFilter, path)); + networksToReturn.addAll(listAccountSpecificNetworksByDomainPath(buildNetworkSearchCriteria(sb, keyword, id, isSystem, zoneId, guestIpType, trafficType, physicalNetworkId, aclType, skipProjectNetworks), searchFilter, path)); } //get account specific networks if (!permittedAccounts.isEmpty()){ - networksToReturn.addAll(listAccountSpecificNetworks(buildNetworkSearchCriteria(sb, keyword, id, isSystem, zoneId, guestIpType, trafficType, physicalNetworkId, aclType), searchFilter, permittedAccounts)); + networksToReturn.addAll(listAccountSpecificNetworks(buildNetworkSearchCriteria(sb, keyword, id, isSystem, zoneId, guestIpType, trafficType, physicalNetworkId, aclType, skipProjectNetworks), searchFilter, permittedAccounts)); } } else { - networksToReturn = _networksDao.search(buildNetworkSearchCriteria(sb, keyword, id, isSystem, zoneId, guestIpType, trafficType, physicalNetworkId, null), searchFilter); + networksToReturn = _networksDao.search(buildNetworkSearchCriteria(sb, keyword, id, isSystem, zoneId, guestIpType, trafficType, physicalNetworkId, null, skipProjectNetworks), searchFilter); } if (supportedServicesStr != null && !supportedServicesStr.isEmpty() && !networksToReturn.isEmpty()) { @@ -2227,7 +2237,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag } } - private SearchCriteria buildNetworkSearchCriteria(SearchBuilder sb, String keyword, Long id, Boolean isSystem, Long zoneId, String guestIpType, String trafficType, Long physicalNetworkId, String aclType) { + private SearchCriteria buildNetworkSearchCriteria(SearchBuilder sb, String keyword, Long id, Boolean isSystem, Long zoneId, String guestIpType, String trafficType, Long physicalNetworkId, String aclType, boolean skipProjectNetworks) { SearchCriteria sc = sb.create(); if (isSystem != null) { @@ -2263,6 +2273,10 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag if (physicalNetworkId != null) { sc.addAnd("physicalNetworkId", SearchCriteria.Op.EQ, physicalNetworkId); } + + if (skipProjectNetworks) { + sc.setJoinParameters("accountSearch", "type", Account.ACCOUNT_TYPE_PROJECT); + } return sc; } diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java index e9110671b4b..3f5e6e42bc6 100755 --- a/server/src/com/cloud/server/ManagementServerImpl.java +++ b/server/src/com/cloud/server/ManagementServerImpl.java @@ -1687,19 +1687,23 @@ public class ManagementServerImpl implements ManagementServer { } //set project information + boolean skipProjectVolumes = true; if (projectId != null) { - permittedAccounts.clear(); - Project project = _projectMgr.getProject(projectId); - if (project == null) { - throw new InvalidParameterValueException("Unable to find project by id " + projectId); - } - if (!_projectMgr.canAccessProjectAccount(caller, project.getProjectAccountId())) { - throw new InvalidParameterValueException("Account " + caller + " can't access project id=" + projectId); - } - permittedAccounts.add(project.getProjectAccountId()); - } else if (caller.getType() == Account.ACCOUNT_TYPE_NORMAL){ - permittedAccounts.addAll(_projectMgr.listPermittedProjectAccounts(caller.getId())); - } + if (projectId == -1) { + permittedAccounts.addAll(_projectMgr.listPermittedProjectAccounts(caller.getId())); + } else { + permittedAccounts.clear(); + Project project = _projectMgr.getProject(projectId); + if (project == null) { + throw new InvalidParameterValueException("Unable to find project by id " + projectId); + } + if (!_projectMgr.canAccessProjectAccount(caller, project.getProjectAccountId())) { + throw new InvalidParameterValueException("Account " + caller + " can't access project id=" + projectId); + } + permittedAccounts.add(project.getProjectAccountId()); + } + skipProjectVolumes = false; + } Filter searchFilter = new Filter(VolumeVO.class, "created", false, cmd.getStartIndex(), cmd.getPageSizeVal()); @@ -1747,6 +1751,12 @@ public class ManagementServerImpl implements ManagementServer { domainSearch.and("path", domainSearch.entity().getPath(), SearchCriteria.Op.EQ); sb.join("domainSearch", domainSearch, sb.entity().getDomainId(), domainSearch.entity().getId(), JoinBuilder.JoinType.INNER); } + + if (skipProjectVolumes) { + SearchBuilder accountSearch = _accountDao.createSearchBuilder(); + accountSearch.and("type", accountSearch.entity().getType(), SearchCriteria.Op.NEQ); + sb.join("accountSearch", accountSearch, sb.entity().getAccountId(), accountSearch.entity().getId(), JoinBuilder.JoinType.INNER); + } // display user vm volumes only SearchBuilder vmSearch = _vmInstanceDao.createSearchBuilder(); @@ -1763,6 +1773,10 @@ public class ManagementServerImpl implements ManagementServer { sc.addAnd("name", SearchCriteria.Op.SC, ssc); } + + if (skipProjectVolumes) { + sc.setJoinParameters("accountSearch", "type", Account.ACCOUNT_TYPE_PROJECT); + } if (name != null) { sc.setParameters("name", "%" + name + "%"); diff --git a/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java b/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java index f07bf4fc738..ca8480d6493 100755 --- a/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java +++ b/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java @@ -111,6 +111,7 @@ import com.cloud.utils.component.Inject; import com.cloud.utils.component.Manager; import com.cloud.utils.db.DB; import com.cloud.utils.db.Filter; +import com.cloud.utils.db.JoinBuilder; import com.cloud.utils.db.JoinBuilder.JoinType; import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; @@ -958,19 +959,23 @@ public class SnapshotManagerImpl implements SnapshotManager, SnapshotService, Ma } //set project information + boolean skipProjectSnapshots = true; if (projectId != null) { - permittedAccounts.clear(); - Project project = _projectMgr.getProject(projectId); - if (project == null) { - throw new InvalidParameterValueException("Unable to find project by id " + projectId); - } - if (!_projectMgr.canAccessProjectAccount(caller, project.getProjectAccountId())) { - throw new InvalidParameterValueException("Account " + caller + " can't access project id=" + projectId); - } - permittedAccounts.add(project.getProjectAccountId()); - } else { - permittedAccounts.addAll(_projectMgr.listPermittedProjectAccounts(caller.getId())); - } + if (projectId == -1) { + permittedAccounts.addAll(_projectMgr.listPermittedProjectAccounts(caller.getId())); + } else { + permittedAccounts.clear(); + Project project = _projectMgr.getProject(projectId); + if (project == null) { + throw new InvalidParameterValueException("Unable to find project by id " + projectId); + } + if (!_projectMgr.canAccessProjectAccount(caller, project.getProjectAccountId())) { + throw new InvalidParameterValueException("Account " + caller + " can't access project id=" + projectId); + } + permittedAccounts.add(project.getProjectAccountId()); + } + skipProjectSnapshots = false; + } Object name = cmd.getSnapshotName(); Object id = cmd.getId(); @@ -1001,8 +1006,18 @@ public class SnapshotManagerImpl implements SnapshotManager, SnapshotService, Ma } accountSearch.join("domainSearch", domainSearch, accountSearch.entity().getDomainId(), domainSearch.entity().getId(), JoinType.INNER); } + + if (skipProjectSnapshots) { + SearchBuilder accountSearch = _accountDao.createSearchBuilder(); + accountSearch.and("type", accountSearch.entity().getType(), SearchCriteria.Op.NEQ); + sb.join("accountSearch", accountSearch, sb.entity().getAccountId(), accountSearch.entity().getId(), JoinBuilder.JoinType.INNER); + } SearchCriteria sc = sb.create(); + + if (skipProjectSnapshots) { + sc.setJoinParameters("accountSearch", "type", Account.ACCOUNT_TYPE_PROJECT); + } if (volumeId != null) { sc.setParameters("volumeId", volumeId); diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java index 9b8f3e72aa0..bb182bbd8be 100755 --- a/server/src/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java @@ -3115,7 +3115,6 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager sc.setJoinParameters("accountSearch", "type", Account.ACCOUNT_TYPE_PROJECT); } - if (groupId != null && (Long) groupId == -1) { sc.setJoinParameters("vmSearch", "instanceId", (Object) null); } else if (groupId != null) {