@Override protected List<StoragePool> select( DiskProfile dskCh, VirtualMachineProfile vmProfile, DeploymentPlan plan, ExcludeList avoid, int returnUpTo) { List<StoragePool> suitablePools = new ArrayList<StoragePool>(); s_logger.debug("LocalStoragePoolAllocator trying to find storage pool to fit the vm"); if (!dskCh.useLocalStorage()) { return suitablePools; } // data disk and host identified from deploying vm (attach volume case) if (dskCh.getType() == Volume.Type.DATADISK && plan.getHostId() != null) { List<StoragePoolHostVO> hostPools = _poolHostDao.listByHostId(plan.getHostId()); for (StoragePoolHostVO hostPool : hostPools) { StoragePoolVO pool = _storagePoolDao.findById(hostPool.getPoolId()); if (pool != null && pool.isLocal()) { StoragePool pol = (StoragePool) this.dataStoreMgr.getPrimaryDataStore(pool.getId()); if (filter(avoid, pol, dskCh, plan)) { s_logger.debug( "Found suitable local storage pool " + pool.getId() + ", adding to list"); suitablePools.add(pol); } else { avoid.addPool(pool.getId()); } } if (suitablePools.size() == returnUpTo) { break; } } } else { if (plan.getPodId() == null) { // zone wide primary storage deployment return null; } List<StoragePoolVO> availablePools = _storagePoolDao.findLocalStoragePoolsByTags( plan.getDataCenterId(), plan.getPodId(), plan.getClusterId(), dskCh.getTags()); for (StoragePoolVO pool : availablePools) { if (suitablePools.size() == returnUpTo) { break; } StoragePool pol = (StoragePool) this.dataStoreMgr.getPrimaryDataStore(pool.getId()); if (filter(avoid, pol, dskCh, plan)) { suitablePools.add(pol); } else { avoid.addPool(pool.getId()); } } // add remaining pools in cluster, that did not match tags, to avoid // set List<StoragePoolVO> allPools = _storagePoolDao.findLocalStoragePoolsByTags( plan.getDataCenterId(), plan.getPodId(), plan.getClusterId(), null); allPools.removeAll(availablePools); for (StoragePoolVO pool : allPools) { avoid.addPool(pool.getId()); } } if (s_logger.isDebugEnabled()) { s_logger.debug( "LocalStoragePoolAllocator returning " + suitablePools.size() + " suitable storage pools"); } return suitablePools; }