Search in sources :

Example 71 with DriverTask

use of com.emc.storageos.storagedriver.DriverTask in project coprhd-controller by CoprHD.

the class ExternalBlockStorageDevice method doExpandVolume.

@Override
public void doExpandVolume(StorageSystem storageSystem, StoragePool storagePool, Volume volume, Long size, TaskCompleter taskCompleter) throws DeviceControllerException {
    _log.info("Volume expand ..... Started");
    BlockStorageDriver driver = getDriver(storageSystem.getSystemType());
    DriverTask task = null;
    try {
        // Prepare driver volume
        StorageVolume driverVolume = new StorageVolume();
        driverVolume.setNativeId(volume.getNativeId());
        driverVolume.setDeviceLabel(volume.getDeviceLabel());
        driverVolume.setStorageSystemId(storageSystem.getNativeId());
        driverVolume.setStoragePoolId(storagePool.getNativeId());
        driverVolume.setRequestedCapacity(volume.getCapacity());
        driverVolume.setThinlyProvisioned(volume.getThinlyProvisioned());
        driverVolume.setDisplayName(volume.getLabel());
        driverVolume.setAllocatedCapacity(volume.getAllocatedCapacity());
        driverVolume.setProvisionedCapacity(volume.getProvisionedCapacity());
        driverVolume.setWwn(volume.getWWN());
        // call driver
        task = driver.expandVolume(driverVolume, size);
        if (!isTaskInTerminalState(task.getStatus())) {
            // If the task is not in a terminal state and will be completed asynchronously
            // create a job to monitor the progress of the request and update the volume and
            // call the completer as appropriate based on the result of the request.
            ExpandVolumeExternalDeviceJob job = new ExpandVolumeExternalDeviceJob(storageSystem.getId(), volume.getId(), task.getTaskId(), taskCompleter);
            ControllerServiceImpl.enqueueJob(new QueueJob(job));
        } else if (task.getStatus() == DriverTask.TaskStatus.READY) {
            String msg = String.format("doExpandVolume -- Expanded volume: %s .", task.getMessage());
            _log.info(msg);
            ExternalDeviceUtils.updateExpandedVolume(volume, driverVolume, dbClient);
            taskCompleter.ready(dbClient);
        } else {
            // operation failed
            String errorMsg = String.format("doExpandVolume -- Failed to expand volume: %s .", task.getMessage());
            _log.error(errorMsg);
            ServiceError serviceError = ExternalDeviceException.errors.expandVolumeFailed("doExpandVolume", errorMsg);
            taskCompleter.error(dbClient, serviceError);
        }
    } catch (Exception e) {
        _log.error("doExpandVolume -- Failed to expand volume. ", e);
        ServiceError serviceError = ExternalDeviceException.errors.expandVolumeFailed("doExpandVolume", e.getMessage());
        taskCompleter.error(dbClient, serviceError);
    } finally {
        try {
            if (task == null || isTaskInTerminalState(task.getStatus())) {
                updateStoragePoolCapacity(storagePool, storageSystem, URIUtil.toUris(Collections.singletonList(volume)), dbClient);
            }
        } catch (Exception ex) {
            _log.error("Failed to update storage pool {} after expand volume operation completion.", storagePool.getId(), ex);
        }
    }
}
Also used : DriverTask(com.emc.storageos.storagedriver.DriverTask) StorageVolume(com.emc.storageos.storagedriver.model.StorageVolume) ServiceError(com.emc.storageos.svcs.errorhandling.model.ServiceError) QueueJob(com.emc.storageos.volumecontroller.impl.job.QueueJob) BlockStorageDriver(com.emc.storageos.storagedriver.BlockStorageDriver) DatabaseException(com.emc.storageos.db.exceptions.DatabaseException) DeviceControllerException(com.emc.storageos.exceptions.DeviceControllerException) IOException(java.io.IOException) ExpandVolumeExternalDeviceJob(com.emc.storageos.volumecontroller.impl.externaldevice.job.ExpandVolumeExternalDeviceJob)

Example 72 with DriverTask

use of com.emc.storageos.storagedriver.DriverTask in project coprhd-controller by CoprHD.

the class ExternalBlockStorageDevice method doRestoreFromClone.

