/*
* Copyright (c) 2012-2015 iWave Software LLC
* All Rights Reserved
*/
package com.emc.sa.asset.providers;
import java.net.URI;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.Predicate;
import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Component;
import com.emc.sa.asset.AssetOptionsContext;
import com.emc.sa.asset.AssetOptionsUtils;
import com.emc.sa.asset.BaseAssetOptionsProvider;
import com.emc.sa.asset.annotation.Asset;
import com.emc.sa.asset.annotation.AssetDependencies;
import com.emc.sa.asset.annotation.AssetNamespace;
import com.emc.sa.machinetags.MachineTagUtils;
import com.emc.storageos.db.client.model.FileShare;
import com.emc.storageos.db.client.model.QuotaDirectory;
import com.emc.storageos.model.NamedRelatedResourceRep;
import com.emc.storageos.model.VirtualArrayRelatedResourceRep;
import com.emc.storageos.model.file.CifsShareACLUpdateParams;
import com.emc.storageos.model.file.ExportRule;
import com.emc.storageos.model.file.FileShareRestRep;
import com.emc.storageos.model.file.FileShareRestRep.FileProtectionRestRep;
import com.emc.storageos.model.file.FileSystemExportParam;
import com.emc.storageos.model.file.MountInfo;
import com.emc.storageos.model.file.SmbShareResponse;
import com.emc.storageos.model.file.policy.FilePolicyListRestRep;
import com.emc.storageos.model.file.policy.FilePolicyRestRep;
import com.emc.storageos.model.varray.VirtualArrayRestRep;
import com.emc.storageos.model.vpool.FileVirtualPoolRestRep;
import com.emc.storageos.volumecontroller.FileControllerConstants;
import com.emc.storageos.volumecontroller.FileSMBShare;
import com.emc.storageos.volumecontroller.FileShareExport;
import com.emc.vipr.client.ViPRCoreClient;
import com.emc.vipr.client.core.filters.SourceTargetFileSystemsFilter;
import com.emc.vipr.client.core.filters.VirtualPoolProtocolFilter;
import com.emc.vipr.model.catalog.AssetOption;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
@Component
@AssetNamespace("vipr")
public class FileProvider extends BaseAssetOptionsProvider {
public static final String CIFS = "CIFS";
public static final String NFS = "NFS";
public static final String NFSv4 = "NFSv4";
public static final String EXPORTED_TYPE = "exported";
public static final String UNEXPORTED_TYPE = "unexported";
@Asset("fileNfsVirtualPool")
@AssetDependencies("fileVirtualArray")
public List<AssetOption> getFileNfsVirtualPools(AssetOptionsContext ctx, URI virtualArray) {
return getFileVirtualPools(ctx, virtualArray, NFS, NFSv4);
}
@Asset("fileNfsVirtualPool")
public List<AssetOption> getFileNfsVirtualPools(AssetOptionsContext ctx) {
return getFileVirtualPools(ctx, null, NFS, NFSv4);
}
@Asset("fileCifsVirtualPool")
public List<AssetOption> getFileCifsVirtualPools(AssetOptionsContext ctx) {
return getFileVirtualPools(ctx, null, CIFS);
}
@Asset("fileCifsVirtualPool")
@AssetDependencies("fileVirtualArray")
public List<AssetOption> getFileCifsVirtualPools(AssetOptionsContext ctx, URI virtualArray) {
return getFileVirtualPools(ctx, virtualArray, CIFS);
}
@Asset("fileVirtualPool")
@AssetDependencies("fileVirtualArray")
public List<AssetOption> getFileVirtualPools(AssetOptionsContext ctx, URI virtualArray) {
return getFileVirtualPools(ctx, virtualArray, CIFS, NFS, NFSv4);
}
@Asset("fileVirtualPool")
public List<AssetOption> getFileVirtualPools(AssetOptionsContext ctx) {
return getFileVirtualPools(ctx, null, CIFS, NFS, NFSv4);
}
private List<AssetOption> getFileVirtualPools(AssetOptionsContext ctx, URI virtualArray, String... protocols) {
Collection<FileVirtualPoolRestRep> virtualPools;
if (virtualArray == null) {
virtualPools = api(ctx).fileVpools().getByTenant(ctx.getTenant());
} else {
virtualPools = api(ctx).fileVpools().getByVirtualArrayAndTenant(virtualArray, ctx.getTenant(),
new VirtualPoolProtocolFilter<FileVirtualPoolRestRep>(protocols));
}
List<AssetOption> options = createBaseResourceOptions(virtualPools);
AssetOptionsUtils.sortOptionsByLabel(options);
return options;
}
@Asset("fileFilesystem")
@AssetDependencies("project")
public List<AssetOption> getFilesystems(AssetOptionsContext ctx, URI project) {
return createFilesystemOptions(api(ctx).fileSystems().findByProject(project));
}
@Asset("fileNFSFilesystem")
@AssetDependencies("project")
public List<AssetOption> getNFSFilesystems(AssetOptionsContext ctx, URI project) {
return createFilesystemOptions(api(ctx).fileSystems().findByProject(project), new NFSFilesytemsPredicate());
}
@Asset("fileCIFSFilesystem")
@AssetDependencies("project")
public List<AssetOption> getCIFSFilesystems(AssetOptionsContext ctx, URI project) {
return createFilesystemOptions(api(ctx).fileSystems().findByProject(project), new CIFSFilesytemsPredicate());
}
@Asset("fileSnapshotFilesystem")
@AssetDependencies({ "project" })
public List<AssetOption> getSnapshotFilesystems(AssetOptionsContext ctx, URI project) {
ViPRCoreClient client = api(ctx);
Collection<FileShareRestRep> filesystems = client.fileSystems().findByProject(project);
Map<URI, FileVirtualPoolRestRep> pools = getFileVirtualPools(client, filesystems);
return createFilesystemOptions(filesystems, new SnapableFilesystemsPredicate(pools));
}
@Asset("fileUnmountedFilesystem")
@AssetDependencies("project")
public List<AssetOption> getUnmountedFilesystems(AssetOptionsContext ctx, URI project) {
return createFilesystemOptions(api(ctx).fileSystems().findByProject(project), new UnmountedFilesytemsPredicate());
}
@Asset("fileUnmountedFilesystemNoTarget")
@AssetDependencies("project")
public List<AssetOption> getUnmountedFilesystemsNoTarget(AssetOptionsContext ctx, URI project) {
return createFilesystemOptions(api(ctx).fileSystems().findByProject(project), new NoTargetFilesytemsPredicate());
}
@Asset("fileFilesystemAssociation")
@AssetDependencies("project")
public List<AssetOption> getFilesystemsForAssociation(AssetOptionsContext ctx, URI project) {
ViPRCoreClient client = api(ctx);
List<FileShareRestRep> fileSharesforAssociation = Lists.newArrayList();
Map<URI, Boolean> uriToBool = Maps.newHashMap();
List<FileShareRestRep> fileShares = client.fileSystems().findByProject(project);
for (FileShareRestRep fileShare : fileShares) {
URI vpoolId = fileShare.getVirtualPool().getId();
if (!uriToBool.containsKey(vpoolId)) {
FileVirtualPoolRestRep vpool = client.fileVpools().get(vpoolId);
uriToBool.put(vpoolId, (vpool.getProtection() != null && vpool.getProtection().getAllowFilePolicyAtFSLevel()
&& (vpool.getProtection().getReplicationSupported() || vpool.getProtection().getScheduleSnapshots())));
}
if (uriToBool.get(vpoolId)) {
fileSharesforAssociation.add(fileShare);
}
}
return createFilesystemOptions(fileSharesforAssociation);
}
@Asset("fileFilesystemSourceArray")
@AssetDependencies("fileFilesystemAssociation")
public List<AssetOption> getFileFilesystemSourceArrayForAssociation(AssetOptionsContext ctx, URI fsId) {
ViPRCoreClient client = api(ctx);
VirtualArrayRestRep vArray = null;
List<AssetOption> options = Lists.newArrayList();
FileShareRestRep fsObj = client.fileSystems().get(fsId);
if (fsObj != null) {
vArray = client.varrays().get(fsObj.getVirtualArray().getId());
options.add(createBaseResourceOption(vArray));
}
return options;
}
private List<FilePolicyRestRep> getAllFileSystemLevelPolicies(AssetOptionsContext ctx) {
ViPRCoreClient client = api(ctx);
List<FilePolicyRestRep> fileSystemPolicies = new ArrayList<FilePolicyRestRep>();
FilePolicyListRestRep policies = client.fileProtectionPolicies().listFilePolicies();
if (policies != null && !policies.getFilePolicies().isEmpty()) {
for (NamedRelatedResourceRep policy : policies.getFilePolicies()) {
FilePolicyRestRep policyRestRep = client.fileProtectionPolicies().get(policy.getId());
if (policyRestRep != null && policyRestRep.getAppliedAt() != null
&& policyRestRep.getAppliedAt().equalsIgnoreCase("file_system")) {
fileSystemPolicies.add(policyRestRep);
}
}
}
return fileSystemPolicies;
}
@Asset("fileFilePolicy")
@AssetDependencies({ "project", "fileFilesystemAssociation" })
public List<AssetOption> getFilePolicies(AssetOptionsContext ctx, URI project, URI fsId) {
ViPRCoreClient client = api(ctx);
List<AssetOption> options = Lists.newArrayList();
for (FilePolicyRestRep policyRestRep : getAllFileSystemLevelPolicies(ctx)) {
options.add(new AssetOption(policyRestRep.getId(), policyRestRep.getName()));
}
if (options != null && !options.isEmpty()) {
AssetOptionsUtils.sortOptionsByLabel(options);
}
return options;
}
@Asset("fileFilePolicy")
public List<AssetOption> getFilePolicies(AssetOptionsContext ctx) {
List<AssetOption> options = Lists.newArrayList();
for (FilePolicyRestRep policyRestRep : getAllFileSystemLevelPolicies(ctx)) {
options.add(new AssetOption(policyRestRep.getId(), policyRestRep.getName()));
}
if (options != null && !options.isEmpty()) {
AssetOptionsUtils.sortOptionsByLabel(options);
}
return options;
}
@Asset("fileFilesystemWithPolicies")
@AssetDependencies("project")
public List<AssetOption> getFilesystemsWithPolicies(AssetOptionsContext ctx, URI project) {
List<AssetOption> options = Lists.newArrayList();
List<FilePolicyRestRep> fileSystemPolicies = getAllFileSystemLevelPolicies(ctx);
List<FileShareRestRep> fileSystems = api(ctx).fileSystems().findByProject(project);
for (FilePolicyRestRep policyRestRep : fileSystemPolicies) {
if (policyRestRep.getAssignedResources() != null && !policyRestRep.getAssignedResources().isEmpty()) {
for (FileShareRestRep fileSystem : fileSystems) {
for (NamedRelatedResourceRep resource : policyRestRep.getAssignedResources()) {
if (resource.getId().equals(fileSystem.getId())) {
options.add(new AssetOption(fileSystem.getId(), fileSystem.getName()));
break;
}
}
}
}
}
AssetOptionsUtils.sortOptionsByLabel(options);
return options;
}
@Asset("fileSystemPolicies")
@AssetDependencies("fileFilesystemWithPolicies")
public List<AssetOption> getFileSystemPolicies(AssetOptionsContext ctx, URI fsId) {
List<AssetOption> options = Lists.newArrayList();
List<FilePolicyRestRep> fileSystemPolicies = getAllFileSystemLevelPolicies(ctx);
for (FilePolicyRestRep policyRestRep : fileSystemPolicies) {
// This function also get called after order submission and we get null value for fsId
// workaround to display policy name in oder receipt: if fsId is null then list all the policy
if (fsId == null) {
options.add(new AssetOption(policyRestRep.getId(), policyRestRep.getName()));
} else if (policyRestRep.getAssignedResources() != null && !policyRestRep.getAssignedResources().isEmpty()) {
for (NamedRelatedResourceRep resource : policyRestRep.getAssignedResources()) {
if (resource.getId().equals(fsId)) {
options.add(new AssetOption(policyRestRep.getId(), policyRestRep.getName()));
}
}
}
}
AssetOptionsUtils.sortOptionsByLabel(options);
return options;
}
@Asset("fileSnapshot")
@AssetDependencies("fileFilesystem")
public List<AssetOption> getFileSnapshots(AssetOptionsContext ctx, URI filesystem) {
return createBaseResourceOptions(api(ctx).fileSnapshots().getByFileSystem(filesystem));
}
@Asset("quotaDirectory")
@AssetDependencies("fileFilesystem")
public List<AssetOption> getQuotaDirectories(AssetOptionsContext ctx, URI filesystem) {
return createNamedResourceOptions(api(ctx).quotaDirectories().listByFileSystem(filesystem));
}
@Asset("fileSnapshot")
@AssetDependencies("fileCIFSFilesystem")
public List<AssetOption> getCIFSFileSnapshots(AssetOptionsContext ctx, URI filesystem) {
return createBaseResourceOptions(api(ctx).fileSnapshots().getByFileSystem(filesystem));
}
@Asset("fileSnapshot")
@AssetDependencies("fileNFSFilesystem")
public List<AssetOption> getNFSFileSnapshots(AssetOptionsContext ctx, URI filesystem) {
return createBaseResourceOptions(api(ctx).fileSnapshots().getByFileSystem(filesystem));
}
@Asset("fileShares")
@AssetDependencies("fileFilesystem")
public List<AssetOption> getFileShares(AssetOptionsContext ctx, URI fileFilesystem) {
List<AssetOption> options = Lists.newArrayList();
for (SmbShareResponse share : listFileShares(ctx, fileFilesystem)) {
String label = String.format("%s [%s]", share.getShareName(), share.getMountPoint());
options.add(new AssetOption(share.getShareName(), label));
}
AssetOptionsUtils.sortOptionsByLabel(options);
return options;
}
@Asset("fileShares")
@AssetDependencies("fileNFSFilesystem")
public List<AssetOption> getNFSFileShares(AssetOptionsContext ctx, URI fileFilesystem) {
List<AssetOption> options = Lists.newArrayList();
for (SmbShareResponse share : listFileShares(ctx, fileFilesystem)) {
String label = String.format("%s [%s]", share.getShareName(), share.getMountPoint());
options.add(new AssetOption(share.getShareName(), label));
}
AssetOptionsUtils.sortOptionsByLabel(options);
return options;
}
@Asset("fileShares")
@AssetDependencies("fileCIFSFilesystem")
public List<AssetOption> getCIFSFileShares(AssetOptionsContext ctx, URI fileFilesystem) {
List<AssetOption> options = Lists.newArrayList();
for (SmbShareResponse share : listFileShares(ctx, fileFilesystem)) {
String label = String.format("%s [%s]", share.getShareName(), share.getMountPoint());
options.add(new AssetOption(share.getShareName(), label));
}
AssetOptionsUtils.sortOptionsByLabel(options);
return options;
}
@Asset("fileSnapshotShares")
@AssetDependencies("fileSnapshot")
public List<AssetOption> getFileSnapshotShares(AssetOptionsContext ctx, URI fileSnapshot) {
List<AssetOption> options = Lists.newArrayList();
for (SmbShareResponse share : api(ctx).fileSnapshots().getShares(fileSnapshot)) {
String label = String.format("%s [%s]", share.getShareName(), share.getMountPoint());
options.add(new AssetOption(share.getShareName(), label));
}
AssetOptionsUtils.sortOptionsByLabel(options);
return options;
}
@Asset("fileExports")
@AssetDependencies("fileFilesystem")
public List<AssetOption> getFileExports(AssetOptionsContext ctx, URI fileFilesystem) {
List<AssetOption> options = Lists.newArrayList();
for (FileSystemExportParam export : listFileExports(ctx, fileFilesystem)) {
options.add(new AssetOption(export.getMountPoint(), export.getMountPoint()));
}
AssetOptionsUtils.sortOptionsByLabel(options);
return options;
}
@Asset("fileExports")
@AssetDependencies("fileNFSFilesystem")
public List<AssetOption> getNFSFileExports(AssetOptionsContext ctx, URI fileFilesystem) {
List<AssetOption> options = Lists.newArrayList();
for (FileSystemExportParam export : listFileExports(ctx, fileFilesystem)) {
options.add(new AssetOption(export.getMountPoint(), export.getMountPoint()));
}
AssetOptionsUtils.sortOptionsByLabel(options);
return options;
}
@Asset("fileExports")
@AssetDependencies("fileCIFSFilesystem")
public List<AssetOption> getCIFSFileExports(AssetOptionsContext ctx, URI fileFilesystem) {
List<AssetOption> options = Lists.newArrayList();
for (FileSystemExportParam export : listFileExports(ctx, fileFilesystem)) {
options.add(new AssetOption(export.getMountPoint(), export.getMountPoint()));
}
AssetOptionsUtils.sortOptionsByLabel(options);
return options;
}
@Asset("securityStyle")
public List<AssetOption> getSecurityStyles(AssetOptionsContext ctx) {
List<AssetOption> options = Lists.newArrayList();
for (QuotaDirectory.SecurityStyles style : QuotaDirectory.SecurityStyles.values()) {
if (!style.name().equals("parent")) {
options.add(new AssetOption(style.name(), style.name().toUpperCase()));
}
}
return options;
}
@Asset("fileExportsWithRootPermissions")
@AssetDependencies("fileUnmountedFilesystem")
public List<AssetOption> getFileExportsWithRootPermissions(AssetOptionsContext ctx, URI fileFilesystem) {
List<AssetOption> options = Lists.newArrayList();
for (FileSystemExportParam export : listFileExports(ctx, fileFilesystem)) {
if (export.getPermissions().equalsIgnoreCase("root")) {
options.add(new AssetOption(export.getMountPoint(), export.getMountPoint()));
}
}
AssetOptionsUtils.sortOptionsByLabel(options);
return options;
}
@Asset("fileWithContinuousCopies")
@AssetDependencies("project")
public List<AssetOption> getFileWithContinuousCopies(AssetOptionsContext ctx, URI project) {
final ViPRCoreClient client = api(ctx);
List<FileShareRestRep> fileShares = client.fileSystems().findByProject(project, new SourceTargetFileSystemsFilter() {
@Override
public boolean acceptId(URI id) {
return !client.fileSystems().getFileContinuousCopies(id).isEmpty();
}
});
return createFilesystemOptions(fileShares);
}
@Asset("fileContinuousCopies")
@AssetDependencies("fileWithContinuousCopies")
public List<AssetOption> getFileContinuousCopies(AssetOptionsContext ctx, URI fileId) {
ViPRCoreClient client = api(ctx);
List<AssetOption> options = Lists.newArrayList();
List<NamedRelatedResourceRep> mirrors = client.fileSystems().getFileContinuousCopies(fileId);
for (NamedRelatedResourceRep mirror : mirrors) {
FileShareRestRep fileShare = client.fileSystems().get(mirror.getId());
options.add(new AssetOption(fileShare.getId(), fileShare.getName()));
}
AssetOptionsUtils.sortOptionsByLabel(options);
return options;
}
@Asset("protectedRemoteFileSystem")
@AssetDependencies({ "project" })
public List<AssetOption> getProtectedFileSystems(AssetOptionsContext ctx, URI project) {
debug("getting protected remote file system (project=%s)", project);
ViPRCoreClient client = api(ctx);
List<AssetOption> options = Lists.newArrayList();
List<FileShareRestRep> fileSystems = client.fileSystems().findByProject(project);
for (FileShareRestRep fileShare : fileSystems) {
if (fileShare.getProtection() != null &&
StringUtils.equals(FileShare.PersonalityTypes.SOURCE.toString(), fileShare.getProtection().getPersonality())) {
options.add(new AssetOption(fileShare.getId(), fileShare.getName()));
}
}
AssetOptionsUtils.sortOptionsByLabel(options);
return options;
}
@Asset("failoverFileTarget")
@AssetDependencies("protectedRemoteFileSystem")
public List<AssetOption> getFailoverFileTarget(AssetOptionsContext ctx, URI protectedFileSystem) {
if (protectedFileSystem != null) {
ViPRCoreClient client = api(ctx);
List<AssetOption> options = Lists.newArrayList();
debug("getting failoverFileTargets (protectedFileSystem=%s)", protectedFileSystem);
FileShareRestRep file = client.fileSystems().get(protectedFileSystem);
FileProtectionRestRep protection = file.getProtection();
if (protection != null) {
List<VirtualArrayRelatedResourceRep> targets = protection.getTargetFileSystems();
for (VirtualArrayRelatedResourceRep target : targets) {
FileShareRestRep fileshare = client.fileSystems().get(target.getId());
options.add(new AssetOption(fileshare.getId(), fileshare.getName()));
}
}
AssetOptionsUtils.sortOptionsByLabel(options);
return options;
}
return Lists.newArrayList();
}
@Asset("failbackFileTarget")
@AssetDependencies("protectedRemoteFileSystem")
public List<AssetOption> getFailbackFileTarget(AssetOptionsContext ctx, URI protectedFileSystem) {
if (protectedFileSystem != null) {
ViPRCoreClient client = api(ctx);
List<AssetOption> options = Lists.newArrayList();
debug("getting failbackFileTargets (protectedFileSystem=%s)", protectedFileSystem);
FileShareRestRep file = client.fileSystems().get(protectedFileSystem);
FileProtectionRestRep protection = file.getProtection();
if (protection != null) {
List<VirtualArrayRelatedResourceRep> targets = protection.getTargetFileSystems();
for (VirtualArrayRelatedResourceRep target : targets) {
FileShareRestRep fileshare = client.fileSystems().get(target.getId());
options.add(new AssetOption(fileshare.getId(), fileshare.getName()));
}
}
AssetOptionsUtils.sortOptionsByLabel(options);
return options;
}
return Lists.newArrayList();
}
@Asset("unprotectedFilesystem")
@AssetDependencies({ "project" })
public List<AssetOption> getUnprotectedFileSystems(AssetOptionsContext ctx, URI project) {
debug("getting unprotected file system (project=%s)", project);
ViPRCoreClient client = api(ctx);
List<AssetOption> options = Lists.newArrayList();
List<FileShareRestRep> fileSystems = client.fileSystems().findByProject(project);
for (FileShareRestRep fileShare : fileSystems) {
if (fileShare.getProtection() != null && fileShare.getProtection().getPersonality() == null) {
options.add(new AssetOption(fileShare.getId(), fileShare.getName()));
}
}
AssetOptionsUtils.sortOptionsByLabel(options);
return options;
}
protected enum FileVirtualPoolChangeOperationEnum {
ADD_REMOTE_FILE_REPLICATION("Add Remote file replication"), ADD_LOCAL_FILE_REPLICATION("Add Local file replication");
private String description;
private FileVirtualPoolChangeOperationEnum(String description) {
this.description = description;
}
@Override
public String toString() {
return description;
}
}
@Asset("fileVirtualPoolChangeOperation")
public List<AssetOption> getVirtualPoolchangeOperations(AssetOptionsContext ctx) {
List<AssetOption> options = Lists.newArrayList();
for (FileVirtualPoolChangeOperationEnum operation : FileVirtualPoolChangeOperationEnum.values()) {
options.add(newAssetOption(operation.name(), "fileVirtualPoolChange.operation." + operation.name()));
}
return options;
}
@Asset("fileTargetVirtualPool")
@AssetDependencies({ "fileFilePolicy" })
public List<AssetOption> getFileTargetVirtualPools(AssetOptionsContext ctx, URI filePolicy) {
List<AssetOption> options = Lists.newArrayList();
ViPRCoreClient client = api(ctx);
FilePolicyRestRep policyRest = client.fileProtectionPolicies().getFilePolicy(filePolicy);
List<FileVirtualPoolRestRep> vpoolChanges = client.fileVpools().getByTenant(ctx.getTenant());
for (FileVirtualPoolRestRep vpool : vpoolChanges) {
if (vpool.getProtection() != null) {
if ((policyRest.getType().equals("file_snapshot") && vpool.getProtection().getScheduleSnapshots())
|| (policyRest.getType().equals("file_replication") &&
vpool.getProtection().getReplicationSupported())) {
options.add(new AssetOption(vpool.getId(), vpool.getName()));
}
}
}
AssetOptionsUtils.sortOptionsByLabel(options);
return options;
}
@Asset("fileSourceVirtualPool")
@AssetDependencies({ "unprotectedFilesystem" })
public List<AssetOption> getFileSourceVirtualPool(AssetOptionsContext ctx, URI fileSystems) {
List<AssetOption> options = Lists.newArrayList();
ViPRCoreClient client = api(ctx);
URI sourceVpoolId = client.fileSystems().get(fileSystems).getVirtualPool().getId();
FileVirtualPoolRestRep sourceVpool = client.fileVpools().get(sourceVpoolId);
options.add(new AssetOption(sourceVpool.getId(), sourceVpool.getName()));
AssetOptionsUtils.sortOptionsByLabel(options);
return options;
}
private List<SmbShareResponse> listFileShares(AssetOptionsContext ctx, URI filesystem) {
return api(ctx).fileSystems().getShares(filesystem);
}
private List<FileSystemExportParam> listFileExports(AssetOptionsContext ctx, URI filesystem) {
return api(ctx).fileSystems().getExports(filesystem);
}
/**
* convenience method for creating filesystem options using no predicate
*/
private List<AssetOption> createFilesystemOptions(Collection<FileShareRestRep> filesystems) {
return createFilesystemOptions(filesystems, null);
}
/**
* Create filesystem options from the list of filesystems, filtering using the given predicate
*
* @return The list of AssetOptions
*/
protected List<AssetOption> createFilesystemOptions(Collection<FileShareRestRep> filesystems, Predicate predicate) {
CollectionUtils.filter(filesystems, predicate);
List<AssetOption> options = Lists.newArrayList();
for (FileShareRestRep fs : filesystems) {
options.add(new AssetOption(fs.getId(), getLabel(fs)));
}
AssetOptionsUtils.sortOptionsByLabel(options);
return options;
}
private Map<URI, FileVirtualPoolRestRep> getFileVirtualPools(ViPRCoreClient client, Collection<FileShareRestRep> filesystems) {
Set<URI> fileVirtualPoolIds = getFileVirtualPoolIdsForFilesystems(filesystems);
return getFileVirtualPools(client, fileVirtualPoolIds);
}
public static Map<URI, FileVirtualPoolRestRep> getFileVirtualPools(ViPRCoreClient client, Set<URI> ids) {
Map<URI, FileVirtualPoolRestRep> virtualPools = Maps.newHashMap();
for (FileVirtualPoolRestRep virtualPool : client.fileVpools().getByIds(ids)) {
virtualPools.put(virtualPool.getId(), virtualPool);
}
return virtualPools;
}
private static Set<URI> getFileVirtualPoolIdsForFilesystems(Collection<FileShareRestRep> filesystems) {
Set<URI> ids = Sets.newHashSet();
for (FileShareRestRep filesystem : filesystems) {
ids.add(filesystem.getVirtualPool().getId());
}
return ids;
}
/**
* Predicate for filtering NFS filesystems
*/
private class NFSFilesytemsPredicate implements Predicate {
@Override
public boolean evaluate(Object object) {
FileShareRestRep filesystem = getFilesystem(object);
return filesystem.getProtocols().contains(NFS)
|| filesystem.getProtocols().contains(NFSv4);
}
}
/**
* Predicate for filtering NFS filesystems
*/
private class CIFSFilesytemsPredicate implements Predicate {
@Override
public boolean evaluate(Object object) {
FileShareRestRep filesystem = getFilesystem(object);
return filesystem.getProtocols().contains(CIFS);
}
}
/**
* Predicate for filtering out mounted filesystems
*/
private class UnmountedFilesytemsPredicate implements Predicate {
@Override
public boolean evaluate(Object object) {
FileShareRestRep filesystem = getFilesystem(object);
return !MachineTagUtils.hasDatastores(filesystem);
}
}
/**
* Predicate for filtering out mounted filesystems and target filesystems
*/
private class NoTargetFilesytemsPredicate implements Predicate {
@Override
public boolean evaluate(Object object) {
FileShareRestRep filesystem = getFilesystem(object);
return !MachineTagUtils.hasDatastores(filesystem) &&
!(filesystem.getProtection() != null && filesystem.getProtection().getParentFileSystem() != null);
}
}
/**
* Predicate for filtering out un-snapshot-able filesystems.
*/
private class SnapableFilesystemsPredicate implements Predicate {
private Map<URI, FileVirtualPoolRestRep> pools;
public SnapableFilesystemsPredicate(Map<URI, FileVirtualPoolRestRep> pools) {
this.pools = pools;
}
@Override
public boolean evaluate(Object object) {
FileShareRestRep filesystem = getFilesystem(object);
URI vpoolId = filesystem.getVirtualPool().getId();
FileVirtualPoolRestRep vpool = pools.get(vpoolId);
return isLocalSnapshotSupported(vpool) || isRemoteSnapshotSupported(filesystem);
}
protected boolean isLocalSnapshotSupported(FileVirtualPoolRestRep virtualPool) {
return (virtualPool.getProtection() != null) &&
(virtualPool.getProtection().getSnapshots() != null) &&
(virtualPool.getProtection().getSnapshots().getMaxSnapshots() > 0);
}
protected boolean isRemoteSnapshotSupported(FileShareRestRep filesystem) {
return filesystem.getDataProtection() != null;
}
}
private FileShareRestRep getFilesystem(Object object) {
if (object instanceof FileShareRestRep) {
return (FileShareRestRep) object;
}
throw new IllegalArgumentException(getMessage("file.exception.fileShareRestRep"));
}
public String getLabel(FileShareRestRep fileSystem) {
return getMessage("file.volume", fileSystem.getName(), fileSystem.getCapacity());
}
@Asset("fileSMBPermissionType")
public List<AssetOption> getSnapshotPermissionType(AssetOptionsContext ctx) {
List<AssetOption> options = Lists.newArrayList();
for (FileSMBShare.PermissionType type : FileSMBShare.PermissionType.values()) {
options.add(newAssetOption(type.name(), String.format("file.SMB.permissionType.%s", type.name())));
}
return options;
}
@Asset("fileShareACLPermission")
public List<AssetOption> getFileShareACLPermissions(AssetOptionsContext ctx) {
List<AssetOption> options = Lists.newArrayList();
for (CifsShareACLUpdateParams.SharePermission perm : CifsShareACLUpdateParams.SharePermission.values()) {
options.add(newAssetOption(perm.name(), String.format("file.ACL.permission.%s", perm.name())));
}
return options;
}
@Asset("fileSnapshotACLPermission")
public List<AssetOption> getFileSnapshotACLPermissions(AssetOptionsContext ctx) {
List<AssetOption> options = Lists.newArrayList();
CifsShareACLUpdateParams.SharePermission readPermission = CifsShareACLUpdateParams.SharePermission.READ;
options.add(newAssetOption(readPermission.name(), String.format("file.ACL.permission.%s", readPermission.name())));
return options;
}
@Asset("fileSMBPermission")
public List<AssetOption> getSnapshotPermissions(AssetOptionsContext ctx) {
List<AssetOption> options = Lists.newArrayList();
for (FileSMBShare.Permission perm : FileSMBShare.Permission.values()) {
options.add(newAssetOption(perm.name(), String.format("file.SMB.permission.%s", perm.name())));
}
return options;
}
@Asset("fileNFSSecurity")
public List<AssetOption> getNFSSecurityTypes(AssetOptionsContext ctx) {
List<AssetOption> options = Lists.newArrayList();
for (FileShareExport.SecurityTypes securityType : FileShareExport.SecurityTypes.values()) {
options.add(newAssetOption(securityType.name(), String.format("file.NFS.security.%s", securityType.name())));
}
return options;
}
@Asset("fileNFSPermission")
public List<AssetOption> getNFSPermissions(AssetOptionsContext ctx) {
List<AssetOption> options = Lists.newArrayList();
for (FileShareExport.Permissions perm : FileShareExport.Permissions.values()) {
options.add(newAssetOption(perm.name(), String.format("file.NFS.permission.%s", perm.name())));
}
return options;
}
@Asset("fileTrueFalse")
public List<AssetOption> getTrueFalseOption(AssetOptionsContext ctx) {
List<AssetOption> options = Lists.newArrayList();
options.add(newAssetOption("true", "boolean.true"));
options.add(newAssetOption("false", "boolean.false"));
return options;
}
@Asset("fileDeletionType")
public List<AssetOption> getFileDeletionType(AssetOptionsContext ctx) {
List<AssetOption> options = new ArrayList<>();
options.add(newAssetOption(FileControllerConstants.DeleteTypeEnum.FULL.toString(), "file.deletion.type.full"));
options.add(newAssetOption(FileControllerConstants.DeleteTypeEnum.VIPR_ONLY.toString(), "file.deletion.type.vipr_only"));
return options;
}
@Asset("fileIngestExportType")
public List<AssetOption> getFileIngestExportType(AssetOptionsContext ctx) {
List<AssetOption> options = Lists.newArrayList();
options.add(newAssetOption(EXPORTED_TYPE, "file.ingest.export.type.exported"));
options.add(newAssetOption(UNEXPORTED_TYPE, "file.ingest.export.type.unexported"));
return options;
}
// For mount operation
@Asset("fileExportedFilesystem")
@AssetDependencies("project")
public List<AssetOption> getExportedFilesystems(AssetOptionsContext ctx, URI project) {
List<FileShareRestRep> filesystems = api(ctx).fileSystems().findByProject(project);
List<FileShareRestRep> exportedFS = new ArrayList<FileShareRestRep>();
for (FileShareRestRep fs : filesystems) {
if (!api(ctx).fileSystems().getExports(fs.getId()).isEmpty()) {
exportedFS.add(fs);
}
}
return createFilesystemOptions(exportedFS, null);
}
@Asset("subDirectory")
@AssetDependencies("fileExportedFilesystem")
public List<AssetOption> getExportedSubdirectory(AssetOptionsContext ctx, URI fileExportedFilesystem) {
List<AssetOption> options = Lists.newArrayList();
List<ExportRule> exports = api(ctx).fileSystems().getExport(fileExportedFilesystem, true, null);
for (ExportRule export : exports) {
AssetOption tempOption;
if (StringUtils.isEmpty(getSubDir(ctx, export))) {
tempOption = new AssetOption("!No subdirectory", "No subdirectory");
} else {
tempOption = new AssetOption(getSubDir(ctx, export), getSubDir(ctx, export));
}
if (!options.contains(tempOption)) {
options.add(tempOption);
}
}
AssetOptionsUtils.sortOptionsByKey(options);
return options;
}
@Asset("securityType")
@AssetDependencies({ "fileExportedFilesystem", "subDirectory" })
public List<AssetOption> getExportedSubdirectory(AssetOptionsContext ctx, URI fileExportedFilesystem, String subDirectory) {
List<AssetOption> options = Lists.newArrayList();
String subDir = subDirectory;
if ("!No subdirectory".equalsIgnoreCase(subDir)) {
subDir = null;
}
List<ExportRule> exports = api(ctx).fileSystems().getExport(fileExportedFilesystem, false, subDir);
for (ExportRule rule : exports) {
List<String> securityTypes = Arrays.asList(rule.getSecFlavor().split("\\s*,\\s*"));
for (String sec : securityTypes) {
options.add(new AssetOption(sec, sec));
}
}
AssetOptionsUtils.sortOptionsByLabel(options);
return options;
}
@Asset("mountedNFSExport")
@AssetDependencies("linuxFileHost")
public List<AssetOption> getNFSMountsForHost(AssetOptionsContext ctx, URI host) {
List<AssetOption> options = Lists.newArrayList();
List<MountInfo> hostMounts = api(ctx).fileSystems().getNfsMountsByHost(host);
for (MountInfo mountInfo : hostMounts) {
String mountString = mountInfo.getMountString();
options.add(new AssetOption(mountString, getDisplayMount(ctx, mountInfo)));
}
AssetOptionsUtils.sortOptionsByLabel(options);
return options;
}
public String getDisplayMount(AssetOptionsContext ctx, MountInfo mount) {
StringBuffer strMount = new StringBuffer();
String subDirPath = "";
if (!StringUtils.isEmpty(mount.getSubDirectory())) {
subDirPath = "/" + mount.getSubDirectory();
}
String fsName = api(ctx).fileSystems().get(mount.getFsId()).getName();
strMount.append(mount.getMountPath())
.append("(")
.append(mount.getSecurityType()).append(", ")
.append(fsName)
.append(subDirPath).append(")");
return strMount.toString();
}
private String getSubDir(AssetOptionsContext ctx, ExportRule export) {
FileShareRestRep fs = api(ctx).fileSystems().get(export.getFsID());
String subDir = export.getExportPath().replace(fs.getMountPath(), "");
if (subDir.startsWith("/")) {
subDir = subDir.replaceFirst("/", "");
}
return subDir;
}
}