Search in sources :

Example 1 with PrimaryDataStoreImpl

use of org.apache.cloudstack.storage.datastore.PrimaryDataStoreImpl in project cloudstack by apache.

the class XenserverSnapshotStrategy method deleteSnapshot.

@Override
public boolean deleteSnapshot(Long snapshotId) {
    SnapshotVO snapshotVO = snapshotDao.findById(snapshotId);
    if (snapshotVO.getState() == Snapshot.State.Allocated) {
        snapshotDao.remove(snapshotId);
        return true;
    }
    if (snapshotVO.getState() == Snapshot.State.Destroyed) {
        return true;
    }
    if (Snapshot.State.Error.equals(snapshotVO.getState())) {
        List<SnapshotDataStoreVO> storeRefs = snapshotStoreDao.findBySnapshotId(snapshotId);
        for (SnapshotDataStoreVO ref : storeRefs) {
            snapshotStoreDao.expunge(ref.getId());
        }
        snapshotDao.remove(snapshotId);
        return true;
    }
    if (snapshotVO.getState() == Snapshot.State.CreatedOnPrimary) {
        s_logger.debug("delete snapshot on primary storage:");
        snapshotVO.setState(Snapshot.State.Destroyed);
        snapshotDao.update(snapshotId, snapshotVO);
        return true;
    }
    if (!Snapshot.State.BackedUp.equals(snapshotVO.getState()) && !Snapshot.State.Error.equals(snapshotVO.getState())) {
        throw new InvalidParameterValueException("Can't delete snapshotshot " + snapshotId + " due to it is in " + snapshotVO.getState() + " Status");
    }
    // first mark the snapshot as destroyed, so that ui can't see it, but we
    // may not destroy the snapshot on the storage, as other snapshots may
    // depend on it.
    SnapshotInfo snapshotOnImage = snapshotDataFactory.getSnapshot(snapshotId, DataStoreRole.Image);
    if (snapshotOnImage == null) {
        s_logger.debug("Can't find snapshot on backup storage, delete it in db");
        snapshotDao.remove(snapshotId);
        return true;
    }
    SnapshotObject obj = (SnapshotObject) snapshotOnImage;
    try {
        obj.processEvent(Snapshot.Event.DestroyRequested);
    } catch (NoTransitionException e) {
        s_logger.debug("Failed to set the state to destroying: ", e);
        return false;
    }
    try {
        boolean result = deleteSnapshotChain(snapshotOnImage);
        obj.processEvent(Snapshot.Event.OperationSucceeded);
        if (result) {
            //snapshot is deleted on backup storage, need to delete it on primary storage
            SnapshotDataStoreVO snapshotOnPrimary = snapshotStoreDao.findBySnapshot(snapshotId, DataStoreRole.Primary);
            if (snapshotOnPrimary != null) {
                SnapshotInfo snapshotOnPrimaryInfo = snapshotDataFactory.getSnapshot(snapshotId, DataStoreRole.Primary);
                long volumeId = snapshotOnPrimary.getVolumeId();
                VolumeVO volumeVO = volumeDao.findById(volumeId);
                if (((PrimaryDataStoreImpl) snapshotOnPrimaryInfo.getDataStore()).getPoolType() == StoragePoolType.RBD && volumeVO != null) {
                    snapshotSvr.deleteSnapshot(snapshotOnPrimaryInfo);
                }
                snapshotOnPrimary.setState(State.Destroyed);
                snapshotStoreDao.update(snapshotOnPrimary.getId(), snapshotOnPrimary);
            }
        }
    } catch (Exception e) {
        s_logger.debug("Failed to delete snapshot: ", e);
        try {
            obj.processEvent(Snapshot.Event.OperationFailed);
        } catch (NoTransitionException e1) {
            s_logger.debug("Failed to change snapshot state: " + e.toString());
        }
        return false;
    }
    return true;
}
Also used : SnapshotInfo(org.apache.cloudstack.engine.subsystem.api.storage.SnapshotInfo) SnapshotVO(com.cloud.storage.SnapshotVO) VolumeVO(com.cloud.storage.VolumeVO) InvalidParameterValueException(com.cloud.exception.InvalidParameterValueException) PrimaryDataStoreImpl(org.apache.cloudstack.storage.datastore.PrimaryDataStoreImpl) NoTransitionException(com.cloud.utils.fsm.NoTransitionException) SnapshotDataStoreVO(org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreVO) NoTransitionException(com.cloud.utils.fsm.NoTransitionException) InvalidParameterValueException(com.cloud.exception.InvalidParameterValueException) CloudRuntimeException(com.cloud.utils.exception.CloudRuntimeException)

