Search in sources :

Example 31 with StoragePoolVO

use of org.apache.cloudstack.storage.datastore.db.StoragePoolVO in project cloudstack by apache.

the class AbstractStoragePoolAllocator method filter.

protected boolean filter(ExcludeList avoid, StoragePool pool, DiskProfile dskCh, DeploymentPlan plan) {
    if (s_logger.isDebugEnabled()) {
        s_logger.debug("Checking if storage pool is suitable, name: " + pool.getName() + " ,poolId: " + pool.getId());
    }
    if (avoid.shouldAvoid(pool)) {
        if (s_logger.isDebugEnabled()) {
            s_logger.debug("StoragePool is in avoid set, skipping this pool");
        }
        return false;
    }
    Long clusterId = pool.getClusterId();
    if (clusterId != null) {
        ClusterVO cluster = clusterDao.findById(clusterId);
        if (!(cluster.getHypervisorType() == dskCh.getHypervisorType())) {
            if (s_logger.isDebugEnabled()) {
                s_logger.debug("StoragePool's Cluster does not have required hypervisorType, skipping this pool");
            }
            return false;
        }
    } else if (pool.getHypervisor() != null && !pool.getHypervisor().equals(HypervisorType.Any) && !(pool.getHypervisor() == dskCh.getHypervisorType())) {
        if (s_logger.isDebugEnabled()) {
            s_logger.debug("StoragePool does not have required hypervisorType, skipping this pool");
        }
        return false;
    }
    if (!checkDiskProvisioningSupport(dskCh, pool)) {
        return false;
    }
    if (!checkHypervisorCompatibility(dskCh.getHypervisorType(), dskCh.getType(), pool.getPoolType())) {
        return false;
    }
    Volume volume = volumeDao.findById(dskCh.getVolumeId());
    if (!storageMgr.storagePoolCompatibleWithVolumePool(pool, volume)) {
        return false;
    }
    if (pool.isManaged() && !storageUtil.managedStoragePoolCanScale(pool, plan.getClusterId(), plan.getHostId())) {
        return false;
    }
    // check capacity
    List<Pair<Volume, DiskProfile>> requestVolumeDiskProfilePairs = new ArrayList<>();
    requestVolumeDiskProfilePairs.add(new Pair<>(volume, dskCh));
    if (dskCh.getHypervisorType() == HypervisorType.VMware) {
        // Skip the parent datastore cluster, consider only child storage pools in it
        if (pool.getPoolType() == Storage.StoragePoolType.DatastoreCluster && storageMgr.isStoragePoolDatastoreClusterParent(pool)) {
            return false;
        }
        // Skip the storage pool whose parent datastore cluster is not in UP state.
        if (pool.getParent() != 0L) {
            StoragePoolVO datastoreCluster = storagePoolDao.findById(pool.getParent());
            if (datastoreCluster == null || (datastoreCluster != null && datastoreCluster.getStatus() != StoragePoolStatus.Up)) {
                return false;
            }
        }
        try {
            boolean isStoragePoolStoragepolicyComplaince = storageMgr.isStoragePoolCompliantWithStoragePolicy(requestVolumeDiskProfilePairs, pool);
            if (!isStoragePoolStoragepolicyComplaince) {
                return false;
            }
        } catch (StorageUnavailableException e) {
            s_logger.warn(String.format("Could not verify storage policy complaince against storage pool %s due to exception %s", pool.getUuid(), e.getMessage()));
            return false;
        }
    }
    return storageMgr.storagePoolHasEnoughIops(requestVolumeDiskProfilePairs, pool) && storageMgr.storagePoolHasEnoughSpace(requestVolumeDiskProfilePairs, pool, plan.getClusterId());
}
Also used : ClusterVO(com.cloud.dc.ClusterVO) StorageUnavailableException(com.cloud.exception.StorageUnavailableException) Volume(com.cloud.storage.Volume) ArrayList(java.util.ArrayList) StoragePoolVO(org.apache.cloudstack.storage.datastore.db.StoragePoolVO) Pair(com.cloud.utils.Pair)

Example 32 with StoragePoolVO

use of org.apache.cloudstack.storage.datastore.db.StoragePoolVO in project cloudstack by apache.

the class VMSnapshotHelperImpl method getStoragePoolForVM.

