/*
* Copyright (c) 2015 EMC Corporation
* All Rights Reserved
*/
package com.emc.storageos.imageservercontroller;
import java.net.URI;
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.ComputeImage;
import com.emc.storageos.db.client.model.ComputeImageServer;
import com.emc.storageos.db.client.model.ComputeImage.ComputeImageStatus;
import com.emc.storageos.db.client.model.Operation.Status;
import com.emc.storageos.exceptions.DeviceControllerException;
import com.emc.storageos.security.audit.AuditLogManager;
import com.emc.storageos.security.audit.AuditLogManagerFactory;
import com.emc.storageos.services.OperationTypeEnum;
import com.emc.storageos.svcs.errorhandling.model.ServiceCoded;
import com.emc.storageos.volumecontroller.TaskCompleter;
@SuppressWarnings("serial")
public class ComputeImageCompleter extends TaskCompleter {
private static final Logger log = LoggerFactory.getLogger(ComputeImageCompleter.class);
private OperationTypeEnum opType = null;
private String serviceType = null;
public ComputeImageCompleter(URI id, String opId, OperationTypeEnum opType, String serviceType) {
super(ComputeImage.class, id, opId);
this.opType = opType;
this.serviceType = serviceType;
}
@Override
protected void complete(DbClient dbClient, Status status, ServiceCoded coded)
throws DeviceControllerException {
log.info("ComputeImageCompleter.complete {}", status.name());
ComputeImage ci = dbClient.queryObject(ComputeImage.class, getId());
AuditLogManager auditMgr = AuditLogManagerFactory.getAuditLogManager();
if (status == Status.error) {
if (opType == OperationTypeEnum.CREATE_COMPUTE_IMAGE) {
boolean available = false;
List<URI> ids = dbClient.queryByType(ComputeImageServer.class,
true);
for (URI imageServerId : ids) {
ComputeImageServer imageServer = dbClient.queryObject(
ComputeImageServer.class, imageServerId);
if (imageServer.getComputeImages() != null
&& imageServer.getComputeImages().contains(
ci.getId().toString())) {
available = true;
break;
}
}
if (available) {
ci.setComputeImageStatus(ComputeImageStatus.AVAILABLE
.name());
} else {
ci.setComputeImageStatus(ComputeImageStatus.NOT_AVAILABLE
.name());
}
ci.setLastImportStatusMessage(coded.getMessage());
dbClient.persistObject(ci);
}
dbClient.error(ComputeImage.class, getId(), getOpId(), coded);
auditMgr.recordAuditLog(null, null, serviceType, opType,
System.currentTimeMillis(),
AuditLogManager.AUDITLOG_FAILURE,
AuditLogManager.AUDITOP_END, ci.getId().toString(),
ci.getImageUrl(), ci.getComputeImageStatus());
} else {
if (opType == OperationTypeEnum.DELETE_COMPUTE_IMAGE) {
dbClient.markForDeletion(ci);
} else if (opType == OperationTypeEnum.CREATE_COMPUTE_IMAGE) {
ci.setComputeImageStatus(ComputeImageStatus.AVAILABLE.name());
ci.setLastImportStatusMessage("Success");
dbClient.persistObject(ci);
}
dbClient.ready(ComputeImage.class, getId(), getOpId());
auditMgr.recordAuditLog(null, null, serviceType, opType,
System.currentTimeMillis(),
AuditLogManager.AUDITLOG_SUCCESS,
AuditLogManager.AUDITOP_END, ci.getId().toString(),
ci.getImageUrl(), ci.getComputeImageStatus());
}
}
}