Search in sources :

Example 46 with VolumeInfo

use of org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo in project cloudstack by apache.

the class SolidFirePrimaryDataStoreDriver method getDataObjectSizeIncludingHypervisorSnapshotReserve.

@Override
public long getDataObjectSizeIncludingHypervisorSnapshotReserve(DataObject dataObject, StoragePool pool) {
    long volumeSize = 0;
    if (dataObject.getType() == DataObjectType.VOLUME) {
        VolumeInfo volume = (VolumeInfo) dataObject;
        volumeSize = getVolumeSizeIncludingHypervisorSnapshotReserve(volume.getSize(), volume.getHypervisorSnapshotReserve());
    } else if (dataObject.getType() == DataObjectType.TEMPLATE) {
        TemplateInfo templateInfo = (TemplateInfo) dataObject;
        // TemplateInfo sometimes has a size equal to null.
        long templateSize = templateInfo.getSize() != null ? templateInfo.getSize() : 0;
        volumeSize = (long) (templateSize + templateSize * (LOWEST_HYPERVISOR_SNAPSHOT_RESERVE / 100f));
    }
    return volumeSize;
}
Also used : TemplateInfo(org.apache.cloudstack.engine.subsystem.api.storage.TemplateInfo) VolumeInfo(org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo)

Example 47 with VolumeInfo

use of org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo in project cloudstack by apache.

the class SolidFirePrimaryDataStoreDriver method resize.

@Override
public void resize(DataObject dataObject, AsyncCompletionCallback<CreateCmdResult> callback) {
    String iqn = null;
    String errMsg = null;
    if (dataObject.getType() == DataObjectType.VOLUME) {
        VolumeInfo volumeInfo = (VolumeInfo) dataObject;
        iqn = volumeInfo.get_iScsiName();
        long storagePoolId = volumeInfo.getPoolId();
        long sfVolumeId = Long.parseLong(volumeInfo.getFolder());
        ResizeVolumePayload payload = (ResizeVolumePayload) volumeInfo.getpayload();
        SolidFireUtil.SolidFireConnection sfConnection = SolidFireUtil.getSolidFireConnection(storagePoolId, storagePoolDetailsDao);
        SolidFireUtil.SolidFireVolume sfVolume = SolidFireUtil.getVolume(sfConnection, sfVolumeId);
        verifySufficientIopsForStoragePool(storagePoolId, volumeInfo.getId(), payload.newMinIops);
        verifySufficientBytesForStoragePool(storagePoolId, volumeInfo.getId(), payload.newSize, payload.newHypervisorSnapshotReserve);
        long sfNewVolumeSize = sfVolume.getTotalSize();
        Integer hsr = volumeInfo.getHypervisorSnapshotReserve();
        if (payload.newSize != null || payload.newHypervisorSnapshotReserve != null) {
            if (payload.newHypervisorSnapshotReserve != null) {
                if (hsr != null) {
                    if (payload.newHypervisorSnapshotReserve > hsr) {
                        hsr = payload.newHypervisorSnapshotReserve;
                    }
                } else {
                    hsr = payload.newHypervisorSnapshotReserve;
                }
            }
            sfNewVolumeSize = getVolumeSizeIncludingHypervisorSnapshotReserve(payload.newSize, hsr);
        }
        Map<String, String> mapAttributes = new HashMap<>();
        mapAttributes.put(SolidFireUtil.CloudStackVolumeId, String.valueOf(volumeInfo.getId()));
        mapAttributes.put(SolidFireUtil.CloudStackVolumeSize, NumberFormat.getInstance().format(payload.newSize));
        SolidFireUtil.modifyVolume(sfConnection, sfVolumeId, sfNewVolumeSize, mapAttributes, payload.newMinIops, payload.newMaxIops, getDefaultBurstIops(storagePoolId, payload.newMaxIops));
        VolumeVO volume = volumeDao.findById(volumeInfo.getId());
        volume.setMinIops(payload.newMinIops);
        volume.setMaxIops(payload.newMaxIops);
        volume.setHypervisorSnapshotReserve(hsr);
        volumeDao.update(volume.getId(), volume);
        // SolidFireUtil.VOLUME_SIZE was introduced in 4.5.
        updateVolumeDetails(volume.getId(), sfNewVolumeSize);
    } else {
        errMsg = "Invalid DataObjectType (" + dataObject.getType() + ") passed to resize";
    }
    CreateCmdResult result = new CreateCmdResult(iqn, new Answer(null, errMsg == null, errMsg));
    result.setResult(errMsg);
    callback.complete(result);
}
Also used : HashMap(java.util.HashMap) VolumeInfo(org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo) CreateCmdResult(org.apache.cloudstack.engine.subsystem.api.storage.CreateCmdResult) CreateObjectAnswer(org.apache.cloudstack.storage.command.CreateObjectAnswer) Answer(com.cloud.agent.api.Answer) VolumeVO(com.cloud.storage.VolumeVO) ResizeVolumePayload(com.cloud.storage.ResizeVolumePayload) SolidFireUtil(org.apache.cloudstack.storage.datastore.util.SolidFireUtil)

