/*
* 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 java.util.Set;
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.FilePolicyApplyLevel;
import com.emc.storageos.db.client.model.Operation;
import com.emc.storageos.db.client.model.Operation.Status;
import com.emc.storageos.db.client.model.Project;
import com.emc.storageos.db.client.model.VirtualPool;
import com.emc.storageos.exceptions.DeviceControllerException;
import com.emc.storageos.svcs.errorhandling.model.ServiceCoded;
import com.emc.storageos.svcs.errorhandling.model.ServiceError;
public class FilePolicyAssignWorkflowCompleter extends FilePolicyWorkflowCompleter {
private static final long serialVersionUID = 1L;
protected static final Logger _log = LoggerFactory.getLogger(FilePolicyAssignWorkflowCompleter.class);
private ArrayList<URI> assignToResource;
private URI projectVPool;
private URI workFlowId;
public URI getWorkFlowId() {
return workFlowId;
}
public void setWorkFlowId(URI workFlowId) {
this.workFlowId = workFlowId;
}
public FilePolicyAssignWorkflowCompleter(URI policyUri, Set<URI> assignToResource, URI projectVPool, String task) {
super(policyUri, task);
this.assignToResource = new ArrayList<URI>(assignToResource);
this.projectVPool = projectVPool;
_log.info("Creating completer for OpId: " + getOpId());
}
public FilePolicyAssignWorkflowCompleter(URI policyUri, List<URI> assignToResource, URI projectVPool, String taskId) {
super(policyUri, taskId);
this.assignToResource = new ArrayList<URI>(assignToResource);
this.projectVPool = projectVPool;
_log.info("Creating completer for OpId: " + getOpId());
}
@Override
protected void complete(DbClient dbClient, Status status, ServiceCoded coded) throws DeviceControllerException {
FilePolicy filePolicy = dbClient.queryObject(FilePolicy.class, getId());
if (Operation.Status.ready.equals(status)) {
updatePolicyAssignedResources(dbClient, filePolicy, status, coded);
setStatus(dbClient, status, coded);
} else {
StringBuffer strErrorMsg = new StringBuffer();
Integer totalWFSteps = 0;
int numFailedSteps = getWorkFlowFailedSteps(dbClient, getWorkFlowId(), strErrorMsg);
if (numFailedSteps > 0) {
totalWFSteps = getWorkFlowSteps(dbClient, getWorkFlowId()).size();
int successPolicies = totalWFSteps - numFailedSteps;
// In case of partial success, Update the policy assignment attributes!!
if (totalWFSteps != numFailedSteps) {
updatePolicyAssignedResources(dbClient, filePolicy, status, coded);
}
_log.error(String.format(" %s number of storage policies assigned successful and %s failed due to %s ", successPolicies,
numFailedSteps, strErrorMsg.toString()));
ServiceError serviceError = DeviceControllerException.errors.deviceProtectionPolicyOperationFailed(
filePolicy.getId().toString(), "assign", numFailedSteps, successPolicies);
setStatus(dbClient, status, serviceError);
}
}
}
private void updatePolicyAssignedResources(DbClient dbClient, FilePolicy filePolicy, Status status, ServiceCoded coded) {
for (URI resourceURI : assignToResource) {
filePolicy.addAssignedResources(resourceURI);
FilePolicyApplyLevel applyAt = FilePolicyApplyLevel.valueOf(filePolicy.getApplyAt());
switch (applyAt) {
case project:
Project project = dbClient.queryObject(Project.class, resourceURI);
project.addFilePolicy(filePolicy.getId());
dbClient.updateObject(project);
if (projectVPool != null) {
filePolicy.setFilePolicyVpool(projectVPool);
}
break;
case vpool:
VirtualPool vpool = dbClient.queryObject(VirtualPool.class, resourceURI);
vpool.addFilePolicy(filePolicy.getId());
dbClient.updateObject(vpool);
break;
default:
break;
}
}
dbClient.updateObject(filePolicy);
}
}