/* * 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.VolumeClone; import com.emc.storageos.storagedriver.storagecapabilities.StorageCapabilities; public class HP3PARCloneHelper { private static final Logger _log = LoggerFactory.getLogger(HP3PARCloneHelper.class); private HP3PARUtil hp3parUtil; public DriverTask createVolumeClone(List<VolumeClone> clones, StorageCapabilities capabilities, DriverTask task, Registry driverRegistry) { String storageSystemId = null; HP3PARApi hp3parApi = null; for (VolumeClone clone : clones) { try { // native id = null , _log.info( "3PARDriver: createVolumeClone for storage system native id {}, clone parent name {} , clone name {} - start", clone.toString(), clone.getParentId(), clone.getDisplayName()); String localStorageSystemId = clone.getStorageSystemId(); // get Api client if (storageSystemId == null || storageSystemId != localStorageSystemId) { storageSystemId = localStorageSystemId; hp3parApi = hp3parUtil.getHP3PARDeviceFromNativeId(localStorageSystemId, driverRegistry); } VolumeDetailsCommandResult volResult = null; // Create volume clone hp3parApi.createPhysicalCopy(clone.getParentId(), clone.getDisplayName(), clone.getStoragePoolId()); volResult = hp3parApi.getVolumeDetails(clone.getDisplayName()); // Actual size of the volume in array clone.setProvisionedCapacity(volResult.getSizeMiB() * HP3PARConstants.MEGA_BYTE); clone.setWwn(volResult.getWwn()); clone.setNativeId(volResult.getName()); // required for volume // delete clone.setDeviceLabel(clone.getDisplayName()); clone.setAccessStatus(clone.getAccessStatus()); clone.setReplicationState(VolumeClone.ReplicationState.SYNCHRONIZED); task.setStatus(DriverTask.TaskStatus.READY); _log.info("createVolumeClone for storage system native id {}, volume clone name {} - end", clone.getStorageSystemId(), clone.getDisplayName()); } catch (Exception e) { String msg = String.format( "3PARDriver: createVolumeClone Unable to create volume clone name %s for parent base volume id %s whose storage system native id is %s; Error: %s.\n", clone.getDisplayName(), clone.getParentId(), clone.getStorageSystemId(), e.getMessage()); _log.info("createVolumeClone exception message {} ", e.getMessage()); _log.error(msg); task.setMessage(msg); task.setStatus(DriverTask.TaskStatus.PARTIALLY_FAILED); e.printStackTrace(); } } // end for each volume clone creation return task; } public DriverTask restoreFromClone(List<VolumeClone> clones, Registry driverRegistry, DriverTask task) { String storageSystemId = null; HP3PARApi hp3parApi = null; // Executing restore for each requested volume clone (in one or more // 3par system) for (VolumeClone clone : clones) { try { _log.info( "3PARDriver: restoreFromClone for storage system system id {}, clone name {} , native id {} - start", clone.getStorageSystemId(), clone.getDisplayName(), clone.getNativeId()); String localStorageSystemId = clone.getStorageSystemId(); // get Api client if (storageSystemId == null || storageSystemId != localStorageSystemId) { storageSystemId = localStorageSystemId; hp3parApi = hp3parUtil.getHP3PARDeviceFromNativeId(localStorageSystemId, driverRegistry); } // restore virtual copy hp3parApi.restorePhysicalCopy(clone.getNativeId()); // clone.setReplicationState(VolumeClone.ReplicationState.RESTORED); task.setStatus(DriverTask.TaskStatus.READY); _log.info( "3PARDriver: restoreFromClone successful for storage system id {}, volume clone native id {} - end", clone.getStorageSystemId(), clone.getNativeId()); } catch (Exception e) { String msg = String.format( "3PARDriver:restoreFromClone Unable to restore volume clone display name %s with native id %s for storage system id %s; Error: %s.\n", clone.getDisplayName(), clone.getNativeId(), clone.getStorageSystemId(), e.getMessage()); _log.error(msg); task.setMessage(msg); task.setStatus(DriverTask.TaskStatus.PARTIALLY_FAILED); e.printStackTrace(); } } // end for each restore clone return task; } public DriverTask deleteVolumeClone(VolumeClone clone, DriverTask task, Registry driverRegistry) { String storageSystemId = null; HP3PARApi hp3parApi = null; try { _log.info( "3PARDriver: deleteVolumeClone for storage system native id {}, volume clone name {} , native id {} - start", clone.getStorageSystemId(), clone.getDisplayName(), clone.getNativeId()); String localStorageSystemId = clone.getStorageSystemId(); // get Api client if (storageSystemId == null || storageSystemId != localStorageSystemId) { storageSystemId = localStorageSystemId; hp3parApi = hp3parUtil.getHP3PARDeviceFromNativeId(localStorageSystemId, driverRegistry); } // Delete physical copy hp3parApi.deletePhysicalCopy(clone.getDeviceLabel()); task.setStatus(DriverTask.TaskStatus.READY); _log.info("3PARDriver: deleteVolumeClone for storage system native id {}, volume clone name {} - end", clone.getStorageSystemId(), clone.getDisplayName()); } catch (Exception e) { String msg = String.format( "3PARDriver: deleteVolumeClone Unable to delete volume clone name %s with native id %s for storage system native id %s; Error: %s.\n", clone.getDisplayName(), clone.getNativeId(), clone.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; } }