Example 48 with VolumeInfo

use of org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo in project cloudstack by apache.

the class SolidFirePrimaryDataStoreDriver method getSolidFireVolumeId.

private long getSolidFireVolumeId(DataObject dataObject, boolean grantAccess) {
    if (dataObject.getType() == DataObjectType.VOLUME) {
        final VolumeInfo volumeInfo = (VolumeInfo) dataObject;
        final long volumeId = volumeInfo.getId();
        if (grantAccess && isBasicGrantAccess(volumeId)) {
            volumeDetailsDao.removeDetail(volumeInfo.getId(), BASIC_GRANT_ACCESS);
            final Long sfVolumeId = getBasicSfVolumeId(volumeId);
            Preconditions.checkNotNull(sfVolumeId, "'sfVolumeId' should not be 'null' (basic grant access).");
            return sfVolumeId;
        } else if (!grantAccess && isBasicRevokeAccess(volumeId)) {
            volumeDetailsDao.removeDetail(volumeInfo.getId(), BASIC_REVOKE_ACCESS);
            final Long sfVolumeId = getBasicSfVolumeId(volumeId);
            Preconditions.checkNotNull(sfVolumeId, "'sfVolumeId' should not be 'null' (basic revoke access).");
            return sfVolumeId;
        }
        return Long.parseLong(volumeInfo.getFolder());
    }
    if (dataObject.getType() == DataObjectType.SNAPSHOT) {
        SnapshotDetailsVO snapshotDetails = snapshotDetailsDao.findDetail(dataObject.getId(), SolidFireUtil.VOLUME_ID);
        if (snapshotDetails == null || snapshotDetails.getValue() == null) {
            throw new CloudRuntimeException("Unable to locate the volume ID associated with the following snapshot ID: " + dataObject.getId());
        }
        return Long.parseLong(snapshotDetails.getValue());
    }
    if (dataObject.getType() == DataObjectType.TEMPLATE) {
        return getVolumeIdFrom_iScsiPath(((TemplateInfo) dataObject).getInstallPath());
    }
    throw new CloudRuntimeException("Invalid DataObjectType (" + dataObject.getType() + ") passed to getSolidFireVolumeId(DataObject, boolean)");
}
Also used : CloudRuntimeException(com.cloud.utils.exception.CloudRuntimeException) VolumeInfo(org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo) SnapshotDetailsVO(com.cloud.storage.dao.SnapshotDetailsVO)

Example 49 with VolumeInfo

use of org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo in project cloudstack by apache.

the class VolumeServiceImpl method copyVolumeFromPrimaryToImage.