Example 2 with PrimaryDataStoreImpl

use of org.apache.cloudstack.storage.datastore.PrimaryDataStoreImpl in project cloudstack by apache.

the class XenserverSnapshotStrategy method takeSnapshot.

@Override
@DB
public SnapshotInfo takeSnapshot(SnapshotInfo snapshot) {
    Object payload = snapshot.getPayload();
    if (payload != null) {
        CreateSnapshotPayload createSnapshotPayload = (CreateSnapshotPayload) payload;
        if (createSnapshotPayload.getQuiescevm()) {
            throw new InvalidParameterValueException("can't handle quiescevm equal true for volume snapshot");
        }
    }
    SnapshotVO snapshotVO = snapshotDao.acquireInLockTable(snapshot.getId());
    if (snapshotVO == null) {
        throw new CloudRuntimeException("Failed to get lock on snapshot:" + snapshot.getId());
    }
    try {
        VolumeInfo volumeInfo = snapshot.getBaseVolume();
        volumeInfo.stateTransit(Volume.Event.SnapshotRequested);
        SnapshotResult result = null;
        try {
            result = snapshotSvr.takeSnapshot(snapshot);
            if (result.isFailed()) {
                s_logger.debug("Failed to take snapshot: " + result.getResult());
                throw new CloudRuntimeException(result.getResult());
            }
        } finally {
            if (result != null && result.isSuccess()) {
                volumeInfo.stateTransit(Volume.Event.OperationSucceeded);
            } else {
                volumeInfo.stateTransit(Volume.Event.OperationFailed);
            }
        }
        snapshot = result.getSnapshot();
        DataStore primaryStore = snapshot.getDataStore();
        boolean backupFlag = Boolean.parseBoolean(configDao.getValue(Config.BackupSnapshotAfterTakingSnapshot.toString()));
        SnapshotInfo backupedSnapshot;
        if (backupFlag) {
            backupedSnapshot = backupSnapshot(snapshot);
        } else {
            // Fake it to get the transitions to fire in the proper order
            s_logger.debug("skipping backup of snapshot due to configuration " + Config.BackupSnapshotAfterTakingSnapshot.toString());
            SnapshotObject snapObj = (SnapshotObject) snapshot;
            try {
                snapObj.processEvent(Snapshot.Event.OperationNotPerformed);
            } catch (NoTransitionException e) {
                s_logger.debug("Failed to change state: " + snapshot.getId() + ": " + e.toString());
                throw new CloudRuntimeException(e.toString());
            }
            backupedSnapshot = snapshot;
        }
        try {
            SnapshotInfo parent = snapshot.getParent();
            if (backupedSnapshot != null && parent != null && primaryStore instanceof PrimaryDataStoreImpl) {
                if (((PrimaryDataStoreImpl) primaryStore).getPoolType() != StoragePoolType.RBD) {
                    Long parentSnapshotId = parent.getId();
                    while (parentSnapshotId != null && parentSnapshotId != 0L) {
                        SnapshotDataStoreVO snapshotDataStoreVO = snapshotStoreDao.findByStoreSnapshot(primaryStore.getRole(), primaryStore.getId(), parentSnapshotId);
                        if (snapshotDataStoreVO != null) {
                            parentSnapshotId = snapshotDataStoreVO.getParentSnapshotId();
                            snapshotStoreDao.remove(snapshotDataStoreVO.getId());
                        } else {
                            parentSnapshotId = null;
                        }
                    }
                }
                SnapshotDataStoreVO snapshotDataStoreVO = snapshotStoreDao.findByStoreSnapshot(primaryStore.getRole(), primaryStore.getId(), snapshot.getId());
                if (snapshotDataStoreVO != null) {
                    snapshotDataStoreVO.setParentSnapshotId(0L);
                    snapshotStoreDao.update(snapshotDataStoreVO.getId(), snapshotDataStoreVO);
                }
            }
        } catch (Exception e) {
            s_logger.debug("Failed to clean up snapshots on primary storage", e);
        }
        return backupedSnapshot;
    } finally {
        if (snapshotVO != null) {
            snapshotDao.releaseFromLockTable(snapshot.getId());
        }
    }
}
Also used : SnapshotResult(org.apache.cloudstack.engine.subsystem.api.storage.SnapshotResult) SnapshotDataStoreVO(org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreVO) CreateSnapshotPayload(com.cloud.storage.CreateSnapshotPayload) VolumeInfo(org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo) NoTransitionException(com.cloud.utils.fsm.NoTransitionException) InvalidParameterValueException(com.cloud.exception.InvalidParameterValueException) CloudRuntimeException(com.cloud.utils.exception.CloudRuntimeException) SnapshotInfo(org.apache.cloudstack.engine.subsystem.api.storage.SnapshotInfo) SnapshotVO(com.cloud.storage.SnapshotVO) InvalidParameterValueException(com.cloud.exception.InvalidParameterValueException) CloudRuntimeException(com.cloud.utils.exception.CloudRuntimeException) PrimaryDataStoreImpl(org.apache.cloudstack.storage.datastore.PrimaryDataStoreImpl) DataStore(org.apache.cloudstack.engine.subsystem.api.storage.DataStore) NoTransitionException(com.cloud.utils.fsm.NoTransitionException) DB(com.cloud.utils.db.DB)

