fix catalogdb cvfnc customization
[so.git] / bpmn / so-bpmn-tasks / src / main / java / org / onap / so / bpmn / infrastructure / workflow / tasks / WorkflowActionBBTasks.java
index d9125e4..a0b48fd 100644 (file)
 
 package org.onap.so.bpmn.infrastructure.workflow.tasks;
 
+import java.sql.Timestamp;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Optional;
+import java.util.UUID;
 
-import org.camunda.bpm.engine.delegate.BpmnError;
 import org.camunda.bpm.engine.delegate.DelegateExecution;
+import org.onap.aai.domain.yang.Vnfc;
 import org.onap.so.bpmn.common.workflow.context.WorkflowCallbackResponse;
 import org.onap.so.bpmn.common.workflow.context.WorkflowContextHolder;
-import org.onap.so.bpmn.core.WorkflowException;
 import org.onap.so.bpmn.servicedecomposition.entities.BuildingBlock;
+import org.onap.so.bpmn.servicedecomposition.entities.ConfigurationResourceKeys;
 import org.onap.so.bpmn.servicedecomposition.entities.ExecuteBuildingBlock;
+import org.onap.so.bpmn.servicedecomposition.entities.WorkflowResourceIds;
+import org.onap.so.bpmn.servicedecomposition.tasks.BBInputSetupUtils;
+import org.onap.so.client.aai.AAIObjectType;
 import org.onap.so.client.exception.ExceptionBuilder;
+import org.onap.so.db.catalog.beans.CvnfcConfigurationCustomization;
+import org.onap.so.db.catalog.client.CatalogDbClient;
 import org.onap.so.db.request.beans.InfraActiveRequests;
 import org.onap.so.db.request.client.RequestsDbClient;
 import org.onap.so.serviceinstancebeans.RequestReferences;
@@ -39,6 +45,7 @@ import org.onap.so.serviceinstancebeans.ServiceInstancesResponse;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.env.Environment;
 import org.springframework.stereotype.Component;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
