// Licensed to the Apache Software Foundation (ASF) under one // or more contributor license agreements. See the NOTICE file // distributed with this work for additional information // regarding copyright ownership. The ASF licenses this file // to you under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance // with the License. You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, // software distributed under the License is distributed on an // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. package com.cloud.api.query; import java.util.ArrayList; import java.util.Date; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import javax.ejb.Local; import javax.inject.Inject; import org.apache.log4j.Logger; import org.springframework.stereotype.Component; import org.apache.cloudstack.acl.ControlledEntity.ACLType; import org.apache.cloudstack.affinity.AffinityGroupDomainMapVO; import org.apache.cloudstack.affinity.AffinityGroupResponse; import org.apache.cloudstack.affinity.AffinityGroupVMMapVO; import org.apache.cloudstack.affinity.dao.AffinityGroupDomainMapDao; import org.apache.cloudstack.affinity.dao.AffinityGroupVMMapDao; import org.apache.cloudstack.api.BaseListProjectAndAccountResourcesCmd; import org.apache.cloudstack.api.ResourceDetail; import org.apache.cloudstack.api.ResponseObject.ResponseView; import org.apache.cloudstack.api.command.admin.account.ListAccountsCmdByAdmin; import org.apache.cloudstack.api.command.admin.host.ListHostsCmd; import org.apache.cloudstack.api.command.admin.internallb.ListInternalLBVMsCmd; import org.apache.cloudstack.api.command.admin.iso.ListIsosCmdByAdmin; import org.apache.cloudstack.api.command.admin.router.ListRoutersCmd; import org.apache.cloudstack.api.command.admin.storage.ListImageStoresCmd; import org.apache.cloudstack.api.command.admin.storage.ListSecondaryStagingStoresCmd; import org.apache.cloudstack.api.command.admin.storage.ListStoragePoolsCmd; import org.apache.cloudstack.api.command.admin.template.ListTemplatesCmdByAdmin; import org.apache.cloudstack.api.command.admin.user.ListUsersCmd; import org.apache.cloudstack.api.command.admin.vm.ListVMsCmdByAdmin; import org.apache.cloudstack.api.command.admin.volume.ListVolumesCmdByAdmin; import org.apache.cloudstack.api.command.admin.zone.ListZonesCmdByAdmin; import org.apache.cloudstack.api.command.user.account.ListAccountsCmd; import org.apache.cloudstack.api.command.user.account.ListProjectAccountsCmd; import org.apache.cloudstack.api.command.user.event.ListEventsCmd; import org.apache.cloudstack.api.command.user.iso.ListIsosCmd; import org.apache.cloudstack.api.command.user.job.ListAsyncJobsCmd; import org.apache.cloudstack.api.command.user.offering.ListDiskOfferingsCmd; import org.apache.cloudstack.api.command.user.offering.ListServiceOfferingsCmd; import org.apache.cloudstack.api.command.user.project.ListProjectInvitationsCmd; import org.apache.cloudstack.api.command.user.project.ListProjectsCmd; import org.apache.cloudstack.api.command.user.securitygroup.ListSecurityGroupsCmd; import org.apache.cloudstack.api.command.user.tag.ListTagsCmd; import org.apache.cloudstack.api.command.user.template.ListTemplatesCmd; import org.apache.cloudstack.api.command.user.vm.ListVMsCmd; import org.apache.cloudstack.api.command.user.vmgroup.ListVMGroupsCmd; import org.apache.cloudstack.api.command.user.volume.ListResourceDetailsCmd; import org.apache.cloudstack.api.command.user.volume.ListVolumesCmd; import org.apache.cloudstack.api.command.user.zone.ListZonesCmd; import org.apache.cloudstack.api.response.AccountResponse; import org.apache.cloudstack.api.response.AsyncJobResponse; import org.apache.cloudstack.api.response.DiskOfferingResponse; import org.apache.cloudstack.api.response.DomainRouterResponse; import org.apache.cloudstack.api.response.EventResponse; import org.apache.cloudstack.api.response.HostResponse; import org.apache.cloudstack.api.response.ImageStoreResponse; import org.apache.cloudstack.api.response.InstanceGroupResponse; import org.apache.cloudstack.api.response.ListResponse; import org.apache.cloudstack.api.response.ProjectAccountResponse; import org.apache.cloudstack.api.response.ProjectInvitationResponse; import org.apache.cloudstack.api.response.ProjectResponse; import org.apache.cloudstack.api.response.ResourceDetailResponse; import org.apache.cloudstack.api.response.ResourceTagResponse; import org.apache.cloudstack.api.response.SecurityGroupResponse; import org.apache.cloudstack.api.response.ServiceOfferingResponse; import org.apache.cloudstack.api.response.StoragePoolResponse; import org.apache.cloudstack.api.response.TemplateResponse; import org.apache.cloudstack.api.response.UserResponse; import org.apache.cloudstack.api.response.UserVmResponse; import org.apache.cloudstack.api.response.VolumeResponse; import org.apache.cloudstack.api.response.ZoneResponse; import org.apache.cloudstack.context.CallContext; import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreCapabilities; import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreDriver; import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager; import org.apache.cloudstack.engine.subsystem.api.storage.TemplateState; import org.apache.cloudstack.framework.config.dao.ConfigurationDao; import org.apache.cloudstack.query.QueryService; import com.cloud.api.query.dao.AccountJoinDao; import com.cloud.api.query.dao.AffinityGroupJoinDao; import com.cloud.api.query.dao.AsyncJobJoinDao; import com.cloud.api.query.dao.DataCenterJoinDao; import com.cloud.api.query.dao.DiskOfferingJoinDao; import com.cloud.api.query.dao.DomainRouterJoinDao; import com.cloud.api.query.dao.HostJoinDao; import com.cloud.api.query.dao.ImageStoreJoinDao; import com.cloud.api.query.dao.InstanceGroupJoinDao; import com.cloud.api.query.dao.ProjectAccountJoinDao; import com.cloud.api.query.dao.ProjectInvitationJoinDao; import com.cloud.api.query.dao.ProjectJoinDao; import com.cloud.api.query.dao.ResourceTagJoinDao; import com.cloud.api.query.dao.SecurityGroupJoinDao; import com.cloud.api.query.dao.ServiceOfferingJoinDao; import com.cloud.api.query.dao.StoragePoolJoinDao; import com.cloud.api.query.dao.TemplateJoinDao; import com.cloud.api.query.dao.UserAccountJoinDao; import com.cloud.api.query.dao.UserVmJoinDao; import com.cloud.api.query.dao.VolumeJoinDao; import com.cloud.api.query.vo.AccountJoinVO; import com.cloud.api.query.vo.AffinityGroupJoinVO; import com.cloud.api.query.vo.AsyncJobJoinVO; import com.cloud.api.query.vo.DataCenterJoinVO; import com.cloud.api.query.vo.DiskOfferingJoinVO; import com.cloud.api.query.vo.DomainRouterJoinVO; import com.cloud.api.query.vo.EventJoinVO; import com.cloud.api.query.vo.HostJoinVO; import com.cloud.api.query.vo.ImageStoreJoinVO; import com.cloud.api.query.vo.InstanceGroupJoinVO; import com.cloud.api.query.vo.ProjectAccountJoinVO; import com.cloud.api.query.vo.ProjectInvitationJoinVO; import com.cloud.api.query.vo.ProjectJoinVO; import com.cloud.api.query.vo.ResourceTagJoinVO; import com.cloud.api.query.vo.SecurityGroupJoinVO; import com.cloud.api.query.vo.ServiceOfferingJoinVO; import com.cloud.api.query.vo.StoragePoolJoinVO; import com.cloud.api.query.vo.TemplateJoinVO; import com.cloud.api.query.vo.UserAccountJoinVO; import com.cloud.api.query.vo.UserVmJoinVO; import com.cloud.api.query.vo.VolumeJoinVO; import com.cloud.dc.DedicatedResourceVO; import com.cloud.dc.dao.DataCenterDetailsDao; import com.cloud.dc.dao.DedicatedResourceDao; import com.cloud.domain.Domain; import com.cloud.domain.DomainVO; import com.cloud.domain.dao.DomainDao; import com.cloud.event.dao.EventJoinDao; import com.cloud.exception.CloudAuthenticationException; import com.cloud.exception.InvalidParameterValueException; import com.cloud.exception.PermissionDeniedException; import com.cloud.ha.HighAvailabilityManager; import com.cloud.hypervisor.Hypervisor; import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.network.dao.NetworkDetailsDao; import com.cloud.network.security.SecurityGroupVMMapVO; import com.cloud.network.security.dao.SecurityGroupVMMapDao; import com.cloud.org.Grouping; import com.cloud.projects.Project; import com.cloud.projects.Project.ListProjectResourcesCriteria; import com.cloud.projects.ProjectInvitation; import com.cloud.projects.ProjectManager; import com.cloud.projects.dao.ProjectAccountDao; import com.cloud.projects.dao.ProjectDao; import com.cloud.resource.ResourceManager; import com.cloud.server.ResourceMetaDataService; import com.cloud.server.ResourceTag; import com.cloud.server.ResourceTag.ResourceObjectType; import com.cloud.server.TaggedResourceService; import com.cloud.service.ServiceOfferingVO; import com.cloud.service.dao.ServiceOfferingDao; import com.cloud.storage.DataStoreRole; import com.cloud.storage.DiskOfferingVO; import com.cloud.storage.ScopeType; import com.cloud.storage.Storage; import com.cloud.storage.Storage.ImageFormat; import com.cloud.storage.Storage.TemplateType; import com.cloud.storage.VMTemplateVO; import com.cloud.storage.Volume; import com.cloud.storage.dao.VMTemplateDao; import com.cloud.storage.dao.VolumeDetailsDao; import com.cloud.tags.ResourceTagVO; import com.cloud.tags.dao.ResourceTagDao; import com.cloud.template.VirtualMachineTemplate.State; import com.cloud.template.VirtualMachineTemplate.TemplateFilter; import com.cloud.user.Account; import com.cloud.user.AccountManager; import com.cloud.user.DomainManager; import com.cloud.user.dao.AccountDao; import com.cloud.utils.DateUtil; import com.cloud.utils.Pair; import com.cloud.utils.Ternary; import com.cloud.utils.component.ManagerBase; import com.cloud.utils.db.Filter; import com.cloud.utils.db.JoinBuilder; import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; import com.cloud.utils.db.SearchCriteria.Func; import com.cloud.utils.db.SearchCriteria.Op; import com.cloud.vm.DomainRouterVO; import com.cloud.vm.UserVmVO; import com.cloud.vm.VirtualMachine; import com.cloud.vm.dao.DomainRouterDao; import com.cloud.vm.dao.NicDetailsDao; import com.cloud.vm.dao.UserVmDao; import com.cloud.vm.dao.UserVmDetailsDao; @Component @Local(value = {QueryService.class}) public class QueryManagerImpl extends ManagerBase implements QueryService { public static final Logger s_logger = Logger.getLogger(QueryManagerImpl.class); @Inject private AccountManager _accountMgr; @Inject private ProjectManager _projectMgr; @Inject private DomainDao _domainDao; @Inject private UserAccountJoinDao _userAccountJoinDao; @Inject private EventJoinDao _eventJoinDao; @Inject private ResourceTagJoinDao _resourceTagJoinDao; @Inject private InstanceGroupJoinDao _vmGroupJoinDao; @Inject private UserVmJoinDao _userVmJoinDao; @Inject private UserVmDao _userVmDao; @Inject private SecurityGroupJoinDao _securityGroupJoinDao; @Inject private SecurityGroupVMMapDao _securityGroupVMMapDao; @Inject private DomainRouterJoinDao _routerJoinDao; @Inject private ProjectInvitationJoinDao _projectInvitationJoinDao; @Inject private ProjectJoinDao _projectJoinDao; @Inject private ProjectDao _projectDao; @Inject private ProjectAccountDao _projectAccountDao; @Inject private ProjectAccountJoinDao _projectAccountJoinDao; @Inject private HostJoinDao _hostJoinDao; @Inject private VolumeJoinDao _volumeJoinDao; @Inject private AccountDao _accountDao; @Inject private ConfigurationDao _configDao; @Inject private AccountJoinDao _accountJoinDao; @Inject private AsyncJobJoinDao _jobJoinDao; @Inject private StoragePoolJoinDao _poolJoinDao; @Inject private ImageStoreJoinDao _imageStoreJoinDao; @Inject private DiskOfferingJoinDao _diskOfferingJoinDao; @Inject private ServiceOfferingJoinDao _srvOfferingJoinDao; @Inject private ServiceOfferingDao _srvOfferingDao; @Inject private DataCenterJoinDao _dcJoinDao; @Inject private DomainRouterDao _routerDao; @Inject private VolumeDetailsDao _volumeDetailDao; @Inject private NicDetailsDao _nicDetailDao; @Inject UserVmDetailsDao _userVmDetailDao; @Inject private HighAvailabilityManager _haMgr; @Inject private VMTemplateDao _templateDao; @Inject private TemplateJoinDao _templateJoinDao; @Inject ResourceManager _resourceMgr; @Inject private ResourceMetaDataService _resourceMetaDataMgr; @Inject private TaggedResourceService _taggedResourceMgr; @Inject AffinityGroupVMMapDao _affinityGroupVMMapDao; @Inject private AffinityGroupJoinDao _affinityGroupJoinDao; @Inject private DedicatedResourceDao _dedicatedDao; @Inject DataCenterDetailsDao _dcDetailsDao; @Inject DomainManager _domainMgr; @Inject AffinityGroupDomainMapDao _affinityGroupDomainMapDao; @Inject NetworkDetailsDao _networkDetailsDao; @Inject ResourceTagDao _resourceTagDao; @Inject DataStoreManager dataStoreManager; /* * (non-Javadoc) * * @see * com.cloud.api.query.QueryService#searchForUsers(org.apache.cloudstack * .api.command.admin.user.ListUsersCmd) */ @Override public ListResponse searchForUsers(ListUsersCmd cmd) throws PermissionDeniedException { Pair, Integer> result = searchForUsersInternal(cmd); ListResponse response = new ListResponse(); List userResponses = ViewResponseHelper.createUserResponse(CallContext.current().getCallingAccount().getDomainId(), result.first().toArray(new UserAccountJoinVO[result.first().size()])); response.setResponses(userResponses, result.second()); return response; } private Pair, Integer> searchForUsersInternal(ListUsersCmd cmd) throws PermissionDeniedException { Account caller = CallContext.current().getCallingAccount(); // TODO: Integrate with ACL checkAccess refactoring Long domainId = cmd.getDomainId(); if (domainId != null) { Domain domain = _domainDao.findById(domainId); if (domain == null) { throw new InvalidParameterValueException("Unable to find domain by id=" + domainId); } _accountMgr.checkAccess(caller, domain); } else { // default domainId to the caller's domain domainId = caller.getDomainId(); } Filter searchFilter = new Filter(UserAccountJoinVO.class, "id", true, cmd.getStartIndex(), cmd.getPageSizeVal()); Long id = cmd.getId(); Object username = cmd.getUsername(); Object type = cmd.getAccountType(); Object accountName = cmd.getAccountName(); Object state = cmd.getState(); Object keyword = cmd.getKeyword(); SearchBuilder sb = _userAccountJoinDao.createSearchBuilder(); sb.and("username", sb.entity().getUsername(), SearchCriteria.Op.LIKE); if (id != null && id == 1) { // system user should NOT be searchable List emptyList = new ArrayList(); return new Pair, Integer>(emptyList, 0); } else if (id != null) { sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ); } else { // this condition is used to exclude system user from the search // results sb.and("id", sb.entity().getId(), SearchCriteria.Op.NEQ); } sb.and("type", sb.entity().getAccountType(), SearchCriteria.Op.EQ); sb.and("domainId", sb.entity().getDomainId(), SearchCriteria.Op.EQ); sb.and("accountName", sb.entity().getAccountName(), SearchCriteria.Op.EQ); sb.and("state", sb.entity().getState(), SearchCriteria.Op.EQ); if ((accountName == null) && (domainId != null)) { sb.and("domainPath", sb.entity().getDomainPath(), SearchCriteria.Op.LIKE); } SearchCriteria sc = sb.create(); if (keyword != null) { SearchCriteria ssc = _userAccountJoinDao.createSearchCriteria(); ssc.addOr("username", SearchCriteria.Op.LIKE, "%" + keyword + "%"); ssc.addOr("firstname", SearchCriteria.Op.LIKE, "%" + keyword + "%"); ssc.addOr("lastname", SearchCriteria.Op.LIKE, "%" + keyword + "%"); ssc.addOr("email", SearchCriteria.Op.LIKE, "%" + keyword + "%"); ssc.addOr("state", SearchCriteria.Op.LIKE, "%" + keyword + "%"); ssc.addOr("accountName", SearchCriteria.Op.LIKE, "%" + keyword + "%"); ssc.addOr("accountType", SearchCriteria.Op.LIKE, "%" + keyword + "%"); sc.addAnd("username", SearchCriteria.Op.SC, ssc); } if (username != null) { sc.setParameters("username", username); } if (id != null) { sc.setParameters("id", id); } else { // Don't return system user, search builder with NEQ sc.setParameters("id", 1); } if (type != null) { sc.setParameters("type", type); } if (accountName != null) { sc.setParameters("accountName", accountName); if (domainId != null) { sc.setParameters("domainId", domainId); } } else if (domainId != null) { DomainVO domainVO = _domainDao.findById(domainId); sc.setParameters("domainPath", domainVO.getPath() + "%"); } if (state != null) { sc.setParameters("state", state); } return _userAccountJoinDao.searchAndCount(sc, searchFilter); } @Override public ListResponse searchForEvents(ListEventsCmd cmd) { Pair, Integer> result = searchForEventsInternal(cmd); ListResponse response = new ListResponse(); List eventResponses = ViewResponseHelper.createEventResponse(result.first().toArray(new EventJoinVO[result.first().size()])); response.setResponses(eventResponses, result.second()); return response; } private Pair, Integer> searchForEventsInternal(ListEventsCmd cmd) { Account caller = CallContext.current().getCallingAccount(); List permittedAccounts = new ArrayList(); Long id = cmd.getId(); String type = cmd.getType(); String level = cmd.getLevel(); Date startDate = cmd.getStartDate(); Date endDate = cmd.getEndDate(); String keyword = cmd.getKeyword(); Integer entryTime = cmd.getEntryTime(); Integer duration = cmd.getDuration(); Ternary 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(); Boolean isRecursive = domainIdRecursiveListProject.second(); ListProjectResourcesCriteria listProjectResourcesCriteria = domainIdRecursiveListProject.third(); Filter searchFilter = new Filter(EventJoinVO.class, "createDate", false, cmd.getStartIndex(), cmd.getPageSizeVal()); SearchBuilder sb = _eventJoinDao.createSearchBuilder(); _accountMgr.buildACLViewSearchBuilder(sb, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ); sb.and("levelL", sb.entity().getLevel(), SearchCriteria.Op.LIKE); sb.and("levelEQ", sb.entity().getLevel(), SearchCriteria.Op.EQ); sb.and("type", sb.entity().getType(), SearchCriteria.Op.EQ); sb.and("createDateB", sb.entity().getCreateDate(), SearchCriteria.Op.BETWEEN); sb.and("createDateG", sb.entity().getCreateDate(), SearchCriteria.Op.GTEQ); sb.and("createDateL", sb.entity().getCreateDate(), SearchCriteria.Op.LTEQ); sb.and("state", sb.entity().getState(), SearchCriteria.Op.NEQ); sb.and("startId", sb.entity().getStartId(), SearchCriteria.Op.EQ); sb.and("createDate", sb.entity().getCreateDate(), SearchCriteria.Op.BETWEEN); sb.and("displayEvent", sb.entity().getDisplay(), SearchCriteria.Op.EQ); sb.and("archived", sb.entity().getArchived(), SearchCriteria.Op.EQ); SearchCriteria sc = sb.create(); // building ACL condition _accountMgr.buildACLViewSearchCriteria(sc, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); // For end users display only enabled events if (!_accountMgr.isRootAdmin(caller.getId())) { sc.setParameters("displayEvent", true); } if (id != null) { sc.setParameters("id", id); } if (keyword != null) { SearchCriteria ssc = _eventJoinDao.createSearchCriteria(); ssc.addOr("type", SearchCriteria.Op.LIKE, "%" + keyword + "%"); ssc.addOr("description", SearchCriteria.Op.LIKE, "%" + keyword + "%"); ssc.addOr("level", SearchCriteria.Op.LIKE, "%" + keyword + "%"); sc.addAnd("level", SearchCriteria.Op.SC, ssc); } if (level != null) { sc.setParameters("levelEQ", level); } if (type != null) { sc.setParameters("type", type); } if (startDate != null && endDate != null) { sc.setParameters("createDateB", startDate, endDate); } else if (startDate != null) { sc.setParameters("createDateG", startDate); } else if (endDate != null) { sc.setParameters("createDateL", endDate); } sc.setParameters("archived", false); Pair, Integer> eventPair = null; // event_view will not have duplicate rows for each event, so // searchAndCount should be good enough. if ((entryTime != null) && (duration != null)) { // TODO: waiting for response from dev list, logic is mystery to // me!! /* * if (entryTime <= duration) { throw new * InvalidParameterValueException * ("Entry time must be greater than duration"); } Calendar calMin = * Calendar.getInstance(); Calendar calMax = Calendar.getInstance(); * calMin.add(Calendar.SECOND, -entryTime); * calMax.add(Calendar.SECOND, -duration); Date minTime = * calMin.getTime(); Date maxTime = calMax.getTime(); * * sc.setParameters("state", com.cloud.event.Event.State.Completed); * sc.setParameters("startId", 0); sc.setParameters("createDate", * minTime, maxTime); List startedEvents = * _eventJoinDao.searchAllEvents(sc, searchFilter); * List pendingEvents = new ArrayList(); * for (EventVO event : startedEvents) { EventVO completedEvent = * _eventDao.findCompletedEvent(event.getId()); if (completedEvent * == null) { pendingEvents.add(event); } } return pendingEvents; */ } else { eventPair = _eventJoinDao.searchAndCount(sc, searchFilter); } return eventPair; } @Override public ListResponse listTags(ListTagsCmd cmd) { Pair, Integer> tags = listTagsInternal(cmd); ListResponse response = new ListResponse(); List tagResponses = ViewResponseHelper.createResourceTagResponse(false, tags.first().toArray(new ResourceTagJoinVO[tags.first().size()])); response.setResponses(tagResponses, tags.second()); return response; } private Pair, Integer> listTagsInternal(ListTagsCmd cmd) { Account caller = CallContext.current().getCallingAccount(); List permittedAccounts = new ArrayList(); String key = cmd.getKey(); String value = cmd.getValue(); String resourceId = cmd.getResourceId(); String resourceType = cmd.getResourceType(); String customerName = cmd.getCustomer(); boolean listAll = cmd.listAll(); Ternary domainIdRecursiveListProject = new Ternary(cmd.getDomainId(), cmd.isRecursive(), null); _accountMgr.buildACLSearchParameters(caller, null, cmd.getAccountName(), cmd.getProjectId(), permittedAccounts, domainIdRecursiveListProject, listAll, false); Long domainId = domainIdRecursiveListProject.first(); Boolean isRecursive = domainIdRecursiveListProject.second(); ListProjectResourcesCriteria listProjectResourcesCriteria = domainIdRecursiveListProject.third(); Filter searchFilter = new Filter(ResourceTagJoinVO.class, "resourceType", false, cmd.getStartIndex(), cmd.getPageSizeVal()); SearchBuilder sb = _resourceTagJoinDao.createSearchBuilder(); _accountMgr.buildACLViewSearchBuilder(sb, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); sb.and("key", sb.entity().getKey(), SearchCriteria.Op.EQ); sb.and("value", sb.entity().getValue(), SearchCriteria.Op.EQ); if (resourceId != null) { sb.and().op("resourceId", sb.entity().getResourceId(), SearchCriteria.Op.EQ); sb.or("resourceUuid", sb.entity().getResourceUuid(), SearchCriteria.Op.EQ); sb.cp(); } sb.and("resourceType", sb.entity().getResourceType(), SearchCriteria.Op.EQ); sb.and("customer", sb.entity().getCustomer(), SearchCriteria.Op.EQ); // now set the SC criteria... SearchCriteria sc = sb.create(); _accountMgr.buildACLViewSearchCriteria(sc, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); if (key != null) { sc.setParameters("key", key); } if (value != null) { sc.setParameters("value", value); } if (resourceId != null) { sc.setParameters("resourceId", resourceId); sc.setParameters("resourceUuid", resourceId); } if (resourceType != null) { sc.setParameters("resourceType", resourceType); } if (customerName != null) { sc.setParameters("customer", customerName); } Pair, Integer> result = _resourceTagJoinDao.searchAndCount(sc, searchFilter); return result; } @Override public ListResponse searchForVmGroups(ListVMGroupsCmd cmd) { Pair, Integer> groups = searchForVmGroupsInternal(cmd); ListResponse response = new ListResponse(); List grpResponses = ViewResponseHelper.createInstanceGroupResponse(groups.first().toArray(new InstanceGroupJoinVO[groups.first().size()])); response.setResponses(grpResponses, groups.second()); return response; } private Pair, Integer> searchForVmGroupsInternal(ListVMGroupsCmd cmd) { Long id = cmd.getId(); String name = cmd.getGroupName(); String keyword = cmd.getKeyword(); Account caller = CallContext.current().getCallingAccount(); List permittedAccounts = new ArrayList(); Ternary 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(); Boolean isRecursive = domainIdRecursiveListProject.second(); ListProjectResourcesCriteria listProjectResourcesCriteria = domainIdRecursiveListProject.third(); Filter searchFilter = new Filter(InstanceGroupJoinVO.class, "id", true, cmd.getStartIndex(), cmd.getPageSizeVal()); SearchBuilder sb = _vmGroupJoinDao.createSearchBuilder(); _accountMgr.buildACLViewSearchBuilder(sb, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ); sb.and("name", sb.entity().getName(), SearchCriteria.Op.LIKE); SearchCriteria sc = sb.create(); _accountMgr.buildACLViewSearchCriteria(sc, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); if (keyword != null) { SearchCriteria ssc = _vmGroupJoinDao.createSearchCriteria(); ssc.addOr("name", SearchCriteria.Op.LIKE, "%" + keyword + "%"); sc.addAnd("name", SearchCriteria.Op.SC, ssc); } if (id != null) { sc.setParameters("id", id); } if (name != null) { sc.setParameters("name", "%" + name + "%"); } return _vmGroupJoinDao.searchAndCount(sc, searchFilter); } @Override public ListResponse searchForUserVMs(ListVMsCmd cmd) { Pair, Integer> result = searchForUserVMsInternal(cmd); ListResponse response = new ListResponse(); ResponseView respView = ResponseView.Restricted; if (cmd instanceof ListVMsCmdByAdmin) { respView = ResponseView.Full; } List vmResponses = ViewResponseHelper.createUserVmResponse(respView, "virtualmachine", cmd.getDetails(), result.first().toArray(new UserVmJoinVO[result.first().size()])); response.setResponses(vmResponses, result.second()); return response; } private Pair, Integer> searchForUserVMsInternal(ListVMsCmd cmd) { Account caller = CallContext.current().getCallingAccount(); List permittedAccounts = new ArrayList(); boolean listAll = cmd.listAll(); Long id = cmd.getId(); Map tags = cmd.getTags(); Boolean display = cmd.getDisplay(); Ternary domainIdRecursiveListProject = new Ternary( cmd.getDomainId(), cmd.isRecursive(), null); _accountMgr.buildACLSearchParameters(caller, id, cmd.getAccountName(), cmd.getProjectId(), permittedAccounts, domainIdRecursiveListProject, listAll, false); Long domainId = domainIdRecursiveListProject.first(); Boolean isRecursive = domainIdRecursiveListProject.second(); ListProjectResourcesCriteria listProjectResourcesCriteria = domainIdRecursiveListProject.third(); Filter searchFilter = new Filter(UserVmJoinVO.class, "id", true, cmd.getStartIndex(), cmd.getPageSizeVal()); List ids = null; if (cmd.getId() != null) { if (cmd.getIds() != null && !cmd.getIds().isEmpty()) { throw new InvalidParameterValueException("Specify either id or ids but not both parameters"); } ids = new ArrayList(); ids.add(cmd.getId()); } else { ids = cmd.getIds(); } // first search distinct vm id by using query criteria and pagination SearchBuilder sb = _userVmJoinDao.createSearchBuilder(); sb.select(null, Func.DISTINCT, sb.entity().getId()); // select distinct ids _accountMgr.buildACLViewSearchBuilder(sb, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); String hypervisor = cmd.getHypervisor(); Object name = cmd.getName(); Object state = cmd.getState(); Object zoneId = cmd.getZoneId(); Object keyword = cmd.getKeyword(); boolean isAdmin = false; boolean isRootAdmin = false; if (_accountMgr.isAdmin(caller.getId())) { isAdmin = true; } if (_accountMgr.isRootAdmin(caller.getId())) { isRootAdmin = true; } Object groupId = cmd.getGroupId(); Object networkId = cmd.getNetworkId(); if (HypervisorType.getType(hypervisor) == HypervisorType.None && hypervisor != null) { // invalid hypervisor type input throw new InvalidParameterValueException("Invalid HypervisorType " + hypervisor); } Object templateId = cmd.getTemplateId(); Object isoId = cmd.getIsoId(); Object vpcId = cmd.getVpcId(); Object affinityGroupId = cmd.getAffinityGroupId(); Object serviceOffId = cmd.getServiceOfferingId(); Object pod = null; Object hostId = null; Object storageId = null; if (cmd instanceof ListVMsCmdByAdmin) { ListVMsCmdByAdmin adCmd = (ListVMsCmdByAdmin)cmd; pod = adCmd.getPodId(); hostId = adCmd.getHostId(); storageId = adCmd.getStorageId(); } sb.and("displayName", sb.entity().getDisplayName(), SearchCriteria.Op.LIKE); sb.and("idIN", sb.entity().getId(), 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("hypervisorType", sb.entity().getHypervisorType(), SearchCriteria.Op.EQ); sb.and("hostIdEQ", sb.entity().getHostId(), SearchCriteria.Op.EQ); sb.and("templateId", sb.entity().getTemplateId(), SearchCriteria.Op.EQ); sb.and("isoId", sb.entity().getIsoId(), SearchCriteria.Op.EQ); sb.and("instanceGroupId", sb.entity().getInstanceGroupId(), SearchCriteria.Op.EQ); if (serviceOffId != null) { sb.and("serviceOfferingId", sb.entity().getServiceOfferingId(), SearchCriteria.Op.EQ); } if (display != null) { sb.and("display", sb.entity().isDisplayVm(), SearchCriteria.Op.EQ); } if (groupId != null && (Long)groupId != -1) { sb.and("instanceGroupId", sb.entity().getInstanceGroupId(), SearchCriteria.Op.EQ); } if (networkId != null) { sb.and("networkId", sb.entity().getNetworkId(), SearchCriteria.Op.EQ); } if (vpcId != null && networkId == null) { sb.and("vpcId", sb.entity().getVpcId(), SearchCriteria.Op.EQ); } if (storageId != null) { sb.and("poolId", sb.entity().getPoolId(), SearchCriteria.Op.EQ); } if (affinityGroupId != null) { sb.and("affinityGroupId", sb.entity().getAffinityGroupId(), SearchCriteria.Op.EQ); } if (!isRootAdmin) { sb.and("displayVm", sb.entity().isDisplayVm(), SearchCriteria.Op.EQ); } // populate the search criteria with the values passed in SearchCriteria sc = sb.create(); // building ACL condition _accountMgr.buildACLViewSearchCriteria(sc, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); if (tags != null && !tags.isEmpty()) { SearchCriteria tagSc = _userVmJoinDao.createSearchCriteria(); for (String key : tags.keySet()) { SearchCriteria tsc = _userVmJoinDao.createSearchCriteria(); tsc.addAnd("tagKey", SearchCriteria.Op.EQ, key); tsc.addAnd("tagValue", SearchCriteria.Op.EQ, tags.get(key)); tagSc.addOr("tagKey", SearchCriteria.Op.SC, tsc); } sc.addAnd("tagKey", SearchCriteria.Op.SC, tagSc); } if (groupId != null && (Long)groupId != -1) { sc.setParameters("instanceGroupId", groupId); } if (keyword != null) { SearchCriteria ssc = _userVmJoinDao.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.EQ, keyword); sc.addAnd("displayName", SearchCriteria.Op.SC, ssc); } if (serviceOffId != null) { sc.setParameters("serviceOfferingId", serviceOffId); } if (display != null) { sc.setParameters("display", display); } if (ids != null) { List idList = (ids instanceof List ? (List)ids : null); if (idList != null && !idList.isEmpty()) { sc.setParameters("idIN", idList.toArray()); } } if (templateId != null) { sc.setParameters("templateId", templateId); } if (isoId != null) { sc.setParameters("isoId", isoId); } if (networkId != null) { sc.setParameters("networkId", networkId); } if (vpcId != null && networkId == null) { sc.setParameters("vpcId", vpcId); } if (name != null) { sc.setParameters("name", "%" + name + "%"); } if (state != null) { sc.setParameters("stateEQ", state); } if (hypervisor != null) { sc.setParameters("hypervisorType", hypervisor); } // Don't show Destroyed and Expunging vms to the end user if (!isAdmin) { sc.setParameters("stateNIN", "Destroyed", "Expunging"); } if (zoneId != null) { sc.setParameters("dataCenterId", zoneId); if (state == null) { sc.setParameters("stateNEQ", "Destroyed"); } } if (affinityGroupId != null) { sc.setParameters("affinityGroupId", affinityGroupId); } if (cmd instanceof ListVMsCmdByAdmin) { ListVMsCmdByAdmin aCmd = (ListVMsCmdByAdmin)cmd; if (aCmd.getPodId() != null) { sc.setParameters("podId", pod); if (state == null) { sc.setParameters("stateNEQ", "Destroyed"); } } if (hostId != null) { sc.setParameters("hostIdEQ", hostId); } if (storageId != null) { sc.setParameters("poolId", storageId); } } if (!isRootAdmin) { sc.setParameters("displayVm", 1); } // search vm details by ids Pair, Integer> uniqueVmPair = _userVmJoinDao.searchAndCount(sc, searchFilter); Integer count = uniqueVmPair.second(); if (count.intValue() == 0) { // handle empty result cases return uniqueVmPair; } List uniqueVms = uniqueVmPair.first(); Long[] vmIds = new Long[uniqueVms.size()]; int i = 0; for (UserVmJoinVO v : uniqueVms) { vmIds[i++] = v.getId(); } List vms = _userVmJoinDao.searchByIds(vmIds); return new Pair, Integer>(vms, count); } @Override public ListResponse searchForSecurityGroups(ListSecurityGroupsCmd cmd) { Pair, Integer> result = searchForSecurityGroupsInternal(cmd); ListResponse response = new ListResponse(); List routerResponses = ViewResponseHelper.createSecurityGroupResponses(result.first()); response.setResponses(routerResponses, result.second()); return response; } private Pair, Integer> searchForSecurityGroupsInternal(ListSecurityGroupsCmd cmd) throws PermissionDeniedException, InvalidParameterValueException { Account caller = CallContext.current().getCallingAccount(); Long instanceId = cmd.getVirtualMachineId(); String securityGroup = cmd.getSecurityGroupName(); Long id = cmd.getId(); Object keyword = cmd.getKeyword(); List permittedAccounts = new ArrayList(); Map tags = cmd.getTags(); if (instanceId != null) { UserVmVO userVM = _userVmDao.findById(instanceId); if (userVM == null) { throw new InvalidParameterValueException("Unable to list network groups for virtual machine instance " + instanceId + "; instance not found."); } _accountMgr.checkAccess(caller, null, true, userVM); return listSecurityGroupRulesByVM(instanceId.longValue(), cmd.getStartIndex(), cmd.getPageSizeVal()); } Ternary 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(); Boolean isRecursive = domainIdRecursiveListProject.second(); ListProjectResourcesCriteria listProjectResourcesCriteria = domainIdRecursiveListProject.third(); Filter searchFilter = new Filter(SecurityGroupJoinVO.class, "id", true, cmd.getStartIndex(), cmd.getPageSizeVal()); SearchBuilder sb = _securityGroupJoinDao.createSearchBuilder(); sb.select(null, Func.DISTINCT, sb.entity().getId()); // select distinct // ids _accountMgr.buildACLViewSearchBuilder(sb, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ); sb.and("name", sb.entity().getName(), SearchCriteria.Op.EQ); SearchCriteria sc = sb.create(); _accountMgr.buildACLViewSearchCriteria(sc, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); if (id != null) { sc.setParameters("id", id); } if (tags != null && !tags.isEmpty()) { SearchCriteria tagSc = _securityGroupJoinDao.createSearchCriteria(); for (String key : tags.keySet()) { SearchCriteria tsc = _securityGroupJoinDao.createSearchCriteria(); tsc.addAnd("tagKey", SearchCriteria.Op.EQ, key); tsc.addAnd("tagValue", SearchCriteria.Op.EQ, tags.get(key)); tagSc.addOr("tagKey", SearchCriteria.Op.SC, tsc); } sc.addAnd("tagKey", SearchCriteria.Op.SC, tagSc); } if (securityGroup != null) { sc.setParameters("name", securityGroup); } if (keyword != null) { SearchCriteria ssc = _securityGroupJoinDao.createSearchCriteria(); ssc.addOr("name", SearchCriteria.Op.LIKE, "%" + keyword + "%"); ssc.addOr("description", SearchCriteria.Op.LIKE, "%" + keyword + "%"); sc.addAnd("name", SearchCriteria.Op.SC, ssc); } // search security group together with rules Pair, Integer> uniqueSgPair = _securityGroupJoinDao.searchAndCount(sc, searchFilter); Integer count = uniqueSgPair.second(); if (count.intValue() == 0) { // handle empty result cases return uniqueSgPair; } List uniqueSgs = uniqueSgPair.first(); Long[] sgIds = new Long[uniqueSgs.size()]; int i = 0; for (SecurityGroupJoinVO v : uniqueSgs) { sgIds[i++] = v.getId(); } List sgs = _securityGroupJoinDao.searchByIds(sgIds); return new Pair, Integer>(sgs, count); } private Pair, Integer> listSecurityGroupRulesByVM(long vmId, long pageInd, long pageSize) { Filter sf = new Filter(SecurityGroupVMMapVO.class, null, true, pageInd, pageSize); Pair, Integer> sgVmMappingPair = _securityGroupVMMapDao.listByInstanceId(vmId, sf); Integer count = sgVmMappingPair.second(); if (count.intValue() == 0) { // handle empty result cases return new Pair, Integer>(new ArrayList(), count); } List sgVmMappings = sgVmMappingPair.first(); Long[] sgIds = new Long[sgVmMappings.size()]; int i = 0; for (SecurityGroupVMMapVO sgVm : sgVmMappings) { sgIds[i++] = sgVm.getSecurityGroupId(); } List sgs = _securityGroupJoinDao.searchByIds(sgIds); return new Pair, Integer>(sgs, count); } @Override public ListResponse searchForRouters(ListRoutersCmd cmd) { Pair, Integer> result = searchForRoutersInternal(cmd, cmd.getId(), cmd.getRouterName(), cmd.getState(), cmd.getZoneId(), cmd.getPodId(), cmd.getClusterId(), cmd.getHostId(), cmd.getKeyword(), cmd.getNetworkId(), cmd.getVpcId(), cmd.getForVpc(), cmd.getRole(), cmd.getVersion()); ListResponse response = new ListResponse(); List routerResponses = ViewResponseHelper.createDomainRouterResponse(result.first().toArray(new DomainRouterJoinVO[result.first().size()])); response.setResponses(routerResponses, result.second()); return response; } @Override public ListResponse searchForInternalLbVms(ListInternalLBVMsCmd cmd) { Pair, Integer> result = searchForRoutersInternal(cmd, cmd.getId(), cmd.getRouterName(), cmd.getState(), cmd.getZoneId(), cmd.getPodId(), null, cmd.getHostId(), cmd.getKeyword(), cmd.getNetworkId(), cmd.getVpcId(), cmd.getForVpc(), cmd.getRole(), null); ListResponse response = new ListResponse(); List routerResponses = ViewResponseHelper.createDomainRouterResponse(result.first().toArray(new DomainRouterJoinVO[result.first().size()])); response.setResponses(routerResponses, result.second()); return response; } private Pair, Integer> searchForRoutersInternal(BaseListProjectAndAccountResourcesCmd cmd, Long id, String name, String state, Long zoneId, Long podId, Long clusterId, Long hostId, String keyword, Long networkId, Long vpcId, Boolean forVpc, String role, String version) { Account caller = CallContext.current().getCallingAccount(); List permittedAccounts = new ArrayList(); Ternary 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(); Boolean isRecursive = domainIdRecursiveListProject.second(); ListProjectResourcesCriteria listProjectResourcesCriteria = domainIdRecursiveListProject.third(); Filter searchFilter = new Filter(DomainRouterJoinVO.class, "id", true, cmd.getStartIndex(), cmd.getPageSizeVal()); SearchBuilder sb = _routerJoinDao.createSearchBuilder(); sb.select(null, Func.DISTINCT, sb.entity().getId()); // select distinct // ids to get // number of // records with // pagination _accountMgr.buildACLViewSearchBuilder(sb, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); sb.and("name", sb.entity().getInstanceName(), SearchCriteria.Op.LIKE); sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ); sb.and("accountId", sb.entity().getAccountId(), SearchCriteria.Op.IN); sb.and("state", sb.entity().getState(), SearchCriteria.Op.EQ); sb.and("dataCenterId", sb.entity().getDataCenterId(), SearchCriteria.Op.EQ); sb.and("podId", sb.entity().getPodId(), SearchCriteria.Op.EQ); sb.and("clusterId", sb.entity().getClusterId(), SearchCriteria.Op.EQ); sb.and("hostId", sb.entity().getHostId(), SearchCriteria.Op.EQ); sb.and("vpcId", sb.entity().getVpcId(), SearchCriteria.Op.EQ); sb.and("role", sb.entity().getRole(), SearchCriteria.Op.EQ); sb.and("version", sb.entity().getTemplateVersion(), SearchCriteria.Op.LIKE); if (forVpc != null) { if (forVpc) { sb.and("forVpc", sb.entity().getVpcId(), SearchCriteria.Op.NNULL); } else { sb.and("forVpc", sb.entity().getVpcId(), SearchCriteria.Op.NULL); } } if (networkId != null) { sb.and("networkId", sb.entity().getNetworkId(), SearchCriteria.Op.EQ); } SearchCriteria sc = sb.create(); _accountMgr.buildACLViewSearchCriteria(sc, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); if (keyword != null) { SearchCriteria ssc = _routerJoinDao.createSearchCriteria(); ssc.addOr("name", SearchCriteria.Op.LIKE, "%" + keyword + "%"); ssc.addOr("instanceName", SearchCriteria.Op.LIKE, "%" + keyword + "%"); ssc.addOr("state", SearchCriteria.Op.LIKE, "%" + keyword + "%"); ssc.addOr("networkName", SearchCriteria.Op.LIKE, "%" + keyword + "%"); sc.addAnd("instanceName", SearchCriteria.Op.SC, ssc); } if (name != null) { sc.setParameters("name", "%" + name + "%"); } if (id != null) { sc.setParameters("id", id); } if (state != null) { sc.setParameters("state", state); } if (zoneId != null) { sc.setParameters("dataCenterId", zoneId); } if (podId != null) { sc.setParameters("podId", podId); } if (clusterId != null) { sc.setParameters("clusterId", clusterId); } if (hostId != null) { sc.setParameters("hostId", hostId); } if (networkId != null) { sc.setParameters("networkId", networkId); } if (vpcId != null) { sc.setParameters("vpcId", vpcId); } if (role != null) { sc.setParameters("role", role); } if (version != null) { sc.setParameters("version", "Cloudstack Release " + version + "%"); } // search VR details by ids Pair, Integer> uniqueVrPair = _routerJoinDao.searchAndCount(sc, searchFilter); Integer count = uniqueVrPair.second(); if (count.intValue() == 0) { // empty result return uniqueVrPair; } List uniqueVrs = uniqueVrPair.first(); Long[] vrIds = new Long[uniqueVrs.size()]; int i = 0; for (DomainRouterJoinVO v : uniqueVrs) { vrIds[i++] = v.getId(); } List vrs = _routerJoinDao.searchByIds(vrIds); return new Pair, Integer>(vrs, count); } @Override public ListResponse listProjects(ListProjectsCmd cmd) { Pair, Integer> projects = listProjectsInternal(cmd); ListResponse response = new ListResponse(); List projectResponses = ViewResponseHelper.createProjectResponse(projects.first().toArray(new ProjectJoinVO[projects.first().size()])); response.setResponses(projectResponses, projects.second()); return response; } private Pair, Integer> listProjectsInternal(ListProjectsCmd cmd) { Long id = cmd.getId(); String name = cmd.getName(); String displayText = cmd.getDisplayText(); String state = cmd.getState(); String accountName = cmd.getAccountName(); Long domainId = cmd.getDomainId(); String keyword = cmd.getKeyword(); Long startIndex = cmd.getStartIndex(); Long pageSize = cmd.getPageSizeVal(); boolean listAll = cmd.listAll(); boolean isRecursive = cmd.isRecursive(); cmd.getTags(); Account caller = CallContext.current().getCallingAccount(); Long accountId = null; String path = null; Filter searchFilter = new Filter(ProjectJoinVO.class, "id", false, startIndex, pageSize); SearchBuilder sb = _projectJoinDao.createSearchBuilder(); sb.select(null, Func.DISTINCT, sb.entity().getId()); // select distinct // ids if (_accountMgr.isAdmin(caller.getId())) { if (domainId != null) { DomainVO domain = _domainDao.findById(domainId); if (domain == null) { throw new InvalidParameterValueException("Domain id=" + domainId + " doesn't exist in the system"); } _accountMgr.checkAccess(caller, domain); if (accountName != null) { Account owner = _accountMgr.getActiveAccountByName(accountName, domainId); if (owner == null) { throw new InvalidParameterValueException("Unable to find account " + accountName + " in domain " + domainId); } accountId = owner.getId(); } } else { // domainId == null if (accountName != null) { throw new InvalidParameterValueException("could not find account " + accountName + " because domain is not specified"); } } } else { if (accountName != null && !accountName.equals(caller.getAccountName())) { throw new PermissionDeniedException("Can't list account " + accountName + " projects; unauthorized"); } if (domainId != null && domainId.equals(caller.getDomainId())) { throw new PermissionDeniedException("Can't list domain id= " + domainId + " projects; unauthorized"); } accountId = caller.getId(); } if (domainId == null && accountId == null && (_accountMgr.isNormalUser(caller.getId()) || !listAll)) { accountId = caller.getId(); } else if (_accountMgr.isDomainAdmin(caller.getId()) || (isRecursive && !listAll)) { DomainVO domain = _domainDao.findById(caller.getDomainId()); path = domain.getPath(); } if (path != null) { sb.and("domainPath", sb.entity().getDomainPath(), SearchCriteria.Op.LIKE); } if (accountId != null) { sb.and("accountId", sb.entity().getAccountId(), SearchCriteria.Op.EQ); } SearchCriteria sc = sb.create(); if (id != null) { sc.addAnd("id", Op.EQ, id); } if (domainId != null && !isRecursive) { sc.addAnd("domainId", Op.EQ, domainId); } if (name != null) { sc.addAnd("name", Op.EQ, name); } if (displayText != null) { sc.addAnd("displayText", Op.EQ, displayText); } if (accountId != null) { sc.setParameters("accountId", accountId); } if (state != null) { sc.addAnd("state", Op.EQ, state); } if (keyword != null) { SearchCriteria ssc = _projectJoinDao.createSearchCriteria(); ssc.addOr("name", SearchCriteria.Op.LIKE, "%" + keyword + "%"); ssc.addOr("displayText", SearchCriteria.Op.LIKE, "%" + keyword + "%"); sc.addAnd("name", SearchCriteria.Op.SC, ssc); } if (path != null) { sc.setParameters("domainPath", path); } // search distinct projects to get count Pair, Integer> uniquePrjPair = _projectJoinDao.searchAndCount(sc, searchFilter); Integer count = uniquePrjPair.second(); if (count.intValue() == 0) { // handle empty result cases return uniquePrjPair; } List uniquePrjs = uniquePrjPair.first(); Long[] prjIds = new Long[uniquePrjs.size()]; int i = 0; for (ProjectJoinVO v : uniquePrjs) { prjIds[i++] = v.getId(); } List prjs = _projectJoinDao.searchByIds(prjIds); return new Pair, Integer>(prjs, count); } @Override public ListResponse listProjectInvitations(ListProjectInvitationsCmd cmd) { Pair, Integer> invites = listProjectInvitationsInternal(cmd); ListResponse response = new ListResponse(); List projectInvitationResponses = ViewResponseHelper.createProjectInvitationResponse(invites.first().toArray(new ProjectInvitationJoinVO[invites.first().size()])); response.setResponses(projectInvitationResponses, invites.second()); return response; } public Pair, Integer> listProjectInvitationsInternal(ListProjectInvitationsCmd cmd) { Long id = cmd.getId(); Long projectId = cmd.getProjectId(); String accountName = cmd.getAccountName(); Long domainId = cmd.getDomainId(); String state = cmd.getState(); boolean activeOnly = cmd.isActiveOnly(); Long startIndex = cmd.getStartIndex(); Long pageSizeVal = cmd.getPageSizeVal(); boolean isRecursive = cmd.isRecursive(); boolean listAll = cmd.listAll(); Account caller = CallContext.current().getCallingAccount(); List permittedAccounts = new ArrayList(); Ternary domainIdRecursiveListProject = new Ternary( domainId, isRecursive, null); _accountMgr.buildACLSearchParameters(caller, id, accountName, projectId, permittedAccounts, domainIdRecursiveListProject, listAll, true); domainId = domainIdRecursiveListProject.first(); isRecursive = domainIdRecursiveListProject.second(); ListProjectResourcesCriteria listProjectResourcesCriteria = domainIdRecursiveListProject.third(); Filter searchFilter = new Filter(ProjectInvitationJoinVO.class, "id", true, startIndex, pageSizeVal); SearchBuilder sb = _projectInvitationJoinDao.createSearchBuilder(); _accountMgr.buildACLViewSearchBuilder(sb, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); sb.and("projectId", sb.entity().getProjectId(), SearchCriteria.Op.EQ); sb.and("state", sb.entity().getState(), SearchCriteria.Op.EQ); sb.and("created", sb.entity().getCreated(), SearchCriteria.Op.GT); sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ); SearchCriteria sc = sb.create(); _accountMgr.buildACLViewSearchCriteria(sc, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); if (projectId != null) { sc.setParameters("projectId", projectId); } if (state != null) { sc.setParameters("state", state); } if (id != null) { sc.setParameters("id", id); } if (activeOnly) { sc.setParameters("state", ProjectInvitation.State.Pending); sc.setParameters("created", new Date((DateUtil.currentGMTTime().getTime()) - _projectMgr.getInvitationTimeout())); } return _projectInvitationJoinDao.searchAndCount(sc, searchFilter); } @Override public ListResponse listProjectAccounts(ListProjectAccountsCmd cmd) { Pair, Integer> projectAccounts = listProjectAccountsInternal(cmd); ListResponse response = new ListResponse(); List projectResponses = ViewResponseHelper.createProjectAccountResponse(projectAccounts.first().toArray(new ProjectAccountJoinVO[projectAccounts.first().size()])); response.setResponses(projectResponses, projectAccounts.second()); return response; } public Pair, Integer> listProjectAccountsInternal(ListProjectAccountsCmd cmd) { long projectId = cmd.getProjectId(); String accountName = cmd.getAccountName(); String role = cmd.getRole(); Long startIndex = cmd.getStartIndex(); Long pageSizeVal = cmd.getPageSizeVal(); // long projectId, String accountName, String role, Long startIndex, // Long pageSizeVal) { Account caller = CallContext.current().getCallingAccount(); // check that the project exists Project project = _projectDao.findById(projectId); if (project == null) { throw new InvalidParameterValueException("Unable to find the project id=" + projectId); } // verify permissions - only accounts belonging to the project can list // project's account if (!_accountMgr.isAdmin(caller.getId()) && _projectAccountDao.findByProjectIdAccountId(projectId, caller.getAccountId()) == null) { throw new PermissionDeniedException("Account " + caller + " is not authorized to list users of the project id=" + projectId); } Filter searchFilter = new Filter(ProjectAccountJoinVO.class, "id", false, startIndex, pageSizeVal); SearchBuilder sb = _projectAccountJoinDao.createSearchBuilder(); sb.and("accountRole", sb.entity().getAccountRole(), Op.EQ); sb.and("projectId", sb.entity().getProjectId(), Op.EQ); if (accountName != null) { sb.and("accountName", sb.entity().getAccountName(), Op.EQ); } SearchCriteria sc = sb.create(); sc.setParameters("projectId", projectId); if (role != null) { sc.setParameters("accountRole", role); } if (accountName != null) { sc.setParameters("accountName", accountName); } return _projectAccountJoinDao.searchAndCount(sc, searchFilter); } @Override public ListResponse searchForServers(ListHostsCmd cmd) { // FIXME: do we need to support list hosts with VmId, maybe we should // create another command just for this // Right now it is handled separately outside this QueryService s_logger.debug(">>>Searching for hosts>>>"); Pair, Integer> hosts = searchForServersInternal(cmd); ListResponse response = new ListResponse(); s_logger.debug(">>>Generating Response>>>"); List hostResponses = ViewResponseHelper.createHostResponse(cmd.getDetails(), hosts.first().toArray(new HostJoinVO[hosts.first().size()])); response.setResponses(hostResponses, hosts.second()); return response; } public Pair, Integer> searchForServersInternal(ListHostsCmd cmd) { Long zoneId = _accountMgr.checkAccessAndSpecifyAuthority(CallContext.current().getCallingAccount(), cmd.getZoneId()); Object name = cmd.getHostName(); Object type = cmd.getType(); Object state = cmd.getState(); Object pod = cmd.getPodId(); Object cluster = cmd.getClusterId(); Object id = cmd.getId(); Object keyword = cmd.getKeyword(); Object resourceState = cmd.getResourceState(); Object haHosts = cmd.getHaHost(); Long startIndex = cmd.getStartIndex(); Long pageSize = cmd.getPageSizeVal(); Hypervisor.HypervisorType hypervisorType = cmd.getHypervisor(); Filter searchFilter = new Filter(HostJoinVO.class, "id", Boolean.TRUE, startIndex, pageSize); SearchBuilder sb = _hostJoinDao.createSearchBuilder(); sb.select(null, Func.DISTINCT, sb.entity().getId()); // select distinct // ids sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ); sb.and("name", sb.entity().getName(), SearchCriteria.Op.LIKE); sb.and("type", sb.entity().getType(), SearchCriteria.Op.LIKE); sb.and("status", sb.entity().getStatus(), SearchCriteria.Op.EQ); sb.and("dataCenterId", sb.entity().getZoneId(), SearchCriteria.Op.EQ); sb.and("podId", sb.entity().getPodId(), SearchCriteria.Op.EQ); sb.and("clusterId", sb.entity().getClusterId(), SearchCriteria.Op.EQ); sb.and("resourceState", sb.entity().getResourceState(), SearchCriteria.Op.EQ); sb.and("hypervisor_type", sb.entity().getHypervisorType(), SearchCriteria.Op.EQ); String haTag = _haMgr.getHaTag(); if (haHosts != null && haTag != null && !haTag.isEmpty()) { if ((Boolean)haHosts) { sb.and("tag", sb.entity().getTag(), SearchCriteria.Op.EQ); } else { sb.and().op("tag", sb.entity().getTag(), SearchCriteria.Op.NEQ); sb.or("tagNull", sb.entity().getTag(), SearchCriteria.Op.NULL); sb.cp(); } } SearchCriteria sc = sb.create(); if (keyword != null) { SearchCriteria ssc = _hostJoinDao.createSearchCriteria(); ssc.addOr("name", SearchCriteria.Op.LIKE, "%" + keyword + "%"); ssc.addOr("status", SearchCriteria.Op.LIKE, "%" + keyword + "%"); ssc.addOr("type", SearchCriteria.Op.LIKE, "%" + keyword + "%"); sc.addAnd("name", SearchCriteria.Op.SC, ssc); } if (id != null) { sc.setParameters("id", id); } if (name != null) { sc.setParameters("name", "%" + name + "%"); } if (type != null) { sc.setParameters("type", "%" + type); } if (state != null) { sc.setParameters("status", state); } if (zoneId != null) { sc.setParameters("dataCenterId", zoneId); } if (pod != null) { sc.setParameters("podId", pod); } if (cluster != null) { sc.setParameters("clusterId", cluster); } if (resourceState != null) { sc.setParameters("resourceState", resourceState); } if (haHosts != null && haTag != null && !haTag.isEmpty()) { sc.setParameters("tag", haTag); } if (hypervisorType != HypervisorType.None && hypervisorType != HypervisorType.Any) { sc.setParameters("hypervisor_type", hypervisorType); } // search host details by ids Pair, Integer> uniqueHostPair = _hostJoinDao.searchAndCount(sc, searchFilter); Integer count = uniqueHostPair.second(); if (count.intValue() == 0) { // handle empty result cases return uniqueHostPair; } List uniqueHosts = uniqueHostPair.first(); Long[] hostIds = new Long[uniqueHosts.size()]; int i = 0; for (HostJoinVO v : uniqueHosts) { hostIds[i++] = v.getId(); } List hosts = _hostJoinDao.searchByIds(hostIds); return new Pair, Integer>(hosts, count); } @Override public ListResponse searchForVolumes(ListVolumesCmd cmd) { Pair, Integer> result = searchForVolumesInternal(cmd); ListResponse response = new ListResponse(); ResponseView respView = ResponseView.Restricted; if (cmd instanceof ListVolumesCmdByAdmin) { respView = ResponseView.Full; } List volumeResponses = ViewResponseHelper.createVolumeResponse(respView, result.first().toArray( new VolumeJoinVO[result.first().size()])); for(VolumeResponse vr : volumeResponses) { String poolId = vr.getStoragePoolId(); if (poolId == null) { continue; } DataStore store = dataStoreManager.getPrimaryDataStore(poolId); if (store == null) { continue; } DataStoreDriver driver = store.getDriver(); if (driver == null) { continue; } Map caps = driver.getCapabilities(); if (caps != null) { boolean quiescevm = Boolean.parseBoolean(caps.get(DataStoreCapabilities.VOLUME_SNAPSHOT_QUIESCEVM.toString())); vr.setNeedQuiescevm(quiescevm); } } response.setResponses(volumeResponses, result.second()); return response; } private Pair, Integer> searchForVolumesInternal(ListVolumesCmd cmd) { Account caller = CallContext.current().getCallingAccount(); List permittedAccounts = new ArrayList(); Long id = cmd.getId(); Long vmInstanceId = cmd.getVirtualMachineId(); String name = cmd.getVolumeName(); String keyword = cmd.getKeyword(); String type = cmd.getType(); Map tags = cmd.getTags(); Long storageId = cmd.getStorageId(); Long diskOffId = cmd.getDiskOfferingId(); Boolean display = cmd.getDisplay(); Long zoneId = cmd.getZoneId(); Long podId = cmd.getPodId(); Ternary 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(); 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 // opted to // do this quickly and worry about making it pretty later SearchBuilder sb = _volumeJoinDao.createSearchBuilder(); sb.select(null, Func.DISTINCT, sb.entity().getId()); // select distinct // ids to get // number of // records with // pagination _accountMgr.buildACLViewSearchBuilder(sb, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); sb.and("name", sb.entity().getName(), SearchCriteria.Op.EQ); sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ); sb.and("volumeType", sb.entity().getVolumeType(), SearchCriteria.Op.LIKE); sb.and("instanceId", sb.entity().getVmId(), SearchCriteria.Op.EQ); sb.and("dataCenterId", sb.entity().getDataCenterId(), SearchCriteria.Op.EQ); sb.and("podId", sb.entity().getPodId(), SearchCriteria.Op.EQ); sb.and("storageId", sb.entity().getPoolId(), SearchCriteria.Op.EQ); sb.and("diskOfferingId", sb.entity().getDiskOfferingId(), SearchCriteria.Op.EQ); sb.and("display", sb.entity().isDisplayVolume(), SearchCriteria.Op.EQ); // Only return volumes that are not destroyed sb.and("state", sb.entity().getState(), SearchCriteria.Op.NEQ); sb.and("systemUse", sb.entity().isSystemUse(), SearchCriteria.Op.NEQ); // display UserVM volumes only sb.and().op("type", sb.entity().getVmType(), SearchCriteria.Op.NIN); sb.or("nulltype", sb.entity().getVmType(), SearchCriteria.Op.NULL); if (!(cmd instanceof ListVolumesCmdByAdmin)) { sb.and("displayVolume", sb.entity().isDisplayVolume(), SearchCriteria.Op.EQ); } sb.cp(); // now set the SC criteria... SearchCriteria sc = sb.create(); _accountMgr.buildACLViewSearchCriteria(sc, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); if (keyword != null) { SearchCriteria ssc = _volumeJoinDao.createSearchCriteria(); ssc.addOr("name", SearchCriteria.Op.LIKE, "%" + keyword + "%"); ssc.addOr("volumeType", SearchCriteria.Op.LIKE, "%" + keyword + "%"); sc.addAnd("name", SearchCriteria.Op.SC, ssc); } if (name != null) { sc.setParameters("name", name); } if (display != null) { sc.setParameters("displayVolume", display); } sc.setParameters("systemUse", 1); if (tags != null && !tags.isEmpty()) { SearchCriteria tagSc = _volumeJoinDao.createSearchCriteria(); for (String key : tags.keySet()) { SearchCriteria tsc = _volumeJoinDao.createSearchCriteria(); tsc.addAnd("tagKey", SearchCriteria.Op.EQ, key); tsc.addAnd("tagValue", SearchCriteria.Op.EQ, tags.get(key)); tagSc.addOr("tagKey", SearchCriteria.Op.SC, tsc); } sc.addAnd("tagKey", SearchCriteria.Op.SC, tagSc); } if (diskOffId != null) { sc.setParameters("diskOfferingId", diskOffId); } if (id != null) { sc.setParameters("id", id); } if (type != null) { sc.setParameters("volumeType", "%" + type + "%"); } if (vmInstanceId != null) { sc.setParameters("instanceId", vmInstanceId); } if (zoneId != null) { sc.setParameters("dataCenterId", zoneId); } if (podId != null) { sc.setParameters("podId", podId); } if (storageId != null) { sc.setParameters("storageId", storageId); } if (!(cmd instanceof ListVolumesCmdByAdmin)) { sc.setParameters("displayVolume", 1); } // Don't return DomR and ConsoleProxy volumes sc.setParameters("type", VirtualMachine.Type.ConsoleProxy, VirtualMachine.Type.SecondaryStorageVm, VirtualMachine.Type.DomainRouter); // Only return volumes that are not destroyed sc.setParameters("state", Volume.State.Destroy); // search Volume details by ids Pair, Integer> uniqueVolPair = _volumeJoinDao.searchAndCount(sc, searchFilter); Integer count = uniqueVolPair.second(); if (count.intValue() == 0) { // empty result return uniqueVolPair; } List uniqueVols = uniqueVolPair.first(); Long[] vrIds = new Long[uniqueVols.size()]; int i = 0; for (VolumeJoinVO v : uniqueVols) { vrIds[i++] = v.getId(); } List vrs = _volumeJoinDao.searchByIds(vrIds); return new Pair, Integer>(vrs, count); } @Override public ListResponse searchForAccounts(ListAccountsCmd cmd) { Pair, Integer> result = searchForAccountsInternal(cmd); ListResponse response = new ListResponse(); ResponseView respView = ResponseView.Restricted; if (cmd instanceof ListAccountsCmdByAdmin) { respView = ResponseView.Full; } List accountResponses = ViewResponseHelper.createAccountResponse(respView, result.first().toArray( new AccountJoinVO[result.first().size()])); response.setResponses(accountResponses, result.second()); return response; } private Pair, Integer> searchForAccountsInternal(ListAccountsCmd cmd) { Account caller = CallContext.current().getCallingAccount(); Long domainId = cmd.getDomainId(); Long accountId = cmd.getId(); String accountName = cmd.getSearchName(); boolean isRecursive = cmd.isRecursive(); boolean listAll = cmd.listAll(); Boolean listForDomain = false; if (accountId != null) { Account account = _accountDao.findById(accountId); if (account == null || account.getId() == Account.ACCOUNT_ID_SYSTEM) { throw new InvalidParameterValueException("Unable to find account by id " + accountId); } _accountMgr.checkAccess(caller, null, true, account); } if (domainId != null) { Domain domain = _domainDao.findById(domainId); if (domain == null) { throw new InvalidParameterValueException("Domain id=" + domainId + " doesn't exist"); } _accountMgr.checkAccess(caller, domain); if (accountName != null) { Account account = _accountDao.findActiveAccount(accountName, domainId); if (account == null || account.getId() == Account.ACCOUNT_ID_SYSTEM) { throw new InvalidParameterValueException("Unable to find account by name " + accountName + " in domain " + domainId); } _accountMgr.checkAccess(caller, null, true, account); } } if (accountId == null) { if (_accountMgr.isAdmin(caller.getId()) && listAll && domainId == null) { listForDomain = true; isRecursive = true; if (domainId == null) { domainId = caller.getDomainId(); } } else if (_accountMgr.isAdmin(caller.getId()) && domainId != null) { listForDomain = true; } else { accountId = caller.getAccountId(); } } Filter searchFilter = new Filter(AccountJoinVO.class, "id", true, cmd.getStartIndex(), cmd.getPageSizeVal()); Object type = cmd.getAccountType(); Object state = cmd.getState(); Object isCleanupRequired = cmd.isCleanupRequired(); Object keyword = cmd.getKeyword(); SearchBuilder sb = _accountJoinDao.createSearchBuilder(); sb.and("accountName", sb.entity().getAccountName(), SearchCriteria.Op.EQ); sb.and("domainId", sb.entity().getDomainId(), SearchCriteria.Op.EQ); sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ); sb.and("type", sb.entity().getType(), SearchCriteria.Op.EQ); sb.and("state", sb.entity().getState(), SearchCriteria.Op.EQ); sb.and("needsCleanup", sb.entity().isNeedsCleanup(), SearchCriteria.Op.EQ); sb.and("typeNEQ", sb.entity().getType(), SearchCriteria.Op.NEQ); sb.and("idNEQ", sb.entity().getId(), SearchCriteria.Op.NEQ); if (listForDomain && isRecursive) { sb.and("path", sb.entity().getDomainPath(), SearchCriteria.Op.LIKE); } SearchCriteria sc = sb.create(); sc.setParameters("idNEQ", Account.ACCOUNT_ID_SYSTEM); if (keyword != null) { SearchCriteria ssc = _accountJoinDao.createSearchCriteria(); ssc.addOr("accountName", SearchCriteria.Op.LIKE, "%" + keyword + "%"); ssc.addOr("state", SearchCriteria.Op.LIKE, "%" + keyword + "%"); sc.addAnd("accountName", SearchCriteria.Op.SC, ssc); } if (type != null) { sc.setParameters("type", type); } if (state != null) { sc.setParameters("state", state); } if (isCleanupRequired != null) { sc.setParameters("needsCleanup", isCleanupRequired); } if (accountName != null) { sc.setParameters("accountName", accountName); } // don't return account of type project to the end user sc.setParameters("typeNEQ", 5); if (accountId != null) { sc.setParameters("id", accountId); } if (listForDomain) { if (isRecursive) { Domain domain = _domainDao.findById(domainId); sc.setParameters("path", domain.getPath() + "%"); } else { sc.setParameters("domainId", domainId); } } return _accountJoinDao.searchAndCount(sc, searchFilter); } @Override public ListResponse searchForAsyncJobs(ListAsyncJobsCmd cmd) { Pair, Integer> result = searchForAsyncJobsInternal(cmd); ListResponse response = new ListResponse(); List jobResponses = ViewResponseHelper.createAsyncJobResponse(result.first().toArray(new AsyncJobJoinVO[result.first().size()])); response.setResponses(jobResponses, result.second()); return response; } private Pair, Integer> searchForAsyncJobsInternal(ListAsyncJobsCmd cmd) { Account caller = CallContext.current().getCallingAccount(); List permittedAccounts = new ArrayList(); Ternary domainIdRecursiveListProject = new Ternary( cmd.getDomainId(), cmd.isRecursive(), null); _accountMgr.buildACLSearchParameters(caller, null, cmd.getAccountName(), null, permittedAccounts, domainIdRecursiveListProject, cmd.listAll(), false); Long domainId = domainIdRecursiveListProject.first(); Boolean isRecursive = domainIdRecursiveListProject.second(); ListProjectResourcesCriteria listProjectResourcesCriteria = domainIdRecursiveListProject.third(); Filter searchFilter = new Filter(AsyncJobJoinVO.class, "id", true, cmd.getStartIndex(), cmd.getPageSizeVal()); SearchBuilder sb = _jobJoinDao.createSearchBuilder(); sb.and("accountIdIN", sb.entity().getAccountId(), SearchCriteria.Op.IN); boolean accountJoinIsDone = false; if (permittedAccounts.isEmpty() && domainId != null) { sb.and("domainId", sb.entity().getDomainId(), SearchCriteria.Op.EQ); sb.and("path", sb.entity().getDomainPath(), SearchCriteria.Op.LIKE); accountJoinIsDone = true; } if (listProjectResourcesCriteria != null) { if (listProjectResourcesCriteria == Project.ListProjectResourcesCriteria.ListProjectResourcesOnly) { sb.and("type", sb.entity().getAccountType(), SearchCriteria.Op.EQ); } else if (listProjectResourcesCriteria == Project.ListProjectResourcesCriteria.SkipProjectResources) { sb.and("type", sb.entity().getAccountType(), SearchCriteria.Op.NEQ); } if (!accountJoinIsDone) { sb.and("domainId", sb.entity().getDomainId(), SearchCriteria.Op.EQ); sb.and("path", sb.entity().getDomainPath(), SearchCriteria.Op.LIKE); } } Object keyword = cmd.getKeyword(); Object startDate = cmd.getStartDate(); SearchCriteria sc = sb.create(); if (listProjectResourcesCriteria != null) { sc.setParameters("type", Account.ACCOUNT_TYPE_PROJECT); } if (!permittedAccounts.isEmpty()) { sc.setParameters("accountIdIN", permittedAccounts.toArray()); } else if (domainId != null) { DomainVO domain = _domainDao.findById(domainId); if (isRecursive) { sc.setParameters("path", domain.getPath() + "%"); } else { sc.setParameters("domainId", domainId); } } if (keyword != null) { sc.addAnd("cmd", SearchCriteria.Op.LIKE, "%" + keyword + "%"); } if (startDate != null) { sc.addAnd("created", SearchCriteria.Op.GTEQ, startDate); } return _jobJoinDao.searchAndCount(sc, searchFilter); } @Override public ListResponse searchForStoragePools(ListStoragePoolsCmd cmd) { Pair, Integer> result = searchForStoragePoolsInternal(cmd); ListResponse response = new ListResponse(); List poolResponses = ViewResponseHelper.createStoragePoolResponse(result.first().toArray(new StoragePoolJoinVO[result.first().size()])); for (StoragePoolResponse poolResponse : poolResponses) { DataStore store = dataStoreManager.getPrimaryDataStore(poolResponse.getId()); if (store != null) { DataStoreDriver driver = store.getDriver(); if (driver != null && driver.getCapabilities() != null) { poolResponse.setCaps(driver.getCapabilities()); } } } response.setResponses(poolResponses, result.second()); return response; } private Pair, Integer> searchForStoragePoolsInternal(ListStoragePoolsCmd cmd) { ScopeType scopeType = null; if (cmd.getScope() != null) { try { scopeType = Enum.valueOf(ScopeType.class, cmd.getScope().toUpperCase()); } catch (Exception e) { throw new InvalidParameterValueException("Invalid scope type: " + cmd.getScope()); } } Long zoneId = _accountMgr.checkAccessAndSpecifyAuthority(CallContext.current().getCallingAccount(), cmd.getZoneId()); Object id = cmd.getId(); Object name = cmd.getStoragePoolName(); Object path = cmd.getPath(); Object pod = cmd.getPodId(); Object cluster = cmd.getClusterId(); Object address = cmd.getIpAddress(); Object keyword = cmd.getKeyword(); Long startIndex = cmd.getStartIndex(); Long pageSize = cmd.getPageSizeVal(); Filter searchFilter = new Filter(StoragePoolJoinVO.class, "id", Boolean.TRUE, startIndex, pageSize); SearchBuilder sb = _poolJoinDao.createSearchBuilder(); sb.select(null, Func.DISTINCT, sb.entity().getId()); // select distinct // ids sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ); sb.and("name", sb.entity().getName(), SearchCriteria.Op.EQ); sb.and("path", sb.entity().getPath(), SearchCriteria.Op.EQ); sb.and("dataCenterId", sb.entity().getZoneId(), SearchCriteria.Op.EQ); sb.and("podId", sb.entity().getPodId(), SearchCriteria.Op.EQ); sb.and("clusterId", sb.entity().getClusterId(), SearchCriteria.Op.EQ); sb.and("hostAddress", sb.entity().getHostAddress(), SearchCriteria.Op.EQ); sb.and("scope", sb.entity().getScope(), SearchCriteria.Op.EQ); SearchCriteria sc = sb.create(); if (keyword != null) { SearchCriteria ssc = _poolJoinDao.createSearchCriteria(); ssc.addOr("name", SearchCriteria.Op.LIKE, "%" + keyword + "%"); ssc.addOr("poolType", SearchCriteria.Op.LIKE, "%" + keyword + "%"); sc.addAnd("name", SearchCriteria.Op.SC, ssc); } if (id != null) { sc.setParameters("id", id); } if (name != null) { sc.setParameters("name", name); } if (path != null) { sc.setParameters("path", path); } if (zoneId != null) { sc.setParameters("dataCenterId", zoneId); } if (pod != null) { sc.setParameters("podId", pod); } if (address != null) { sc.setParameters("hostAddress", address); } if (cluster != null) { sc.setParameters("clusterId", cluster); } if (scopeType != null) { sc.setParameters("scope", scopeType.toString()); } // search Pool details by ids Pair, Integer> uniquePoolPair = _poolJoinDao.searchAndCount(sc, searchFilter); Integer count = uniquePoolPair.second(); if (count.intValue() == 0) { // empty result return uniquePoolPair; } List uniquePools = uniquePoolPair.first(); Long[] vrIds = new Long[uniquePools.size()]; int i = 0; for (StoragePoolJoinVO v : uniquePools) { vrIds[i++] = v.getId(); } List vrs = _poolJoinDao.searchByIds(vrIds); return new Pair, Integer>(vrs, count); } @Override public ListResponse searchForImageStores(ListImageStoresCmd cmd) { Pair, Integer> result = searchForImageStoresInternal(cmd); ListResponse response = new ListResponse(); List poolResponses = ViewResponseHelper.createImageStoreResponse(result.first().toArray(new ImageStoreJoinVO[result.first().size()])); response.setResponses(poolResponses, result.second()); return response; } private Pair, Integer> searchForImageStoresInternal(ListImageStoresCmd cmd) { Long zoneId = _accountMgr.checkAccessAndSpecifyAuthority(CallContext.current().getCallingAccount(), cmd.getZoneId()); Object id = cmd.getId(); Object name = cmd.getStoreName(); String provider = cmd.getProvider(); String protocol = cmd.getProtocol(); Object keyword = cmd.getKeyword(); Long startIndex = cmd.getStartIndex(); Long pageSize = cmd.getPageSizeVal(); Filter searchFilter = new Filter(ImageStoreJoinVO.class, "id", Boolean.TRUE, startIndex, pageSize); SearchBuilder sb = _imageStoreJoinDao.createSearchBuilder(); sb.select(null, Func.DISTINCT, sb.entity().getId()); // select distinct // ids sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ); sb.and("name", sb.entity().getName(), SearchCriteria.Op.EQ); sb.and("dataCenterId", sb.entity().getZoneId(), SearchCriteria.Op.EQ); sb.and("protocol", sb.entity().getProtocol(), SearchCriteria.Op.EQ); sb.and("provider", sb.entity().getProviderName(), SearchCriteria.Op.EQ); sb.and("role", sb.entity().getRole(), SearchCriteria.Op.EQ); SearchCriteria sc = sb.create(); sc.setParameters("role", DataStoreRole.Image); if (keyword != null) { SearchCriteria ssc = _imageStoreJoinDao.createSearchCriteria(); ssc.addOr("name", SearchCriteria.Op.LIKE, "%" + keyword + "%"); ssc.addOr("providerName", SearchCriteria.Op.LIKE, "%" + keyword + "%"); sc.addAnd("name", SearchCriteria.Op.SC, ssc); } if (id != null) { sc.setParameters("id", id); } if (name != null) { sc.setParameters("name", name); } if (zoneId != null) { sc.setParameters("dataCenterId", zoneId); } if (provider != null) { sc.setParameters("provider", provider); } if (protocol != null) { sc.setParameters("protocol", protocol); } // search Store details by ids Pair, Integer> uniqueStorePair = _imageStoreJoinDao.searchAndCount(sc, searchFilter); Integer count = uniqueStorePair.second(); if (count.intValue() == 0) { // empty result return uniqueStorePair; } List uniqueStores = uniqueStorePair.first(); Long[] vrIds = new Long[uniqueStores.size()]; int i = 0; for (ImageStoreJoinVO v : uniqueStores) { vrIds[i++] = v.getId(); } List vrs = _imageStoreJoinDao.searchByIds(vrIds); return new Pair, Integer>(vrs, count); } @Override public ListResponse searchForSecondaryStagingStores(ListSecondaryStagingStoresCmd cmd) { Pair, Integer> result = searchForCacheStoresInternal(cmd); ListResponse response = new ListResponse(); List poolResponses = ViewResponseHelper.createImageStoreResponse(result.first().toArray(new ImageStoreJoinVO[result.first().size()])); response.setResponses(poolResponses, result.second()); return response; } private Pair, Integer> searchForCacheStoresInternal(ListSecondaryStagingStoresCmd cmd) { Long zoneId = _accountMgr.checkAccessAndSpecifyAuthority(CallContext.current().getCallingAccount(), cmd.getZoneId()); Object id = cmd.getId(); Object name = cmd.getStoreName(); String provider = cmd.getProvider(); String protocol = cmd.getProtocol(); Object keyword = cmd.getKeyword(); Long startIndex = cmd.getStartIndex(); Long pageSize = cmd.getPageSizeVal(); Filter searchFilter = new Filter(ImageStoreJoinVO.class, "id", Boolean.TRUE, startIndex, pageSize); SearchBuilder sb = _imageStoreJoinDao.createSearchBuilder(); sb.select(null, Func.DISTINCT, sb.entity().getId()); // select distinct // ids sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ); sb.and("name", sb.entity().getName(), SearchCriteria.Op.EQ); sb.and("dataCenterId", sb.entity().getZoneId(), SearchCriteria.Op.EQ); sb.and("protocol", sb.entity().getProtocol(), SearchCriteria.Op.EQ); sb.and("provider", sb.entity().getProviderName(), SearchCriteria.Op.EQ); sb.and("role", sb.entity().getRole(), SearchCriteria.Op.EQ); SearchCriteria sc = sb.create(); sc.setParameters("role", DataStoreRole.ImageCache); if (keyword != null) { SearchCriteria ssc = _imageStoreJoinDao.createSearchCriteria(); ssc.addOr("name", SearchCriteria.Op.LIKE, "%" + keyword + "%"); ssc.addOr("provider", SearchCriteria.Op.LIKE, "%" + keyword + "%"); sc.addAnd("name", SearchCriteria.Op.SC, ssc); } if (id != null) { sc.setParameters("id", id); } if (name != null) { sc.setParameters("name", name); } if (zoneId != null) { sc.setParameters("dataCenterId", zoneId); } if (provider != null) { sc.setParameters("provider", provider); } if (protocol != null) { sc.setParameters("protocol", protocol); } // search Store details by ids Pair, Integer> uniqueStorePair = _imageStoreJoinDao.searchAndCount(sc, searchFilter); Integer count = uniqueStorePair.second(); if (count.intValue() == 0) { // empty result return uniqueStorePair; } List uniqueStores = uniqueStorePair.first(); Long[] vrIds = new Long[uniqueStores.size()]; int i = 0; for (ImageStoreJoinVO v : uniqueStores) { vrIds[i++] = v.getId(); } List vrs = _imageStoreJoinDao.searchByIds(vrIds); return new Pair, Integer>(vrs, count); } @Override public ListResponse searchForDiskOfferings(ListDiskOfferingsCmd cmd) { Pair, Integer> result = searchForDiskOfferingsInternal(cmd); ListResponse response = new ListResponse(); List offeringResponses = ViewResponseHelper.createDiskOfferingResponse(result.first().toArray(new DiskOfferingJoinVO[result.first().size()])); response.setResponses(offeringResponses, result.second()); return response; } private Pair, Integer> searchForDiskOfferingsInternal(ListDiskOfferingsCmd cmd) { // Note // The list method for offerings is being modified in accordance with // discussion with Will/Kevin // For now, we will be listing the following based on the usertype // 1. For root, we will list all offerings // 2. For domainAdmin and regular users, we will list everything in // their domains+parent domains ... all the way // till // root Boolean isAscending = Boolean.parseBoolean(_configDao.getValue("sortkey.algorithm")); isAscending = (isAscending == null ? true : isAscending); Filter searchFilter = new Filter(DiskOfferingJoinVO.class, "sortKey", isAscending, cmd.getStartIndex(), cmd.getPageSizeVal()); SearchCriteria sc = _diskOfferingJoinDao.createSearchCriteria(); sc.addAnd("type", Op.EQ, DiskOfferingVO.Type.Disk); Account account = CallContext.current().getCallingAccount(); Object name = cmd.getDiskOfferingName(); Object id = cmd.getId(); Object keyword = cmd.getKeyword(); Long domainId = cmd.getDomainId(); Boolean isRootAdmin = _accountMgr.isRootAdmin(account.getAccountId()); // Keeping this logic consistent with domain specific zones // if a domainId is provided, we just return the disk offering // associated with this domain if (domainId != null) { if (_accountMgr.isRootAdmin(account.getId()) || isPermissible(account.getDomainId(), domainId)) { // check if the user's domain == do's domain || user's domain is // a child of so's domain for non-root users sc.addAnd("domainId", SearchCriteria.Op.EQ, domainId); if (!isRootAdmin) { sc.addAnd("displayOffering", SearchCriteria.Op.EQ, 1); } return _diskOfferingJoinDao.searchAndCount(sc, searchFilter); } else { throw new PermissionDeniedException("The account:" + account.getAccountName() + " does not fall in the same domain hierarchy as the disk offering"); } } List domainIds = null; // For non-root users, only return all offerings for the user's domain, // and everything above till root if ((_accountMgr.isNormalUser(account.getId()) || _accountMgr.isDomainAdmin(account.getId())) || account.getType() == Account.ACCOUNT_TYPE_RESOURCE_DOMAIN_ADMIN) { // find all domain Id up to root domain for this account domainIds = new ArrayList(); DomainVO domainRecord = _domainDao.findById(account.getDomainId()); if (domainRecord == null) { s_logger.error("Could not find the domainId for account:" + account.getAccountName()); throw new CloudAuthenticationException("Could not find the domainId for account:" + account.getAccountName()); } domainIds.add(domainRecord.getId()); while (domainRecord.getParent() != null) { domainRecord = _domainDao.findById(domainRecord.getParent()); domainIds.add(domainRecord.getId()); } SearchCriteria spc = _diskOfferingJoinDao.createSearchCriteria(); spc.addOr("domainId", SearchCriteria.Op.IN, domainIds.toArray()); spc.addOr("domainId", SearchCriteria.Op.NULL); // include public // offering as where sc.addAnd("domainId", SearchCriteria.Op.SC, spc); sc.addAnd("displayOffering", SearchCriteria.Op.EQ, 1); sc.addAnd("systemUse", SearchCriteria.Op.EQ, false); // non-root // users should // not see // system // offering at // all } if (keyword != null) { SearchCriteria ssc = _diskOfferingJoinDao.createSearchCriteria(); ssc.addOr("displayText", SearchCriteria.Op.LIKE, "%" + keyword + "%"); ssc.addOr("name", SearchCriteria.Op.LIKE, "%" + keyword + "%"); sc.addAnd("name", SearchCriteria.Op.SC, ssc); } if (id != null) { sc.addAnd("id", SearchCriteria.Op.EQ, id); } if (name != null) { sc.addAnd("name", SearchCriteria.Op.EQ, name); } // FIXME: disk offerings should search back up the hierarchy for // available disk offerings... /* * sb.addAnd("domainId", sb.entity().getDomainId(), * SearchCriteria.Op.EQ); if (domainId != null) { * SearchBuilder domainSearch = * _domainDao.createSearchBuilder(); domainSearch.addAnd("path", * domainSearch.entity().getPath(), SearchCriteria.Op.LIKE); * sb.join("domainSearch", domainSearch, sb.entity().getDomainId(), * domainSearch.entity().getId()); } */ // FIXME: disk offerings should search back up the hierarchy for // available disk offerings... /* * if (domainId != null) { sc.setParameters("domainId", domainId); // * //DomainVO domain = _domainDao.findById((Long)domainId); // // I want * to join on user_vm.domain_id = domain.id where domain.path like * 'foo%' //sc.setJoinParameters("domainSearch", "path", * domain.getPath() + "%"); // } */ return _diskOfferingJoinDao.searchAndCount(sc, searchFilter); } @Override public ListResponse searchForServiceOfferings(ListServiceOfferingsCmd cmd) { Pair, Integer> result = searchForServiceOfferingsInternal(cmd); ListResponse response = new ListResponse(); List offeringResponses = ViewResponseHelper.createServiceOfferingResponse(result.first().toArray(new ServiceOfferingJoinVO[result.first().size()])); response.setResponses(offeringResponses, result.second()); return response; } private Pair, Integer> searchForServiceOfferingsInternal(ListServiceOfferingsCmd cmd) { // Note // The list method for offerings is being modified in accordance with // discussion with Will/Kevin // For now, we will be listing the following based on the usertype // 1. For root, we will list all offerings // 2. For domainAdmin and regular users, we will list everything in // their domains+parent domains ... all the way // till // root Boolean isAscending = Boolean.parseBoolean(_configDao.getValue("sortkey.algorithm")); isAscending = (isAscending == null ? true : isAscending); Filter searchFilter = new Filter(ServiceOfferingJoinVO.class, "sortKey", isAscending, cmd.getStartIndex(), cmd.getPageSizeVal()); Account caller = CallContext.current().getCallingAccount(); Object name = cmd.getServiceOfferingName(); Object id = cmd.getId(); Object keyword = cmd.getKeyword(); Long vmId = cmd.getVirtualMachineId(); Long domainId = cmd.getDomainId(); Boolean isSystem = cmd.getIsSystem(); String vmTypeStr = cmd.getSystemVmType(); SearchCriteria sc = _srvOfferingJoinDao.createSearchCriteria(); if (!_accountMgr.isRootAdmin(caller.getId()) && isSystem) { throw new InvalidParameterValueException("Only ROOT admins can access system's offering"); } // Keeping this logic consistent with domain specific zones // if a domainId is provided, we just return the so associated with this // domain if (domainId != null && !_accountMgr.isRootAdmin(caller.getId())) { // check if the user's domain == so's domain || user's domain is a // child of so's domain if (!isPermissible(caller.getDomainId(), domainId)) { throw new PermissionDeniedException("The account:" + caller.getAccountName() + " does not fall in the same domain hierarchy as the service offering"); } } if (vmId != null) { UserVmVO vmInstance = _userVmDao.findById(vmId); if ((vmInstance == null) || (vmInstance.getRemoved() != null)) { InvalidParameterValueException ex = new InvalidParameterValueException("unable to find a virtual machine with specified id"); ex.addProxyObject(vmId.toString(), "vmId"); throw ex; } _accountMgr.checkAccess(caller, null, true, vmInstance); ServiceOfferingVO offering = _srvOfferingDao.findByIdIncludingRemoved(vmInstance.getId(), vmInstance.getServiceOfferingId()); sc.addAnd("id", SearchCriteria.Op.NEQ, offering.getId()); // Only return offerings with the same Guest IP type and storage // pool preference // sc.addAnd("guestIpType", SearchCriteria.Op.EQ, // offering.getGuestIpType()); sc.addAnd("useLocalStorage", SearchCriteria.Op.EQ, offering.getUseLocalStorage()); } // boolean includePublicOfferings = false; if ((_accountMgr.isNormalUser(caller.getId()) || _accountMgr.isDomainAdmin(caller.getId())) || caller.getType() == Account.ACCOUNT_TYPE_RESOURCE_DOMAIN_ADMIN) { // For non-root users. if (isSystem) { throw new InvalidParameterValueException("Only root admins can access system's offering"); } // find all domain Id up to root domain for this account List domainIds = new ArrayList(); DomainVO domainRecord; if (vmId != null) { UserVmVO vmInstance = _userVmDao.findById(vmId); domainRecord = _domainDao.findById(vmInstance.getDomainId()); if (domainRecord == null) { s_logger.error("Could not find the domainId for vmId:" + vmId); throw new CloudAuthenticationException("Could not find the domainId for vmId:" + vmId); } } else { domainRecord = _domainDao.findById(caller.getDomainId()); if (domainRecord == null) { s_logger.error("Could not find the domainId for account:" + caller.getAccountName()); throw new CloudAuthenticationException("Could not find the domainId for account:" + caller.getAccountName()); } } domainIds.add(domainRecord.getId()); while (domainRecord.getParent() != null) { domainRecord = _domainDao.findById(domainRecord.getParent()); domainIds.add(domainRecord.getId()); } SearchCriteria spc = _srvOfferingJoinDao.createSearchCriteria(); spc.addOr("domainId", SearchCriteria.Op.IN, domainIds.toArray()); spc.addOr("domainId", SearchCriteria.Op.NULL); // include public // offering as where sc.addAnd("domainId", SearchCriteria.Op.SC, spc); } else { // for root users if (caller.getDomainId() != 1 && isSystem) { // NON ROOT admin throw new InvalidParameterValueException("Non ROOT admins cannot access system's offering"); } if (domainId != null) { sc.addAnd("domainId", SearchCriteria.Op.EQ, domainId); } } if (keyword != null) { SearchCriteria ssc = _srvOfferingJoinDao.createSearchCriteria(); ssc.addOr("displayText", SearchCriteria.Op.LIKE, "%" + keyword + "%"); ssc.addOr("name", SearchCriteria.Op.LIKE, "%" + keyword + "%"); sc.addAnd("name", SearchCriteria.Op.SC, ssc); } if (id != null) { sc.addAnd("id", SearchCriteria.Op.EQ, id); } if (isSystem != null) { // note that for non-root users, isSystem is always false when // control comes to here sc.addAnd("systemUse", SearchCriteria.Op.EQ, isSystem); } if (name != null) { sc.addAnd("name", SearchCriteria.Op.EQ, name); } if (vmTypeStr != null) { sc.addAnd("vmType", SearchCriteria.Op.EQ, vmTypeStr); } return _srvOfferingJoinDao.searchAndCount(sc, searchFilter); } @Override public ListResponse listDataCenters(ListZonesCmd cmd) { Pair, Integer> result = listDataCentersInternal(cmd); ListResponse response = new ListResponse(); ResponseView respView = ResponseView.Restricted; if (cmd instanceof ListZonesCmdByAdmin) { respView = ResponseView.Full; } List dcResponses = ViewResponseHelper.createDataCenterResponse(respView, cmd.getShowCapacities(), result .first().toArray(new DataCenterJoinVO[result.first().size()])); response.setResponses(dcResponses, result.second()); return response; } private Pair, Integer> listDataCentersInternal(ListZonesCmd cmd) { Account account = CallContext.current().getCallingAccount(); Long domainId = cmd.getDomainId(); Long id = cmd.getId(); String keyword = cmd.getKeyword(); String name = cmd.getName(); String networkType = cmd.getNetworkType(); Map resourceTags = cmd.getTags(); SearchBuilder sb = _dcJoinDao.createSearchBuilder(); if (resourceTags != null && !resourceTags.isEmpty()) { SearchBuilder tagSearch = _resourceTagDao.createSearchBuilder(); for (int count = 0; count < resourceTags.size(); count++) { tagSearch.or().op("key" + String.valueOf(count), tagSearch.entity().getKey(), SearchCriteria.Op.EQ); tagSearch.and("value" + String.valueOf(count), tagSearch.entity().getValue(), SearchCriteria.Op.EQ); tagSearch.cp(); } tagSearch.and("resourceType", tagSearch.entity().getResourceType(), SearchCriteria.Op.EQ); sb.groupBy(sb.entity().getId()); sb.join("tagSearch", tagSearch, sb.entity().getId(), tagSearch.entity().getResourceId(), JoinBuilder.JoinType.INNER); } Filter searchFilter = new Filter(DataCenterJoinVO.class, null, false, cmd.getStartIndex(), cmd.getPageSizeVal()); SearchCriteria sc = sb.create(); if (networkType != null) { sc.addAnd("networkType", SearchCriteria.Op.EQ, networkType); } if (id != null) { sc.addAnd("id", SearchCriteria.Op.EQ, id); } else if (name != null) { sc.addAnd("name", SearchCriteria.Op.EQ, name); } else { if (keyword != null) { SearchCriteria ssc = _dcJoinDao.createSearchCriteria(); ssc.addOr("name", SearchCriteria.Op.LIKE, "%" + keyword + "%"); ssc.addOr("description", SearchCriteria.Op.LIKE, "%" + keyword + "%"); sc.addAnd("name", SearchCriteria.Op.SC, ssc); } /* * List all resources due to Explicit Dedication except the * dedicated resources of other account */ if (domainId != null) { // // for domainId != null // right now, we made the decision to // only list zones associated // with this domain, private zone sc.addAnd("domainId", SearchCriteria.Op.EQ, domainId); if (_accountMgr.isNormalUser(account.getId())) { // accountId == null (zones dedicated to a domain) or // accountId = caller SearchCriteria sdc = _dcJoinDao.createSearchCriteria(); sdc.addOr("accountId", SearchCriteria.Op.EQ, account.getId()); sdc.addOr("accountId", SearchCriteria.Op.NULL); sc.addAnd("accountId", SearchCriteria.Op.SC, sdc); } } else if (_accountMgr.isNormalUser(account.getId())) { // it was decided to return all zones for the user's domain, and // everything above till root // list all zones belonging to this domain, and all of its // parents // check the parent, if not null, add zones for that parent to // list // find all domain Id up to root domain for this account List domainIds = new ArrayList(); DomainVO domainRecord = _domainDao.findById(account.getDomainId()); if (domainRecord == null) { s_logger.error("Could not find the domainId for account:" + account.getAccountName()); throw new CloudAuthenticationException("Could not find the domainId for account:" + account.getAccountName()); } domainIds.add(domainRecord.getId()); while (domainRecord.getParent() != null) { domainRecord = _domainDao.findById(domainRecord.getParent()); domainIds.add(domainRecord.getId()); } // domainId == null (public zones) or domainId IN [all domain id // up to root domain] SearchCriteria sdc = _dcJoinDao.createSearchCriteria(); sdc.addOr("domainId", SearchCriteria.Op.IN, domainIds.toArray()); sdc.addOr("domainId", SearchCriteria.Op.NULL); sc.addAnd("domainId", SearchCriteria.Op.SC, sdc); // remove disabled zones sc.addAnd("allocationState", SearchCriteria.Op.NEQ, Grouping.AllocationState.Disabled); // accountId == null (zones dedicated to a domain) or // accountId = caller SearchCriteria sdc2 = _dcJoinDao.createSearchCriteria(); sdc2.addOr("accountId", SearchCriteria.Op.EQ, account.getId()); sdc2.addOr("accountId", SearchCriteria.Op.NULL); sc.addAnd("accountId", SearchCriteria.Op.SC, sdc2); // remove Dedicated zones not dedicated to this domainId or // subdomainId List dedicatedZoneIds = removeDedicatedZoneNotSuitabe(domainIds); if (!dedicatedZoneIds.isEmpty()) { sdc.addAnd("id", SearchCriteria.Op.NIN, dedicatedZoneIds.toArray(new Object[dedicatedZoneIds.size()])); } } else if (_accountMgr.isDomainAdmin(account.getId()) || account.getType() == Account.ACCOUNT_TYPE_RESOURCE_DOMAIN_ADMIN) { // it was decided to return all zones for the domain admin, and // everything above till root, as well as zones till the domain // leaf List domainIds = new ArrayList(); DomainVO domainRecord = _domainDao.findById(account.getDomainId()); if (domainRecord == null) { s_logger.error("Could not find the domainId for account:" + account.getAccountName()); throw new CloudAuthenticationException("Could not find the domainId for account:" + account.getAccountName()); } domainIds.add(domainRecord.getId()); // find all domain Ids till leaf List allChildDomains = _domainDao.findAllChildren(domainRecord.getPath(), domainRecord.getId()); for (DomainVO domain : allChildDomains) { domainIds.add(domain.getId()); } // then find all domain Id up to root domain for this account while (domainRecord.getParent() != null) { domainRecord = _domainDao.findById(domainRecord.getParent()); domainIds.add(domainRecord.getId()); } // domainId == null (public zones) or domainId IN [all domain id // up to root domain] SearchCriteria sdc = _dcJoinDao.createSearchCriteria(); sdc.addOr("domainId", SearchCriteria.Op.IN, domainIds.toArray()); sdc.addOr("domainId", SearchCriteria.Op.NULL); sc.addAnd("domainId", SearchCriteria.Op.SC, sdc); // remove disabled zones sc.addAnd("allocationState", SearchCriteria.Op.NEQ, Grouping.AllocationState.Disabled); // remove Dedicated zones not dedicated to this domainId or // subdomainId List dedicatedZoneIds = removeDedicatedZoneNotSuitabe(domainIds); if (!dedicatedZoneIds.isEmpty()) { sdc.addAnd("id", SearchCriteria.Op.NIN, dedicatedZoneIds.toArray(new Object[dedicatedZoneIds.size()])); } } // handle available=FALSE option, only return zones with at least // one VM running there Boolean available = cmd.isAvailable(); if (account != null) { if ((available != null) && Boolean.FALSE.equals(available)) { Set dcIds = new HashSet(); // data centers with // at least one VM // running List routers = _routerDao.listBy(account.getId()); for (DomainRouterVO router : routers) { dcIds.add(router.getDataCenterId()); } if (dcIds.size() == 0) { return new Pair, Integer>(new ArrayList(), 0); } else { sc.addAnd("id", SearchCriteria.Op.IN, dcIds.toArray()); } } } } if (resourceTags != null && !resourceTags.isEmpty()) { int count = 0; sc.setJoinParameters("tagSearch", "resourceType", ResourceObjectType.Zone.toString()); for (String key : resourceTags.keySet()) { sc.setJoinParameters("tagSearch", "key" + String.valueOf(count), key); sc.setJoinParameters("tagSearch", "value" + String.valueOf(count), resourceTags.get(key)); count++; } } return _dcJoinDao.searchAndCount(sc, searchFilter); } private List removeDedicatedZoneNotSuitabe(List domainIds) { // remove dedicated zone of other domain List dedicatedZoneIds = new ArrayList(); List dedicatedResources = _dedicatedDao.listZonesNotInDomainIds(domainIds); for (DedicatedResourceVO dr : dedicatedResources) { if (dr != null) { dedicatedZoneIds.add(dr.getDataCenterId()); } } return dedicatedZoneIds; } // This method is used for permissions check for both disk and service // offerings private boolean isPermissible(Long accountDomainId, Long offeringDomainId) { if (accountDomainId.equals(offeringDomainId)) { return true; // account and service offering in same domain } DomainVO domainRecord = _domainDao.findById(accountDomainId); if (domainRecord != null) { while (true) { if (domainRecord.getId() == offeringDomainId) { return true; } // try and move on to the next domain if (domainRecord.getParent() != null) { domainRecord = _domainDao.findById(domainRecord.getParent()); } else { break; } } } return false; } @Override public ListResponse listTemplates(ListTemplatesCmd cmd) { Pair, Integer> result = searchForTemplatesInternal(cmd); ListResponse response = new ListResponse(); ResponseView respView = ResponseView.Restricted; if (cmd instanceof ListTemplatesCmdByAdmin) { respView = ResponseView.Full; } List templateResponses = ViewResponseHelper.createTemplateResponse(respView, result.first().toArray( new TemplateJoinVO[result.first().size()])); response.setResponses(templateResponses, result.second()); return response; } private Pair, Integer> searchForTemplatesInternal(ListTemplatesCmd cmd) { TemplateFilter templateFilter = TemplateFilter.valueOf(cmd.getTemplateFilter()); Long id = cmd.getId(); Map tags = cmd.getTags(); boolean showRemovedTmpl = cmd.getShowRemoved(); Account caller = CallContext.current().getCallingAccount(); boolean listAll = false; if (templateFilter != null && templateFilter == TemplateFilter.all) { if (caller.getType() == Account.ACCOUNT_TYPE_NORMAL) { throw new InvalidParameterValueException("Filter " + TemplateFilter.all + " can be specified by admin only"); } listAll = true; } List permittedAccountIds = new ArrayList(); Ternary domainIdRecursiveListProject = new Ternary( cmd.getDomainId(), cmd.isRecursive(), null); _accountMgr.buildACLSearchParameters(caller, id, cmd.getAccountName(), cmd.getProjectId(), permittedAccountIds, domainIdRecursiveListProject, listAll, false); ListProjectResourcesCriteria listProjectResourcesCriteria = domainIdRecursiveListProject.third(); List permittedAccounts = new ArrayList(); for (Long accountId : permittedAccountIds) { permittedAccounts.add(_accountMgr.getAccount(accountId)); } boolean showDomr = ((templateFilter != TemplateFilter.selfexecutable) && (templateFilter != TemplateFilter.featured)); HypervisorType hypervisorType = HypervisorType.getType(cmd.getHypervisor()); return searchForTemplatesInternal(id, cmd.getTemplateName(), cmd.getKeyword(), templateFilter, false, null, cmd.getPageSizeVal(), cmd.getStartIndex(), cmd.getZoneId(), hypervisorType, showDomr, cmd.listInReadyState(), permittedAccounts, caller, listProjectResourcesCriteria, tags, showRemovedTmpl); } private Pair, Integer> searchForTemplatesInternal(Long templateId, String name, String keyword, TemplateFilter templateFilter, boolean isIso, Boolean bootable, Long pageSize, Long startIndex, Long zoneId, HypervisorType hyperType, boolean showDomr, boolean onlyReady, List permittedAccounts, Account caller, ListProjectResourcesCriteria listProjectResourcesCriteria, Map tags, boolean showRemovedTmpl) { // check if zone is configured, if not, just return empty list List hypers = null; if (!isIso) { hypers = _resourceMgr.listAvailHypervisorInZone(null, null); if (hypers == null || hypers.isEmpty()) { return new Pair, Integer>(new ArrayList(), 0); } } VMTemplateVO template = null; Boolean isAscending = Boolean.parseBoolean(_configDao.getValue("sortkey.algorithm")); isAscending = (isAscending == null ? true : isAscending); Filter searchFilter = new Filter(TemplateJoinVO.class, "sortKey", isAscending, startIndex, pageSize); SearchBuilder sb = _templateJoinDao.createSearchBuilder(); sb.select(null, Func.DISTINCT, sb.entity().getTempZonePair()); // select distinct (templateId, zoneId) pair SearchCriteria sc = sb.create(); // verify templateId parameter and specially handle it if (templateId != null) { template = _templateDao.findByIdIncludingRemoved(templateId); // Done for backward compatibility - Bug-5221 if (template == null) { throw new InvalidParameterValueException("Please specify a valid template ID."); }// If ISO requested then it should be ISO. if (isIso && template.getFormat() != ImageFormat.ISO) { s_logger.error("Template Id " + templateId + " is not an ISO"); InvalidParameterValueException ex = new InvalidParameterValueException( "Specified Template Id is not an ISO"); ex.addProxyObject(template.getUuid(), "templateId"); throw ex; }// If ISO not requested then it shouldn't be an ISO. if (!isIso && template.getFormat() == ImageFormat.ISO) { s_logger.error("Incorrect format of the template id " + templateId); InvalidParameterValueException ex = new InvalidParameterValueException("Incorrect format " + template.getFormat() + " of the specified template id"); ex.addProxyObject(template.getUuid(), "templateId"); throw ex; } // if template is not public, perform permission check here if (!template.isPublicTemplate() && caller.getType() != Account.ACCOUNT_TYPE_ADMIN) { Account owner = _accountMgr.getAccount(template.getAccountId()); _accountMgr.checkAccess(caller, null, true, owner); } // if templateId is specified, then we will just use the id to // search and ignore other query parameters sc.addAnd("id", SearchCriteria.Op.EQ, templateId); } else { DomainVO domain = null; if (!permittedAccounts.isEmpty()) { domain = _domainDao.findById(permittedAccounts.get(0).getDomainId()); } else { domain = _domainDao.findById(Domain.ROOT_DOMAIN); } // List hypers = null; // if (!isIso) { // hypers = _resourceMgr.listAvailHypervisorInZone(null, null); // } // add criteria for project or not if (listProjectResourcesCriteria == ListProjectResourcesCriteria.SkipProjectResources) { sc.addAnd("accountType", SearchCriteria.Op.NEQ, Account.ACCOUNT_TYPE_PROJECT); } else if (listProjectResourcesCriteria == ListProjectResourcesCriteria.ListProjectResourcesOnly) { sc.addAnd("accountType", SearchCriteria.Op.EQ, Account.ACCOUNT_TYPE_PROJECT); } // add criteria for domain path in case of domain admin if ((templateFilter == TemplateFilter.self || templateFilter == TemplateFilter.selfexecutable) && (caller.getType() == Account.ACCOUNT_TYPE_DOMAIN_ADMIN || caller.getType() == Account.ACCOUNT_TYPE_RESOURCE_DOMAIN_ADMIN)) { sc.addAnd("domainPath", SearchCriteria.Op.LIKE, domain.getPath() + "%"); } List relatedDomainIds = new ArrayList(); List permittedAccountIds = new ArrayList(); if (!permittedAccounts.isEmpty()) { for (Account account : permittedAccounts) { permittedAccountIds.add(account.getId()); boolean publicTemplates = (templateFilter == TemplateFilter.featured || templateFilter == TemplateFilter.community); // get all parent domain ID's all the way till root domain DomainVO domainTreeNode = null; //if template filter is featured, or community, all child domains should be included in search if (publicTemplates) { domainTreeNode = _domainDao.findById(Domain.ROOT_DOMAIN); } else { domainTreeNode = _domainDao.findById(account.getDomainId()); } relatedDomainIds.add(domainTreeNode.getId()); while (domainTreeNode.getParent() != null) { domainTreeNode = _domainDao.findById(domainTreeNode.getParent()); relatedDomainIds.add(domainTreeNode.getId()); } // get all child domain ID's if (_accountMgr.isAdmin(account.getId()) || publicTemplates) { List allChildDomains = _domainDao.findAllChildren(domainTreeNode.getPath(), domainTreeNode.getId()); for (DomainVO childDomain : allChildDomains) { relatedDomainIds.add(childDomain.getId()); } } } } if (!isIso) { // add hypervisor criteria for template case if (hypers != null && !hypers.isEmpty()) { String[] relatedHypers = new String[hypers.size()]; for (int i = 0; i < hypers.size(); i++) { relatedHypers[i] = hypers.get(i).toString(); } sc.addAnd("hypervisorType", SearchCriteria.Op.IN, relatedHypers); } } // control different template filters if (templateFilter == TemplateFilter.featured || templateFilter == TemplateFilter.community) { sc.addAnd("publicTemplate", SearchCriteria.Op.EQ, true); if (templateFilter == TemplateFilter.featured) { sc.addAnd("featured", SearchCriteria.Op.EQ, true); } else { sc.addAnd("featured", SearchCriteria.Op.EQ, false); } if (!permittedAccounts.isEmpty()) { SearchCriteria scc = _templateJoinDao.createSearchCriteria(); scc.addOr("domainId", SearchCriteria.Op.IN, relatedDomainIds.toArray()); scc.addOr("domainId", SearchCriteria.Op.NULL); sc.addAnd("domainId", SearchCriteria.Op.SC, scc); } } else if (templateFilter == TemplateFilter.self || templateFilter == TemplateFilter.selfexecutable) { if (!permittedAccounts.isEmpty()) { sc.addAnd("accountId", SearchCriteria.Op.IN, permittedAccountIds.toArray()); } } else if (templateFilter == TemplateFilter.sharedexecutable || templateFilter == TemplateFilter.shared) { // only show templates shared by others sc.addAnd("sharedAccountId", SearchCriteria.Op.IN, permittedAccountIds.toArray()); } else if (templateFilter == TemplateFilter.executable) { SearchCriteria scc = _templateJoinDao.createSearchCriteria(); scc.addOr("publicTemplate", SearchCriteria.Op.EQ, true); if (!permittedAccounts.isEmpty()) { scc.addOr("accountId", SearchCriteria.Op.IN, permittedAccountIds.toArray()); } sc.addAnd("publicTemplate", SearchCriteria.Op.SC, scc); } // add tags criteria if (tags != null && !tags.isEmpty()) { SearchCriteria scc = _templateJoinDao.createSearchCriteria(); for (String key : tags.keySet()) { SearchCriteria scTag = _templateJoinDao.createSearchCriteria(); scTag.addAnd("tagKey", SearchCriteria.Op.EQ, key); scTag.addAnd("tagValue", SearchCriteria.Op.EQ, tags.get(key)); if (isIso) { scTag.addAnd("tagResourceType", SearchCriteria.Op.EQ, ResourceObjectType.ISO); } else { scTag.addAnd("tagResourceType", SearchCriteria.Op.EQ, ResourceObjectType.Template); } scc.addOr("tagKey", SearchCriteria.Op.SC, scTag); } sc.addAnd("tagKey", SearchCriteria.Op.SC, scc); } // other criteria if (keyword != null) { sc.addAnd("name", SearchCriteria.Op.LIKE, "%" + keyword + "%"); } else if (name != null) { sc.addAnd("name", SearchCriteria.Op.EQ, name); } if (isIso) { sc.addAnd("format", SearchCriteria.Op.EQ, "ISO"); } else { sc.addAnd("format", SearchCriteria.Op.NEQ, "ISO"); } if (!hyperType.equals(HypervisorType.None)) { sc.addAnd("hypervisorType", SearchCriteria.Op.EQ, hyperType); } if (bootable != null) { sc.addAnd("bootable", SearchCriteria.Op.EQ, bootable); } if (onlyReady) { SearchCriteria readySc = _templateJoinDao.createSearchCriteria(); readySc.addOr("state", SearchCriteria.Op.EQ, TemplateState.Ready); readySc.addOr("format", SearchCriteria.Op.EQ, ImageFormat.BAREMETAL); SearchCriteria isoPerhostSc = _templateJoinDao.createSearchCriteria(); isoPerhostSc.addAnd("format", SearchCriteria.Op.EQ, ImageFormat.ISO); isoPerhostSc.addAnd("templateType", SearchCriteria.Op.EQ, TemplateType.PERHOST); readySc.addOr("templateType", SearchCriteria.Op.SC, isoPerhostSc); sc.addAnd("state", SearchCriteria.Op.SC, readySc); } if (!showDomr) { // excluding system template sc.addAnd("templateType", SearchCriteria.Op.NEQ, Storage.TemplateType.SYSTEM); } } if (zoneId != null) { SearchCriteria zoneSc = _templateJoinDao.createSearchCriteria(); zoneSc.addOr("dataCenterId", SearchCriteria.Op.EQ, zoneId); zoneSc.addOr("dataStoreScope", SearchCriteria.Op.EQ, ScopeType.REGION); // handle the case where xs-tools.iso and vmware-tools.iso do not // have data_center information in template_view SearchCriteria isoPerhostSc = _templateJoinDao.createSearchCriteria(); isoPerhostSc.addAnd("format", SearchCriteria.Op.EQ, ImageFormat.ISO); isoPerhostSc.addAnd("templateType", SearchCriteria.Op.EQ, TemplateType.PERHOST); zoneSc.addOr("templateType", SearchCriteria.Op.SC, isoPerhostSc); sc.addAnd("dataCenterId", SearchCriteria.Op.SC, zoneSc); } // don't return removed template, this should not be needed since we // changed annotation for removed field in TemplateJoinVO. // sc.addAnd("removed", SearchCriteria.Op.NULL); // search unique templates and find details by Ids Pair, Integer> uniqueTmplPair = null; if (showRemovedTmpl) { uniqueTmplPair = _templateJoinDao.searchIncludingRemovedAndCount(sc, searchFilter); } else { sc.addAnd("templateState", SearchCriteria.Op.EQ, State.Active); uniqueTmplPair = _templateJoinDao.searchAndCount(sc, searchFilter); } Integer count = uniqueTmplPair.second(); if (count.intValue() == 0) { // empty result return uniqueTmplPair; } List uniqueTmpls = uniqueTmplPair.first(); String[] tzIds = new String[uniqueTmpls.size()]; int i = 0; for (TemplateJoinVO v : uniqueTmpls) { tzIds[i++] = v.getTempZonePair(); } List vrs = _templateJoinDao.searchByTemplateZonePair(showRemovedTmpl, tzIds); return new Pair, Integer>(vrs, count); // TODO: revisit the special logic for iso search in // VMTemplateDaoImpl.searchForTemplates and understand why we need to // specially handle ISO. The original logic is very twisted and no idea // about what the code was doing. } @Override public ListResponse listIsos(ListIsosCmd cmd) { Pair, Integer> result = searchForIsosInternal(cmd); ListResponse response = new ListResponse(); ResponseView respView = ResponseView.Restricted; if (cmd instanceof ListIsosCmdByAdmin) { respView = ResponseView.Full; } List templateResponses = ViewResponseHelper.createIsoResponse(respView, result.first().toArray( new TemplateJoinVO[result.first().size()])); response.setResponses(templateResponses, result.second()); return response; } private Pair, Integer> searchForIsosInternal(ListIsosCmd cmd) { TemplateFilter isoFilter = TemplateFilter.valueOf(cmd.getIsoFilter()); Long id = cmd.getId(); Map tags = cmd.getTags(); boolean showRemovedISO = cmd.getShowRemoved(); Account caller = CallContext.current().getCallingAccount(); boolean listAll = false; if (isoFilter != null && isoFilter == TemplateFilter.all) { if (caller.getType() == Account.ACCOUNT_TYPE_NORMAL) { throw new InvalidParameterValueException("Filter " + TemplateFilter.all + " can be specified by admin only"); } listAll = true; } List permittedAccountIds = new ArrayList(); Ternary domainIdRecursiveListProject = new Ternary( cmd.getDomainId(), cmd.isRecursive(), null); _accountMgr.buildACLSearchParameters(caller, id, cmd.getAccountName(), cmd.getProjectId(), permittedAccountIds, domainIdRecursiveListProject, listAll, false); ListProjectResourcesCriteria listProjectResourcesCriteria = domainIdRecursiveListProject.third(); List permittedAccounts = new ArrayList(); for (Long accountId : permittedAccountIds) { permittedAccounts.add(_accountMgr.getAccount(accountId)); } HypervisorType hypervisorType = HypervisorType.getType(cmd.getHypervisor()); return searchForTemplatesInternal(cmd.getId(), cmd.getIsoName(), cmd.getKeyword(), isoFilter, true, cmd.isBootable(), cmd.getPageSizeVal(), cmd.getStartIndex(), cmd.getZoneId(), hypervisorType, true, cmd.listInReadyState(), permittedAccounts, caller, listProjectResourcesCriteria, tags, showRemovedISO); } @Override public ListResponse listAffinityGroups(Long affinityGroupId, String affinityGroupName, String affinityGroupType, Long vmId, String accountName, Long domainId, boolean isRecursive, boolean listAll, Long startIndex, Long pageSize, String keyword) { Pair, Integer> result = listAffinityGroupsInternal(affinityGroupId, affinityGroupName, affinityGroupType, vmId, accountName, domainId, isRecursive, listAll, startIndex, pageSize, keyword); ListResponse response = new ListResponse(); List agResponses = ViewResponseHelper.createAffinityGroupResponses(result.first()); response.setResponses(agResponses, result.second()); return response; } public Pair, Integer> listAffinityGroupsInternal(Long affinityGroupId, String affinityGroupName, String affinityGroupType, Long vmId, String accountName, Long domainId, boolean isRecursive, boolean listAll, Long startIndex, Long pageSize, String keyword) { Account caller = CallContext.current().getCallingAccount(); caller.getAccountId(); if (vmId != null) { UserVmVO userVM = _userVmDao.findById(vmId); if (userVM == null) { throw new InvalidParameterValueException("Unable to list affinity groups for virtual machine instance " + vmId + "; instance not found."); } _accountMgr.checkAccess(caller, null, true, userVM); return listAffinityGroupsByVM(vmId.longValue(), startIndex, pageSize); } List permittedAccounts = new ArrayList(); Ternary domainIdRecursiveListProject = new Ternary( domainId, isRecursive, null); _accountMgr.buildACLSearchParameters(caller, affinityGroupId, accountName, null, permittedAccounts, domainIdRecursiveListProject, listAll, true); domainId = domainIdRecursiveListProject.first(); isRecursive = domainIdRecursiveListProject.second(); ListProjectResourcesCriteria listProjectResourcesCriteria = domainIdRecursiveListProject.third(); Filter searchFilter = new Filter(AffinityGroupJoinVO.class, "id", true, startIndex, pageSize); SearchCriteria sc = buildAffinityGroupSearchCriteria(domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria, affinityGroupId, affinityGroupName, affinityGroupType, keyword); Pair, Integer> uniqueGroupsPair = _affinityGroupJoinDao.searchAndCount(sc, searchFilter); // search group details by ids List vrs = new ArrayList(); Integer count = uniqueGroupsPair.second(); if (count.intValue() != 0) { List uniqueGroups = uniqueGroupsPair.first(); Long[] vrIds = new Long[uniqueGroups.size()]; int i = 0; for (AffinityGroupJoinVO v : uniqueGroups) { vrIds[i++] = v.getId(); } vrs = _affinityGroupJoinDao.searchByIds(vrIds); } if (!permittedAccounts.isEmpty()) { // add domain level affinity groups if (domainId != null) { SearchCriteria scDomain = buildAffinityGroupSearchCriteria(null, isRecursive, new ArrayList(), listProjectResourcesCriteria, affinityGroupId, affinityGroupName, affinityGroupType, keyword); vrs.addAll(listDomainLevelAffinityGroups(scDomain, searchFilter, domainId)); } else { for (Long permAcctId : permittedAccounts) { Account permittedAcct = _accountDao.findById(permAcctId); SearchCriteria scDomain = buildAffinityGroupSearchCriteria( null, isRecursive, new ArrayList(), listProjectResourcesCriteria, affinityGroupId, affinityGroupName, affinityGroupType, keyword); vrs.addAll(listDomainLevelAffinityGroups(scDomain, searchFilter, permittedAcct.getDomainId())); } } } else if (((permittedAccounts.isEmpty()) && (domainId != null) && isRecursive)) { // list all domain level affinity groups for the domain admin case SearchCriteria scDomain = buildAffinityGroupSearchCriteria(null, isRecursive, new ArrayList(), listProjectResourcesCriteria, affinityGroupId, affinityGroupName, affinityGroupType, keyword); vrs.addAll(listDomainLevelAffinityGroups(scDomain, searchFilter, domainId)); } return new Pair, Integer>(vrs, vrs.size()); } private void buildAffinityGroupViewSearchBuilder(SearchBuilder sb, Long domainId, boolean isRecursive, List permittedAccounts, ListProjectResourcesCriteria listProjectResourcesCriteria) { sb.and("accountIdIN", sb.entity().getAccountId(), SearchCriteria.Op.IN); sb.and("domainId", sb.entity().getDomainId(), SearchCriteria.Op.EQ); if (((permittedAccounts.isEmpty()) && (domainId != null) && isRecursive)) { // if accountId isn't specified, we can do a domain match for the // admin case if isRecursive is true sb.and("domainPath", sb.entity().getDomainPath(), SearchCriteria.Op.LIKE); } if (listProjectResourcesCriteria != null) { if (listProjectResourcesCriteria == Project.ListProjectResourcesCriteria.ListProjectResourcesOnly) { sb.and("accountType", sb.entity().getAccountType(), SearchCriteria.Op.EQ); } else if (listProjectResourcesCriteria == Project.ListProjectResourcesCriteria.SkipProjectResources) { sb.and("accountType", sb.entity().getAccountType(), SearchCriteria.Op.NEQ); } } } private void buildAffinityGroupViewSearchCriteria(SearchCriteria sc, Long domainId, boolean isRecursive, List permittedAccounts, ListProjectResourcesCriteria listProjectResourcesCriteria) { if (listProjectResourcesCriteria != null) { sc.setParameters("accountType", Account.ACCOUNT_TYPE_PROJECT); } if (!permittedAccounts.isEmpty()) { sc.setParameters("accountIdIN", permittedAccounts.toArray()); } else if (domainId != null) { DomainVO domain = _domainDao.findById(domainId); if (isRecursive) { sc.setParameters("domainPath", domain.getPath() + "%"); } else { sc.setParameters("domainId", domainId); } } } private SearchCriteria buildAffinityGroupSearchCriteria(Long domainId, boolean isRecursive, List permittedAccounts, ListProjectResourcesCriteria listProjectResourcesCriteria, Long affinityGroupId, String affinityGroupName, String affinityGroupType, String keyword) { SearchBuilder groupSearch = _affinityGroupJoinDao.createSearchBuilder(); buildAffinityGroupViewSearchBuilder(groupSearch, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); groupSearch.select(null, Func.DISTINCT, groupSearch.entity().getId()); // select // distinct SearchCriteria sc = groupSearch.create(); buildAffinityGroupViewSearchCriteria(sc, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); if (affinityGroupId != null) { sc.addAnd("id", SearchCriteria.Op.EQ, affinityGroupId); } if (affinityGroupName != null) { sc.addAnd("name", SearchCriteria.Op.EQ, affinityGroupName); } if (affinityGroupType != null) { sc.addAnd("type", SearchCriteria.Op.EQ, affinityGroupType); } if (keyword != null) { SearchCriteria ssc = _affinityGroupJoinDao.createSearchCriteria(); ssc.addOr("name", SearchCriteria.Op.LIKE, "%" + keyword + "%"); ssc.addOr("type", SearchCriteria.Op.LIKE, "%" + keyword + "%"); sc.addAnd("name", SearchCriteria.Op.SC, ssc); } return sc; } private Pair, Integer> listAffinityGroupsByVM(long vmId, long pageInd, long pageSize) { Filter sf = new Filter(SecurityGroupVMMapVO.class, null, true, pageInd, pageSize); Pair, Integer> agVmMappingPair = _affinityGroupVMMapDao.listByInstanceId(vmId, sf); Integer count = agVmMappingPair.second(); if (count.intValue() == 0) { // handle empty result cases return new Pair, Integer>(new ArrayList(), count); } List agVmMappings = agVmMappingPair.first(); Long[] agIds = new Long[agVmMappings.size()]; int i = 0; for (AffinityGroupVMMapVO agVm : agVmMappings) { agIds[i++] = agVm.getAffinityGroupId(); } List ags = _affinityGroupJoinDao.searchByIds(agIds); return new Pair, Integer>(ags, count); } private List listDomainLevelAffinityGroups(SearchCriteria sc, Filter searchFilter, long domainId) { List affinityGroupIds = new ArrayList(); Set allowedDomains = _domainMgr.getDomainParentIds(domainId); List maps = _affinityGroupDomainMapDao.listByDomain(allowedDomains.toArray()); for (AffinityGroupDomainMapVO map : maps) { boolean subdomainAccess = map.isSubdomainAccess(); if (map.getDomainId() == domainId || subdomainAccess) { affinityGroupIds.add(map.getAffinityGroupId()); } } if (!affinityGroupIds.isEmpty()) { SearchCriteria domainSC = _affinityGroupJoinDao.createSearchCriteria(); domainSC.addAnd("id", SearchCriteria.Op.IN, affinityGroupIds.toArray()); domainSC.addAnd("aclType", SearchCriteria.Op.EQ, ACLType.Domain.toString()); sc.addAnd("id", SearchCriteria.Op.SC, domainSC); Pair, Integer> uniqueGroupsPair = _affinityGroupJoinDao.searchAndCount(sc, searchFilter); // search group by ids Integer count = uniqueGroupsPair.second(); if (count.intValue() == 0) { // empty result return new ArrayList(); } List uniqueGroups = uniqueGroupsPair.first(); Long[] vrIds = new Long[uniqueGroups.size()]; int i = 0; for (AffinityGroupJoinVO v : uniqueGroups) { vrIds[i++] = v.getId(); } List vrs = _affinityGroupJoinDao.searchByIds(vrIds); return vrs; } else { return new ArrayList(); } } @Override public List listResourceDetails(ListResourceDetailsCmd cmd) { String key = cmd.getKey(); Boolean forDisplay = cmd.getDisplay(); ResourceTag.ResourceObjectType resourceType = cmd.getResourceType(); String resourceIdStr = cmd.getResourceId(); String value = cmd.getValue(); Long resourceId = null; //Validation - 1.1 - resourceId and value cant be null. if(resourceIdStr == null && value == null){ throw new InvalidParameterValueException("Insufficient parameters passed for listing by resourceId OR key,value pair. Please check your params and try again."); } //Validation - 1.2 - Value has to be passed along with key. if(value != null && key == null){ throw new InvalidParameterValueException("Listing by (key, value) but key is null. Please check the params and try again"); } //Validation - 1.3 if (resourceIdStr != null) { resourceId = _taggedResourceMgr.getResourceId(resourceIdStr, resourceType); if (resourceId == null) { throw new InvalidParameterValueException("Cannot find resource with resourceId " + resourceIdStr + " and of resource type " + resourceType); } } List detailList = new ArrayList(); ResourceDetail requestedDetail = null; if (key == null) { detailList = _resourceMetaDataMgr.getDetailsList(resourceId, resourceType, forDisplay); } else if (value == null){ requestedDetail = _resourceMetaDataMgr.getDetail(resourceId, resourceType, key); if (requestedDetail != null && forDisplay != null && requestedDetail.isDisplay() != forDisplay) { requestedDetail = null; } }else { detailList = _resourceMetaDataMgr.getDetails(resourceType, key, value, forDisplay); } List responseList = new ArrayList(); if (requestedDetail != null) { ResourceDetailResponse detailResponse = createResourceDetailsResponse(requestedDetail, resourceType); responseList.add(detailResponse); } else { for (ResourceDetail detail : detailList) { ResourceDetailResponse detailResponse = createResourceDetailsResponse(detail, resourceType); responseList.add(detailResponse); } } return responseList; } protected ResourceDetailResponse createResourceDetailsResponse(ResourceDetail requestedDetail, ResourceTag.ResourceObjectType resourceType) { ResourceDetailResponse resourceDetailResponse = new ResourceDetailResponse(); resourceDetailResponse.setResourceId(String.valueOf(requestedDetail.getResourceId())); resourceDetailResponse.setName(requestedDetail.getName()); resourceDetailResponse.setValue(requestedDetail.getValue()); resourceDetailResponse.setForDisplay(requestedDetail.isDisplay()); resourceDetailResponse.setResourceType(resourceType.toString().toString()); resourceDetailResponse.setObjectName("resourcedetail"); return resourceDetailResponse; } }