Search in sources :

Example 41 with FileExport

use of com.emc.storageos.db.client.model.FileExport in project coprhd-controller by CoprHD.

the class VNXUnityFileStorageDevice method doUnexport.

@Override
public BiosCommandResult doUnexport(StorageSystem storage, FileDeviceInputOutput args, List<FileExport> exportList) throws ControllerException {
    _logger.info("unexporting the file system: " + args.getFsName());
    boolean isFile = args.getFileOperation();
    for (FileExport exp : exportList) {
        VNXeApiClient apiClient = getVnxUnityClient(storage);
        String vnxeShareId = exp.getIsilonId();
        VNXeCommandJob job = null;
        VNXeFileTaskCompleter completer = null;
        try {
            if (isFile) {
                String fsId = args.getFs().getNativeId();
                job = apiClient.removeNfsShare(vnxeShareId, fsId);
            } else {
                job = apiClient.deleteNfsShareForSnapshot(vnxeShareId);
            }
            if (job != null) {
                if (isFile) {
                    completer = new VNXeFileTaskCompleter(FileShare.class, args.getFsId(), args.getOpId());
                } else {
                    completer = new VNXeFileTaskCompleter(Snapshot.class, args.getSnapshotId(), args.getOpId());
                }
                FileShareExport export = new FileShareExport(exp);
                VNXeUnexportFileSystemJob unexportFSJob = new VNXeUnexportFileSystemJob(job.getId(), storage.getId(), completer, export, export.getPath(), isFile);
                ControllerServiceImpl.enqueueJob(new QueueJob(unexportFSJob));
            } else {
                _logger.error("No job returned from exportFileSystem");
                ServiceError error = DeviceControllerErrors.vnxe.jobFailed("DeleteFileSystem", "No Job returned from deleteFileSystem");
                return BiosCommandResult.createErrorResult(error);
            }
        } catch (VNXeException e) {
            _logger.error("Unexport file system got the exception", e);
            if (completer != null) {
                completer.error(dbClient, e);
            }
            return BiosCommandResult.createErrorResult(e);
        } catch (Exception ex) {
            _logger.error("Delete file system got the exception", ex);
            ServiceError error = DeviceControllerErrors.vnxe.jobFailed("DeleteFileSystem", ex.getMessage());
            if (completer != null) {
                completer.error(dbClient, error);
            }
            return BiosCommandResult.createErrorResult(error);
        }
        StringBuilder logMsgBuilder = new StringBuilder(String.format("Unexport filesystem job submitted - Array:%s, fileSystem: %s", storage.getSerialNumber(), args.getFsName()));
        _logger.info(logMsgBuilder.toString());
    }
    return BiosCommandResult.createPendingResult();
}
Also used : ServiceError(com.emc.storageos.svcs.errorhandling.model.ServiceError) VNXeApiClient(com.emc.storageos.vnxe.VNXeApiClient) VNXeFileTaskCompleter(com.emc.storageos.volumecontroller.impl.vnxe.job.VNXeFileTaskCompleter) FileShare(com.emc.storageos.db.client.model.FileShare) SMBFileShare(com.emc.storageos.db.client.model.SMBFileShare) VNXeException(com.emc.storageos.vnxe.VNXeException) DeviceControllerException(com.emc.storageos.exceptions.DeviceControllerException) ControllerException(com.emc.storageos.volumecontroller.ControllerException) VNXeCommandJob(com.emc.storageos.vnxe.models.VNXeCommandJob) FileShareExport(com.emc.storageos.volumecontroller.FileShareExport) Snapshot(com.emc.storageos.db.client.model.Snapshot) VNXeException(com.emc.storageos.vnxe.VNXeException) FileExport(com.emc.storageos.db.client.model.FileExport) VNXeUnexportFileSystemJob(com.emc.storageos.volumecontroller.impl.vnxe.job.VNXeUnexportFileSystemJob) QueueJob(com.emc.storageos.volumecontroller.impl.job.QueueJob)

Example 42 with FileExport

use of com.emc.storageos.db.client.model.FileExport in project coprhd-controller by CoprHD.

the class VNXUnityFileStorageDevice method updateExportRules.