Example 3 with PrimaryDataStoreImpl

use of org.apache.cloudstack.storage.datastore.PrimaryDataStoreImpl in project cloudstack by apache.

the class KvmNonManagedStorageSystemDataMotionTest method configureTestInternalCanHandle.

private Map<VolumeInfo, DataStore> configureTestInternalCanHandle(boolean isManagedStorage, StoragePoolType storagePoolType) {
    VolumeObject volumeInfo = Mockito.spy(new VolumeObject());
    Mockito.doReturn(0l).when(volumeInfo).getPoolId();
    DataStore ds = Mockito.spy(new PrimaryDataStoreImpl());
    Mockito.doReturn(0l).when(ds).getId();
    Map<VolumeInfo, DataStore> volumeMap = new HashMap<>();
    volumeMap.put(volumeInfo, ds);
    StoragePoolVO storagePool = Mockito.spy(new StoragePoolVO());
    Mockito.doReturn(storagePoolType).when(storagePool).getPoolType();
    Mockito.doReturn(storagePool).when(primaryDataStoreDao).findById(0l);
    Mockito.doReturn(isManagedStorage).when(storagePool).isManaged();
    return volumeMap;
}
Also used : HashMap(java.util.HashMap) PrimaryDataStoreImpl(org.apache.cloudstack.storage.datastore.PrimaryDataStoreImpl) DataStore(org.apache.cloudstack.engine.subsystem.api.storage.DataStore) VMTemplateStoragePoolVO(com.cloud.storage.VMTemplateStoragePoolVO) StoragePoolVO(org.apache.cloudstack.storage.datastore.db.StoragePoolVO) VolumeInfo(org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo) VolumeObject(org.apache.cloudstack.storage.volume.VolumeObject)

Example 4 with PrimaryDataStoreImpl

use of org.apache.cloudstack.storage.datastore.PrimaryDataStoreImpl in project cloudstack by apache.

the class StorageSystemDataMotionStrategyTest method configureAndTestInternalCanHandle.

