/*
* Copyright (c) 2016 EMC Corporation
* All Rights Reserved
*/
package com.emc.sa.service.linux.file;
import static com.emc.sa.service.ServiceParams.ADVISORY_LIMIT;
import static com.emc.sa.service.ServiceParams.COMMENT;
import static com.emc.sa.service.ServiceParams.FILESYSTEM_NAME;
import static com.emc.sa.service.ServiceParams.GRACE_PERIOD;
import static com.emc.sa.service.ServiceParams.PROJECT;
import static com.emc.sa.service.ServiceParams.SIZE_IN_GB;
import static com.emc.sa.service.ServiceParams.SOFT_LIMIT;
import static com.emc.sa.service.ServiceParams.VIRTUAL_ARRAY;
import static com.emc.sa.service.ServiceParams.VIRTUAL_POOL;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import com.emc.sa.engine.ExecutionUtils;
import com.emc.sa.engine.bind.Bindable;
import com.emc.sa.engine.bind.Param;
import com.emc.sa.engine.service.Service;
import com.emc.sa.service.vipr.ViPRService;
import com.emc.sa.service.vipr.block.BlockStorageUtils;
import com.emc.sa.service.vipr.file.FileStorageUtils;
import com.emc.sa.service.vipr.file.FileStorageUtils.FileExportRule;
import com.emc.sa.service.vipr.file.FileStorageUtils.Mount;
import com.emc.storageos.db.client.model.Host;
/**
*
* @author yelkaa
*
*/
@Service("LinuxCreateMountNFSExport")
public class CreateNFSExportAndMountService extends ViPRService {
@Param(FILESYSTEM_NAME)
protected String exportName;
@Param(VIRTUAL_POOL)
protected URI virtualPool;
@Param(VIRTUAL_ARRAY)
protected URI virtualArray;
@Param(PROJECT)
protected URI project;
@Param(COMMENT)
protected String comment;
@Param(SIZE_IN_GB)
protected Double sizeInGb;
@Param(value = SOFT_LIMIT, required = false)
protected Double softLimit;
@Param(value = ADVISORY_LIMIT, required = false)
protected Double advisoryLimit;
@Param(value = GRACE_PERIOD, required = false)
protected Double gracePeriod;
@Bindable(itemType = FileStorageUtils.Mount.class)
protected Mount[] mountList;
protected MountNFSExportHelper mountNFSExportHelper;
@Override
public void init() throws Exception {
super.init();
mountNFSExportHelper = MountNFSExportHelper.createHelper();
}
@Override
public void precheck() throws Exception {
super.precheck();
if (mountList == null || mountList.length == 0) {
ExecutionUtils.fail("failTask.CreateFileSystemExport.precheck", new Object[] {}, new Object[] {});
}
}
@Override
public void execute() throws Exception {
// set fs quotas
int tempSoftLimit = (softLimit != null) ? softLimit.intValue() : 0;
int tempAdvisoryLimit = (advisoryLimit != null) ? advisoryLimit.intValue() : 0;
int tempGracePeriod = (gracePeriod != null) ? gracePeriod.intValue() : 0;
// convert mount object to export
List<FileExportRule> exportList = new ArrayList<FileExportRule>();
for (Mount mount : mountList) {
FileExportRule export = new FileExportRule();
List<String> exportHosts = new ArrayList<String>();
exportHosts.add(BlockStorageUtils.getHost(mount.getHost()).getHostName());
export.setExportHosts(exportHosts);
export.setPermission(mount.getPermission());
export.setSecurity(mount.getSecurity());
export.setDomain(mount.getDomain());
export.setRootUserMapping(mount.getRootUserMapping());
exportList.add(export);
}
// create filesystem
URI fileSystemId = FileStorageUtils.createFileSystemWithoutRollBack(project, virtualArray, virtualPool, exportName, sizeInGb,
tempAdvisoryLimit,
tempSoftLimit, tempGracePeriod);
// create nfs export
if (exportList != null) {
String rootUserMapping = exportList.get(0).getRootUserMapping().trim();
String domain = exportList.get(0).getDomain();
if(StringUtils.isNotBlank(domain)) {
rootUserMapping = domain.trim() + "\\" + rootUserMapping.trim();
}
FileStorageUtils.createFileSystemExportWithoutRollBack(fileSystemId, comment, exportList.get(0).getSecurity(),
exportList.get(0).getPermission(), rootUserMapping, exportList.get(0).getExportHosts(), null, false);
if (!exportList.isEmpty()) {
FileStorageUtils.updateFileSystemExport(fileSystemId, null, exportList.toArray(new FileExportRule[exportList.size()]),
false);
}
}
// mount the exports
for (Mount mount : mountList) {
Host host = BlockStorageUtils.getHost(mount.getHost());
mountNFSExportHelper.mountExport(fileSystemId, mount.getHost(), null, mount.getMountPath(), mount.getSecurity(),
host.getHostName(), mount.getFsType());
ExecutionUtils.addAffectedResource(mount.getHost().toString());
}
}
}