@Override
public Long getStoragePoolForVM(Long vmId) {
    List<VolumeVO> rootVolumes = volumeDao.findReadyRootVolumesByInstance(vmId);
    if (rootVolumes == null || rootVolumes.isEmpty()) {
        throw new InvalidParameterValueException("Failed to find root volume for the user vm:" + vmId);
    }
    VolumeVO rootVolume = rootVolumes.get(0);
    StoragePoolVO rootVolumePool = primaryDataStoreDao.findById(rootVolume.getPoolId());
    if (rootVolumePool == null) {
        throw new InvalidParameterValueException("Failed to find root volume storage pool for the user vm:" + vmId);
    }
    if (rootVolumePool.isInMaintenance()) {
        throw new InvalidParameterValueException("Storage pool for the user vm:" + vmId + " is in maintenance");
    }
    return rootVolumePool.getId();
}
Also used : VolumeVO(com.cloud.storage.VolumeVO) InvalidParameterValueException(com.cloud.exception.InvalidParameterValueException) StoragePoolVO(org.apache.cloudstack.storage.datastore.db.StoragePoolVO)

Example 33 with StoragePoolVO

use of org.apache.cloudstack.storage.datastore.db.StoragePoolVO in project cloudstack by apache.

the class VMSnapshotHelperImpl method pickRunningHost.

@Override
public Long pickRunningHost(Long vmId) {
    UserVmVO vm = userVmDao.findById(vmId);
    // use VM's host if VM is running
    if (vm.getState() == VirtualMachine.State.Running)
        return vm.getHostId();
    // check if lastHostId is available
    if (vm.getLastHostId() != null) {
        HostVO lastHost = hostDao.findByIdIncludingRemoved(vm.getLastHostId());
        if (lastHost.getStatus() == com.cloud.host.Status.Up && !lastHost.isInMaintenanceStates())
            return lastHost.getId();
    }
    List<VolumeVO> listVolumes = volumeDao.findByInstance(vmId);
    if (listVolumes == null || listVolumes.size() == 0) {
        throw new InvalidParameterValueException("vmInstance has no volumes");
    }
    VolumeVO volume = listVolumes.get(0);
    Long poolId = volume.getPoolId();
    if (poolId == null) {
        throw new InvalidParameterValueException("pool id is not found");
    }
    StoragePoolVO storagePool = primaryDataStoreDao.findById(poolId);
    if (storagePool == null) {
        throw new InvalidParameterValueException("storage pool is not found");
    }
    List<HostVO> listHost = hostDao.listAllUpAndEnabledNonHAHosts(Host.Type.Routing, storagePool.getClusterId(), storagePool.getPodId(), storagePool.getDataCenterId(), null);
    if (listHost == null || listHost.size() == 0) {
        throw new InvalidParameterValueException("no host in up state is found");
    }
    return listHost.get(0).getId();
}
Also used : UserVmVO(com.cloud.vm.UserVmVO) VolumeVO(com.cloud.storage.VolumeVO) InvalidParameterValueException(com.cloud.exception.InvalidParameterValueException) StoragePoolVO(org.apache.cloudstack.storage.datastore.db.StoragePoolVO) HostVO(com.cloud.host.HostVO)

Example 34 with StoragePoolVO

use of org.apache.cloudstack.storage.datastore.db.StoragePoolVO in project cloudstack by apache.

the class DefaultHostListener method updateStoragePoolHostVOAndDetails.

private void updateStoragePoolHostVOAndDetails(StoragePool pool, long hostId, ModifyStoragePoolAnswer mspAnswer) {
    StoragePoolHostVO poolHost = storagePoolHostDao.findByPoolHost(pool.getId(), hostId);
    if (poolHost == null) {
        poolHost = new StoragePoolHostVO(pool.getId(), hostId, mspAnswer.getPoolInfo().getLocalPath().replaceAll("//", "/"));
        storagePoolHostDao.persist(poolHost);
    } else {
        poolHost.setLocalPath(mspAnswer.getPoolInfo().getLocalPath().replaceAll("//", "/"));
    }
    StoragePoolVO poolVO = this.primaryStoreDao.findById(pool.getId());
    poolVO.setUsedBytes(mspAnswer.getPoolInfo().getCapacityBytes() - mspAnswer.getPoolInfo().getAvailableBytes());
    poolVO.setCapacityBytes(mspAnswer.getPoolInfo().getCapacityBytes());
    if (StringUtils.isNotEmpty(mspAnswer.getPoolType())) {
        StoragePoolDetailVO poolType = storagePoolDetailsDao.findDetail(pool.getId(), "pool_type");
        if (poolType == null) {
            StoragePoolDetailVO storagePoolDetailVO = new StoragePoolDetailVO(pool.getId(), "pool_type", mspAnswer.getPoolType(), false);
            storagePoolDetailsDao.persist(storagePoolDetailVO);
        }
    }
    primaryStoreDao.update(pool.getId(), poolVO);
}
Also used : StoragePoolHostVO(com.cloud.storage.StoragePoolHostVO) StoragePoolVO(org.apache.cloudstack.storage.datastore.db.StoragePoolVO) StoragePoolDetailVO(org.apache.cloudstack.storage.datastore.db.StoragePoolDetailVO)