protected AsyncCallFuture<VolumeApiResult> copyVolumeFromPrimaryToImage(VolumeInfo srcVolume, DataStore destStore) {
    AsyncCallFuture<VolumeApiResult> future = new AsyncCallFuture<VolumeApiResult>();
    VolumeApiResult res = new VolumeApiResult(srcVolume);
    VolumeInfo destVolume = null;
    try {
        destVolume = (VolumeInfo) destStore.create(srcVolume);
        // this is just used for locking that src volume record in DB to avoid using lock
        srcVolume.processEvent(Event.MigrationRequested);
        destVolume.processEventOnly(Event.CreateOnlyRequested);
        CopyVolumeContext<VolumeApiResult> context = new CopyVolumeContext<VolumeApiResult>(null, future, srcVolume, destVolume, destStore);
        AsyncCallbackDispatcher<VolumeServiceImpl, CopyCommandResult> caller = AsyncCallbackDispatcher.create(this);
        caller.setCallback(caller.getTarget().copyVolumeFromPrimaryToImageCallback(null, null)).setContext(context);
        motionSrv.copyAsync(srcVolume, destVolume, caller);
        return future;
    } catch (Exception e) {
        s_logger.error("failed to copy volume to image store", e);
        if (destVolume != null) {
            destVolume.getDataStore().delete(destVolume);
        }
        // unlock source volume record
        srcVolume.processEvent(Event.OperationFailed);
        res.setResult(e.toString());
        future.complete(res);
        return future;
    }
}
Also used : AsyncCallFuture(org.apache.cloudstack.framework.async.AsyncCallFuture) VolumeInfo(org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo) CopyCommandResult(org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult) ResourceAllocationException(com.cloud.exception.ResourceAllocationException) ConcurrentOperationException(com.cloud.exception.ConcurrentOperationException) CloudRuntimeException(com.cloud.utils.exception.CloudRuntimeException)

Example 50 with VolumeInfo

use of org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo in project cloudstack by apache.

the class VolumeServiceImpl method copyVolumeFromPrimaryToImageCallback.

protected Void copyVolumeFromPrimaryToImageCallback(AsyncCallbackDispatcher<VolumeServiceImpl, CopyCommandResult> callback, CopyVolumeContext<VolumeApiResult> context) {
    VolumeInfo srcVolume = context.srcVolume;
    VolumeInfo destVolume = context.destVolume;
    CopyCommandResult result = callback.getResult();
    AsyncCallFuture<VolumeApiResult> future = context.future;
    VolumeApiResult res = new VolumeApiResult(destVolume);
    try {
        if (result.isFailed()) {
            // back to Ready state in Volume table
            srcVolume.processEvent(Event.OperationFailed);
            destVolume.processEventOnly(Event.OperationFailed);
            res.setResult(result.getResult());
            future.complete(res);
        } else {
            // back to Ready state in Volume table
            srcVolume.processEvent(Event.OperationSuccessed);
            destVolume.processEventOnly(Event.OperationSuccessed, result.getAnswer());
            future.complete(res);
        }
    } catch (Exception e) {
        res.setResult(e.toString());
        future.complete(res);
    }
    return null;
}
Also used : VolumeInfo(org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo) CopyCommandResult(org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult) ResourceAllocationException(com.cloud.exception.ResourceAllocationException) ConcurrentOperationException(com.cloud.exception.ConcurrentOperationException) CloudRuntimeException(com.cloud.utils.exception.CloudRuntimeException)

Aggregations

VolumeInfo (org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo)112 CloudRuntimeException (com.cloud.utils.exception.CloudRuntimeException)51 DataStore (org.apache.cloudstack.engine.subsystem.api.storage.DataStore)50 VolumeVO (com.cloud.storage.VolumeVO)36 ConcurrentOperationException (com.cloud.exception.ConcurrentOperationException)23 ResourceAllocationException (com.cloud.exception.ResourceAllocationException)22 ExecutionException (java.util.concurrent.ExecutionException)22 VolumeApiResult (org.apache.cloudstack.engine.subsystem.api.storage.VolumeService.VolumeApiResult)22 InvalidParameterValueException (com.cloud.exception.InvalidParameterValueException)19 StoragePoolVO (org.apache.cloudstack.storage.datastore.db.StoragePoolVO)19 CopyCommandResult (org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult)18 SnapshotInfo (org.apache.cloudstack.engine.subsystem.api.storage.SnapshotInfo)17 ArrayList (java.util.ArrayList)15 HashMap (java.util.HashMap)15 StorageUnavailableException (com.cloud.exception.StorageUnavailableException)13 Map (java.util.Map)13 SnapshotVO (com.cloud.storage.SnapshotVO)12 DB (com.cloud.utils.db.DB)12 Test (org.testng.annotations.Test)12 Account (com.cloud.user.Account)11