@Transactional(readOnly = true) private List<VmInstanceVO> getCandidateVmForAttaching(String accountUuid) { List<String> vmUuids = acntMgr.getResourceUuidsCanAccessByAccount(accountUuid, VmInstanceVO.class); if (vmUuids != null && vmUuids.isEmpty()) { return new ArrayList<VmInstanceVO>(); } TypedQuery<VmInstanceVO> q = null; String sql; if (vmUuids == null) { // all vms if (self.getStatus() == VolumeStatus.Ready) { sql = "select vm from VmInstanceVO vm, PrimaryStorageClusterRefVO ref, VolumeVO vol where vm.state in (:vmStates) and vol.uuid = :volUuid and vm.hypervisorType in (:hvTypes) and vm.clusterUuid = ref.clusterUuid and ref.primaryStorageUuid = vol.primaryStorageUuid group by vm.uuid"; q = dbf.getEntityManager().createQuery(sql, VmInstanceVO.class); q.setParameter("volUuid", self.getUuid()); List<String> hvTypes = VolumeFormat.valueOf(self.getFormat()) .getHypervisorTypesSupportingThisVolumeFormatInString(); q.setParameter("hvTypes", hvTypes); } else if (self.getStatus() == VolumeStatus.NotInstantiated) { sql = "select vm from VmInstanceVO vm where vm.state in (:vmStates) group by vm.uuid"; q = dbf.getEntityManager().createQuery(sql, VmInstanceVO.class); } else { DebugUtils.Assert( false, String.format("should not reach here, volume[uuid:%s]", self.getUuid())); } } else { if (self.getStatus() == VolumeStatus.Ready) { sql = "select vm from VmInstanceVO vm, PrimaryStorageClusterRefVO ref, VolumeVO vol where vm.uuid in (:vmUuids) and vm.state in (:vmStates) and vol.uuid = :volUuid and vm.hypervisorType in (:hvTypes) and vm.clusterUuid = ref.clusterUuid and ref.primaryStorageUuid = vol.primaryStorageUuid group by vm.uuid"; q = dbf.getEntityManager().createQuery(sql, VmInstanceVO.class); q.setParameter("volUuid", self.getUuid()); List<String> hvTypes = VolumeFormat.valueOf(self.getFormat()) .getHypervisorTypesSupportingThisVolumeFormatInString(); q.setParameter("hvTypes", hvTypes); } else if (self.getStatus() == VolumeStatus.NotInstantiated) { sql = "select vm from VmInstanceVO vm where vm.uuid in (:vmUuids) and vm.state in (:vmStates) group by vm.uuid"; q = dbf.getEntityManager().createQuery(sql, VmInstanceVO.class); } else { DebugUtils.Assert( false, String.format("should not reach here, volume[uuid:%s]", self.getUuid())); } q.setParameter("vmUuids", vmUuids); } q.setParameter("vmStates", Arrays.asList(VmInstanceState.Running, VmInstanceState.Stopped)); List<VmInstanceVO> vms = q.getResultList(); if (vms.isEmpty()) { return vms; } VolumeInventory vol = getSelfInventory(); for (VolumeGetAttachableVmExtensionPoint ext : pluginRgty.getExtensionList(VolumeGetAttachableVmExtensionPoint.class)) { vms = ext.returnAttachableVms(vol, vms); } return vms; }