@Override
public void doRestoreFromClone(StorageSystem storageSystem, URI cloneVolume, TaskCompleter taskCompleter) {
    BlockStorageDriver driver = getDriver(storageSystem.getSystemType());
    DriverTask task = null;
    Volume clone = dbClient.queryObject(Volume.class, cloneVolume);
    _log.info("Restore from volume clone on storage system {}, clone: {} .", storageSystem.getNativeId(), clone.toString());
    try {
        BlockObject sourceVolume = BlockObject.fetch(dbClient, clone.getAssociatedSourceVolume());
        VolumeClone driverClone = new VolumeClone();
        driverClone.setStorageSystemId(storageSystem.getNativeId());
        driverClone.setNativeId(clone.getNativeId());
        driverClone.setParentId(sourceVolume.getNativeId());
        driverClone.setConsistencyGroup(clone.getReplicationGroupInstance());
        // Call driver
        task = driver.restoreFromClone(Collections.unmodifiableList(Collections.singletonList(driverClone)));
        if (!isTaskInTerminalState(task.getStatus())) {
            // If the task is not in a terminal state and will be completed asynchronously
            // create a job to monitor the progress of the request and update the clone
            // volume replica state and call the completer as appropriate based on the result
            // of the request.
            RestoreFromCloneExternalDeviceJob job = new RestoreFromCloneExternalDeviceJob(storageSystem.getId(), cloneVolume, task.getTaskId(), taskCompleter);
            ControllerServiceImpl.enqueueJob(new QueueJob(job));
        } else if (task.getStatus() == DriverTask.TaskStatus.READY) {
            String msg = String.format("doRestoreFromClone -- Restored volume from clone: %s .", task.getMessage());
            _log.info(msg);
            ExternalDeviceUtils.updateRestoredClone(clone, driverClone, dbClient, true);
            taskCompleter.ready(dbClient);
        } else {
            String msg = String.format("Failed to restore volume from clone on storage system %s, clone: %s .", storageSystem.getNativeId(), clone.toString());
            _log.error(msg);
            // todo: add error
            ServiceError serviceError = ExternalDeviceException.errors.restoreVolumesFromClonesFailed("doRestoreFromClone", msg);
            taskCompleter.error(dbClient, serviceError);
        }
    } catch (Exception e) {
        String msg = String.format("Failed to restore volume from clone on storage system %s, clone: %s .", storageSystem.getNativeId(), clone.toString());
        _log.error(msg, e);
        ServiceError serviceError = ExternalDeviceException.errors.restoreVolumesFromClonesFailed("doRestoreFromClone", msg);
        taskCompleter.error(dbClient, serviceError);
    }
}
Also used : DriverTask(com.emc.storageos.storagedriver.DriverTask) ServiceError(com.emc.storageos.svcs.errorhandling.model.ServiceError) RestoreFromCloneExternalDeviceJob(com.emc.storageos.volumecontroller.impl.externaldevice.job.RestoreFromCloneExternalDeviceJob) StorageVolume(com.emc.storageos.storagedriver.model.StorageVolume) Volume(com.emc.storageos.db.client.model.Volume) VolumeClone(com.emc.storageos.storagedriver.model.VolumeClone) QueueJob(com.emc.storageos.volumecontroller.impl.job.QueueJob) BlockStorageDriver(com.emc.storageos.storagedriver.BlockStorageDriver) BlockObject(com.emc.storageos.db.client.model.BlockObject) StorageBlockObject(com.emc.storageos.storagedriver.model.StorageBlockObject) DatabaseException(com.emc.storageos.db.exceptions.DatabaseException) DeviceControllerException(com.emc.storageos.exceptions.DeviceControllerException) IOException(java.io.IOException)

Example 73 with DriverTask

use of com.emc.storageos.storagedriver.DriverTask in project coprhd-controller by CoprHD.

the class ExternalBlockStorageDevice method doDetachGroupClone.