@Override
public BiosCommandResult updateExportRules(StorageSystem storage, FileDeviceInputOutput args) {
    // Requested Export Rules
    List<ExportRule> exportAdd = args.getExportRulesToAdd();
    List<ExportRule> exportDelete = args.getExportRulesToDelete();
    List<ExportRule> exportModify = args.getExportRulesToModify();
    // To be processed export rules
    List<ExportRule> exportsToRemove = new ArrayList<>();
    List<ExportRule> exportsToAdd = new ArrayList<>();
    List<ExportRule> newExportsForDelete = new ArrayList<>();
    VNXeFileTaskCompleter completer = null;
    VNXeApiClient apiClient = getVnxUnityClient(storage);
    String subDir = args.getSubDirectory();
    // ALL EXPORTS
    List<ExportRule> exportsToprocess = args.getExistingDBExportRules();
    Map<String, ArrayList<ExportRule>> existingExportsMapped = new HashMap();
    try {
        String exportPath;
        if (!args.getFileOperation()) {
            exportPath = args.getSnapshotPath();
            if (subDir != null && subDir.length() > 0) {
                exportPath = args.getSnapshotPath() + "/" + subDir;
            }
        } else {
            exportPath = args.getFs().getPath();
            if (subDir != null && subDir.length() > 0) {
                exportPath = args.getFs().getPath() + "/" + subDir;
            }
        }
        _logger.info("exportPath : {}", exportPath);
        args.setExportPath(exportPath);
        try {
            // add the new export rule from the array into the update request.
            Map<String, ExportRule> arrayExportRuleMap = extraExportRuleFromArray(storage, args);
            if (!arrayExportRuleMap.isEmpty()) {
                if (exportModify != null) {
                    // merge the end point for which sec flavor is common.
                    for (ExportRule exportRule : exportModify) {
                        ExportRule arrayExportRule = arrayExportRuleMap.remove(exportRule.getSecFlavor());
                        if (arrayExportRule != null) {
                            if (exportRule.getReadOnlyHosts() != null) {
                                exportRule.getReadOnlyHosts().addAll(arrayExportRule.getReadOnlyHosts());
                            } else {
                                exportRule.setReadOnlyHosts(arrayExportRule.getReadOnlyHosts());
                            }
                            if (exportRule.getReadWriteHosts() != null) {
                                exportRule.getReadWriteHosts().addAll(arrayExportRule.getReadWriteHosts());
                            } else {
                                exportRule.setReadWriteHosts(arrayExportRule.getReadWriteHosts());
                            }
                            if (exportRule.getRootHosts() != null) {
                                exportRule.getRootHosts().addAll(arrayExportRule.getRootHosts());
                            } else {
                                exportRule.setRootHosts(arrayExportRule.getRootHosts());
                            }
                        }
                    }
                    // now add the remaining export rule
                    exportModify.addAll(arrayExportRuleMap.values());
                } else {
                    // if exportModify is null then create a new export rule and add
                    exportModify = new ArrayList<ExportRule>();
                    exportModify.addAll(arrayExportRuleMap.values());
                }
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            _logger.error("Not able to fetch latest Export rule from backend array.", e);
        }
        if (exportsToprocess == null) {
            exportsToprocess = new ArrayList<>();
        }
        _logger.info("Number of existng Rules found {}", exportsToprocess.size());
        // Process Exports
        for (ExportRule existingRule : exportsToprocess) {
            ArrayList<ExportRule> exps = existingExportsMapped.get(existingRule.getExportPath());
            if (exps == null) {
                exps = new ArrayList<>();
            }
            exps.add(existingRule);
            _logger.info("Checking existing export for {} : exps : {}", existingRule.getExportPath(), exps);
            existingExportsMapped.put(existingRule.getExportPath(), exps);
        }
        // Handle Add export Rules
        if (exportAdd != null && !exportAdd.isEmpty()) {
            // Check for existing exports for the export path including subdirectory
            ArrayList<ExportRule> exps = existingExportsMapped.get(exportPath);
            if (exps != null && !exps.isEmpty()) {
                _logger.error("Adding export rules is not supported as there can be only one export rule for VNX Unity.");
                ServiceError error = DeviceControllerErrors.vnxe.jobFailed("updateExportRules", "Adding export rule is not supported for VNX unity");
                return BiosCommandResult.createErrorResult(error);
            }
        }
        // Handle Modified export Rules
        if (!exportsToprocess.isEmpty()) {
            if (subDir != null && !subDir.isEmpty()) {
                for (ExportRule existingRule : exportsToprocess) {
                    if (existingRule.getExportPath().endsWith("/" + subDir)) {
                        // Filter for a specific Sub Directory export
                        _logger.info("Updating all subdir exports rules at ViPR and  sub directory export at device {}", subDir);
                        processModifyRules(exportModify, existingRule, exportsToRemove, exportsToAdd);
                    } else {
                        exportsToRemove.add(existingRule);
                    }
                }
                // Handle Delete export Rules
                if (exportDelete != null && !exportDelete.isEmpty()) {
                    for (ExportRule existingRule : exportsToprocess) {
                        if (existingRule.getExportPath().endsWith("/" + subDir)) {
                            processDeleteRules(exportDelete, existingRule, exportsToRemove, newExportsForDelete);
                        } else {
                            exportsToRemove.add(existingRule);
                        }
                    }
                    exportsToAdd.addAll(newExportsForDelete);
                }
            } else {
                for (ExportRule existingRule : exportsToprocess) {
                    if (existingRule.getExportPath().equalsIgnoreCase(exportPath)) {
                        processModifyRules(exportModify, existingRule, exportsToRemove, exportsToAdd);
                    } else {
                        exportsToRemove.add(existingRule);
                    }
                }
                // Handle Delete export Rules
                if (exportDelete != null && !exportDelete.isEmpty()) {
                    for (ExportRule existingRule : exportsToprocess) {
                        if (existingRule.getExportPath().equalsIgnoreCase(exportPath)) {
                            processDeleteRules(exportDelete, existingRule, exportsToRemove, newExportsForDelete);
                        } else {
                            exportsToRemove.add(existingRule);
                        }
                    }
                    exportsToAdd.addAll(newExportsForDelete);
                }
            }
            // No of exports found to remove from the list
            _logger.info("No of exports found to remove from the existing exports list {}", exportsToRemove.size());
            exportsToprocess.removeAll(exportsToRemove);
            _logger.info("No of exports found to add to the existing exports list {}", exportsToAdd.size());
            exportsToprocess.addAll(exportsToAdd);
        } else {
            // This is valid only if no rules to modify exists
            if (exportAdd != null && !exportAdd.isEmpty()) {
                for (ExportRule newExport : exportAdd) {
                    if (args.getFileObjExports() != null) {
                        Collection<FileExport> expList = args.getFileObjExports().values();
                        Iterator<FileExport> it = expList.iterator();
                        FileExport exp = null;
                        while (it.hasNext()) {
                            FileExport export = it.next();
                            if (export.getPath().equalsIgnoreCase(exportPath)) {
                                exp = export;
                            }
                        }
                        if (exp != null) {
                            if (exp.getIsilonId() != null) {
                                newExport.setDeviceExportId(exp.getIsilonId());
                            }
                            if (exp.getNativeId() != null) {
                                newExport.setDeviceExportId(exp.getNativeId());
                            }
                        }
                    }
                    _logger.info("Add Export Rule {}", newExport);
                    newExport.setExportPath(exportPath);
                    exportsToAdd.add(newExport);
                }
            }
            exportsToprocess.addAll(exportsToAdd);
        }
        _logger.info("exportPath : {}", exportPath);
        args.setExportPath(exportPath);
        VNXeCommandJob job = null;
        for (ExportRule rule : exportsToprocess) {
            AccessEnum access = null;
            List<String> roHosts = new ArrayList<String>();
            List<String> rwHosts = new ArrayList<String>();
            List<String> rootHosts = new ArrayList<String>();
            String path = "/";
            String subdirName = "";
            String mountPathFs = args.getFsMountPath();
            String shareName = null;
            FileShareExport fsExport = null;
            boolean isDeleteRule = false;
            if (args.getFileObjExports() != null) {
                Collection<FileExport> expList = args.getFileObjExports().values();
                Iterator<FileExport> it = expList.iterator();
                FileExport exp = null;
                while (it.hasNext()) {
                    FileExport export = it.next();
                    if (export.getPath().equalsIgnoreCase(rule.getExportPath())) {
                        exp = export;
                    }
                }
                fsExport = new FileShareExport(exp);
            }
            String mountPathArg = rule.getExportPath();
            if (rule.getReadWriteHosts() != null && !rule.getReadWriteHosts().isEmpty()) {
                access = AccessEnum.READWRITE;
                rwHosts.addAll(rule.getReadWriteHosts());
            }
            if (rule.getReadOnlyHosts() != null && !rule.getReadOnlyHosts().isEmpty()) {
                access = AccessEnum.READ;
                roHosts.addAll(rule.getReadOnlyHosts());
            }
            if (rule.getRootHosts() != null && !rule.getRootHosts().isEmpty()) {
                access = AccessEnum.ROOT;
                rootHosts.addAll(rule.getRootHosts());
            }
            if (newExportsForDelete.contains(rule)) {
                isDeleteRule = true;
            }
            if (args.getFileOperation()) {
                if (!mountPathArg.equals(mountPathFs)) {
                    // subdirectory specified.
                    subdirName = mountPathArg.substring(mountPathFs.length() + 1);
                    path += subdirName;
                }
                if (isDeleteRule) {
                    job = apiClient.removeNfsShare(rule.getDeviceExportId(), args.getFs().getNativeId());
                    if (job != null) {
                        completer = new VNXeFileTaskCompleter(FileShare.class, args.getFsId(), args.getOpId());
                        VNXeUnexportFileSystemJob unexportFSJob = new VNXeUnexportFileSystemJob(job.getId(), storage.getId(), completer, fsExport, args.getExportPath(), true);
                        ControllerServiceImpl.enqueueJob(new QueueJob(unexportFSJob));
                    } else {
                        _logger.error("No job returned from unexport FileSystem");
                        ServiceError error = DeviceControllerErrors.vnxe.jobFailed("UnExportFileSystem", "No Job returned from UnExportFileSystem");
                        return BiosCommandResult.createErrorResult(error);
                    }
                } else {
                    job = apiClient.exportFileSystem(args.getFs().getNativeId(), roHosts, rwHosts, rootHosts, access, path, null, rule.getDeviceExportId(), null);
                    if (job != null) {
                        completer = new VNXeFileTaskCompleter(FileShare.class, args.getFsId(), args.getOpId());
                        VNXeModifyExportJob modifyExportJob = new VNXeModifyExportJob(job.getId(), storage.getId(), completer, rule, fsExport, args.getExportPath(), args.getFileOperation(), isDeleteRule, shareName);
                        ControllerServiceImpl.enqueueJob(new QueueJob(modifyExportJob));
                    } else {
                        _logger.error("No job returned from updateExportRules");
                        ServiceError error = DeviceControllerErrors.vnxe.jobFailed("updateExportRules", "No Job returned from updateExportRules");
                        return BiosCommandResult.createErrorResult(error);
                    }
                }
            } else {
                shareName = VNXeUtils.buildNfsShareName(args.getSnapshotName(), path);
                if (isDeleteRule) {
                    job = apiClient.deleteNfsShareForSnapshot(rule.getDeviceExportId());
                    if (job != null) {
                        completer = new VNXeFileTaskCompleter(Snapshot.class, args.getSnapshotId(), args.getOpId());
                        VNXeUnexportFileSystemJob unexportFSJob = new VNXeUnexportFileSystemJob(job.getId(), storage.getId(), completer, fsExport, rule.getExportPath(), false);
                        ControllerServiceImpl.enqueueJob(new QueueJob(unexportFSJob));
                    } else {
                        _logger.error("No job returned from unexportFileSystem Snapshot");
                        ServiceError error = DeviceControllerErrors.vnxe.jobFailed("UnExportFileSystem", "No Job returned from UnExportFileSystem");
                        return BiosCommandResult.createErrorResult(error);
                    }
                } else {
                    job = apiClient.createNfsShareForSnap(args.getSnapNativeId(), roHosts, rwHosts, rootHosts, access, path, shareName, null);
                    if (job != null) {
                        completer = new VNXeFileTaskCompleter(Snapshot.class, args.getSnapshotId(), args.getOpId());
                        VNXeModifyExportJob modifyExportJob = new VNXeModifyExportJob(job.getId(), storage.getId(), completer, rule, fsExport, args.getExportPath(), args.getFileOperation(), isDeleteRule, shareName);
                        ControllerServiceImpl.enqueueJob(new QueueJob(modifyExportJob));
                    } else {
                        _logger.error("No job returned from updateExportRules");
                        ServiceError error = DeviceControllerErrors.vnxe.jobFailed("updateExportRules", "No Job returned from updateExportRules");
                        return BiosCommandResult.createErrorResult(error);
                    }
                }
            }
        }
    } catch (VNXeException e) {
        _logger.error("updateExportRules got the exception", e);
        if (completer != null) {
            completer.error(dbClient, e);
        }
        return BiosCommandResult.createErrorResult(e);
    } catch (Exception ex) {
        _logger.error("updateExportRules got the exception", ex);
        ServiceError error = DeviceControllerErrors.vnxe.jobFailed("updateExportRules", ex.getMessage());
        if (completer != null) {
            completer.error(dbClient, error);
        }
        return BiosCommandResult.createErrorResult(error);
    }
    _logger.info("UpdateExportRules job submitted");
    return BiosCommandResult.createPendingResult();
}
Also used : VNXeModifyExportJob(com.emc.storageos.volumecontroller.impl.vnxe.job.VNXeModifyExportJob) VNXeApiClient(com.emc.storageos.vnxe.VNXeApiClient) HashMap(java.util.HashMap) ArrayList(java.util.ArrayList) VNXeFileTaskCompleter(com.emc.storageos.volumecontroller.impl.vnxe.job.VNXeFileTaskCompleter) VNXeCommandJob(com.emc.storageos.vnxe.models.VNXeCommandJob) FileShareExport(com.emc.storageos.volumecontroller.FileShareExport) AccessEnum(com.emc.storageos.vnxe.models.AccessEnum) ServiceError(com.emc.storageos.svcs.errorhandling.model.ServiceError) FileShare(com.emc.storageos.db.client.model.FileShare) SMBFileShare(com.emc.storageos.db.client.model.SMBFileShare) VNXeException(com.emc.storageos.vnxe.VNXeException) DeviceControllerException(com.emc.storageos.exceptions.DeviceControllerException) ControllerException(com.emc.storageos.volumecontroller.ControllerException) Snapshot(com.emc.storageos.db.client.model.Snapshot) VNXeException(com.emc.storageos.vnxe.VNXeException) FileExport(com.emc.storageos.db.client.model.FileExport) ExportRule(com.emc.storageos.model.file.ExportRule) VNXeUnexportFileSystemJob(com.emc.storageos.volumecontroller.impl.vnxe.job.VNXeUnexportFileSystemJob) QueueJob(com.emc.storageos.volumecontroller.impl.job.QueueJob)

Example 43 with FileExport

use of com.emc.storageos.db.client.model.FileExport in project coprhd-controller by CoprHD.

the class VNXUnityFileStorageDevice method doExport.

@Override
public BiosCommandResult doExport(StorageSystem storage, FileDeviceInputOutput args, List<FileExport> exportList) throws ControllerException {
    _logger.info("exporting the file system: " + args.getFsName());
    if (args.getFileObjExports() == null || args.getFileObjExports().isEmpty()) {
        args.initFileObjExports();
    }
    for (FileExport exp : exportList) {
        VNXeApiClient apiClient = getVnxUnityClient(storage);
        String fsId = args.getFs().getNativeId();
        String fsName = args.getFsName();
        String permission = exp.getPermissions();
        String path = "/";
        String subdirName = "";
        String mountPathArg = exp.getMountPath();
        String comments = exp.getComments();
        VNXeCommandJob job = null;
        VNXeFileTaskCompleter completer = null;
        String exportKey = exp.getFileExportKey();
        FileShareExport newExport = new FileShareExport(exp);
        try {
            AccessEnum access = null;
            List<String> roClients = null;
            List<String> rwClients = null;
            List<String> rootClients = null;
            FileExport existingExport = null;
            if (args.getFileOperation()) {
                FSExportMap exportMap = args.getFileObjExports();
                existingExport = exportMap.get(exportKey);
            } else {
                FSExportMap exportMap = args.getSnapshotExports();
                existingExport = exportMap.get(exportKey);
            }
            if (existingExport != null) {
                if (permission.equalsIgnoreCase(FileShareExport.Permissions.rw.name())) {
                    access = AccessEnum.READWRITE;
                    if (existingExport.getClients() != null && !existingExport.getClients().isEmpty()) {
                        if (rwClients == null) {
                            rwClients = new ArrayList<String>();
                        }
                        rwClients.addAll(existingExport.getClients());
                    }
                } else if (permission.equalsIgnoreCase(FileShareExport.Permissions.ro.name())) {
                    access = AccessEnum.READ;
                    if (existingExport.getClients() != null && !existingExport.getClients().isEmpty()) {
                        if (roClients == null) {
                            roClients = new ArrayList<String>();
                        }
                        roClients.addAll(existingExport.getClients());
                    }
                } else if (permission.equalsIgnoreCase(FileShareExport.Permissions.root.name())) {
                    access = AccessEnum.ROOT;
                    if (existingExport.getClients() != null && !existingExport.getClients().isEmpty()) {
                        if (rootClients == null) {
                            rootClients = new ArrayList<String>();
                        }
                        rootClients.addAll(existingExport.getClients());
                    }
                }
            }
            if (permission.equalsIgnoreCase(FileShareExport.Permissions.rw.name())) {
                access = AccessEnum.READWRITE;
                if (exp.getClients() != null && !exp.getClients().isEmpty()) {
                    if (rwClients == null) {
                        rwClients = new ArrayList<String>();
                    }
                    rwClients.addAll(exp.getClients());
                }
            } else if (permission.equalsIgnoreCase(FileShareExport.Permissions.ro.name())) {
                access = AccessEnum.READ;
                if (exp.getClients() != null && !exp.getClients().isEmpty()) {
                    if (roClients == null) {
                        roClients = new ArrayList<String>();
                    }
                    roClients.addAll(exp.getClients());
                }
            } else if (permission.equalsIgnoreCase(FileShareExport.Permissions.root.name())) {
                access = AccessEnum.ROOT;
                if (exp.getClients() != null && !exp.getClients().isEmpty()) {
                    if (rootClients == null) {
                        rootClients = new ArrayList<String>();
                    }
                    rootClients.addAll(exp.getClients());
                }
            }
            if (args.getFileOperation()) {
                String mountPathFs = args.getFsMountPath();
                if (!mountPathArg.equals(mountPathFs)) {
                    // subdirectory specified.
                    subdirName = mountPathArg.substring(mountPathFs.length() + 1);
                    path += subdirName;
                }
                String shareName = VNXeUtils.buildNfsShareName(fsName, subdirName);
                job = apiClient.exportFileSystem(fsId, roClients, rwClients, rootClients, access, path, shareName, null, comments);
                if (job != null) {
                    completer = new VNXeFileTaskCompleter(FileShare.class, args.getFsId(), args.getOpId());
                    VNXeExportFileSystemJob exportFSJob = new VNXeExportFileSystemJob(job.getId(), storage.getId(), completer, newExport, shareName, true);
                    ControllerServiceImpl.enqueueJob(new QueueJob(exportFSJob));
                } else {
                    _logger.error("No job returned from exportFileSystem");
                    ServiceError error = DeviceControllerErrors.vnxe.jobFailed("exportFileSystem", "No Job returned from exportFileSystem");
                    return BiosCommandResult.createErrorResult(error);
                }
            } else {
                String snapId = args.getSnapNativeId();
                String snapName = args.getSnapshotName();
                String shareName = VNXeUtils.buildNfsShareName(snapName, path);
                job = apiClient.createNfsShareForSnap(snapId, roClients, rwClients, rootClients, access, path, shareName, comments);
                if (job != null) {
                    completer = new VNXeFileTaskCompleter(Snapshot.class, args.getSnapshotId(), args.getOpId());
                    VNXeExportFileSystemJob exportFSJob = new VNXeExportFileSystemJob(job.getId(), storage.getId(), completer, newExport, shareName, false);
                    ControllerServiceImpl.enqueueJob(new QueueJob(exportFSJob));
                } else {
                    _logger.error("No job returned from exportFileSystem");
                    ServiceError error = DeviceControllerErrors.vnxe.jobFailed("exportFileSystem", "No Job returned from exportFileSystem");
                    return BiosCommandResult.createErrorResult(error);
                }
            }
        } catch (VNXeException e) {
            _logger.error("Export file system got the exception", e);
            if (completer != null) {
                completer.error(dbClient, e);
            }
            return BiosCommandResult.createErrorResult(e);
        } catch (Exception ex) {
            _logger.error("export file system got the exception", ex);
            ServiceError error = DeviceControllerErrors.vnxe.jobFailed("exportFileSystem", ex.getMessage());
            if (completer != null) {
                completer.error(dbClient, error);
            }
            return BiosCommandResult.createErrorResult(error);
        }
        _logger.info("Export job submitted");
    }
    return BiosCommandResult.createPendingResult();
}
Also used : ServiceError(com.emc.storageos.svcs.errorhandling.model.ServiceError) VNXeApiClient(com.emc.storageos.vnxe.VNXeApiClient) ArrayList(java.util.ArrayList) VNXeFileTaskCompleter(com.emc.storageos.volumecontroller.impl.vnxe.job.VNXeFileTaskCompleter) FSExportMap(com.emc.storageos.db.client.model.FSExportMap) FileShare(com.emc.storageos.db.client.model.FileShare) SMBFileShare(com.emc.storageos.db.client.model.SMBFileShare) VNXeException(com.emc.storageos.vnxe.VNXeException) DeviceControllerException(com.emc.storageos.exceptions.DeviceControllerException) ControllerException(com.emc.storageos.volumecontroller.ControllerException) VNXeCommandJob(com.emc.storageos.vnxe.models.VNXeCommandJob) FileShareExport(com.emc.storageos.volumecontroller.FileShareExport) Snapshot(com.emc.storageos.db.client.model.Snapshot) VNXeExportFileSystemJob(com.emc.storageos.volumecontroller.impl.vnxe.job.VNXeExportFileSystemJob) VNXeException(com.emc.storageos.vnxe.VNXeException) FileExport(com.emc.storageos.db.client.model.FileExport) AccessEnum(com.emc.storageos.vnxe.models.AccessEnum) QueueJob(com.emc.storageos.volumecontroller.impl.job.QueueJob)

Example 44 with FileExport

use of com.emc.storageos.db.client.model.FileExport in project coprhd-controller by CoprHD.

the class DataDomainFileStorageDevice method ddCreateExports.

private void ddCreateExports(DataDomainClient ddClient, String storagePoolId, FSExportMap exportMap, List<FileExport> createFileExports) throws DataDomainApiException {
    for (FileExport fileExport : createFileExports) {
        // Build export map for export create
        String exportName;
        if (!fileExport.getPath().startsWith(DataDomainApiConstants.FS_PATH_BASE)) {
            exportName = DataDomainApiConstants.FS_PATH_BASE + fileExport.getPath();
            fileExport.setPath(exportName);
        } else {
            exportName = fileExport.getPath();
        }
        List<DDExportClient> ddExportClients = ddBuildCreateExportClientList(fileExport);
        for (DDExportClient ddExpClient : ddExportClients) {
            _log.info("DD Export Client {}", ddExpClient.toString());
        }
        DDExportInfo ddExportInfo = ddClient.createExport(storagePoolId, exportName, ddExportClients);
        if (ddExportInfo.getPathStatus() != DataDomainApiConstants.PATH_EXISTS) {
            DDServiceStatus ddSvcStatus = ddClient.deleteExport(storagePoolId, ddExportInfo.getId());
            throw DataDomainApiException.exceptions.failedExportPathDoesNotExist(exportName);
        } else {
            ddSetNewExportProperties(fileExport, ddExportClients, ddExportInfo);
            String exportKey = fileExport.getFileExportKey();
            exportMap.put(exportKey, fileExport);
        }
    }
}
Also used : DDExportClient(com.emc.storageos.datadomain.restapi.model.DDExportClient) DDServiceStatus(com.emc.storageos.datadomain.restapi.model.DDServiceStatus) DDExportInfo(com.emc.storageos.datadomain.restapi.model.DDExportInfo) FileExport(com.emc.storageos.db.client.model.FileExport)

Example 45 with FileExport

use of com.emc.storageos.db.client.model.FileExport in project coprhd-controller by CoprHD.

the class DataDomainFileStorageDevice method updateExportRules.

@Override
public BiosCommandResult updateExportRules(StorageSystem storage, FileDeviceInputOutput args) throws ControllerException {
    // Requested Export Rules
    List<ExportRule> exportAdd = args.getExportRulesToAdd();
    List<ExportRule> exportDelete = args.getExportRulesToDelete();
    List<ExportRule> exportModify = args.getExportRulesToModify();
    // Export path
    String exportPath;
    String subDir = args.getSubDirectory();
    StringBuilder path = new StringBuilder();
    if (!args.getFileOperation()) {
        path.append(args.getSnapshotPath());
    } else {
        path.append(args.getFs().getPath());
    }
    if ((subDir != null) && (subDir.length() > 0)) {
        path.append("/");
        path.append(subDir);
    }
    exportPath = path.toString();
    // Data Domain attaches a prefix to every file system path
    path = new StringBuilder();
    if (!exportPath.startsWith(DataDomainApiConstants.FS_PATH_BASE)) {
        path.append(DataDomainApiConstants.FS_PATH_BASE);
    }
    path.append(exportPath);
    _log.info("exportPath : {}", path);
    args.setExportPath(path.toString());
    // Check to ensure clients are not repeated
    if (repeatedClientsInRequest(exportAdd, exportDelete, exportModify)) {
        ServiceError serviceError = DeviceControllerErrors.datadomain.exportUpdateFailedRepeatedClients();
        return BiosCommandResult.createErrorResult(serviceError);
    }
    // Ensure that the clients being added don't already exist in
    // another export rule
    List<ExportRule> existingExports = args.getExistingDBExportRules();
    if (addingExistingClient(existingExports, path.toString(), exportAdd)) {
        ServiceError serviceError = DeviceControllerErrors.datadomain.exportUpdateFailedAddingExistingClient();
        return BiosCommandResult.createErrorResult(serviceError);
    }
    // To be processed export rules
    List<ExportRule> exportsToRemove = new ArrayList<>();
    List<ExportRule> exportsToAdd = new ArrayList<>();
    if (existingExports != null && !existingExports.isEmpty()) {
        args.setObjIdOnDevice(existingExports.get(0).getDeviceExportId());
        _log.info("Number of existng Rules found {}", existingExports.size());
    }
    // Create/Modify/Delete exports on the array
    DataDomainClient ddClient = getDataDomainClient(storage);
    if (ddClient == null) {
        _log.error("updateExportRules failed, provider unreachable");
        String op = "Update export rules";
        return BiosCommandResult.createErrorResult(DeviceControllerErrors.datadomain.operationFailedProviderInaccessible(op));
    }
    URI storagePoolId = args.getFs().getPool();
    StoragePool storagePool = _dbClient.queryObject(StoragePool.class, storagePoolId);
    // may be deleted selectively without deleting the export.
    if ((exportModify != null) && (!exportModify.isEmpty())) {
        // Are all existing rules being modified?
        int existingRulesToModify = 0;
        int numExistingRules = 0;
        for (ExportRule modifyRule : exportModify) {
            String securityFlavor = modifyRule.getSecFlavor();
            for (ExportRule existingRule : existingExports) {
                if (existingRule.getExportPath().equals(path.toString())) {
                    if (existingRule.getSecFlavor().equals(securityFlavor)) {
                        existingRulesToModify++;
                    }
                    numExistingRules++;
                }
            }
        }
        if (existingRulesToModify == numExistingRules) {
            // All rules are being modified, delete the existing export on the array
            String deviceExportId = null;
            for (ExportRule existingRule : existingExports) {
                if (existingRule.getExportPath().equals(path.toString())) {
                    deviceExportId = existingRule.getDeviceExportId();
                    break;
                }
            }
            try {
                doDeleteFsExport(ddClient, storagePool.getNativeId(), deviceExportId);
            } catch (DataDomainApiException dde) {
                _log.error("Export update failed, device error.", dde);
                return BiosCommandResult.createErrorResult(dde);
            }
            // Export rules to create
            for (ExportRule modifyRule : exportModify) {
                exportsToAdd.add(modifyRule);
            }
            doCreateExports(ddClient, storagePool.getNativeId(), path.toString(), exportsToAdd);
            exportsToAdd.clear();
        } else {
            // end points selectively
            for (ExportRule modifyRule : exportModify) {
                String securityFlavor = modifyRule.getSecFlavor();
                ExportRule matchingRule = null;
                for (ExportRule existingRule : existingExports) {
                    if (existingRule.getSecFlavor().equals(securityFlavor)) {
                        matchingRule = existingRule;
                        break;
                    }
                }
                // Since the list has been validated already, we can safely assume we will
                // always find a matching existing rule.
                modifyRule.setExportPath(args.getExportPath());
                modifyRule.setFsID(args.getFsId());
                exportsToRemove.add(matchingRule);
                exportsToAdd.add(modifyRule);
            }
        }
    }
    // Process add list
    if ((exportAdd != null) && (!exportAdd.isEmpty())) {
        for (ExportRule newExport : exportAdd) {
            _log.info("Adding Export Rule {}", newExport);
            if (args.getFileObjExports() != null) {
                Collection<FileExport> expList = args.getFileObjExports().values();
                Iterator<FileExport> it = expList.iterator();
                FileExport exp = null;
                while (it.hasNext()) {
                    FileExport export = it.next();
                    if (export.getPath().equalsIgnoreCase(path.toString())) {
                        exp = export;
                    }
                }
                // set the device export id with export id.
                if (exp != null) {
                    if (exp.getIsilonId() != null) {
                        newExport.setDeviceExportId(exp.getIsilonId());
                    }
                    if (exp.getNativeId() != null) {
                        newExport.setDeviceExportId(exp.getNativeId());
                    }
                }
            }
            newExport.setExportPath(args.getExportPath());
            newExport.setFsID(args.getFsId());
            exportsToAdd.add(newExport);
        }
        // otherwise, update the exports.
        if (existingExports == null || existingExports.isEmpty()) {
            doCreateExports(ddClient, storagePool.getNativeId(), path.toString(), exportsToAdd);
            exportsToAdd.clear();
        }
    }
    // selectively, without disrupting unaffected end points.
    if ((exportDelete != null) && (!exportDelete.isEmpty())) {
        // Are all existing rules being deleted?
        int existingRulesToDelete = 0;
        for (ExportRule deleteRule : exportDelete) {
            String securityFlavor = deleteRule.getSecFlavor();
            for (ExportRule existingRule : existingExports) {
                if (existingRule.getSecFlavor().equals(securityFlavor)) {
                    existingRulesToDelete++;
                }
            }
        }
        if (existingRulesToDelete == existingExports.size()) {
            // All rules are being deleted, delete the existing export on the array
            String deviceExportId = existingExports.get(0).getDeviceExportId();
            try {
                doDeleteFsExport(ddClient, storagePool.getNativeId(), deviceExportId);
            } catch (DataDomainApiException dde) {
                _log.error("Export update failed, device error.", dde);
                return BiosCommandResult.createErrorResult(dde);
            }
        } else {
            // end points selectively
            for (ExportRule deleteRule : exportDelete) {
                String securityFlavor = deleteRule.getSecFlavor();
                ExportRule matchingRule = null;
                for (ExportRule existingRule : existingExports) {
                    if (existingRule.getSecFlavor().equals(securityFlavor)) {
                        matchingRule = existingRule;
                        break;
                    }
                }
                // Since the list has been validated already, we can safely assume we will
                // always find a matching existing rule.
                exportsToRemove.add(matchingRule);
            }
        }
    }
    _log.info("No of exports to be removed from the existing list {}", exportsToRemove.size());
    _log.info("No of exports to be added to the existing list {}", exportsToAdd.size());
    // Delete clients selectively
    try {
        String deviceExportId = null;
        for (ExportRule existingRule : existingExports) {
            if (existingRule.getExportPath().equals(path.toString())) {
                deviceExportId = existingRule.getDeviceExportId();
                break;
            }
        }
        boolean deleteClients = true;
        doAddDeleteClients(ddClient, storagePool.getNativeId(), deviceExportId, exportsToRemove, deleteClients);
    } catch (DataDomainApiException dde) {
        _log.error("Export update failed, device error.", dde);
        return BiosCommandResult.createErrorResult(dde);
    }
    // Create exports
    try {
        String deviceExportId = null;
        for (ExportRule existingRule : existingExports) {
            if (existingRule.getExportPath().equals(path.toString())) {
                deviceExportId = existingRule.getDeviceExportId();
                break;
            }
        }
        boolean deleteClients = false;
        doAddDeleteClients(ddClient, storagePool.getNativeId(), deviceExportId, exportsToAdd, deleteClients);
    } catch (DataDomainApiException dde) {
        _log.error("Export update failed, device error.", dde);
        return BiosCommandResult.createErrorResult(dde);
    }
    _log.info("DataDomainFileStorageDevice updateFSExportRules {} - complete", args.getFsId());
    return BiosCommandResult.createSuccessfulResult();
}
Also used : ServiceError(com.emc.storageos.svcs.errorhandling.model.ServiceError) StoragePool(com.emc.storageos.db.client.model.StoragePool) ArrayList(java.util.ArrayList) DataDomainClient(com.emc.storageos.datadomain.restapi.DataDomainClient) URI(java.net.URI) DataDomainApiException(com.emc.storageos.datadomain.restapi.errorhandling.DataDomainApiException) FileExport(com.emc.storageos.db.client.model.FileExport) ExportRule(com.emc.storageos.model.file.ExportRule)

Aggregations

FileExport (com.emc.storageos.db.client.model.FileExport)66 FSExportMap (com.emc.storageos.db.client.model.FSExportMap)33 ArrayList (java.util.ArrayList)32 FileShare (com.emc.storageos.db.client.model.FileShare)31 SMBFileShare (com.emc.storageos.db.client.model.SMBFileShare)29 Snapshot (com.emc.storageos.db.client.model.Snapshot)21 DeviceControllerException (com.emc.storageos.exceptions.DeviceControllerException)20 FileShareExport (com.emc.storageos.volumecontroller.FileShareExport)18 ControllerException (com.emc.storageos.volumecontroller.ControllerException)17 ServiceError (com.emc.storageos.svcs.errorhandling.model.ServiceError)16 VNXeApiClient (com.emc.storageos.vnxe.VNXeApiClient)14 VNXeException (com.emc.storageos.vnxe.VNXeException)12 StorageSystem (com.emc.storageos.db.client.model.StorageSystem)11 URI (java.net.URI)10 VNXeCommandJob (com.emc.storageos.vnxe.models.VNXeCommandJob)8 QueueJob (com.emc.storageos.volumecontroller.impl.job.QueueJob)8 VNXeFileTaskCompleter (com.emc.storageos.volumecontroller.impl.vnxe.job.VNXeFileTaskCompleter)8 FileObject (com.emc.storageos.db.client.model.FileObject)7 DatabaseException (com.emc.storageos.db.exceptions.DatabaseException)7 CheckPermission (com.emc.storageos.security.authorization.CheckPermission)7