/*
* Copyright (c) 2013 EMC Corporation
* All Rights Reserved
*/
package com.emc.storageos.volumecontroller.impl;
import java.net.URI;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.emc.storageos.db.client.DbClient;
import com.emc.storageos.db.client.model.ExportPathParams;
import com.emc.storageos.exceptions.ClientControllerException;
import com.emc.storageos.volumecontroller.BlockExportController;
import com.emc.storageos.volumecontroller.ControllerException;
public class BlockExportControllerImpl implements BlockExportController {
private static final Logger _log = LoggerFactory.getLogger(BlockExportControllerImpl.class);
private Set<BlockExportController> _deviceImpl;
private Dispatcher _dispatcher;
private DbClient _dbClient;
public void setDeviceImpl(Set<BlockExportController> deviceImpl) {
_deviceImpl = deviceImpl;
}
public void setDispatcher(Dispatcher dispatcher) {
_dispatcher = dispatcher;
}
public void setDbClient(DbClient dbClient) {
_dbClient = dbClient;
}
/**
* Dummy implementation that just returns the first controller that implements this device
*
* @return
* @throws com.emc.storageos.volumecontroller.ControllerException
*
*/
private BlockExportController getExportController()
throws ControllerException {
BlockExportController bc = _deviceImpl.iterator().next();
if (bc == null) {
throw ClientControllerException.fatals.unableToLocateDeviceController("block controller");
}
return bc;
}
/**
* Puts the operation in the zkQueue so it can Dispatch'd to a Device Controller
*
* @param methodName
* @param args
* @throws com.emc.storageos.volumecontroller.ControllerException
*
*/
private void blockRMI(String methodName, Object... args) throws ControllerException {
final URI export = (URI) args[0];
BlockExportController controller = getExportController();
_dispatcher.queue(export, "export", controller, methodName, args);
}
/**
* Export one or more volumes. The volumeToExports parameter has
* all the information required to do the add volumes operation.
*
* @param export URI of ExportMask
* @param volumeMap Volume-lun map to be part of the export mask
* @param initiatorURIs List of URIs for the initiators to be added to the export mask
* @param opId Operation ID
* @throws com.emc.storageos.volumecontroller.ControllerException
*
*/
@Override
public void exportGroupCreate(URI export, Map<URI, Integer> volumeMap,
List<URI> initiatorURIs, String opId)
throws ControllerException {
blockRMI("exportGroupCreate", export, volumeMap, initiatorURIs, opId);
}
/**
* Delete the export.
*
* @param export URI of ExportMask
* @param opId Operation ID
* @throws com.emc.storageos.volumecontroller.ControllerException
*
*/
@Override
public void exportGroupDelete(URI export, String opId) throws ControllerException {
blockRMI("exportGroupDelete", export, opId);
}
@Override
public void exportGroupUpdate(URI export,
Map<URI, Integer> addedBlockObjectMap, Map<URI, Integer> removedObjectMap,
Set<URI> addedClusters, Set<URI> removedClusters,
Set<URI> addedHosts, Set<URI> removedHosts, Set<URI> addedInitiators, Set<URI> removedInitiators, String opId)
throws ControllerException {
blockRMI("exportGroupUpdate", export, addedBlockObjectMap, removedObjectMap,
addedClusters, removedClusters, addedHosts, removedHosts, addedInitiators,
removedInitiators, opId);
}
/**
* Update the path parameters for a volume from a new Vpool.
*
* @param volumeURI - URI of volume
* @param newVpoolURI - URI of new Vpool
* @param opid String containing task identifier
*/
@Override
public void updateVolumePathParams(URI volumeURI, URI newVpoolURI, String opId) throws ControllerException {
blockRMI("updateVolumePathParams", volumeURI, newVpoolURI, opId);
}
/**
* Updates the Auto-tiering policy from a new vPool for the given volumes.
*
* @param volumeURIs the volume uris
* @param newVpoolURI - URI of new Vpool
* @param opId the op id
* @throws ControllerException the controller exception
*/
@Override
public void updatePolicyAndLimits(List<URI> volumeURIs, URI newVpoolURI, String opId) throws ControllerException {
BlockExportController controller = getExportController();
_dispatcher.queue(volumeURIs.get(0), "export", controller,
"updatePolicyAndLimits", volumeURIs, newVpoolURI, opId);
}
@Override
public void exportGroupPortRebalance(URI systemURI, URI exportGroupURI, URI varray, Map<URI, List<URI>> addedPaths, Map<URI, List<URI>> removedPaths,
ExportPathParams exportPathParam, boolean waitForApproval, String opId) throws ControllerException {
blockRMI("exportGroupPortRebalance", systemURI, exportGroupURI, varray, addedPaths, removedPaths, exportPathParam, waitForApproval, opId);
}
}