package com.emc.storageos.db.client.util; import java.net.URI; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.emc.storageos.db.client.DbClient; import com.emc.storageos.db.client.constraint.ContainmentConstraint; import com.emc.storageos.db.client.model.FileExportRule; import com.emc.storageos.db.client.model.FileMountInfo; import com.emc.storageos.db.client.model.FileShare; import com.emc.storageos.model.file.ExportRule; import com.emc.storageos.model.file.MountInfo; public class FileOperationUtils { private static final Logger _log = LoggerFactory.getLogger(FileOperationUtils.class); public static ExportRule findExport(FileShare fs, String subDirectory, String securityType, DbClient dbClient) { dbClient.queryByType(FileShare.class, true); List<ExportRule> exportList = getExportRules(fs.getId(), false, subDirectory, dbClient); for (ExportRule export : exportList) { List<String> securityTypes = Arrays.asList(export.getSecFlavor().split("\\s*,\\s*")); if (securityTypes.contains(securityType)) { return export; } } throw new IllegalArgumentException("No exports found for the provided security type and subdirectory."); } public static List<FileExportRule> queryDBFSExports(FileShare fs, DbClient dbClient) { _log.info("Querying all ExportRules Using FsId {}", fs.getId()); try { ContainmentConstraint containmentConstraint = ContainmentConstraint.Factory.getFileExportRulesConstraint(fs.getId()); List<FileExportRule> fileExportRules = CustomQueryUtility.queryActiveResourcesByConstraint(dbClient, FileExportRule.class, containmentConstraint); return fileExportRules; } catch (Exception e) { _log.error("Error while querying {}", e); } return null; } public static List<ExportRule> getExportRules(URI id, boolean allDirs, String subDir, DbClient dbClient) { FileShare fs = dbClient.queryObject(FileShare.class, id); List<ExportRule> exportRule = new ArrayList<>(); // Query All Export Rules Specific to a File System. List<FileExportRule> exports = queryDBFSExports(fs, dbClient); _log.info("Number of existing exports found : {} ", exports.size()); if (allDirs) { // ALL EXPORTS for (FileExportRule rule : exports) { ExportRule expRule = new ExportRule(); // Copy Props copyPropertiesToSave(rule, expRule, fs); exportRule.add(expRule); } } else if (subDir != null && subDir.length() > 0) { // Filter for a specific Sub Directory export for (FileExportRule rule : exports) { if (rule.getExportPath().endsWith("/" + subDir)) { ExportRule expRule = new ExportRule(); // Copy Props copyPropertiesToSave(rule, expRule, fs); exportRule.add(expRule); } } } else { // Filter for No SUBDIR - main export rules with no sub dirs for (FileExportRule rule : exports) { if (rule.getExportPath().equalsIgnoreCase(fs.getPath())) { ExportRule expRule = new ExportRule(); // Copy Props copyPropertiesToSave(rule, expRule, fs); exportRule.add(expRule); } } } _log.info("Number of export rules returning {}", exportRule.size()); return exportRule; } private static void copyPropertiesToSave(FileExportRule orig, ExportRule dest, FileShare fs) { dest.setFsID(fs.getId()); dest.setExportPath(orig.getExportPath()); dest.setSecFlavor(orig.getSecFlavor()); dest.setAnon(orig.getAnon()); dest.setReadOnlyHosts(orig.getReadOnlyHosts()); dest.setReadWriteHosts(orig.getReadWriteHosts()); dest.setRootHosts(orig.getRootHosts()); dest.setMountPoint(orig.getMountPoint()); // Test _log.info("Expor Rule : {} - {}", orig, dest); } public static List<MountInfo> queryDBFSMounts(URI fsId, DbClient dbClient) { _log.info("Querying File System mounts using FsId {}", fsId); List<MountInfo> fsMounts = new ArrayList<MountInfo>(); try { ContainmentConstraint containmentConstraint = ContainmentConstraint.Factory.getFileMountsConstraint(fsId); List<FileMountInfo> fsDBMounts = CustomQueryUtility.queryActiveResourcesByConstraint(dbClient, FileMountInfo.class, containmentConstraint); if (fsDBMounts != null && !fsDBMounts.isEmpty()) { for (FileMountInfo dbMount : fsDBMounts) { MountInfo mountInfo = new MountInfo(); getMountInfo(dbMount, mountInfo); fsMounts.add(mountInfo); } } return fsMounts; } catch (Exception e) { _log.error("Error while querying {}", e); } return fsMounts; } private static void getMountInfo(FileMountInfo orig, MountInfo dest) { dest.setFsId(orig.getFsId()); dest.setHostId(orig.getHostId()); dest.setMountPath(orig.getMountPath()); dest.setSecurityType(orig.getSecurityType()); dest.setSubDirectory(orig.getSubDirectory()); } /** * Method to get the list file system mounts which are mount on a host * * @param host * host system URI * @return List<MountInfo> List of mount infos */ public static List<MountInfo> queryDBHostMounts(URI host, DbClient dbClient) { _log.info("Querying NFS mounts for host {}", host); List<MountInfo> hostMounts = new ArrayList<MountInfo>(); try { ContainmentConstraint containmentConstraint = ContainmentConstraint.Factory.getHostFileMountsConstraint(host); List<FileMountInfo> fileMounts = CustomQueryUtility.queryActiveResourcesByConstraint(dbClient, FileMountInfo.class, containmentConstraint); if (fileMounts != null && !fileMounts.isEmpty()) { for (FileMountInfo dbMount : fileMounts) { MountInfo mountInfo = new MountInfo(); getMountInfo(dbMount, mountInfo); hostMounts.add(mountInfo); } } return hostMounts; } catch (Exception e) { _log.error("Error while querying {}", e); } return hostMounts; } }