/* * Copyright (c) 2015 EMC Corporation * All Rights Reserved */ package com.emc.storageos.computesystemcontroller.impl; import java.net.URI; import java.util.HashMap; import java.util.List; import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.emc.storageos.db.client.DbClient; import com.emc.storageos.db.client.model.ActionableEvent; import com.emc.storageos.db.client.model.Host; import com.emc.storageos.db.client.model.Operation.Status; import com.emc.storageos.db.client.util.NullColumnValueGetter; import com.emc.storageos.exceptions.DeviceControllerException; import com.emc.storageos.svcs.errorhandling.model.ServiceCoded; @SuppressWarnings("serial") public class HostCompleter extends ComputeSystemCompleter { private static final Logger _logger = LoggerFactory.getLogger(HostCompleter.class); private final URI eventId; private final Map<URI, URI> oldHostClusters = new HashMap<URI, URI>(); private final Map<URI, URI> oldHostVcenterDataCenters = new HashMap<URI, URI>(); public HostCompleter(URI id, boolean deactivateOnComplete, String opId) { this(NullColumnValueGetter.getNullURI(), id, deactivateOnComplete, opId); } public HostCompleter(List<URI> ids, boolean deactivateOnComplete, String opId) { this(NullColumnValueGetter.getNullURI(), ids, deactivateOnComplete, opId); } public HostCompleter(URI eventId, URI id, boolean deactivateOnComplete, String opId) { super(Host.class, id, deactivateOnComplete, opId); this.eventId = eventId; } public HostCompleter(URI eventId, List<URI> ids, boolean deactivateOnComplete, String opId) { super(Host.class, ids, deactivateOnComplete, opId); this.eventId = eventId; } @Override protected void complete(DbClient dbClient, Status status, ServiceCoded coded) throws DeviceControllerException { super.complete(dbClient, status, coded); for (URI id : getIds()) { switch (status) { case error: Host host = dbClient.queryObject(Host.class, id); if (!NullColumnValueGetter.isNullURI(host.getComputeElement())) { host.setProvisioningStatus(Host.ProvisioningJobStatus.ERROR.toString()); dbClient.updateObject(host); } if (!NullColumnValueGetter.isNullURI(eventId)) { ActionableEvent event = dbClient.queryObject(ActionableEvent.class, eventId); if (event != null) { event.setEventStatus(ActionableEvent.Status.failed.name()); dbClient.updateObject(event); } } if (oldHostClusters.containsKey(id)) { _logger.info(String.format("Updating cluster to %s for host %s", oldHostClusters.get(id), id)); ComputeSystemHelper.updateHostAndInitiatorClusterReferences(dbClient, oldHostClusters.get(id), id); } if (oldHostVcenterDataCenters.containsKey(id)) { _logger.info(String.format("Updating vcenter datacenter to %s for host %s", oldHostVcenterDataCenters.get(id), id)); ComputeSystemHelper.updateHostVcenterDatacenterReference(dbClient, id, oldHostVcenterDataCenters.get(id)); } dbClient.error(Host.class, id, getOpId(), coded); break; default: dbClient.ready(Host.class, id, getOpId()); } if (deactivateOnComplete && status.equals(Status.ready)) { Host host = dbClient.queryObject(Host.class, id); ComputeSystemHelper.doDeactivateHost(dbClient, host); _logger.info("Deactivating Host: " + id); } } } /** * Used to set the "old" values for cluster and vcenter data center. These values will be used for * rollback if an error occurs. * * @param hostUri the rollback host URI * @param oldClusterUri the rollback cluster URI * @param oldVcenterDataCenterUri the rollback vcenter data center URI */ public void addOldHostClusterAndVcenterDataCenter(URI hostUri, URI oldClusterUri, URI oldVcenterDataCenterUri) { oldHostClusters.put(hostUri, oldClusterUri); oldHostVcenterDataCenters.put(hostUri, oldVcenterDataCenterUri); } }