Example 35 with StoragePoolVO

use of org.apache.cloudstack.storage.datastore.db.StoragePoolVO in project cloudstack by apache.

the class DefaultHostListener method hostConnect.

@Override
public boolean hostConnect(long hostId, long poolId) throws StorageConflictException {
    StoragePool pool = (StoragePool) this.dataStoreMgr.getDataStore(poolId, DataStoreRole.Primary);
    ModifyStoragePoolCommand cmd = new ModifyStoragePoolCommand(true, pool);
    final Answer answer = agentMgr.easySend(hostId, cmd);
    if (answer == null) {
        throw new CloudRuntimeException("Unable to get an answer to the modify storage pool command" + pool.getId());
    }
    if (!answer.getResult()) {
        String msg = "Unable to attach storage pool" + poolId + " to the host" + hostId;
        alertMgr.sendAlert(AlertManager.AlertType.ALERT_TYPE_HOST, pool.getDataCenterId(), pool.getPodId(), msg, msg);
        throw new CloudRuntimeException("Unable establish connection from storage head to storage pool " + pool.getId() + " due to " + answer.getDetails() + pool.getId());
    }
    assert (answer instanceof ModifyStoragePoolAnswer) : "Well, now why won't you actually return the ModifyStoragePoolAnswer when it's ModifyStoragePoolCommand? Pool=" + pool.getId() + "Host=" + hostId;
    ModifyStoragePoolAnswer mspAnswer = (ModifyStoragePoolAnswer) answer;
    if (mspAnswer.getLocalDatastoreName() != null && pool.isShared()) {
        String datastoreName = mspAnswer.getLocalDatastoreName();
        List<StoragePoolVO> localStoragePools = this.primaryStoreDao.listLocalStoragePoolByPath(pool.getDataCenterId(), datastoreName);
        for (StoragePoolVO localStoragePool : localStoragePools) {
            if (datastoreName.equals(localStoragePool.getPath())) {
                s_logger.warn("Storage pool: " + pool.getId() + " has already been added as local storage: " + localStoragePool.getName());
                throw new StorageConflictException("Cannot add shared storage pool: " + pool.getId() + " because it has already been added as local storage:" + localStoragePool.getName());
            }
        }
    }
    StoragePoolVO poolVO = this.primaryStoreDao.findById(poolId);
    updateStoragePoolHostVOAndDetails(poolVO, hostId, mspAnswer);
    if (pool.getPoolType() == Storage.StoragePoolType.DatastoreCluster) {
        storageManager.syncDatastoreClusterStoragePool(poolId, ((ModifyStoragePoolAnswer) answer).getDatastoreClusterChildren(), hostId);
    }
    storageService.updateStorageCapabilities(poolId, false);
    s_logger.info("Connection established between storage pool " + pool + " and host " + hostId);
    return true;
}
Also used : ModifyStoragePoolAnswer(com.cloud.agent.api.ModifyStoragePoolAnswer) Answer(com.cloud.agent.api.Answer) StoragePool(com.cloud.storage.StoragePool) CloudRuntimeException(com.cloud.utils.exception.CloudRuntimeException) ModifyStoragePoolAnswer(com.cloud.agent.api.ModifyStoragePoolAnswer) StoragePoolVO(org.apache.cloudstack.storage.datastore.db.StoragePoolVO) StorageConflictException(com.cloud.exception.StorageConflictException) ModifyStoragePoolCommand(com.cloud.agent.api.ModifyStoragePoolCommand)

Aggregations

StoragePoolVO (org.apache.cloudstack.storage.datastore.db.StoragePoolVO)276 CloudRuntimeException (com.cloud.utils.exception.CloudRuntimeException)106 VMTemplateStoragePoolVO (com.cloud.storage.VMTemplateStoragePoolVO)75 ArrayList (java.util.ArrayList)54 VolumeVO (com.cloud.storage.VolumeVO)53 HostVO (com.cloud.host.HostVO)46 InvalidParameterValueException (com.cloud.exception.InvalidParameterValueException)45 DataStore (org.apache.cloudstack.engine.subsystem.api.storage.DataStore)45 HashMap (java.util.HashMap)44 Answer (com.cloud.agent.api.Answer)38 VolumeInfo (org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo)35 StoragePool (com.cloud.storage.StoragePool)33 Test (org.junit.Test)33 VMInstanceVO (com.cloud.vm.VMInstanceVO)25 Map (java.util.Map)25 Account (com.cloud.user.Account)24 HypervisorType (com.cloud.hypervisor.Hypervisor.HypervisorType)20 ExecutionException (java.util.concurrent.ExecutionException)20 ConcurrentOperationException (com.cloud.exception.ConcurrentOperationException)19 ClusterVO (com.cloud.dc.ClusterVO)18