/*
* Copyright (c) 2017 EMC Corporation
* All Rights Reserved
*/
package com.emc.storageos.volumecontroller.impl.file;
import java.net.URI;
import java.util.ArrayList;
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.model.FilePolicy;
import com.emc.storageos.db.client.model.FilePolicy.FilePolicyType;
import com.emc.storageos.db.client.model.FileShare;
import com.emc.storageos.db.client.model.FileShare.MirrorStatus;
import com.emc.storageos.db.client.model.FileShare.PersonalityTypes;
import com.emc.storageos.db.client.model.Operation;
import com.emc.storageos.db.client.model.StringSet;
import com.emc.storageos.db.client.util.NullColumnValueGetter;
import com.emc.storageos.svcs.errorhandling.model.ServiceCoded;
/**
* Task Completer class for assign file policy to existing file system.
*
* @author Mudit Jain
*/
public class FileSystemAssignPolicyWorkflowCompleter extends FileWorkflowCompleter {
private static final long serialVersionUID = 1L;
protected static final Logger _log = LoggerFactory.getLogger(FilePolicyAssignWorkflowCompleter.class);
private URI filePolicyURI;
public FileSystemAssignPolicyWorkflowCompleter(URI filePolicy, List<URI> fsURIs, String task) {
super(fsURIs, task);
this.filePolicyURI = filePolicy;
}
@Override
protected void complete(DbClient dbClient, Operation.Status status, ServiceCoded serviceCoded) {
if (Operation.Status.ready.equals(status)) {
FileShare fileSystem = getSourceFileSystem(dbClient);
if (fileSystem != null) {
fileSystem.setMirrorStatus(MirrorStatus.UNKNOWN.name());
dbClient.updateObject(fileSystem);
_log.info("CreateMirrorFileSystemsCompleter::Set the mirror status of source file system {}",
fileSystem.getId());
}
updateFilePolicyResource(dbClient);
} else {
// Remove the replication relation attributes from source and target file systems
removeFileSystemReplicationAttrs(dbClient, getSourceFileSystem(dbClient));
}
super.complete(dbClient, status, serviceCoded);
}
private FileShare getSourceFileSystem(DbClient dbClient) {
FileShare fs = null;
for (URI id : getIds()) {
FileShare fileSystem = dbClient.queryObject(FileShare.class, id);
if (fileSystem != null && !fileSystem.getInactive() && fileSystem.getPersonality() != null &&
PersonalityTypes.SOURCE.name().equalsIgnoreCase(fileSystem.getPersonality())) {
fs = fileSystem;
}
}
return fs;
}
private void updateFilePolicyResource(DbClient dbClient) {
FilePolicy filePolicy = dbClient.queryObject(FilePolicy.class, filePolicyURI);
if (filePolicy.getFilePolicyType().equals(FilePolicyType.file_snapshot.name())) {
filePolicy.addAssignedResources(getIds().get(0));
FileShare fileSystem = dbClient.queryObject(FileShare.class, getIds().get(0));
fileSystem.addFilePolicy(filePolicyURI);
dbClient.updateObject(filePolicy);
dbClient.updateObject(fileSystem);
} else {
FileShare fileSystem = getSourceFileSystem(dbClient);
if (fileSystem != null) {
filePolicy.addAssignedResources(fileSystem.getId());
fileSystem.addFilePolicy(filePolicyURI);
dbClient.updateObject(filePolicy);
dbClient.updateObject(fileSystem);
}
}
}
private void removeFileSystemReplicationAttrs(DbClient dbClient, FileShare fileshare) {
FilePolicy filePolicy = dbClient.queryObject(FilePolicy.class, filePolicyURI);
if (filePolicy.getFilePolicyType().equals(FilePolicyType.file_replication.name()) && fileshare != null) {
List<FileShare> modifiedFileshares = new ArrayList<>();
// Remove source file share attributes!!
fileshare.setMirrorStatus(NullColumnValueGetter.getNullStr());
fileshare.setAccessState(NullColumnValueGetter.getNullStr());
fileshare.setPersonality(NullColumnValueGetter.getNullStr());
if (fileshare.getMirrorfsTargets() != null && !fileshare.getMirrorfsTargets().isEmpty()) {
StringSet targets = fileshare.getMirrorfsTargets();
for (String strTargetFs : targets) {
FileShare targetFs = dbClient.queryObject(FileShare.class, URI.create(strTargetFs));
targetFs.setMirrorStatus(NullColumnValueGetter.getNullStr());
targetFs.setAccessState(NullColumnValueGetter.getNullStr());
targetFs.setParentFileShare(NullColumnValueGetter.getNullNamedURI());
modifiedFileshares.add(targetFs);
}
targets.clear();
fileshare.setMirrorfsTargets(targets);
}
modifiedFileshares.add(fileshare);
if (!modifiedFileshares.isEmpty()) {
dbClient.updateObject(modifiedFileshares);
}
}
}
}