/* * Copyright (c) 2015 EMC Corporation * All Rights Reserved */ package com.emc.storageos.computesystemcontroller.impl; 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.ActionableEvent; import com.emc.storageos.db.client.model.Initiator; 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; public class InitiatorCompleter extends ComputeSystemCompleter { private static final Logger _logger = LoggerFactory.getLogger(InitiatorCompleter.class); private static final long serialVersionUID = 1L; private final URI eventId; private final InitiatorOperation op; public enum InitiatorOperation { ADD, REMOVE; } public InitiatorCompleter(URI eventId, URI id, InitiatorOperation op, String opId) { super(Initiator.class, id, opId); this.op = op; this.eventId = eventId; } public InitiatorCompleter(URI eventId, List<URI> ids, InitiatorOperation op, String opId) { super(Initiator.class, ids, opId); this.op = op; 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: dbClient.error(Initiator.class, this.getId(), getOpId(), coded); if (!NullColumnValueGetter.isNullURI(eventId)) { ActionableEvent event = dbClient.queryObject(ActionableEvent.class, eventId); if (event != null) { event.setEventStatus(ActionableEvent.Status.failed.name()); dbClient.updateObject(event); } } // If this completer is part of an add initiator operation and the operation // is NOT successful, we want to remove the initiator. The initiator should only // be removed if it is no longer in use. if (op == InitiatorOperation.ADD) { removeInitiator(id, dbClient); } break; default: dbClient.ready(Initiator.class, this.getId(), getOpId()); // If this completer is part of a remove initiator operation and the operation // is successful, we want to remove the initiator. The initiator should only // be removed if it is no longer in use. if (op == InitiatorOperation.REMOVE) { removeInitiator(id, dbClient); } } } } /** * Removes an initiator if it is no longer in use. * * @param initiatorUri the initiator to remove * @param dbClient the DB client */ private void removeInitiator(URI initiatorUri, DbClient dbClient) { if (!ComputeSystemHelper.isInitiatorInUse(dbClient, initiatorUri.toString()) && (op == InitiatorOperation.REMOVE || NullColumnValueGetter.isNullURI(eventId))) { Initiator initiator = dbClient.queryObject(Initiator.class, initiatorUri); dbClient.markForDeletion(initiator); _logger.info("Initiator marked for deletion: " + this.getId()); } } }