@Override
public void doDetachGroupClone(StorageSystem storageSystem, List<URI> cloneVolumes, TaskCompleter taskCompleter) {
    BlockStorageDriver driver = getDriver(storageSystem.getSystemType());
    DriverTask task = null;
    List<Volume> clones = dbClient.queryObject(Volume.class, cloneVolumes);
    _log.info("Detaching group clones on storage system {}, clone: {} .", storageSystem.getNativeId(), clones.toString());
    try {
        Map<VolumeClone, Volume> driverCloneToCloneMap = new HashMap<>();
        List<VolumeClone> driverClones = new ArrayList<>();
        for (Volume clone : clones) {
            BlockObject sourceVolume = BlockObject.fetch(dbClient, clone.getAssociatedSourceVolume());
            VolumeClone driverClone = new VolumeClone();
            driverClone.setStorageSystemId(storageSystem.getNativeId());
            driverClone.setNativeId(clone.getNativeId());
            driverClone.setParentId(sourceVolume.getNativeId());
            driverClone.setConsistencyGroup(clone.getReplicationGroupInstance());
            driverClones.add(driverClone);
            driverCloneToCloneMap.put(driverClone, clone);
        }
        // Call driver
        task = driver.detachVolumeClone(Collections.unmodifiableList(driverClones));
        // todo: need to implement support for async case.
        if (task.getStatus() == DriverTask.TaskStatus.READY) {
            for (Map.Entry<VolumeClone, Volume> entry : driverCloneToCloneMap.entrySet()) {
                VolumeClone driverClone = entry.getKey();
                Volume clone = entry.getValue();
                ReplicationUtils.removeDetachedFullCopyFromSourceFullCopiesList(clone, dbClient);
                clone.setAssociatedSourceVolume(NullColumnValueGetter.getNullURI());
                clone.setReplicaState(Volume.ReplicationState.DETACHED.name());
            }
            String msg = String.format("doDetachGroupClone -- Detached group clone: %s .", task.getMessage());
            _log.info(msg);
            dbClient.updateObject(clones);
            taskCompleter.ready(dbClient);
        } else {
            String msg = String.format("Failed to detach group clone on storage system %s, clones: %s .", storageSystem.getNativeId(), clones.toString());
            _log.error(msg);
            // todo: add error
            ServiceError serviceError = ExternalDeviceException.errors.detachVolumeCloneFailed("doDetachGroupClone", msg);
            taskCompleter.error(dbClient, serviceError);
        }
    } catch (Exception e) {
        String msg = String.format("Failed to detach group clone on storage system %s, clones: %s .", storageSystem.getNativeId(), clones.toString());
        _log.error(msg, e);
        // todo: add error
        ServiceError serviceError = ExternalDeviceException.errors.detachVolumeCloneFailed("doDetachGroupClone", msg);
        taskCompleter.error(dbClient, serviceError);
    }
}
Also used : ServiceError(com.emc.storageos.svcs.errorhandling.model.ServiceError) HashMap(java.util.HashMap) ArrayList(java.util.ArrayList) DatabaseException(com.emc.storageos.db.exceptions.DatabaseException) DeviceControllerException(com.emc.storageos.exceptions.DeviceControllerException) IOException(java.io.IOException) DriverTask(com.emc.storageos.storagedriver.DriverTask) StorageVolume(com.emc.storageos.storagedriver.model.StorageVolume) Volume(com.emc.storageos.db.client.model.Volume) VolumeClone(com.emc.storageos.storagedriver.model.VolumeClone) Map(java.util.Map) HashMap(java.util.HashMap) BlockStorageDriver(com.emc.storageos.storagedriver.BlockStorageDriver) BlockObject(com.emc.storageos.db.client.model.BlockObject) StorageBlockObject(com.emc.storageos.storagedriver.model.StorageBlockObject)

Example 74 with DriverTask

use of com.emc.storageos.storagedriver.DriverTask in project coprhd-controller by CoprHD.

the class ExternalBlockStorageDevice method doDeleteVolumes.

/**
 * {@inheritDoc}
 */
