/* * Copyright (c) 2014 EMC Corporation * All Rights Reserved */ package com.emc.storageos.volumecontroller.impl.vnxe.job; import java.net.URI; import java.util.HashSet; import java.util.List; import java.util.Set; 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.db.client.util.NullColumnValueGetter; import com.emc.storageos.vnxe.VNXeApiClient; import com.emc.storageos.volumecontroller.JobContext; import com.emc.storageos.volumecontroller.TaskCompleter; public class VNXeDeleteVolumesJob extends VNXeJob { private static final long serialVersionUID = 4957354153412227028L; private static final Logger _logger = LoggerFactory.getLogger(VNXeDeleteVolumesJob.class); public VNXeDeleteVolumesJob(List<String> jobIds, URI storageSystemUri, TaskCompleter taskCompleter) { super(jobIds, storageSystemUri, taskCompleter, "DeleteVolumes"); } /** * Called to update the job status when the volumes delete job completes. * * @param jobContext The job context. */ @Override public void updateStatus(JobContext jobContext) throws Exception { DbClient dbClient = jobContext.getDbClient(); try { if (_status == JobStatus.IN_PROGRESS) { return; } String opId = getTaskCompleter().getOpId(); StringBuilder logMsgBuilder = new StringBuilder(String.format("Updating status of job %s to %s", opId, _status.name())); // Get list of volumes; get set of storage pool ids to which they belong. List<Volume> volumes = dbClient.queryObject(Volume.class, getTaskCompleter().getIds()); Set<URI> poolURIs = new HashSet<URI>(); for (Volume volume : volumes) { poolURIs.add(volume.getPool()); } VNXeApiClient vnxeApiClient = getVNXeClient(jobContext); // If terminal state update storage pool capacity if (_status == JobStatus.SUCCESS || _status == JobStatus.FAILED) { for (URI poolURI : poolURIs) { VNXeJob.updateStoragePoolCapacity(dbClient, vnxeApiClient, poolURI, null); } } if (_status == JobStatus.SUCCESS) { for (Volume volume : volumes) { volume.setInactive(true); volume.setConsistencyGroup(NullColumnValueGetter.getNullURI()); dbClient.updateObject(volume); if (logMsgBuilder.length() != 0) { logMsgBuilder.append("\n"); } logMsgBuilder.append(String.format("Successfully deleted volume %s", volume.getId())); } } else if (_status == JobStatus.FAILED) { for (URI id : getTaskCompleter().getIds()) { if (logMsgBuilder.length() != 0) { logMsgBuilder.append("\n"); } logMsgBuilder.append(String.format("Failed to delete volume: %s", id)); } } _logger.info(logMsgBuilder.toString()); } catch (Exception e) { _logger.error("Caught an exception while trying to updateStatus for VNXeDeleteVolumesJob", e); setErrorStatus("Encountered an internal error during volume delete job status processing : " + e.getMessage()); } finally { super.updateStatus(jobContext); } } }