From ce3c794bd3cb19550216423c14ce43ef2ed43653 Mon Sep 17 00:00:00 2001 From: kishan Date: Tue, 4 Jan 2011 13:05:17 +0530 Subject: [PATCH] bug 6916: check for removed account for ListVMs. Moved realated code to userVm Manager status 6916: resolved fixed --- .../com/cloud/api/commands/ListVMsCmd.java | 2 +- .../com/cloud/server/ManagementService.java | 8 - api/src/com/cloud/vm/UserVmService.java | 11 + server/src/com/cloud/api/ApiDBUtils.java | 2 +- .../com/cloud/server/ManagementServer.java | 8 - .../cloud/server/ManagementServerImpl.java | 258 ------------------ server/src/com/cloud/vm/UserVmManager.java | 9 + .../src/com/cloud/vm/UserVmManagerImpl.java | 252 +++++++++++++++++ 8 files changed, 274 insertions(+), 276 deletions(-) diff --git a/api/src/com/cloud/api/commands/ListVMsCmd.java b/api/src/com/cloud/api/commands/ListVMsCmd.java index 681b1cdef48..db5f7238e78 100644 --- a/api/src/com/cloud/api/commands/ListVMsCmd.java +++ b/api/src/com/cloud/api/commands/ListVMsCmd.java @@ -140,7 +140,7 @@ public class ListVMsCmd extends BaseListCmd { @Override public void execute(){ - List result = _mgr.searchForUserVMs(this); + List result = _userVmService.searchForUserVMs(this); ListResponse response = new ListResponse(); List vmResponses = new ArrayList(); for (UserVm userVm : result) { diff --git a/api/src/com/cloud/server/ManagementService.java b/api/src/com/cloud/server/ManagementService.java index 987e3884bc7..8ca4895b8a9 100644 --- a/api/src/com/cloud/server/ManagementService.java +++ b/api/src/com/cloud/server/ManagementService.java @@ -172,14 +172,6 @@ public interface ManagementService { VirtualMachineTemplate updateTemplate(UpdateIsoCmd cmd); VirtualMachineTemplate updateTemplate(UpdateTemplateCmd cmd); - /** - * Obtains a list of virtual machines by the specified search criteria. - * Can search by: "userId", "name", "state", "dataCenterId", "podId", "hostId" - * @param cmd the API command that wraps the search criteria - * @return List of UserVMs. - */ - List searchForUserVMs(ListVMsCmd cmd); - /** * Obtains a list of events by the specified search criteria. * Can search by: "username", "type", "level", "startDate", "endDate" diff --git a/api/src/com/cloud/vm/UserVmService.java b/api/src/com/cloud/vm/UserVmService.java index 271846a34bb..3b40a26da45 100755 --- a/api/src/com/cloud/vm/UserVmService.java +++ b/api/src/com/cloud/vm/UserVmService.java @@ -17,6 +17,8 @@ */ package com.cloud.vm; +import java.util.List; + import com.cloud.api.ServerApiException; import com.cloud.api.commands.AttachVolumeCmd; import com.cloud.api.commands.CreateTemplateCmd; @@ -25,6 +27,7 @@ import com.cloud.api.commands.DeleteVMGroupCmd; import com.cloud.api.commands.DeployVMCmd; import com.cloud.api.commands.DestroyVMCmd; import com.cloud.api.commands.DetachVolumeCmd; +import com.cloud.api.commands.ListVMsCmd; import com.cloud.api.commands.RebootVMCmd; import com.cloud.api.commands.RecoverVMCmd; import com.cloud.api.commands.ResetVMPasswordCmd; @@ -156,4 +159,12 @@ public interface UserVmService { UserVm startVirtualMachine(long vmId) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException; void deletePrivateTemplateRecord(Long templateId); + + /** + * Obtains a list of virtual machines by the specified search criteria. + * Can search by: "userId", "name", "state", "dataCenterId", "podId", "hostId" + * @param cmd the API command that wraps the search criteria + * @return List of UserVMs. + */ + List searchForUserVMs(ListVMsCmd cmd); } diff --git a/server/src/com/cloud/api/ApiDBUtils.java b/server/src/com/cloud/api/ApiDBUtils.java index a24cd05ae23..3fe4c16a3ef 100755 --- a/server/src/com/cloud/api/ApiDBUtils.java +++ b/server/src/com/cloud/api/ApiDBUtils.java @@ -209,7 +209,7 @@ public class ApiDBUtils { } public static List searchForUserVMs(Criteria c) { - return _ms.searchForUserVMs(c); + return _userVmMgr.searchForUserVMs(c); } public static List searchForStoragePools(Criteria c) { diff --git a/server/src/com/cloud/server/ManagementServer.java b/server/src/com/cloud/server/ManagementServer.java index b2ca3eb75f7..a0ba9d1c7b6 100755 --- a/server/src/com/cloud/server/ManagementServer.java +++ b/server/src/com/cloud/server/ManagementServer.java @@ -312,14 +312,6 @@ public interface ManagementServer extends ManagementService { */ VMTemplateVO findTemplateById(long templateId); - /** - * Obtains a list of virtual machines by the specified search criteria. - * Can search by: "userId", "name", "state", "dataCenterId", "podId", "hostId" - * @param c - * @return List of UserVMs. - */ - List searchForUserVMs(Criteria c); - List listPendingEvents(int entryTime, int duration); /** diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java index b4cec3411ef..b453d8916d8 100755 --- a/server/src/com/cloud/server/ManagementServerImpl.java +++ b/server/src/com/cloud/server/ManagementServerImpl.java @@ -106,7 +106,6 @@ import com.cloud.api.commands.ListTemplateOrIsoPermissionsCmd; import com.cloud.api.commands.ListTemplatesCmd; import com.cloud.api.commands.ListUsersCmd; import com.cloud.api.commands.ListVMGroupsCmd; -import com.cloud.api.commands.ListVMsCmd; import com.cloud.api.commands.ListVlanIpRangesCmd; import com.cloud.api.commands.ListVolumesCmd; import com.cloud.api.commands.ListZonesByCmd; @@ -179,13 +178,10 @@ import com.cloud.host.dao.HostDao; import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.info.ConsoleProxyInfo; import com.cloud.network.IPAddressVO; -import com.cloud.network.NetworkVO; import com.cloud.network.dao.IPAddressDao; -import com.cloud.network.dao.NetworkDao; import com.cloud.network.router.VirtualNetworkApplianceManager; import com.cloud.network.security.SecurityGroupVO; import com.cloud.network.security.dao.SecurityGroupDao; -import com.cloud.offering.NetworkOffering; import com.cloud.offering.ServiceOffering; import com.cloud.server.auth.UserAuthenticator; import com.cloud.service.ServiceOfferingVO; @@ -255,9 +251,7 @@ import com.cloud.utils.net.MacAddress; import com.cloud.utils.net.NetUtils; import com.cloud.vm.ConsoleProxyVO; import com.cloud.vm.DomainRouterVO; -import com.cloud.vm.InstanceGroupVMMapVO; import com.cloud.vm.InstanceGroupVO; -import com.cloud.vm.NicVO; import com.cloud.vm.SecondaryStorageVmVO; import com.cloud.vm.State; import com.cloud.vm.UserVmManager; @@ -267,8 +261,6 @@ import com.cloud.vm.VirtualMachine; import com.cloud.vm.dao.ConsoleProxyDao; import com.cloud.vm.dao.DomainRouterDao; import com.cloud.vm.dao.InstanceGroupDao; -import com.cloud.vm.dao.InstanceGroupVMMapDao; -import com.cloud.vm.dao.NicDao; import com.cloud.vm.dao.SecondaryStorageVmDao; import com.cloud.vm.dao.UserVmDao; import com.cloud.vm.dao.VMInstanceDao; @@ -313,8 +305,6 @@ public class ManagementServerImpl implements ManagementServer { private final StoragePoolDao _poolDao; private final StoragePoolHostDao _poolHostDao; private final StorageManager _storageMgr; - private final NetworkDao _networkDao; - private final NicDao _nicDao; private final Adapters _userAuthenticators; private final HostPodDao _hostPodDao; @@ -327,7 +317,6 @@ public class ManagementServerImpl implements ManagementServer { private final int _purgeDelay; private final PreallocatedLunDao _lunDao; private final InstanceGroupDao _vmGroupDao; - private final InstanceGroupVMMapDao _groupVMMapDao; private final UploadMonitor _uploadMonitor; private final UploadDao _uploadDao; private final CertificateDao _certDao; @@ -363,8 +352,6 @@ public class ManagementServerImpl implements ManagementServer { _hostPodDao = locator.getDao(HostPodDao.class); _jobDao = locator.getDao(AsyncJobDao.class); _clusterDao = locator.getDao(ClusterDao.class); - _networkDao = locator.getDao(NetworkDao.class); - _nicDao = locator.getDao(NicDao.class); _accountMgr = locator.getManager(AccountManager.class); _agentMgr = locator.getManager(AgentManager.class); @@ -395,7 +382,6 @@ public class ManagementServerImpl implements ManagementServer { _poolDao = locator.getDao(StoragePoolDao.class); _poolHostDao = locator.getDao(StoragePoolHostDao.class); _vmGroupDao = locator.getDao(InstanceGroupDao.class); - _groupVMMapDao = locator.getDao(InstanceGroupVMMapDao.class); _uploadDao = locator.getDao(UploadDao.class); _certDao = locator.getDao(CertificateDao.class); _configs = _configDao.getConfiguration(); @@ -2017,250 +2003,6 @@ public class ManagementServerImpl implements ManagementServer { return _templateDao.findById(templateId); } - - @Override - public List searchForUserVMs(ListVMsCmd cmd) throws InvalidParameterValueException, PermissionDeniedException { - Account account = UserContext.current().getCaller(); - Long domainId = cmd.getDomainId(); - String accountName = cmd.getAccountName(); - Long accountId = null; - boolean isAdmin = false; - String path = null; - if ((account == null) || isAdmin(account.getType())) { - isAdmin = true; - if (domainId != null) { - if ((account != null) && !_domainDao.isChildDomain(account.getDomainId(), domainId)) { - throw new PermissionDeniedException("Invalid domain id (" + domainId + ") given, unable to list virtual machines."); - } - - if (accountName != null) { - account = _accountDao.findActiveAccount(accountName, domainId); - if (account == null) { - throw new InvalidParameterValueException("Unable to find account " + accountName + " in domain " + domainId); - } - accountId = account.getId(); - } - } - if (account.getType() == Account.ACCOUNT_TYPE_DOMAIN_ADMIN) { - DomainVO domain = _domainDao.findById(account.getDomainId()); - if (domain != null) { - path = domain.getPath(); - } - } - } else { - accountId = account.getId(); - } - - Criteria c = new Criteria("id", Boolean.TRUE, cmd.getStartIndex(), cmd.getPageSizeVal()); - c.addCriteria(Criteria.KEYWORD, cmd.getKeyword()); - c.addCriteria(Criteria.ID, cmd.getId()); - c.addCriteria(Criteria.NAME, cmd.getInstanceName()); - c.addCriteria(Criteria.STATE, cmd.getState()); - c.addCriteria(Criteria.DATACENTERID, cmd.getZoneId()); - c.addCriteria(Criteria.GROUPID, cmd.getGroupId()); - c.addCriteria(Criteria.FOR_VIRTUAL_NETWORK, cmd.getForVirtualNetwork()); - c.addCriteria(Criteria.NETWORKID, cmd.getNetworkId()); - - if (path != null) { - c.addCriteria(Criteria.PATH, path); - } - - // ignore these search requests if it's not an admin - if (isAdmin == true) { - c.addCriteria(Criteria.DOMAINID, domainId); - c.addCriteria(Criteria.PODID, cmd.getPodId()); - c.addCriteria(Criteria.HOSTID, cmd.getHostId()); - } - - if (accountId != null) { - c.addCriteria(Criteria.ACCOUNTID, new Object[] {accountId}); - } - c.addCriteria(Criteria.ISADMIN, isAdmin); - - return searchForUserVMs(c); - } - - @Override - public List searchForUserVMs(Criteria c) { - Filter searchFilter = new Filter(UserVmVO.class, c.getOrderBy(), c.getAscending(), c.getOffset(), c.getLimit()); - - SearchBuilder sb = _userVmDao.createSearchBuilder(); - - // some criteria matter for generating the join condition - Object[] accountIds = (Object[]) c.getCriteria(Criteria.ACCOUNTID); - Object domainId = c.getCriteria(Criteria.DOMAINID); - - // get the rest of the criteria - Object id = c.getCriteria(Criteria.ID); - Object name = c.getCriteria(Criteria.NAME); - Object state = c.getCriteria(Criteria.STATE); - Object notState = c.getCriteria(Criteria.NOTSTATE); - Object zone = c.getCriteria(Criteria.DATACENTERID); - Object pod = c.getCriteria(Criteria.PODID); - Object hostId = c.getCriteria(Criteria.HOSTID); - Object hostName = c.getCriteria(Criteria.HOSTNAME); - Object keyword = c.getCriteria(Criteria.KEYWORD); - Object isAdmin = c.getCriteria(Criteria.ISADMIN); - Object ipAddress = c.getCriteria(Criteria.IPADDRESS); - Object groupId = c.getCriteria(Criteria.GROUPID); - Object useVirtualNetwork = c.getCriteria(Criteria.FOR_VIRTUAL_NETWORK); - Object path = c.getCriteria(Criteria.PATH); - Object networkId = c.getCriteria(Criteria.NETWORKID); - - sb.and("displayName", sb.entity().getDisplayName(), SearchCriteria.Op.LIKE); - sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ); - sb.and("accountIdEQ", sb.entity().getAccountId(), SearchCriteria.Op.EQ); - sb.and("accountIdIN", sb.entity().getAccountId(), SearchCriteria.Op.IN); - sb.and("name", sb.entity().getName(), SearchCriteria.Op.LIKE); - sb.and("stateEQ", sb.entity().getState(), SearchCriteria.Op.EQ); - sb.and("stateNEQ", sb.entity().getState(), SearchCriteria.Op.NEQ); - sb.and("stateNIN", sb.entity().getState(), SearchCriteria.Op.NIN); - sb.and("dataCenterId", sb.entity().getDataCenterId(), SearchCriteria.Op.EQ); - sb.and("podId", sb.entity().getPodId(), SearchCriteria.Op.EQ); - sb.and("hostIdEQ", sb.entity().getHostId(), SearchCriteria.Op.EQ); - sb.and("hostIdIN", sb.entity().getHostId(), SearchCriteria.Op.IN); - sb.and("guestIP", sb.entity().getGuestIpAddress(), SearchCriteria.Op.EQ); - - if (domainId != null || path != null) { - // if accountId isn't specified, we can do a domain match for the admin case - SearchBuilder domainSearch = _domainDao.createSearchBuilder(); - domainSearch.and("id", domainSearch.entity().getId(), SearchCriteria.Op.EQ); - domainSearch.and("path", domainSearch.entity().getPath(), SearchCriteria.Op.LIKE); - sb.join("domainSearch", domainSearch, sb.entity().getDomainId(), domainSearch.entity().getId(), JoinBuilder.JoinType.INNER); - } - - if (groupId != null && (Long)groupId == -1) { - SearchBuilder vmSearch = _groupVMMapDao.createSearchBuilder(); - vmSearch.and("instanceId", vmSearch.entity().getInstanceId(), SearchCriteria.Op.EQ); - sb.join("vmSearch", vmSearch, sb.entity().getId(), vmSearch.entity().getInstanceId(), JoinBuilder.JoinType.LEFTOUTER); - } else if (groupId != null) { - SearchBuilder groupSearch = _groupVMMapDao.createSearchBuilder(); - groupSearch.and("groupId", groupSearch.entity().getGroupId(), SearchCriteria.Op.EQ); - sb.join("groupSearch", groupSearch, sb.entity().getId(), groupSearch.entity().getInstanceId(), JoinBuilder.JoinType.INNER); - } - - if (networkId != null) { - SearchBuilder nicSearch = _nicDao.createSearchBuilder(); - nicSearch.and("networkId", nicSearch.entity().getNetworkId(), SearchCriteria.Op.EQ); - - SearchBuilder networkSearch = _networkDao.createSearchBuilder(); - networkSearch.and("networkId", networkSearch.entity().getId(), SearchCriteria.Op.EQ); - nicSearch.join("networkSearch", networkSearch, nicSearch.entity().getNetworkId(), networkSearch.entity().getId(), JoinBuilder.JoinType.INNER); - - sb.join("nicSearch", nicSearch, sb.entity().getId(), nicSearch.entity().getInstanceId(), JoinBuilder.JoinType.INNER); - } - - if (useVirtualNetwork != null) { - SearchBuilder serviceSearch = _offeringsDao.createSearchBuilder(); - if ((Boolean)useVirtualNetwork){ - serviceSearch.and("guestIpType", serviceSearch.entity().getGuestIpType(), SearchCriteria.Op.EQ); - } else { - serviceSearch.and("guestIpType", serviceSearch.entity().getGuestIpType(), SearchCriteria.Op.NEQ); - } - sb.join("serviceSearch", serviceSearch, sb.entity().getServiceOfferingId(), serviceSearch.entity().getId(), JoinBuilder.JoinType.INNER); - } - - // populate the search criteria with the values passed in - SearchCriteria sc = sb.create(); - - if (groupId != null && (Long)groupId == -1){ - sc.setJoinParameters("vmSearch", "instanceId", (Object)null); - } else if (groupId != null ) { - sc.setJoinParameters("groupSearch", "groupId", groupId); - } - - if (useVirtualNetwork != null) { - sc.setJoinParameters("serviceSearch", "guestIpType", NetworkOffering.GuestIpType.Virtual.toString()); - } - - if (keyword != null) { - SearchCriteria ssc = _userVmDao.createSearchCriteria(); - ssc.addOr("displayName", SearchCriteria.Op.LIKE, "%" + keyword + "%"); - ssc.addOr("name", SearchCriteria.Op.LIKE, "%" + keyword + "%"); - ssc.addOr("instanceName", SearchCriteria.Op.LIKE, "%" + keyword + "%"); - ssc.addOr("state", SearchCriteria.Op.LIKE, "%" + keyword + "%"); - - sc.addAnd("displayName", SearchCriteria.Op.SC, ssc); - } - - if (id != null) { - sc.setParameters("id", id); - } - if (accountIds != null) { - if (accountIds.length == 1) { - if (accountIds[0] != null) { - sc.setParameters("accountIdEQ", accountIds[0]); - } - } else { - sc.setParameters("accountIdIN", accountIds); - } - } else if (domainId != null) { - sc.setJoinParameters("domainSearch", "id", domainId); - } - - if (path != null) { - sc.setJoinParameters("domainSearch", "path", path + "%"); - } - - if (networkId != null) { - sc.setJoinParameters("nicSearch", "networkId", networkId); - } - - if (name != null) { - sc.setParameters("name", "%" + name + "%"); - } - if (state != null) { - if (notState != null && (Boolean) notState == true) { - sc.setParameters("stateNEQ", state); - } else { - sc.setParameters("stateEQ", state); - } - } - - if ((isAdmin != null) && ((Boolean) isAdmin != true)) { - sc.setParameters("stateNIN", "Destroyed", "Expunging"); - } - - if (zone != null) { - sc.setParameters("dataCenterId", zone); - - if(state == null) { - sc.setParameters("stateNEQ", "Destroyed"); - } - } - if (pod != null) { - sc.setParameters("podId", pod); - - if(state == null) { - sc.setParameters("stateNEQ", "Destroyed"); - } - } - - if (hostId != null) { - sc.setParameters("hostIdEQ", hostId); - } else { - if (hostName != null) { - List hosts = _hostDao.findHostsLike((String) hostName); - if (hosts != null & !hosts.isEmpty()) { - Long[] hostIds = new Long[hosts.size()]; - for (int i = 0; i < hosts.size(); i++) { - HostVO host = hosts.get(i); - hostIds[i] = host.getId(); - } - sc.setParameters("hostIdIN", (Object[]) hostIds); - } else { - return new ArrayList(); - } - } - } - - if (ipAddress != null) { - sc.setParameters("guestIP", ipAddress); - } - - return _userVmDao.search(sc, searchFilter); - } - @Override public List searchForEvents(ListEventsCmd cmd) throws PermissionDeniedException, InvalidParameterValueException { Account account = UserContext.current().getCaller(); diff --git a/server/src/com/cloud/vm/UserVmManager.java b/server/src/com/cloud/vm/UserVmManager.java index d2ddb7208c2..bea3b0a6850 100644 --- a/server/src/com/cloud/vm/UserVmManager.java +++ b/server/src/com/cloud/vm/UserVmManager.java @@ -24,6 +24,7 @@ import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.InsufficientCapacityException; import com.cloud.exception.ResourceUnavailableException; import com.cloud.exception.StorageUnavailableException; +import com.cloud.server.Criteria; import com.cloud.user.Account; import com.cloud.uservm.UserVm; import com.cloud.utils.exception.ExecutionException; @@ -95,5 +96,13 @@ public interface UserVmManager extends VirtualMachineGuru{ ConcurrentOperationException, ExecutionException, ResourceUnavailableException, InsufficientCapacityException; boolean expunge(UserVmVO vm, long callerUserId, Account caller); + + /** + * Obtains a list of virtual machines by the specified search criteria. + * Can search by: "userId", "name", "state", "dataCenterId", "podId", "hostId" + * @param c + * @return List of UserVMs. + */ + List searchForUserVMs(Criteria c); } diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java index a67bac5316f..2ddef9dc86e 100755 --- a/server/src/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java @@ -68,6 +68,7 @@ import com.cloud.api.commands.DeleteVMGroupCmd; import com.cloud.api.commands.DeployVMCmd; import com.cloud.api.commands.DestroyVMCmd; import com.cloud.api.commands.DetachVolumeCmd; +import com.cloud.api.commands.ListVMsCmd; import com.cloud.api.commands.RebootVMCmd; import com.cloud.api.commands.RecoverVMCmd; import com.cloud.api.commands.ResetVMPasswordCmd; @@ -134,6 +135,7 @@ import com.cloud.network.security.SecurityGroupManager; import com.cloud.offering.NetworkOffering; import com.cloud.offering.ServiceOffering; import com.cloud.offerings.dao.NetworkOfferingDao; +import com.cloud.server.Criteria; import com.cloud.service.ServiceOfferingVO; import com.cloud.service.dao.ServiceOfferingDao; import com.cloud.storage.DiskOfferingVO; @@ -183,7 +185,9 @@ import com.cloud.utils.component.Inject; import com.cloud.utils.component.Manager; import com.cloud.utils.concurrency.NamedThreadFactory; import com.cloud.utils.db.DB; +import com.cloud.utils.db.Filter; import com.cloud.utils.db.GlobalLock; +import com.cloud.utils.db.JoinBuilder; import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; import com.cloud.utils.db.Transaction; @@ -2512,4 +2516,252 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager throw new CloudRuntimeException("Failed to destroy vm with id " + vmId); } } + + + @Override + public List searchForUserVMs(ListVMsCmd cmd) throws InvalidParameterValueException, PermissionDeniedException { + Account account = UserContext.current().getCaller(); + Long domainId = cmd.getDomainId(); + String accountName = cmd.getAccountName(); + Long accountId = null; + boolean isAdmin = false; + String path = null; + if ((account == null) || isAdmin(account.getType())) { + isAdmin = true; + if (domainId != null) { + if ((account != null) && !_domainDao.isChildDomain(account.getDomainId(), domainId)) { + throw new PermissionDeniedException("Invalid domain id (" + domainId + ") given, unable to list virtual machines."); + } + + if (accountName != null) { + account = _accountDao.findActiveAccount(accountName, domainId); + if (account == null) { + throw new InvalidParameterValueException("Unable to find account " + accountName + " in domain " + domainId); + } + accountId = account.getId(); + } + } + if (account.getType() == Account.ACCOUNT_TYPE_DOMAIN_ADMIN) { + DomainVO domain = _domainDao.findById(account.getDomainId()); + if (domain != null) { + path = domain.getPath(); + } + } + } else { + accountId = account.getId(); + } + + Criteria c = new Criteria("id", Boolean.TRUE, cmd.getStartIndex(), cmd.getPageSizeVal()); + c.addCriteria(Criteria.KEYWORD, cmd.getKeyword()); + c.addCriteria(Criteria.ID, cmd.getId()); + c.addCriteria(Criteria.NAME, cmd.getInstanceName()); + c.addCriteria(Criteria.STATE, cmd.getState()); + c.addCriteria(Criteria.DATACENTERID, cmd.getZoneId()); + c.addCriteria(Criteria.GROUPID, cmd.getGroupId()); + c.addCriteria(Criteria.FOR_VIRTUAL_NETWORK, cmd.getForVirtualNetwork()); + c.addCriteria(Criteria.NETWORKID, cmd.getNetworkId()); + + if (path != null) { + c.addCriteria(Criteria.PATH, path); + } + + // ignore these search requests if it's not an admin + if (isAdmin == true) { + c.addCriteria(Criteria.DOMAINID, domainId); + c.addCriteria(Criteria.PODID, cmd.getPodId()); + c.addCriteria(Criteria.HOSTID, cmd.getHostId()); + } + + if (accountId != null) { + c.addCriteria(Criteria.ACCOUNTID, new Object[] {accountId}); + } + c.addCriteria(Criteria.ISADMIN, isAdmin); + + return searchForUserVMs(c); + } + + @Override + public List searchForUserVMs(Criteria c) { + Filter searchFilter = new Filter(UserVmVO.class, c.getOrderBy(), c.getAscending(), c.getOffset(), c.getLimit()); + + SearchBuilder sb = _vmDao.createSearchBuilder(); + + // some criteria matter for generating the join condition + Object[] accountIds = (Object[]) c.getCriteria(Criteria.ACCOUNTID); + Object domainId = c.getCriteria(Criteria.DOMAINID); + + // get the rest of the criteria + Object id = c.getCriteria(Criteria.ID); + Object name = c.getCriteria(Criteria.NAME); + Object state = c.getCriteria(Criteria.STATE); + Object notState = c.getCriteria(Criteria.NOTSTATE); + Object zone = c.getCriteria(Criteria.DATACENTERID); + Object pod = c.getCriteria(Criteria.PODID); + Object hostId = c.getCriteria(Criteria.HOSTID); + Object hostName = c.getCriteria(Criteria.HOSTNAME); + Object keyword = c.getCriteria(Criteria.KEYWORD); + Object isAdmin = c.getCriteria(Criteria.ISADMIN); + Object ipAddress = c.getCriteria(Criteria.IPADDRESS); + Object groupId = c.getCriteria(Criteria.GROUPID); + Object useVirtualNetwork = c.getCriteria(Criteria.FOR_VIRTUAL_NETWORK); + Object path = c.getCriteria(Criteria.PATH); + Object networkId = c.getCriteria(Criteria.NETWORKID); + + sb.and("displayName", sb.entity().getDisplayName(), SearchCriteria.Op.LIKE); + sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ); + sb.and("accountIdEQ", sb.entity().getAccountId(), SearchCriteria.Op.EQ); + sb.and("accountIdIN", sb.entity().getAccountId(), SearchCriteria.Op.IN); + sb.and("name", sb.entity().getName(), SearchCriteria.Op.LIKE); + sb.and("stateEQ", sb.entity().getState(), SearchCriteria.Op.EQ); + sb.and("stateNEQ", sb.entity().getState(), SearchCriteria.Op.NEQ); + sb.and("stateNIN", sb.entity().getState(), SearchCriteria.Op.NIN); + sb.and("dataCenterId", sb.entity().getDataCenterId(), SearchCriteria.Op.EQ); + sb.and("podId", sb.entity().getPodId(), SearchCriteria.Op.EQ); + sb.and("hostIdEQ", sb.entity().getHostId(), SearchCriteria.Op.EQ); + sb.and("hostIdIN", sb.entity().getHostId(), SearchCriteria.Op.IN); + sb.and("guestIP", sb.entity().getGuestIpAddress(), SearchCriteria.Op.EQ); + + if (domainId != null || path != null) { + // if accountId isn't specified, we can do a domain match for the admin case + SearchBuilder domainSearch = _domainDao.createSearchBuilder(); + domainSearch.and("id", domainSearch.entity().getId(), SearchCriteria.Op.EQ); + domainSearch.and("path", domainSearch.entity().getPath(), SearchCriteria.Op.LIKE); + sb.join("domainSearch", domainSearch, sb.entity().getDomainId(), domainSearch.entity().getId(), JoinBuilder.JoinType.INNER); + } + + if (groupId != null && (Long)groupId == -1) { + SearchBuilder vmSearch = _groupVMMapDao.createSearchBuilder(); + vmSearch.and("instanceId", vmSearch.entity().getInstanceId(), SearchCriteria.Op.EQ); + sb.join("vmSearch", vmSearch, sb.entity().getId(), vmSearch.entity().getInstanceId(), JoinBuilder.JoinType.LEFTOUTER); + } else if (groupId != null) { + SearchBuilder groupSearch = _groupVMMapDao.createSearchBuilder(); + groupSearch.and("groupId", groupSearch.entity().getGroupId(), SearchCriteria.Op.EQ); + sb.join("groupSearch", groupSearch, sb.entity().getId(), groupSearch.entity().getInstanceId(), JoinBuilder.JoinType.INNER); + } + + if (networkId != null) { + SearchBuilder nicSearch = _nicDao.createSearchBuilder(); + nicSearch.and("networkId", nicSearch.entity().getNetworkId(), SearchCriteria.Op.EQ); + + SearchBuilder networkSearch = _networkDao.createSearchBuilder(); + networkSearch.and("networkId", networkSearch.entity().getId(), SearchCriteria.Op.EQ); + nicSearch.join("networkSearch", networkSearch, nicSearch.entity().getNetworkId(), networkSearch.entity().getId(), JoinBuilder.JoinType.INNER); + + sb.join("nicSearch", nicSearch, sb.entity().getId(), nicSearch.entity().getInstanceId(), JoinBuilder.JoinType.INNER); + } + + if (useVirtualNetwork != null) { + SearchBuilder serviceSearch = _offeringDao.createSearchBuilder(); + if ((Boolean)useVirtualNetwork){ + serviceSearch.and("guestIpType", serviceSearch.entity().getGuestIpType(), SearchCriteria.Op.EQ); + } else { + serviceSearch.and("guestIpType", serviceSearch.entity().getGuestIpType(), SearchCriteria.Op.NEQ); + } + sb.join("serviceSearch", serviceSearch, sb.entity().getServiceOfferingId(), serviceSearch.entity().getId(), JoinBuilder.JoinType.INNER); + } + + SearchBuilder accountRemoved = _accountDao.createSearchBuilder(); + accountRemoved.and("accountremoved", accountRemoved.entity().getRemoved(), SearchCriteria.Op.NULL); + sb.join("accountRemoved", accountRemoved, sb.entity().getAccountId(), accountRemoved.entity().getId(), JoinBuilder.JoinType.INNER); + + // populate the search criteria with the values passed in + SearchCriteria sc = sb.create(); + + if (groupId != null && (Long)groupId == -1){ + sc.setJoinParameters("vmSearch", "instanceId", (Object)null); + } else if (groupId != null ) { + sc.setJoinParameters("groupSearch", "groupId", groupId); + } + + if (useVirtualNetwork != null) { + sc.setJoinParameters("serviceSearch", "guestIpType", NetworkOffering.GuestIpType.Virtual.toString()); + } + + if (keyword != null) { + SearchCriteria ssc = _vmDao.createSearchCriteria(); + ssc.addOr("displayName", SearchCriteria.Op.LIKE, "%" + keyword + "%"); + ssc.addOr("name", SearchCriteria.Op.LIKE, "%" + keyword + "%"); + ssc.addOr("instanceName", SearchCriteria.Op.LIKE, "%" + keyword + "%"); + ssc.addOr("state", SearchCriteria.Op.LIKE, "%" + keyword + "%"); + + sc.addAnd("displayName", SearchCriteria.Op.SC, ssc); + } + + if (id != null) { + sc.setParameters("id", id); + } + if (accountIds != null) { + if (accountIds.length == 1) { + if (accountIds[0] != null) { + sc.setParameters("accountIdEQ", accountIds[0]); + } + } else { + sc.setParameters("accountIdIN", accountIds); + } + } else if (domainId != null) { + sc.setJoinParameters("domainSearch", "id", domainId); + } + + if (path != null) { + sc.setJoinParameters("domainSearch", "path", path + "%"); + } + + if (networkId != null) { + sc.setJoinParameters("nicSearch", "networkId", networkId); + } + + if (name != null) { + sc.setParameters("name", "%" + name + "%"); + } + if (state != null) { + if (notState != null && (Boolean) notState == true) { + sc.setParameters("stateNEQ", state); + } else { + sc.setParameters("stateEQ", state); + } + } + + if ((isAdmin != null) && ((Boolean) isAdmin != true)) { + sc.setParameters("stateNIN", "Destroyed", "Expunging"); + } + + if (zone != null) { + sc.setParameters("dataCenterId", zone); + + if(state == null) { + sc.setParameters("stateNEQ", "Destroyed"); + } + } + if (pod != null) { + sc.setParameters("podId", pod); + + if(state == null) { + sc.setParameters("stateNEQ", "Destroyed"); + } + } + + if (hostId != null) { + sc.setParameters("hostIdEQ", hostId); + } else { + if (hostName != null) { + List hosts = _hostDao.findHostsLike((String) hostName); + if (hosts != null & !hosts.isEmpty()) { + Long[] hostIds = new Long[hosts.size()]; + for (int i = 0; i < hosts.size(); i++) { + HostVO host = hosts.get(i); + hostIds[i] = host.getId(); + } + sc.setParameters("hostIdIN", (Object[]) hostIds); + } else { + return new ArrayList(); + } + } + } + + if (ipAddress != null) { + sc.setParameters("guestIP", ipAddress); + } + + return _vmDao.search(sc, searchFilter); + } }