/*
* Copyright 2016 EMC Corporation
* All Rights Reserved
*/
package com.emc.storageos.hp3par.impl;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.emc.storageos.hp3par.command.VolumeDetailsCommandResult;
import com.emc.storageos.hp3par.utils.HP3PARConstants;
import com.emc.storageos.hp3par.utils.HP3PARUtil;
import com.emc.storageos.storagedriver.DriverTask;
import com.emc.storageos.storagedriver.Registry;
import com.emc.storageos.storagedriver.model.VolumeSnapshot;
import com.emc.storageos.storagedriver.model.StorageObject.AccessStatus;
import com.emc.storageos.storagedriver.storagecapabilities.StorageCapabilities;
public class HP3PARSnapshotHelper {
private static final Logger _log = LoggerFactory.getLogger(HP3PARSnapshotHelper.class);
private HP3PARUtil hp3parUtil;
public DriverTask createVolumeSnapshot(List<VolumeSnapshot> snapshots, StorageCapabilities capabilities,
DriverTask task, Registry driverRegistry) {
for (VolumeSnapshot snap : snapshots) {
try {
// native id = null ,
_log.info(
"3PARDriver: createVolumeSnapshot for storage system native id {}, snapshot name {}, parent id {}- start",
snap.getNativeId(), snap.getDisplayName(), snap.getParentId());
Boolean readOnly = true;
// get Api client
HP3PARApi hp3parApi = hp3parUtil.getHP3PARDeviceFromNativeId(snap.getStorageSystemId(), driverRegistry);
VolumeDetailsCommandResult volResult = null;
if (snap.getAccessStatus() != AccessStatus.READ_ONLY) {
readOnly = false;
}
// Create volume snapshot
hp3parApi.createVirtualCopy(snap.getParentId(), snap.getDisplayName(), readOnly);
volResult = hp3parApi.getVolumeDetails(snap.getDisplayName());
// Actual size of the volume in array
snap.setProvisionedCapacity(volResult.getSizeMiB() * HP3PARConstants.MEGA_BYTE);
snap.setWwn(volResult.getWwn());
snap.setNativeId(snap.getDisplayName()); // required for volume
// delete
snap.setDeviceLabel(snap.getDisplayName());
snap.setAccessStatus(snap.getAccessStatus());
task.setStatus(DriverTask.TaskStatus.READY);
_log.info("createVolumeSnapshot for storage system native id {}, snapshot name {}, parent id {} - end",
snap.getStorageSystemId(), snap.getDisplayName(), snap.getParentId());
} catch (Exception e) {
String msg = String.format(
"3PARDriver: Unable to create volume snap name %s for parent base volume id %s whose storage system native id is %s; Error: %s.\n",
snap.getDisplayName(), snap.getParentId(), snap.getStorageSystemId(), e.getMessage());
_log.error(msg);
task.setMessage(msg);
task.setStatus(DriverTask.TaskStatus.PARTIALLY_FAILED);
e.printStackTrace();
}
} // end for each volume snapshot creation
return task;
}
public DriverTask restoreSnapshot(List<VolumeSnapshot> snapshots, DriverTask task, Registry driverRegistry) {
// Executing restore for each requested volume snapshot (in one or more
// 3par system)
for (VolumeSnapshot snap : snapshots) {
try {
_log.info(
"3PARDriver: restoreSnapshot for storage system system id {}, snapshot name {} , native id {} , all = {} - start",
snap.getStorageSystemId(), snap.getDisplayName(), snap.getNativeId(), snap.toString());
// get Api client
HP3PARApi hp3parApi = hp3parUtil.getHP3PARDeviceFromNativeId(snap.getStorageSystemId(), driverRegistry);
// restore virtual copy
hp3parApi.restoreVirtualCopy(snap.getNativeId());
task.setStatus(DriverTask.TaskStatus.READY);
_log.info("3PARDriver: restoreSnapshot for storage system id {}, snapshot display name {} - end",
snap.getStorageSystemId(), snap.getDisplayName());
} catch (Exception e) {
String msg = String.format(
"3PARDriver: Unable to restore snapshot display name %s with native id %s for storage system id %s; Error: %s.\n",
snap.getDisplayName(), snap.getNativeId(), snap.getStorageSystemId(), e.getMessage());
_log.error(msg);
task.setMessage(msg);
task.setStatus(DriverTask.TaskStatus.PARTIALLY_FAILED);
e.printStackTrace();
}
} // end for each restore snapshot
return task;
}
public DriverTask deleteVolumeSnapshot(VolumeSnapshot snap, DriverTask task, Registry driverRegistry) {
try {
_log.info(
"3PARDriver: deleteVolumeSnapshot for storage system native id {}, snapshot name {} , native id {} - start",
snap.getStorageSystemId(), snap.getDisplayName(), snap.getNativeId());
// get Api client
HP3PARApi hp3parApi = hp3parUtil.getHP3PARDeviceFromNativeId(snap.getStorageSystemId(), driverRegistry);
// Delete virtual copy
hp3parApi.deleteVirtualCopy(snap.getNativeId());
task.setStatus(DriverTask.TaskStatus.READY);
_log.info("3PARDriver: deleteVolumeSnapshot for storage system native id {}, snapshot name {} - end",
snap.getStorageSystemId(), snap.getDisplayName());
} catch (Exception e) {
String msg = String.format(
"3PARDriver: Unable to delete snapshot name %s with native id %s for storage system native id %s; Error: %s.\n",
snap.getDisplayName(), snap.getNativeId(), snap.getStorageSystemId(), e.getMessage());
_log.error(msg);
task.setMessage(msg);
task.setStatus(DriverTask.TaskStatus.PARTIALLY_FAILED);
e.printStackTrace();
}
return task;
}
public HP3PARUtil getHp3parUtil() {
return hp3parUtil;
}
public void setHp3parUtil(HP3PARUtil hp3parUtil) {
this.hp3parUtil = hp3parUtil;
}
}