/*
* Copyright (c) 2015 EMC Corporation
* All Rights Reserved
*/
package com.emc.storageos.api.service.impl.resource;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.emc.storageos.api.service.impl.placement.FileStorageScheduler;
import com.emc.storageos.db.client.model.DataObject;
import com.emc.storageos.db.client.model.FilePolicy;
import com.emc.storageos.db.client.model.FileShare;
import com.emc.storageos.db.client.model.Operation;
import com.emc.storageos.db.client.model.Project;
import com.emc.storageos.db.client.model.TenantOrg;
import com.emc.storageos.db.client.model.VirtualArray;
import com.emc.storageos.db.client.model.VirtualPool;
import com.emc.storageos.fileorchestrationcontroller.FileDescriptor;
import com.emc.storageos.fileorchestrationcontroller.FileOrchestrationController;
import com.emc.storageos.model.TaskList;
import com.emc.storageos.model.TaskResourceRep;
import com.emc.storageos.model.file.FileSystemParam;
import com.emc.storageos.svcs.errorhandling.resources.InternalException;
import com.emc.storageos.volumecontroller.Recommendation;
import com.emc.storageos.volumecontroller.impl.utils.VirtualPoolCapabilityValuesWrapper;
/**
* File Service subtask (parts of larger operations) default implementation.
*/
public class DefaultFileServiceApiImpl extends AbstractFileServiceApiImpl<FileStorageScheduler> {
private static final Logger _log = LoggerFactory.getLogger(DefaultFileServiceApiImpl.class);
public DefaultFileServiceApiImpl() {
super(null);
}
@Override
public TaskList createFileSystems(FileSystemParam param, Project project,
VirtualArray varray, VirtualPool vpool, TenantOrg tenantOrg, DataObject.Flag[] flags,
List<Recommendation> recommendations, TaskList taskList, String task,
VirtualPoolCapabilityValuesWrapper vpoolCapabilities) throws InternalException {
List<FileShare> fileList = null;
List<FileShare> fileShares = new ArrayList<FileShare>();
// Prepare the FileShares
fileList = getFileScheduler().prepareFileSystems(param, task, taskList, project,
varray, vpool, recommendations, vpoolCapabilities, false);
fileShares.addAll(fileList);
// prepare the file descriptors
String suggestedNativeFsId = param.getFsId() == null ? "" : param.getFsId();
final List<FileDescriptor> fileDescriptors = prepareFileDescriptors(fileShares, vpoolCapabilities, suggestedNativeFsId);
final FileOrchestrationController controller = getController(FileOrchestrationController.class,
FileOrchestrationController.FILE_ORCHESTRATION_DEVICE);
try {
// Execute the fileshare creations requests
controller.createFileSystems(fileDescriptors, task);
} catch (InternalException e) {
_log.error("Controller error when creating filesystems", e);
failFileShareCreateRequest(task, taskList, fileShares, e.getMessage());
throw e;
} catch (Exception e) {
_log.error("Controller error when creating filesystems", e);
failFileShareCreateRequest(task, taskList, fileShares, e.getMessage());
throw e;
}
return taskList;
}
@Override
public void deleteFileSystems(URI systemURI, List<URI> fileSystemURIs, String deletionType,
boolean forceDelete, boolean deleteOnlyMirrors, String task)
throws InternalException {
super.deleteFileSystems(systemURI, fileSystemURIs, deletionType, forceDelete, deleteOnlyMirrors, task);
}
@Override
public TaskResourceRep createTargetsForExistingSource(FileShare fs, Project project,
VirtualPool vpool, VirtualArray varray, TaskList taskList, String task, List<Recommendation> recommendations,
VirtualPoolCapabilityValuesWrapper vpoolCapabilities) throws InternalException {
try {
super.createTargetsForExistingSource(fs, project, vpool, varray, taskList, task,
recommendations, vpoolCapabilities);
} catch (Exception e) {
_log.error("Controller error when create mirror filesystems", e);
throw e;
}
return taskList.getTaskList().get(0);
}
/**
* prepare the file descriptors
*
* @param filesystems
* @param cosCapabilities
* @param suggestedId
* @return
*/
private List<FileDescriptor> prepareFileDescriptors(List<FileShare> filesystems,
VirtualPoolCapabilityValuesWrapper cosCapabilities, String suggestedId) {
// Build up a list of FileDescriptors based on the fileshares
final List<FileDescriptor> fileDescriptors = new ArrayList<FileDescriptor>();
for (FileShare filesystem : filesystems) {
FileDescriptor desc = new FileDescriptor(FileDescriptor.Type.FILE_DATA,
filesystem.getStorageDevice(), filesystem.getId(),
filesystem.getPool(), filesystem.getCapacity(), cosCapabilities, null, suggestedId);
fileDescriptors.add(desc);
}
return fileDescriptors;
}
/**
* {@inheritDoc}
*/
@Override
protected List<FileDescriptor> getDescriptorsOfFileShareDeleted(URI systemURI,
List<URI> fileShareURIs, String deletionType, boolean forceDelete, boolean deleteOnlyMirrors) {
List<FileDescriptor> fileDescriptors = new ArrayList<FileDescriptor>();
for (URI fileShareURI : fileShareURIs) {
FileShare filesystem = _dbClient.queryObject(FileShare.class, fileShareURI);
FileDescriptor fileDescriptor = new FileDescriptor(FileDescriptor.Type.FILE_DATA,
filesystem.getStorageDevice(), filesystem.getId(),
filesystem.getPool(), deletionType, forceDelete, deleteOnlyMirrors);
fileDescriptors.add(fileDescriptor);
}
return fileDescriptors;
}
private void failFileShareCreateRequest(String task, TaskList taskList, List<FileShare> preparedFileShares, String errorMsg) {
String errorMessage = String.format("Controller error: %s", errorMsg);
for (TaskResourceRep fileShareTask : taskList.getTaskList()) {
fileShareTask.setState(Operation.Status.error.name());
fileShareTask.setMessage(errorMessage);
Operation statusUpdate = new Operation(Operation.Status.error.name(), errorMessage);
_dbClient.updateTaskOpStatus(FileShare.class, fileShareTask.getResource()
.getId(), task, statusUpdate);
}
for (FileShare fileShare : preparedFileShares) {
fileShare.setInactive(true);
_dbClient.updateObject(fileShare);
}
}
@Override
public void assignFilePolicyToFileSystem(FileShare fs, FilePolicy filePolicy, Project project, VirtualPool vpool,
VirtualArray varray, TaskList taskList, String task, List<Recommendation> recommendations,
VirtualPoolCapabilityValuesWrapper vpoolCapabilities)
throws InternalException {
try {
super.assignFilePolicyToFileSystem(fs, filePolicy, project, vpool, varray, taskList, task,
recommendations, vpoolCapabilities);
} catch (Exception e) {
_log.error("Controller error when create mirror filesystems", e);
throw e;
}
}
}