@Override
public void doDeleteVolumes(StorageSystem storageSystem, String opId, List<Volume> volumes, TaskCompleter taskCompleter) throws DeviceControllerException {
    BlockStorageDriver driver = getDriver(storageSystem.getSystemType());
    List<Volume> deletedVolumes = new ArrayList<>();
    List<String> failedToDeleteVolumes = new ArrayList<>();
    List<Volume> deletedClones = new ArrayList<>();
    List<String> failedToDeleteClones = new ArrayList<>();
    boolean exception = false;
    StringBuffer errorMsgForVolumes = new StringBuffer();
    StringBuffer errorMsgForClones = new StringBuffer();
    try {
        for (Volume volume : volumes) {
            DriverTask task = null;
            // Check if this is regular volume or this is volume clone
            if (!NullColumnValueGetter.isNullURI(volume.getAssociatedSourceVolume())) {
                // this is clone
                _log.info("Deleting volume clone on storage system {}, clone: {} .", storageSystem.getNativeId(), volume.getNativeId());
                BlockObject sourceVolume = BlockObject.fetch(dbClient, volume.getAssociatedSourceVolume());
                VolumeClone driverClone = new VolumeClone();
                driverClone.setStorageSystemId(storageSystem.getNativeId());
                driverClone.setNativeId(volume.getNativeId());
                driverClone.setDeviceLabel(volume.getDeviceLabel());
                driverClone.setParentId(sourceVolume.getNativeId());
                driverClone.setConsistencyGroup(volume.getReplicationGroupInstance());
                // check for exports
                if (hasExports(driver, driverClone)) {
                    failedToDeleteClones.add(volume.getNativeId());
                    String errorMsgClone = String.format("Cannot delete clone %s on storage system %s, clone has exports on array.", driverClone.getNativeId(), storageSystem.getNativeId());
                    _log.error(errorMsgClone);
                    errorMsgForClones.append(errorMsgClone + "\n");
                    continue;
                }
                task = driver.deleteVolumeClone(driverClone);
            } else {
                // this is regular volume
                _log.info("Deleting volume on storage system {}, volume: {} .", storageSystem.getNativeId(), volume.getNativeId());
                StorageVolume driverVolume = new StorageVolume();
                driverVolume.setStorageSystemId(storageSystem.getNativeId());
                driverVolume.setNativeId(volume.getNativeId());
                driverVolume.setDeviceLabel(volume.getDeviceLabel());
                driverVolume.setConsistencyGroup(volume.getReplicationGroupInstance());
                // check for exports
                if (hasExports(driver, driverVolume)) {
                    failedToDeleteVolumes.add(volume.getNativeId());
                    String errorMsgVolume = String.format("Cannot delete volume %s on storage system %s, volume has exports on array.", driverVolume.getNativeId(), storageSystem.getNativeId());
                    _log.error(errorMsgVolume);
                    errorMsgForVolumes.append(errorMsgVolume + "\n");
                    continue;
                }
                task = driver.deleteVolume(driverVolume);
            }
            if (task.getStatus() == DriverTask.TaskStatus.READY) {
                volume.setInactive(true);
                if (volume.getAssociatedSourceVolume() != null) {
                    deletedClones.add(volume);
                } else {
                    deletedVolumes.add(volume);
                }
            } else {
                if (volume.getAssociatedSourceVolume() != null) {
                    failedToDeleteClones.add(volume.getNativeId());
                } else {
                    failedToDeleteVolumes.add(volume.getNativeId());
                }
            }
        }
    } catch (Exception e) {
        exception = true;
        _log.error("doDeleteVolumes -- Failed to delete volumes. ", e);
        ServiceError serviceError = ExternalDeviceException.errors.deleteVolumesFailed("doDeleteVolumes", e.getMessage());
        taskCompleter.error(dbClient, serviceError);
    } finally {
        if (!deletedVolumes.isEmpty()) {
            _log.info("Deleted volumes on storage system {}, volumes: {} .", storageSystem.getNativeId(), deletedVolumes.toString());
            dbClient.updateObject(deletedVolumes);
        }
        if (!deletedClones.isEmpty()) {
            _log.info("Deleted volume clones on storage system {}, clones: {} .", storageSystem.getNativeId(), deletedClones.toString());
            dbClient.updateObject(deletedClones);
        }
        if (!(failedToDeleteVolumes.isEmpty() && failedToDeleteClones.isEmpty())) {
            if (!failedToDeleteVolumes.isEmpty()) {
                String errorMsgVolumes = String.format("Failed to delete volumes on storage system %s, volumes: %s . ", storageSystem.getNativeId(), failedToDeleteVolumes.toString());
                _log.error(errorMsgVolumes);
            } else {
                String errorMsgClones = String.format("Failed to delete volume clones on storage system %s, clones: %s .", storageSystem.getNativeId(), failedToDeleteClones.toString());
                _log.error(errorMsgClones);
            }
            ServiceError serviceError = ExternalDeviceException.errors.deleteVolumesFailed("doDeleteVolumes", errorMsgForVolumes.append(errorMsgForClones).toString());
            taskCompleter.error(dbClient, serviceError);
        } else if (!exception) {
            taskCompleter.ready(dbClient);
        }
    }
}
Also used : ServiceError(com.emc.storageos.svcs.errorhandling.model.ServiceError) ArrayList(java.util.ArrayList) DatabaseException(com.emc.storageos.db.exceptions.DatabaseException) DeviceControllerException(com.emc.storageos.exceptions.DeviceControllerException) IOException(java.io.IOException) DriverTask(com.emc.storageos.storagedriver.DriverTask) StorageVolume(com.emc.storageos.storagedriver.model.StorageVolume) StorageVolume(com.emc.storageos.storagedriver.model.StorageVolume) Volume(com.emc.storageos.db.client.model.Volume) VolumeClone(com.emc.storageos.storagedriver.model.VolumeClone) BlockStorageDriver(com.emc.storageos.storagedriver.BlockStorageDriver) BlockObject(com.emc.storageos.db.client.model.BlockObject) StorageBlockObject(com.emc.storageos.storagedriver.model.StorageBlockObject)

Example 75 with DriverTask

use of com.emc.storageos.storagedriver.DriverTask in project coprhd-controller by CoprHD.

the class ExternalBlockStorageDevice method doDetachClone.

