/*
* Copyright (c) 2013 EMC Corporation
* All Rights Reserved
*/
package com.emc.storageos.vplexcontroller;
import java.net.URI;
import java.util.List;
import java.util.Map;
import java.util.Set;
import com.emc.storageos.Controller;
import com.emc.storageos.blockorchestrationcontroller.VolumeDescriptor;
import com.emc.storageos.db.client.DbClient;
import com.emc.storageos.db.client.model.DiscoveredSystemObject;
import com.emc.storageos.db.client.model.StorageSystem;
import com.emc.storageos.impl.AbstractDiscoveredSystemController;
import com.emc.storageos.services.OperationTypeEnum;
import com.emc.storageos.svcs.errorhandling.resources.InternalException;
import com.emc.storageos.volumecontroller.ApplicationAddVolumeList;
import com.emc.storageos.volumecontroller.ControllerException;
import com.emc.storageos.volumecontroller.impl.Dispatcher;
/**
* South bound API implementation - a singleton instance of this class services
* all vplex controller calls. Calls are matched against device specific
* controller implementations and forwarded from this implementation.
*/
public class VPlexControllerImpl extends AbstractDiscoveredSystemController implements VPlexController {
private Set<VPlexController> _deviceImpl;
private Dispatcher _dispatcher;
private DbClient _dbClient;
public void setDeviceImpl(Set<VPlexController> deviceImpl) {
_deviceImpl = deviceImpl;
}
public void setDispatcher(Dispatcher dispatcher) {
_dispatcher = dispatcher;
}
public void setDbClient(DbClient dbClient) {
_dbClient = dbClient;
}
@Override
protected Controller lookupDeviceController(DiscoveredSystemObject system) {
return _deviceImpl.iterator().next();
}
private void queueRequest(String methodName, Object... args) throws InternalException {
queueTask(_dbClient, StorageSystem.class, _dispatcher, methodName, args);
}
@Override
public void migrateVolumes(URI vplexURI, URI virtualVolumeURI,
List<URI> targetVolumeURIs, Map<URI, URI> migrationsMap,
Map<URI, URI> poolVolumeMap, URI newCoSURI, URI newNhURI, String successMsg,
String failMsg, OperationTypeEnum opType, String opId, String wfStepId) throws InternalException {
queueRequest("migrateVolumes", vplexURI, virtualVolumeURI, targetVolumeURIs,
migrationsMap, poolVolumeMap, newCoSURI, newNhURI, successMsg, failMsg, opType, opId, wfStepId);
}
@Override
public void importVolume(URI vplexURI, List<VolumeDescriptor> descriptors,
URI vplexSystemProject, URI vplexSystemTenant, URI newCos, String newLabel, String setTransferSpeed,
Boolean markInactive, String opId) throws InternalException {
queueRequest("importVolume", vplexURI, descriptors,
vplexSystemProject, vplexSystemTenant, newCos, newLabel, setTransferSpeed, markInactive, opId);
}
@Override
public void expandVolumeUsingMigration(URI vplexURI, URI vplexVolumeURI,
List<URI> targetVolumeURIs, Map<URI, URI> migrationsMap,
Map<URI, URI> poolVolumeMap, Long newSize, String opId)
throws InternalException {
queueRequest("expandVolumeUsingMigration", vplexURI, vplexVolumeURI,
targetVolumeURIs, migrationsMap, poolVolumeMap, newSize, opId);
}
@Override
public void deleteConsistencyGroup(URI vplexURI, URI cgURI, String opId)
throws InternalException {
queueRequest("deleteConsistencyGroup", vplexURI, cgURI, opId);
}
@Override
public void updateConsistencyGroup(URI vplexURI, URI cgURI, List<URI> addVolumesList,
List<URI> removeVolumesList, String opId) throws InternalException {
queueRequest("updateConsistencyGroup", vplexURI, cgURI, addVolumesList,
removeVolumesList, opId);
}
@Override
public void createFullCopy(URI vplexURI, List<VolumeDescriptor> volumeDescriptors,
String opId) throws InternalException {
queueRequest("createFullCopy", vplexURI, volumeDescriptors, opId);
}
@Override
public void restoreFromFullCopy(URI vplexURI, List<URI> fullCopyURIs, String opId)
throws InternalException {
queueRequest("restoreFromFullCopy", vplexURI, fullCopyURIs, opId);
}
@Override
public void resyncFullCopy(URI vplexURI, List<URI> fullCopyURIs, String opId)
throws InternalException {
queueRequest("resyncFullCopy", vplexURI, fullCopyURIs, opId);
}
@Override
public void detachFullCopy(URI vplexURI, List<URI> fullCopyURIs, String opId)
throws InternalException {
queueRequest("detachFullCopy", vplexURI, fullCopyURIs, opId);
}
@Override
public void restoreVolume(URI vplexURI, URI snapshotURI, String opId)
throws InternalException {
queueRequest("restoreVolume", vplexURI, snapshotURI, opId);
}
@Override
public void attachContinuousCopies(URI vplexURI, List<VolumeDescriptor> volumeDescriptors, URI sourceVolumeURI,
String opId) throws ControllerException {
queueRequest("attachContinuousCopies", vplexURI, volumeDescriptors, sourceVolumeURI, opId);
}
@Override
public void deactivateMirror(URI vplexURI, URI mirrorURI, List<VolumeDescriptor> volumeDescriptors,
String opId) throws InternalException {
queueRequest("deactivateMirror", vplexURI, mirrorURI, volumeDescriptors, opId);
}
@Override
public void detachContinuousCopies(URI vplexURI, URI sourceVolumeURI, List<URI> mirrors, List<URI> promotees,
String opId) throws InternalException {
queueRequest("detachContinuousCopies", vplexURI, sourceVolumeURI, mirrors, promotees, opId);
}
@Override
public boolean validateStorageProviderConnection(String ipAddress, Integer portNumber) {
return VPlexDeviceController.getInstance().validateStorageProviderConnection(ipAddress, portNumber);
}
@Override
public void establishVolumeAndFullCopyGroupRelation(URI storage, URI sourceVolume, URI fullCopy, String opId) {
queueRequest("establishVolumeAndFullCopyGroupRelation", storage, sourceVolume, fullCopy, opId);
}
@Override
public void resyncSnapshot(URI vplexURI, URI snapshotURI, String opId) throws InternalException {
queueRequest("resyncSnapshot", vplexURI, snapshotURI, opId);
}
@Override
public void pauseMigration(URI vplexURI, URI migrationURI, String opId) {
queueRequest("pauseMigration", vplexURI, migrationURI, opId);
}
@Override
public void resumeMigration(URI vplexURI, URI migrationURI, String opId) {
queueRequest("resumeMigration", vplexURI, migrationURI, opId);
}
@Override
public void cancelMigration(URI vplexURI, URI migrationURI, String opId) {
queueRequest("cancelMigration", vplexURI, migrationURI, opId);
}
@Override
public void deleteMigration(URI vplexURI, URI migrationURI, String opId) {
queueRequest("deleteMigration", vplexURI, migrationURI, opId);
}
@Override
public void restoreSnapshotSession(URI vplexURI, URI snapSessionURI, String opId)
throws InternalException {
queueRequest("restoreSnapshotSession", vplexURI, snapSessionURI, opId);
}
@Override
public void relinkTargetsToSnapshotSession(URI vplexURI, URI tgtSnapSessionURI, List<URI> snapshotURIs,
String opId) throws InternalException {
queueRequest("relinkTargetsToSnapshotSession", vplexURI, tgtSnapSessionURI, snapshotURIs, opId);
}
@Override
public void updateVolumeGroup(URI vplexURI, ApplicationAddVolumeList addVolList, List<URI> removeVolumeList, URI volumeGroup,
String opId) throws InternalException {
queueRequest("updateVolumeGroup", vplexURI, addVolList, removeVolumeList, volumeGroup, opId);
}
}