@@ -52,6 +59,10 @@ public class WorkflowActionBBTasks {
        private static final String G_ALACARTE = "aLaCarte";
        private static final String G_ACTION = "requestAction";
        private static final String RETRY_COUNT = "retryCount";
+       private static final String FABRIC_CONFIGURATION = "FabricConfiguration";
+       private static final String ASSIGN_FABRIC_CONFIGURATION_BB = "AssignFabricConfigurationBB";
+       private static final String ACTIVATE_FABRIC_CONFIGURATION_BB = "ActivateFabricConfigurationBB";
+       protected String maxRetries = "mso.rainyDay.maxRetries";
        private static final Logger logger = LoggerFactory.getLogger(WorkflowActionBBTasks.class);
 
        @Autowired
@@ -60,6 +71,12 @@ public class WorkflowActionBBTasks {
        private WorkflowAction workflowAction;
        @Autowired
        private WorkflowActionBBFailure workflowActionBBFailure;
+       @Autowired
+       private Environment environment;
+       @Autowired
+       private BBInputSetupUtils bbInputSetupUtils;
+       @Autowired
+       private CatalogDbClient catalogDbClient;
        
        public void selectBB(DelegateExecution execution) {
                List<ExecuteBuildingBlock> flowsToExecute = (List<ExecuteBuildingBlock>) execution
@@ -83,8 +100,8 @@ public class WorkflowActionBBTasks {
                        execution.setVariable("completed", true);
                } else {
                        execution.setVariable("completed", false);
-                       execution.setVariable(G_CURRENT_SEQUENCE, currentSequence);
                }
+               execution.setVariable(G_CURRENT_SEQUENCE, currentSequence);
        }
        
        public void updateFlowStatistics(DelegateExecution execution) {
@@ -155,6 +172,7 @@ public class WorkflowActionBBTasks {
                WorkflowContextHolder.getInstance().processCallback(processKey, execution.getProcessInstanceId(), requestId,
                                callbackResponse);
                logger.info("Successfully sent sync ack.");
+               updateInstanceId(execution);
        }
 
        public void sendErrorSyncAck(DelegateExecution execution) {
@@ -181,27 +199,31 @@ public class WorkflowActionBBTasks {
                }
        }
 
-       public void setupCompleteMsoProcess(DelegateExecution execution) {
-               final String requestId = (String) execution.getVariable(G_REQUEST_ID);
-               final String action = (String) execution.getVariable(G_ACTION);
-               final String resourceId = (String) execution.getVariable("resourceId");
-               final boolean aLaCarte = (boolean) execution.getVariable(G_ALACARTE);
-               final String resourceName = (String) execution.getVariable("resourceName");
-               final String source = (String) execution.getVariable("source");
-               String macroAction = "";
-               if (aLaCarte) {
-                       macroAction = "ALaCarte-" + resourceName + "-" + action;
-               } else {
-                       macroAction = "Macro-" + resourceName + "-" + action;
+       public void updateRequestStatusToComplete(DelegateExecution execution) {
+               try{
+                       final String requestId = (String) execution.getVariable(G_REQUEST_ID);
+                       InfraActiveRequests request = requestDbclient.getInfraActiveRequestbyRequestId(requestId);
+                       final String action = (String) execution.getVariable(G_ACTION);
+                       final boolean aLaCarte = (boolean) execution.getVariable(G_ALACARTE);
+                       final String resourceName = (String) execution.getVariable("resourceName");
+                       String macroAction = "";
+                       if (aLaCarte) {
+                               macroAction = "ALaCarte-" + resourceName + "-" + action + " request was executed correctly.";
+                       } else {
+                               macroAction = "Macro-" + resourceName + "-" + action + " request was executed correctly.";
+                       }
+                       execution.setVariable("finalStatusMessage", macroAction);
+                       Timestamp endTime = new Timestamp(System.currentTimeMillis());
+                       request.setEndTime(endTime);
+                       request.setFlowStatus("Successfully completed all Building Blocks");
+                       request.setStatusMessage(macroAction);
+                       request.setProgress(Long.valueOf(100));
+                       request.setRequestStatus("COMPLETE");
+                       request.setLastModifiedBy("CamundaBPMN");
+                       requestDbclient.updateInfraActiveRequests(request);
+               }catch (Exception ex) {
+                       workflowAction.buildAndThrowException(execution, "Error Updating Request Database", ex);
                }
-               String msoCompletionRequest = "<aetgt:MsoCompletionRequest xmlns:aetgt=\"http://org.onap/so/workflow/schema/v1\" xmlns:ns=\"http://org.onap/so/request/types/v1\"><request-info xmlns=\"http://org.onap/so/infra/vnf-request/v1\"><request-id>"
-                               + requestId + "</request-id><action>" + action + "</action><source>" + source
-                               + "</source></request-info><status-message>" + macroAction
-                               + " request was executed correctly.</status-message><serviceInstanceId>" + resourceId
-                               + "</serviceInstanceId><mso-bpel-name>WorkflowActionBB</mso-bpel-name></aetgt:MsoCompletionRequest>";
-               execution.setVariable("CompleteMsoProcessRequest", msoCompletionRequest);
-               execution.setVariable("mso-request-id", requestId);
-               execution.setVariable("mso-service-instance-id", resourceId);
        }
 
        public void checkRetryStatus(DelegateExecution execution) {
@@ -209,19 +231,27 @@ public class WorkflowActionBBTasks {
                String requestId = (String) execution.getVariable(G_REQUEST_ID);
                String retryDuration = (String) execution.getVariable("RetryDuration");
                int retryCount = (int) execution.getVariable(RETRY_COUNT);
+               int envMaxRetries;
+               try{
+                       envMaxRetries = Integer.parseInt(this.environment.getProperty(maxRetries));     
+               } catch (Exception ex) {
+                       logger.error("Could not read maxRetries from config file. Setting max to 5 retries");
+                       envMaxRetries = 5;
+               }
+               int nextCount = retryCount +1;
                if (handlingCode.equals("Retry")){
                        workflowActionBBFailure.updateRequestErrorStatusMessage(execution);
                        try{
                                InfraActiveRequests request = requestDbclient.getInfraActiveRequestbyRequestId(requestId);
-                               request.setRetryStatusMessage("Retry " + retryCount+1 + "/5 will be started in " + retryDuration);
+                               request.setRetryStatusMessage("Retry " + nextCount + "/" + envMaxRetries + " will be started in " + retryDuration);
                                requestDbclient.updateInfraActiveRequests(request); 
                        } catch(Exception ex){
                                logger.warn("Failed to update Request Db Infra Active Requests with Retry Status",ex);
                        }
-                       if(retryCount<5){
+                       if(retryCount<envMaxRetries){
                                int currSequence = (int) execution.getVariable("gCurrentSequence");
                                execution.setVariable("gCurrentSequence", currSequence-1);
-                               execution.setVariable(RETRY_COUNT, retryCount + 1);
+                               execution.setVariable(RETRY_COUNT, nextCount);
                        }else{
                                workflowAction.buildAndThrowException(execution, "Exceeded maximum retries. Ending flow with status Abort");
                        }
@@ -262,10 +292,12 @@ public class WorkflowActionBBTasks {
                        
                        int flowSize = rollbackFlows.size();
                        String handlingCode = (String) execution.getVariable("handlingCode");
-                       if(handlingCode.equals("RollbackToAssigned")){
-                               for(int i = 0; i<flowSize -1; i++){
+                       if(handlingCode.equals("RollbackToAssigned") || handlingCode.equals("RollbackToCreated")){
+                               for(int i = 0; i<flowSize; i++){
                                        if(rollbackFlows.get(i).getBuildingBlock().getBpmnFlowName().contains("Unassign")){
                                                rollbackFlows.remove(i);
+                                       } else if(rollbackFlows.get(i).getBuildingBlock().getBpmnFlowName().contains("Delete") && handlingCode.equals("RollbackToCreated")) {
+                                               rollbackFlows.remove(i);
                                        }
                                }
                        }
@@ -285,4 +317,109 @@ public class WorkflowActionBBTasks {
                        workflowAction.buildAndThrowException(execution, "Rollback has already been called. Cannot rollback a request that is currently in the rollback state.");
                }
        }
+       
+       protected void updateInstanceId(DelegateExecution execution){
+               try{
+                       String requestId = (String) execution.getVariable(G_REQUEST_ID);
+                       String resourceId = (String) execution.getVariable("resourceId");
+                       WorkflowType resourceType = (WorkflowType) execution.getVariable("resourceType");
+                       InfraActiveRequests request = requestDbclient.getInfraActiveRequestbyRequestId(requestId);
+                       if(resourceType == WorkflowType.SERVICE){
+                               request.setServiceInstanceId(resourceId);
+                       }else if(resourceType == WorkflowType.VNF){
+                               request.setVnfId(resourceId);
+                       }else if(resourceType == WorkflowType.VFMODULE){
+                               request.setVfModuleId(resourceId);
+                       }else if(resourceType == WorkflowType.VOLUMEGROUP){
+                               request.setVolumeGroupId(resourceId);
+                       }else if(resourceType == WorkflowType.NETWORK){
+                               request.setNetworkId(resourceId);
+                       }else if(resourceType == WorkflowType.CONFIGURATION){
+                               request.setConfigurationId(resourceId);
+                       }else if(resourceType == WorkflowType.INSTANCE_GROUP){
+                               request.setInstanceGroupId(resourceId);
+                       }
+                       requestDbclient.updateInfraActiveRequests(request);
+               }catch(Exception ex){
+                       workflowAction.buildAndThrowException(execution, "Failed to update Request db with instanceId");
+               }
+       }
+       
+       public void postProcessingExecuteBB(DelegateExecution execution) {
+               List<ExecuteBuildingBlock> flowsToExecute = (List<ExecuteBuildingBlock>) execution
+                               .getVariable("flowsToExecute");
+               String handlingCode = (String) execution.getVariable("handlingCode");
+               final boolean aLaCarte = (boolean) execution.getVariable(G_ALACARTE);
+               int currentSequence = (int) execution.getVariable(G_CURRENT_SEQUENCE);
+               ExecuteBuildingBlock ebb = flowsToExecute.get(currentSequence - 1);
+               String bbFlowName = ebb.getBuildingBlock().getBpmnFlowName();
+               if(bbFlowName.equalsIgnoreCase("ActivateVfModuleBB") && aLaCarte && handlingCode.equalsIgnoreCase("Success")) {
+                       postProcessingExecuteBBActivateVfModule(execution, ebb, flowsToExecute);
+               }
+       }
+       
+       protected void postProcessingExecuteBBActivateVfModule(DelegateExecution execution, 
+                       ExecuteBuildingBlock ebb, List<ExecuteBuildingBlock> flowsToExecute) {
+               try {
+                       String serviceInstanceId = ebb.getWorkflowResourceIds().getServiceInstanceId();
+                       String vnfId = ebb.getWorkflowResourceIds().getVnfId();
+                       String vfModuleId = ebb.getResourceId();
+                       ebb.getWorkflowResourceIds().setVfModuleId(vfModuleId);
+                       String serviceModelUUID = bbInputSetupUtils.getAAIServiceInstanceById(serviceInstanceId).getModelVersionId();
+                       String vnfCustomizationUUID = bbInputSetupUtils.getAAIGenericVnf(vnfId).getModelCustomizationId();
+                       String vfModuleCustomizationUUID = bbInputSetupUtils.getAAIVfModule(vnfId, vfModuleId).getModelCustomizationId();
+                       List<Vnfc> vnfcs = workflowAction.getRelatedResourcesInVfModule(vnfId, vfModuleId, Vnfc.class, AAIObjectType.VNFC);
+                       logger.debug("Vnfc Size: {}", vnfcs.size());
+                       for(Vnfc vnfc : vnfcs) {
+                               String modelCustomizationId = vnfc.getModelCustomizationId();
+                               logger.debug("Processing Vnfc: {}", modelCustomizationId);
+                               CvnfcConfigurationCustomization fabricConfig = 
+                                               catalogDbClient.getCvnfcCustomization(serviceModelUUID,vnfCustomizationUUID,
+                                                               vfModuleCustomizationUUID, modelCustomizationId);
+                               if(fabricConfig != null && fabricConfig.getConfigurationResource() != null 
+                                               && fabricConfig.getConfigurationResource().getToscaNodeType() != null 
+                                               && fabricConfig.getConfigurationResource().getToscaNodeType().contains(FABRIC_CONFIGURATION)) {
+                                       String configurationId = UUID.randomUUID().toString();
+                                       ConfigurationResourceKeys configurationResourceKeys = new ConfigurationResourceKeys();
+                                       configurationResourceKeys.setCvnfcCustomizationUUID(modelCustomizationId);
+                                       configurationResourceKeys.setVfModuleCustomizationUUID(vfModuleCustomizationUUID);
+                                       configurationResourceKeys.setVnfResourceCustomizationUUID(vnfCustomizationUUID);
+                                       configurationResourceKeys.setVnfcName(vnfc.getVnfcName());
+                                       ExecuteBuildingBlock assignConfigBB = getExecuteBBForConfig(ASSIGN_FABRIC_CONFIGURATION_BB, ebb, configurationId, configurationResourceKeys);
+                                       ExecuteBuildingBlock activateConfigBB = getExecuteBBForConfig(ACTIVATE_FABRIC_CONFIGURATION_BB, ebb, configurationId, configurationResourceKeys);
+                                       flowsToExecute.add(assignConfigBB);
+                                       flowsToExecute.add(activateConfigBB);
+                                       flowsToExecute.stream().forEach(executeBB -> logger.info("Flows to Execute After Post Processing: {}", executeBB.getBuildingBlock().getBpmnFlowName()));
+                                       execution.setVariable("flowsToExecute", flowsToExecute);
+                                       execution.setVariable("completed", false);
+                               } else {
+                                       logger.debug("No cvnfcCustomization found for customizationId: " + modelCustomizationId);
+                               }
+                       }
+               } catch (Exception e) {
+                       String errorMessage = "Error occurred in post processing of Vf Module create";
+                       execution.setVariable("handlingCode", "RollbackToCreated");
+                       execution.setVariable("WorkflowActionErrorMessage", errorMessage);
+                       logger.error(errorMessage, e);
+               }
+       }
+       
+       protected ExecuteBuildingBlock getExecuteBBForConfig(String bbName, ExecuteBuildingBlock ebb, String configurationId, ConfigurationResourceKeys configurationResourceKeys) {
+               ExecuteBuildingBlock configBB = new ExecuteBuildingBlock();
+               BuildingBlock buildingBlock = new BuildingBlock();
+               buildingBlock.setBpmnFlowName(bbName);
+               buildingBlock.setMsoId(UUID.randomUUID().toString());
+               configBB.setaLaCarte(ebb.isaLaCarte());
+               configBB.setApiVersion(ebb.getApiVersion());
+               configBB.setRequestAction(ebb.getRequestAction());
+               configBB.setVnfType(ebb.getVnfType());
+               configBB.setRequestId(ebb.getRequestId());
+               configBB.setRequestDetails(ebb.getRequestDetails());
+               configBB.setBuildingBlock(buildingBlock);
+               WorkflowResourceIds workflowResourceIds = ebb.getWorkflowResourceIds();
+               workflowResourceIds.setConfigurationId(configurationId);
+               configBB.setWorkflowResourceIds(workflowResourceIds);
+               configBB.setConfigurationResourceKeys(configurationResourceKeys);
+               return configBB;
+       }
 }