/*
* Copyright (c) 2015 EMC Corporation
* All Rights Reserved
*/
package models.virtualpool;
import static com.emc.vipr.client.core.util.ResourceUtils.uris;
import static util.BourneUtil.getViprClient;
import java.net.URI;
import java.util.List;
import java.util.Set;
import com.emc.storageos.model.NamedRelatedResourceRep;
import com.emc.storageos.model.vpool.FileVirtualPoolProtectionParam;
import com.emc.storageos.model.vpool.FileVirtualPoolRestRep;
import com.emc.vipr.client.core.FileVirtualPools;
import com.emc.vipr.client.core.util.ResourceUtils;
import jobs.vipr.ConnectedFileVirtualPoolsCall;
import jobs.vipr.MatchingFileStoragePoolsCall;
import play.Logger;
import play.data.validation.Min;
import util.VirtualPoolUtils;
import util.builders.FileVirtualPoolBuilder;
import util.builders.FileVirtualPoolUpdateBuilder;
public class FileVirtualPoolForm extends VirtualPoolCommonForm<FileVirtualPoolRestRep> {
@Min(0)
public Integer maxSnapshots;
public Boolean longTermRetention;
public Long replicationRpo;
public String rpRpoType;
public Boolean scheduleSnapshots;
public Boolean replicationSupported;
public Boolean allowPolicyApplyAtProject;
public Boolean allowPolicyApplyAtFS;
public void deserialize() {
// Gson g = new Gson();
// replicationCopies = g.fromJson(replicationCopiesJson, ReplicationCopyForm[].class);
}
public ConnectedFileVirtualPoolsCall replicationVirtualPools() {
List<URI> varrayIds = uris(virtualArrays);
return new ConnectedFileVirtualPoolsCall(varrayIds);
}
@Override
public void load(FileVirtualPoolRestRep virtualPool) {
doLoad(virtualPool);
FileVirtualPools vpools = getViprClient().fileVpools();
loadQuota(vpools);
loadTenantACLs(vpools);
}
protected void doLoad(FileVirtualPoolRestRep virtualPool) {
loadCommon(virtualPool);
FileVirtualPoolProtectionParam protection = virtualPool.getProtection();
if ((protection != null) && (protection.getSnapshots() != null)) {
maxSnapshots = protection.getSnapshots().getMaxSnapshots();
}
if (protection != null) {
scheduleSnapshots = protection.getScheduleSnapshots();
replicationSupported = protection.getReplicationSupported();
allowPolicyApplyAtProject = protection.getAllowFilePolicyAtProjectLevel();
allowPolicyApplyAtFS = protection.getAllowFilePolicyAtFSLevel();
rpRpoType = protection.getMinRpoType();
replicationRpo = protection.getMinRpoValue();
}
longTermRetention = virtualPool.getLongTermRetention();
}
@Override
public FileVirtualPoolRestRep save() {
FileVirtualPoolRestRep virtualPool = doSave();
FileVirtualPools vpools = getViprClient().fileVpools();
saveQuota(vpools);
saveTenantACLs(vpools);
return virtualPool;
}
protected FileVirtualPoolRestRep doSave() {
FileVirtualPoolRestRep virtualPool;
if (isNew()) {
FileVirtualPoolBuilder builder = apply(new FileVirtualPoolBuilder());
virtualPool = VirtualPoolUtils.create(builder.getVirtualPool());
this.id = ResourceUtils.stringId(virtualPool);
} else {
FileVirtualPoolRestRep oldVirtualPool = VirtualPoolUtils.getFileVirtualPool(id);
FileVirtualPoolUpdateBuilder builder = apply(new FileVirtualPoolUpdateBuilder(oldVirtualPool));
virtualPool = VirtualPoolUtils.update(id, builder.getVirtualPoolUpdate());
List<NamedRelatedResourceRep> matchingPools = VirtualPoolUtils.refreshMatchingPools(virtualPool);
Logger.info("Refreshed File Virtual Pool '%s' matching pools: %d", virtualPool.getName(), matchingPools.size());
}
virtualPool = saveStoragePools(virtualPool);
return virtualPool;
}
private FileVirtualPoolBuilder apply(FileVirtualPoolBuilder builder) {
applyCommon(builder);
builder.setSnapshots(maxSnapshots);
builder.setScheduleSnapshots(scheduleSnapshots);
builder.setLongTermRetention(longTermRetention);
// Set Protection parameters!!
builder.setReplicationSupported(replicationSupported);
builder.setAllowPolicyAtProject(allowPolicyApplyAtProject);
builder.setAllowPolicyAtFS(allowPolicyApplyAtFS);
builder.setFileReplicationRPO(replicationRpo);
builder.setFileReplicationRpoType(rpRpoType);
return builder;
}
private FileVirtualPoolUpdateBuilder apply(FileVirtualPoolUpdateBuilder builder) {
applyCommon(builder);
builder.setSnapshots(maxSnapshots);
builder.setScheduleSnapshots(scheduleSnapshots);
builder.setLongTermRetention(longTermRetention);
// Set Protection parameters!!
builder.setReplicationSupported(replicationSupported);
builder.setAllowPolicyAtProject(allowPolicyApplyAtProject);
builder.setAllowPolicyAtFS(allowPolicyApplyAtFS);
builder.setMinRPO(replicationRpo);
builder.setMinRPOType(rpRpoType);
return builder;
}
@Override
protected FileVirtualPoolRestRep updateStoragePools(Set<String> add, Set<String> remove) {
return VirtualPoolUtils.updateAssignedFilePools(id, add, remove);
}
public MatchingFileStoragePoolsCall matchingStoragePools() {
FileVirtualPoolBuilder builder = new FileVirtualPoolBuilder();
apply(builder);
builder.setUseMatchedPools(true);
return new MatchingFileStoragePoolsCall(builder.getVirtualPool());
}
public ConnectedFileVirtualPoolsCall connectedVirtualPools() {
return new ConnectedFileVirtualPoolsCall(uris(virtualArrays));
}
}