/* * Copyright (c) 2014 EMC Corporation * All Rights Reserved */ package com.emc.storageos.volumecontroller.impl.hds.prov.job; import com.emc.storageos.db.client.DbClient; import com.emc.storageos.db.client.model.BlockObject; import com.emc.storageos.db.client.model.Operation; import com.emc.storageos.db.client.model.StoragePool; import com.emc.storageos.db.client.model.StorageSystem; import com.emc.storageos.db.client.model.Volume; import com.emc.storageos.hds.api.HDSApiClient; import com.emc.storageos.volumecontroller.JobContext; import com.emc.storageos.volumecontroller.TaskCompleter; import com.emc.storageos.volumecontroller.impl.hds.prov.utils.HDSUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.net.URI; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; /** * A HDS Volume Delete job */ public class HDSDeleteVolumeJob extends HDSJob { private static final Logger _log = LoggerFactory.getLogger(HDSDeleteVolumeJob.class); public HDSDeleteVolumeJob(String hdsJob, URI storageSystem, TaskCompleter taskCompleter) { super(hdsJob, storageSystem, taskCompleter, "DeleteVolume"); } public HDSDeleteVolumeJob(String hdsJob, URI storageSystem, TaskCompleter taskCompleter, String name) { super(hdsJob, storageSystem, taskCompleter, name); } /** * Called to update the job status when the volume delete job completes. * * @param jobContext The job context. */ public void updateStatus(JobContext jobContext) throws Exception { DbClient dbClient = jobContext.getDbClient(); try { if (_status == JobStatus.IN_PROGRESS) { return; } StorageSystem storageSystem = dbClient.queryObject(StorageSystem.class, getStorageSystemURI()); HDSApiClient hdsApiClient = jobContext.getHdsApiFactory().getClient( HDSUtils.getHDSServerManagementServerInfo(storageSystem), storageSystem.getSmisUserName(), storageSystem.getSmisPassword()); // Get list of volumes; get set of storage pool ids to which they // belong. List<Volume> volumes = new ArrayList<Volume>(); Set<URI> poolURIs = new HashSet<URI>(); for (URI id : getTaskCompleter().getIds()) { // Volume volume = dbClient.queryObject(Volume.class, id); Volume volume = (Volume) BlockObject.fetch(dbClient, id); volumes.add(volume); poolURIs.add(volume.getPool()); } // If terminal state update storage pool capacity if (_status == JobStatus.SUCCESS || _status == JobStatus.FAILED) { // Update capacity of storage pools. for (URI poolURI : poolURIs) { StoragePool storagePool = dbClient.queryObject(StoragePool.class, poolURI); HDSUtils.updateStoragePoolCapacity(dbClient, hdsApiClient, storagePool); } } StringBuilder logMsgBuilder = new StringBuilder(); if (_status == JobStatus.SUCCESS) { super.updateStatus(jobContext); for (Volume volume : volumes) { /* * if (URIUtil.isType(volume.getId(), BlockMirror.class)) { * BlockMirror mirror = (BlockMirror) volume; * HDSMirrorOperations.removeReferenceFromSourceVolume(dbClient, mirror); * } */ volume.setInactive(true); dbClient.persistObject(volume); dbClient.updateTaskOpStatus( Volume.class, volume.getId(), getTaskCompleter().getOpId(), new Operation(Operation.Status.ready.name(), String.format( "Deleted volume %s", volume.getNativeId()))); if (logMsgBuilder.length() != 0) { logMsgBuilder.append("\n"); } logMsgBuilder.append(String.format("Successfully deleted volume %s", volume.getId())); } } else if (_status == JobStatus.FAILED) { super.updateStatus(jobContext); for (URI id : getTaskCompleter().getIds()) { if (logMsgBuilder.length() != 0) { logMsgBuilder.append("\n"); } logMsgBuilder .append(String.format("Failed to delete volume: %s", id)); } } if (logMsgBuilder.length() > 0) { _log.info(logMsgBuilder.toString()); } } catch (Exception e) { setErrorStatus("Encountered an internal error during delete volume job status processing: " + e.getMessage()); super.updateStatus(jobContext); _log.error( "Caught exception while handling updateStatus for delete volume job.", e); } } }