/*
* Copyright (c) 2015 EMC Corporation
* All Rights Reserved
*/
package com.emc.storageos.imageservercontroller;
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.URIUtil;
import com.emc.storageos.db.client.model.ComputeImage;
import com.emc.storageos.db.client.model.ComputeImageJob;
import com.emc.storageos.db.client.model.ComputeImageJob.JobStatus;
import com.emc.storageos.db.client.model.DiscoveredDataObject;
import com.emc.storageos.db.client.model.DiscoveredDataObject.CompatibilityStatus;
import com.emc.storageos.db.client.model.Host.ProvisioningJobStatus;
import com.emc.storageos.db.client.model.Host;
import com.emc.storageos.db.client.model.HostInterface;
import com.emc.storageos.db.client.model.IpInterface;
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 OsInstallCompleter extends TaskCompleter {
private static final Logger log = LoggerFactory.getLogger(OsInstallCompleter.class);
private String serviceType = null;
private URI jobId = null;
public OsInstallCompleter(URI id, String opId, URI jobId, String serviceType) {
super(Host.class, id, opId);
this.jobId = jobId;
this.serviceType = serviceType;
}
@Override
protected void complete(DbClient dbClient, Status status, ServiceCoded coded) throws DeviceControllerException {
log.info("OsInstallCompleter.complete {} {}", status.name(), coded);
Host host = dbClient.queryObject(Host.class, getId());
ComputeImageJob job = dbClient.queryObject(ComputeImageJob.class, jobId);
AuditLogManager auditMgr = AuditLogManagerFactory.getAuditLogManager();
if (status == Status.ready && job.getJobStatus().equals(JobStatus.SUCCESS.name())) {
// set host type based on image type
ComputeImage image = dbClient.queryObject(ComputeImage.class, job.getComputeImageId());
if (image.getImageType().equals(ComputeImage.ImageType.esx.name())) {
host.setType(Host.HostType.Esx.name());
host.setOsVersion(image.getOsVersion());
} else if (image.getImageType().equals(ComputeImage.ImageType.linux.name())) {
host.setType(Host.HostType.Linux.name());
host.setOsVersion(String.format("%s %s", image.getOsName(), image.getOsVersion()));
}
/*
* Create the IpInterface that represents the IpAddress that's
* supposed to come on the ESX Management Network (for ESX
* installations)
*/
IpInterface ipInterface = new IpInterface();
ipInterface.setHost(host.getId());
ipInterface.setId(URIUtil.createId(IpInterface.class));
ipInterface.setIpAddress(job.getHostIp());
ipInterface.setLabel(job.getHostName());
ipInterface.setNetmask(job.getNetmask());
ipInterface.setProtocol(HostInterface.Protocol.IPV4.toString());
ipInterface.setRegistrationStatus(DiscoveredDataObject.RegistrationStatus.REGISTERED.toString());
dbClient.createObject(ipInterface);
/*
* End create IpInterface. Consider making this a seperate method.
*/
host.setCompatibilityStatus(CompatibilityStatus.COMPATIBLE.name());
host.setProvisioningStatus(ProvisioningJobStatus.COMPLETE.toString());
dbClient.persistObject(host);
dbClient.ready(Host.class, getId(), getOpId());
auditMgr.recordAuditLog(null, null, serviceType, OperationTypeEnum.INSTALL_COMPUTE_IMAGE,
System.currentTimeMillis(), AuditLogManager.AUDITLOG_SUCCESS, AuditLogManager.AUDITOP_END,
host.getId(), job.getId());
} else {
host.setProvisioningStatus(ProvisioningJobStatus.ERROR.toString());
dbClient.persistObject(host);
job.setJobStatus(JobStatus.FAILED.name());
dbClient.persistObject(job);
dbClient.error(Host.class, getId(), getOpId(), coded);
auditMgr.recordAuditLog(null, null, serviceType, OperationTypeEnum.INSTALL_COMPUTE_IMAGE,
System.currentTimeMillis(), AuditLogManager.AUDITLOG_FAILURE, AuditLogManager.AUDITOP_END,
host.getId(), job.getId());
}
}
}