private void configureAndTestInternalCanHandle(boolean sPool0IsManaged, boolean sPool1IsManaged, StrategyPriority expectedStrategyPriority) {
    VolumeObject volumeInfo = Mockito.spy(new VolumeObject());
    Mockito.doReturn(0l).when(volumeInfo).getPoolId();
    DataStore ds = Mockito.spy(new PrimaryDataStoreImpl());
    Mockito.doReturn(1l).when(ds).getId();
    Map<VolumeInfo, DataStore> volumeMap = new HashMap<>();
    volumeMap.put(volumeInfo, ds);
    StoragePoolVO storagePool0 = Mockito.spy(new StoragePoolVO());
    Mockito.doReturn(sPool0IsManaged).when(storagePool0).isManaged();
    StoragePoolVO storagePool1 = Mockito.spy(new StoragePoolVO());
    Mockito.doReturn(sPool1IsManaged).when(storagePool1).isManaged();
    Mockito.doReturn(storagePool0).when(primaryDataStoreDao).findById(0l);
    Mockito.doReturn(storagePool1).when(primaryDataStoreDao).findById(1l);
    StrategyPriority strategyPriority = strategy.internalCanHandle(volumeMap, new HostVO("srcHostUuid"), new HostVO("destHostUuid"));
    Assert.assertEquals(expectedStrategyPriority, strategyPriority);
}
Also used : HashMap(java.util.HashMap) PrimaryDataStoreImpl(org.apache.cloudstack.storage.datastore.PrimaryDataStoreImpl) StrategyPriority(org.apache.cloudstack.engine.subsystem.api.storage.StrategyPriority) PrimaryDataStore(org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStore) DataStore(org.apache.cloudstack.engine.subsystem.api.storage.DataStore) StoragePoolVO(org.apache.cloudstack.storage.datastore.db.StoragePoolVO) VolumeInfo(org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo) VolumeObject(org.apache.cloudstack.storage.volume.VolumeObject) HostVO(com.cloud.host.HostVO)

Example 5 with PrimaryDataStoreImpl

use of org.apache.cloudstack.storage.datastore.PrimaryDataStoreImpl in project cloudstack by apache.

the class PrimaryDataStoreProviderManagerImpl method getPrimaryDataStore.

@Override
public PrimaryDataStore getPrimaryDataStore(long dataStoreId) {
    StoragePoolVO dataStoreVO = dataStoreDao.findByIdIncludingRemoved(dataStoreId);
    if (dataStoreVO == null) {
        throw new CloudRuntimeException("Unable to locate datastore with id " + dataStoreId);
    }
    String providerName = dataStoreVO.getStorageProviderName();
    DataStoreProvider provider = providerManager.getDataStoreProvider(providerName);
    PrimaryDataStoreImpl dataStore = PrimaryDataStoreImpl.createDataStore(dataStoreVO, driverMaps.get(provider.getName()), provider);
    return dataStore;
}
Also used : CloudRuntimeException(com.cloud.utils.exception.CloudRuntimeException) PrimaryDataStoreImpl(org.apache.cloudstack.storage.datastore.PrimaryDataStoreImpl) DataStoreProvider(org.apache.cloudstack.engine.subsystem.api.storage.DataStoreProvider) StoragePoolVO(org.apache.cloudstack.storage.datastore.db.StoragePoolVO)

Aggregations

PrimaryDataStoreImpl (org.apache.cloudstack.storage.datastore.PrimaryDataStoreImpl)5 CloudRuntimeException (com.cloud.utils.exception.CloudRuntimeException)3 DataStore (org.apache.cloudstack.engine.subsystem.api.storage.DataStore)3 VolumeInfo (org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo)3 StoragePoolVO (org.apache.cloudstack.storage.datastore.db.StoragePoolVO)3 InvalidParameterValueException (com.cloud.exception.InvalidParameterValueException)2 SnapshotVO (com.cloud.storage.SnapshotVO)2 NoTransitionException (com.cloud.utils.fsm.NoTransitionException)2 HashMap (java.util.HashMap)2 SnapshotInfo (org.apache.cloudstack.engine.subsystem.api.storage.SnapshotInfo)2 SnapshotDataStoreVO (org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreVO)2 VolumeObject (org.apache.cloudstack.storage.volume.VolumeObject)2 HostVO (com.cloud.host.HostVO)1 CreateSnapshotPayload (com.cloud.storage.CreateSnapshotPayload)1 VMTemplateStoragePoolVO (com.cloud.storage.VMTemplateStoragePoolVO)1 VolumeVO (com.cloud.storage.VolumeVO)1 DB (com.cloud.utils.db.DB)1 DataStoreProvider (org.apache.cloudstack.engine.subsystem.api.storage.DataStoreProvider)1 PrimaryDataStore (org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStore)1 SnapshotResult (org.apache.cloudstack.engine.subsystem.api.storage.SnapshotResult)1