/* * Copyright (c) 2016 EMC Corporation * All Rights Reserved */ package com.emc.storageos.volumecontroller.impl.externaldevice.job; import java.net.URI; import java.util.ArrayList; 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 group clone that will complete asynchronously. */ public class RestoreFromGroupCloneExternalDeviceJob extends ExternalDeviceJob { private static final long serialVersionUID = 1L; // The URIs of the volumes representing the controller clones that are being restored. private List<URI> _volumeURIs; // Logger reference. private static final Logger s_logger = LoggerFactory.getLogger(RestoreFromGroupCloneExternalDeviceJob.class); /** * Constructor. * * @param storageSystemURI The URI of the external storage system on which the task is running. * @param volumeURIs The URIs of the volumes representing the controller clones that are being restored. * @param driverTaskId The id of the task monitored by the job. * @param taskCompleter The task completer. */ public RestoreFromGroupCloneExternalDeviceJob(URI storageSystemURI, List<URI> volumeURIs, String driverTaskId, TaskCompleter taskCompleter) { super(storageSystemURI, driverTaskId, taskCompleter); _volumeURIs = volumeURIs; } /** * {@inheritDoc} */ @Override protected void doTaskSucceeded(DriverTask driverTask, DbClient dbClient) throws Exception { s_logger.info(String.format("Successfully restored group clone: %s", driverTask.getMessage())); // Update the ViPR volumes representing the clones with the // corresponding driver clone. List<Volume> updatedVolumes = new ArrayList<>(); for (URI volumeURI : _volumeURIs) { 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. RestoreFromCloneDriverTask restoreDriverTask = (RestoreFromCloneDriverTask) driverTask; List<VolumeClone> updatedClones = restoreDriverTask.getClones(); for (VolumeClone updatedClone: updatedClones) { if (ExternalDeviceUtils.isVolumeExternalDeviceClone(volume, updatedClone, dbClient)) { ExternalDeviceUtils.updateRestoredClone(volume, updatedClone, dbClient, false); updatedVolumes.add(volume); break; } } } dbClient.updateObject(updatedVolumes); } /** * {@inheritDoc} */ @Override protected void doTaskFailed(DriverTask driverTask, DbClient dbClient) throws Exception { s_logger.error(String.format("Failed to restore group clone: %s", driverTask.getMessage())); } }