/* * Copyright (c) 2016 EMC Corporation * All Rights Reserved */ package com.emc.storageos.volumecontroller.impl.externaldevice.job; import java.net.URI; import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.emc.storageos.db.client.DbClient; import com.emc.storageos.db.client.model.Volume; import com.emc.storageos.exceptions.DeviceControllerException; import com.emc.storageos.storagedriver.DriverTask; import com.emc.storageos.storagedriver.model.VolumeClone; import com.emc.storageos.storagedriver.task.RestoreFromCloneDriverTask; import com.emc.storageos.volumecontroller.TaskCompleter; import com.emc.storageos.volumecontroller.impl.externaldevice.ExternalDeviceUtils; /** * This ExternalDeviceJob derived class is created to monitor the progress * of a request to restore a volume from a clone that will complete asynchronously. */ public class RestoreFromCloneExternalDeviceJob extends ExternalDeviceJob { private static final long serialVersionUID = 1L; // The URI of the volume representing the controller clone that is being restored. private URI _volumeURI; // Logger reference. private static final Logger s_logger = LoggerFactory.getLogger(RestoreFromCloneExternalDeviceJob.class); /** * Constructor. * * @param storageSystemURI The URI of the external storage system on which the task is running. * @param volumeURI The URI of the volume representing the controller clone that is being restored. * @param driverTaskId The id of the task monitored by the job. * @param taskCompleter The task completer. */ public RestoreFromCloneExternalDeviceJob(URI storageSystemURI, URI volumeURI, String driverTaskId, TaskCompleter taskCompleter) { super(storageSystemURI, driverTaskId, taskCompleter); _volumeURI = volumeURI; } /** * {@inheritDoc} */ @Override protected void doTaskSucceeded(DriverTask driverTask, DbClient dbClient) throws Exception { // Get the ViPR volume representing the clone. s_logger.info(String.format("Successfully restored clone %s:%s", _volumeURI, driverTask.getMessage())); Volume volume = dbClient.queryObject(Volume.class, _volumeURI); if (volume == null) { s_logger.error(String.format("Failed to find volume %s", _volumeURI)); throw DeviceControllerException.exceptions.objectNotFound(_volumeURI); } // Update the ViPR clone with the driver clone information. // Note that we know ViPR only allows you to restore a single // non-group clone at a time. RestoreFromCloneDriverTask restoreDriverTask = (RestoreFromCloneDriverTask) driverTask; List<VolumeClone> updatedClones = restoreDriverTask.getClones(); VolumeClone updatedClone = updatedClones.get(0); ExternalDeviceUtils.updateRestoredClone(volume, updatedClone, dbClient, true); } /** * {@inheritDoc} */ @Override protected void doTaskFailed(DriverTask driverTask, DbClient dbClient) throws Exception { s_logger.error(String.format("Failed to restore from clone %s:%s", _volumeURI, driverTask.getMessage())); } }