/* * Copyright (c) 2014 EMC Corporation * All Rights Reserved */ package com.emc.storageos.volumecontroller.impl.vnxe.job; import java.net.URI; import java.util.Arrays; 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.vnxe.VNXeApiClient; import com.emc.storageos.vnxe.models.VNXeLun; import com.emc.storageos.volumecontroller.JobContext; import com.emc.storageos.volumecontroller.TaskCompleter; public class VNXeExpandVolumeJob extends VNXeJob { private static final long serialVersionUID = 7215022240972292798L; private static final Logger _logger = LoggerFactory.getLogger(VNXeExpandVolumeJob.class); public VNXeExpandVolumeJob(String jobId, URI storageSystemUri, TaskCompleter taskCompleter) { super(jobId, storageSystemUri, taskCompleter, "expandVolume"); } /** * Called to update the job status when the volume expand 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())); VNXeApiClient vnxeApiClient = getVNXeClient(jobContext); URI volumeId = getTaskCompleter().getId(); Volume volumeObj = dbClient.queryObject(Volume.class, volumeId); // If terminal state update storage pool capacity if (_status == JobStatus.SUCCESS || _status == JobStatus.FAILED) { VNXeJob.updateStoragePoolCapacity(dbClient, vnxeApiClient, volumeObj.getPool(), Arrays.asList(volumeObj.getId().toString())); } if (_status == JobStatus.SUCCESS && volumeObj != null) { updateVolume(volumeObj, dbClient, logMsgBuilder, vnxeApiClient); } else if (_status == JobStatus.FAILED && volumeObj != null) { logMsgBuilder.append("\n"); logMsgBuilder.append(String.format( "Task %s failed to expand volume: %s", opId, volumeId.toString())); } else { logMsgBuilder.append(String.format("The volume: %s is not found anymore", volumeId)); } _logger.info(logMsgBuilder.toString()); } catch (Exception e) { _logger.error("Caught an exception while trying to updateStatus for VNXeExpandVolumeJob", e); setErrorStatus("Encountered an internal error during expand volume job status processing : " + e.getMessage()); } finally { super.updateStatus(jobContext); } } /** * update Volume after expanded in VNXe * * @param volumeObj volume in vipr * @param dbClient DbClient * @param logMsgBuilder string builder for logging * @param vnxeApiClient VNXeApiClient */ private void updateVolume(Volume volumeObj, DbClient dbClient, StringBuilder logMsgBuilder, VNXeApiClient vnxeApiClient) { VNXeLun vnxeLun = null; vnxeLun = vnxeApiClient.getLun(volumeObj.getNativeId()); if (vnxeLun != null) { volumeObj.setCapacity(vnxeLun.getSizeTotal()); volumeObj.setAllocatedCapacity(vnxeLun.getSizeAllocated()); volumeObj.setProvisionedCapacity(vnxeLun.getSizeTotal()); logMsgBuilder.append(String.format( "Expand volume successfully for NativeId: %s, URI: %s", volumeObj.getNativeId(), getTaskCompleter().getId())); dbClient.updateObject(volumeObj); } else { logMsgBuilder.append("Could not find corresponding volume in the VNXe, using the resource ID: "); logMsgBuilder.append(volumeObj.getNativeId()); } } }