/* * Copyright (c) 2015 EMC Corporation * All Rights Reserved */ package com.emc.storageos.volumecontroller.impl.block.taskcompleter; import java.net.URI; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.emc.storageos.db.client.DbClient; import com.emc.storageos.db.client.model.ExportGroup; import com.emc.storageos.db.client.model.ExportMask; import com.emc.storageos.db.client.model.Operation; import com.emc.storageos.db.client.model.StorageSystem; import com.emc.storageos.exceptions.DeviceControllerException; import com.emc.storageos.svcs.errorhandling.model.ServiceCoded; import com.emc.storageos.svcs.errorhandling.model.ServiceError; public class RollbackExportGroupCreateCompleter extends ExportTaskCompleter { private static final long serialVersionUID = -8307408975210762419L; private static final Logger _log = LoggerFactory.getLogger(RollbackExportGroupCreateCompleter.class); public RollbackExportGroupCreateCompleter(URI egUri, URI emUri, String task) { super(ExportGroup.class, egUri, emUri, task); } @Override protected void complete(DbClient dbClient, Operation.Status status, ServiceCoded coded) throws DeviceControllerException { try { ExportGroup exportGroup = dbClient.queryObject(ExportGroup.class, getId()); ExportMask exportMask = (getMask() != null) ? dbClient.queryObject(ExportMask.class, getMask()) : null; if ((status == Operation.Status.error) && (coded instanceof ServiceError)) { ServiceError error = (ServiceError) coded; String originalMessage = error.getMessage(); StorageSystem storageSystem = exportMask != null ? dbClient.queryObject(StorageSystem.class, exportMask.getStorageDevice()) : null; String additionMessage = String.format( "Rollback encountered problems cleaning up export mask %s on storage system %s and may require manual clean up", exportMask.getMaskName(), storageSystem != null ? storageSystem.forDisplay() : "Unknown"); String updatedMessage = String.format("%s\n%s", originalMessage, additionMessage); error.setMessage(updatedMessage); } if (exportMask != null) { exportGroup.removeExportMask(exportMask.getId()); // What if this mask is being referenced by another EG? dbClient.markForDeletion(exportMask); dbClient.updateObject(exportGroup); } _log.info(String.format("Done RollbackExportGroupCreate - Id: %s, OpId: %s, status: %s", getId().toString(), getOpId(), status.name())); } catch (Exception e) { _log.error(String.format("Failed updating status for RollbackExportGroupCreate - Id: %s, OpId: %s", getId().toString(), getOpId()), e); } finally { super.complete(dbClient, status, coded); } } }