/* * Copyright (c) 2012 EMC Corporation * All Rights Reserved */ package com.emc.storageos.volumecontroller.impl.block.taskcompleter; import java.net.URI; import java.util.HashMap; import java.util.List; import java.util.Map; import com.emc.storageos.db.client.DbClient; import com.emc.storageos.db.client.model.Operation; import com.emc.storageos.db.client.model.Volume; import com.emc.storageos.exceptions.DeviceControllerException; import com.emc.storageos.svcs.errorhandling.model.ServiceCoded; import com.emc.storageos.volumecontroller.TaskCompleter; /** * MultiVolumeTaskCompleter is a completer for volume jobs that support multiple * volumes such as volume creation and volume deletion. */ @SuppressWarnings("serial") public class MultiVolumeTaskCompleter extends TaskCompleter { // A list of associated volume task completers. private Map<URI, VolumeTaskCompleter> _volumeTaskCompleterMap = new HashMap<>(); public MultiVolumeTaskCompleter(List<URI> ids, String opId) { super(Volume.class, ids, opId); } /** * Constructor. * * @param volumeTaskCompleters A list of volume task completers. * @param opId The operation id. */ public MultiVolumeTaskCompleter(List<URI> ids, List<VolumeTaskCompleter> volumeTaskCompleters, String opId) { super(Volume.class, ids, opId); for (VolumeTaskCompleter tc : volumeTaskCompleters) { addVolumeCompleter(tc); } } /** * For the same volume contained its its own single completer and in this multi-volume completer, * only one completer should delegate to inform the workflow service of completion. This disables * the single completer in the case of a multi-volume completer. * * @param completer * single volume completer * @return completer to add to the */ public void addVolumeCompleter(VolumeTaskCompleter completer) { completer.setNotifyWorkflow(false); // This completer will take care of notifying workflow _volumeTaskCompleterMap.put(completer.getId(), completer); } /** * Implements TaskCompleter interface by invoking the the like method for * the associated volume task completer instances. * * @param dbClient A reference to the database client. * @param status The completion status. */ @Override protected void complete(DbClient dbClient, Operation.Status status, ServiceCoded coded) throws DeviceControllerException { for (VolumeTaskCompleter volumeTaskCompleter : _volumeTaskCompleterMap.values()) { volumeTaskCompleter.complete(dbClient, status, coded); } updateWorkflowStatus(status, coded); } public VolumeTaskCompleter skipTaskCompleter(URI volumeURI) { return _volumeTaskCompleterMap.remove(volumeURI); } /** * check whether VolumeTaskCompleters left out * * @return */ public boolean isVolumeTaskCompletersEmpty() { return (null == _volumeTaskCompleterMap || _volumeTaskCompleterMap.isEmpty()); } public Map<URI, VolumeTaskCompleter> getVolumeTaskCompleterMap() { return _volumeTaskCompleterMap; } }