@Override
public void doDetachClone(StorageSystem storageSystem, URI cloneVolume, TaskCompleter taskCompleter) {
    BlockStorageDriver driver = getDriver(storageSystem.getSystemType());
    DriverTask task = null;
    Volume clone = dbClient.queryObject(Volume.class, cloneVolume);
    _log.info("Detaching volume clone on storage system {}, clone: {} .", storageSystem.getNativeId(), clone.toString());
    try {
        BlockObject sourceVolume = BlockObject.fetch(dbClient, clone.getAssociatedSourceVolume());
        VolumeClone driverClone = new VolumeClone();
        driverClone.setStorageSystemId(storageSystem.getNativeId());
        driverClone.setNativeId(clone.getNativeId());
        driverClone.setParentId(sourceVolume.getNativeId());
        driverClone.setConsistencyGroup(clone.getReplicationGroupInstance());
        // Call driver
        task = driver.detachVolumeClone(Collections.unmodifiableList(Collections.singletonList(driverClone)));
        // todo: need to implement support for async case.
        if (task.getStatus() == DriverTask.TaskStatus.READY) {
            ReplicationUtils.removeDetachedFullCopyFromSourceFullCopiesList(clone, dbClient);
            clone.setAssociatedSourceVolume(NullColumnValueGetter.getNullURI());
            clone.setReplicaState(Volume.ReplicationState.DETACHED.name());
            String msg = String.format("doDetachClone -- Detached volume clone: %s .", task.getMessage());
            _log.info(msg);
            dbClient.updateObject(clone);
            taskCompleter.ready(dbClient);
        } else {
            String msg = String.format("Failed to detach volume clone on storage system %s, clone: %s .", storageSystem.getNativeId(), clone.toString());
            _log.error(msg);
            // todo: add error
            ServiceError serviceError = ExternalDeviceException.errors.detachVolumeCloneFailed("doDetachClone", msg);
            taskCompleter.error(dbClient, serviceError);
        }
    } catch (Exception e) {
        String msg = String.format("Failed to detach volume clone on storage system %s, clone: %s .", storageSystem.getNativeId(), clone.toString());
        _log.error(msg, e);
        ServiceError serviceError = ExternalDeviceException.errors.detachVolumeCloneFailed("doDetachClone", msg);
        taskCompleter.error(dbClient, serviceError);
    }
}
Also used : DriverTask(com.emc.storageos.storagedriver.DriverTask) ServiceError(com.emc.storageos.svcs.errorhandling.model.ServiceError) StorageVolume(com.emc.storageos.storagedriver.model.StorageVolume) Volume(com.emc.storageos.db.client.model.Volume) VolumeClone(com.emc.storageos.storagedriver.model.VolumeClone) BlockStorageDriver(com.emc.storageos.storagedriver.BlockStorageDriver) BlockObject(com.emc.storageos.db.client.model.BlockObject) StorageBlockObject(com.emc.storageos.storagedriver.model.StorageBlockObject) DatabaseException(com.emc.storageos.db.exceptions.DatabaseException) DeviceControllerException(com.emc.storageos.exceptions.DeviceControllerException) IOException(java.io.IOException)

Aggregations

DriverTask (com.emc.storageos.storagedriver.DriverTask)80 BlockStorageDriver (com.emc.storageos.storagedriver.BlockStorageDriver)26 StorageVolume (com.emc.storageos.storagedriver.model.StorageVolume)26 ArrayList (java.util.ArrayList)26 ServiceError (com.emc.storageos.svcs.errorhandling.model.ServiceError)22 DeviceControllerException (com.emc.storageos.exceptions.DeviceControllerException)21 Volume (com.emc.storageos.db.client.model.Volume)15 DatabaseException (com.emc.storageos.db.exceptions.DatabaseException)15 IOException (java.io.IOException)15 URI (java.net.URI)15 HashMap (java.util.HashMap)13 DellSCDriverTask (com.emc.storageos.driver.dellsc.DellSCDriverTask)10 BlockConsistencyGroup (com.emc.storageos.db.client.model.BlockConsistencyGroup)9 HashSet (java.util.HashSet)9 VolumeClone (com.emc.storageos.storagedriver.model.VolumeClone)7 VolumeSnapshot (com.emc.storageos.storagedriver.model.VolumeSnapshot)7 BlockObject (com.emc.storageos.db.client.model.BlockObject)6 BlockSnapshot (com.emc.storageos.db.client.model.BlockSnapshot)6 ExportGroup (com.emc.storageos.db.client.model.ExportGroup)6 ExportMask (com.emc.storageos.db.client.model.ExportMask)6