Fix macro flow resource blocks processing order 63/122463/8
authorLukasz Rajewski <lukasz.rajewski@orange.com>
Tue, 6 Jul 2021 15:35:37 +0000 (17:35 +0200)
committerLukasz Rajewski <lukasz.rajewski@orange.com>
Sun, 11 Jul 2021 21:21:09 +0000 (23:21 +0200)
Change-Id: I9941cf15d65b5c463126d99e03aa4eb0c2e8c183
Issue-ID: SO-3705
Signed-off-by: Lukasz Rajewski <lukasz.rajewski@orange.com>
17 files changed:
bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ExecuteBuildingBlockBuilder.java
bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ExecutionPlan.java [new file with mode: 0644]
bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/Resource.java
bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowAction.java
bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ebb/loader/ServiceEBBLoader.java
bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ebb/loader/UserParamsServiceTraversal.java
bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ebb/loader/VnfEBBLoader.java
bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ExecuteBuildingBlockBuilderTest.java
bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ResourceTest.java
bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowActionTest.java
bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ebb/loader/ServiceEBBLoaderTest.java
bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ebb/loader/UserParamsServiceTraversalTest.java
bpmn/so-bpmn-tasks/src/test/resources/__files/Macro/ServiceMacroAssignVnfAndPnf.json [new file with mode: 0644]
common/src/main/java/org/onap/so/serviceinstancebeans/Networks.java
common/src/main/java/org/onap/so/serviceinstancebeans/Pnfs.java
common/src/main/java/org/onap/so/serviceinstancebeans/VfModules.java
common/src/main/java/org/onap/so/serviceinstancebeans/Vnfs.java

index 813dc04..2bd0f2c 100644 (file)
@@ -10,6 +10,8 @@
  * ================================================================================
  * Modifications Copyright (c) 2020 Tech Mahindra
  * ================================================================================
  * ================================================================================
  * Modifications Copyright (c) 2020 Tech Mahindra
  * ================================================================================
+ * Modifications Copyright (c) 2021 Orange
+ * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
@@ -26,7 +28,7 @@
 
 package org.onap.so.bpmn.infrastructure.workflow.tasks;
 
 
 package org.onap.so.bpmn.infrastructure.workflow.tasks;
 
-import java.util.Comparator;
+import org.apache.commons.lang3.builder.ToStringBuilder;
 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.BuildingBlock;
 import org.onap.so.bpmn.servicedecomposition.entities.ConfigurationResourceKeys;
 import org.onap.so.bpmn.servicedecomposition.entities.ExecuteBuildingBlock;
@@ -41,16 +43,7 @@ import java.util.List;
 import java.util.Optional;
 import java.util.UUID;
 import java.util.stream.Collectors;
 import java.util.Optional;
 import java.util.UUID;
 import java.util.stream.Collectors;
-import static org.onap.so.bpmn.infrastructure.workflow.tasks.WorkflowActionConstants.ACTIVATE_INSTANCE;
-import static org.onap.so.bpmn.infrastructure.workflow.tasks.WorkflowActionConstants.ASSIGN_INSTANCE;
-import static org.onap.so.bpmn.infrastructure.workflow.tasks.WorkflowActionConstants.CONFIGURATION;
-import static org.onap.so.bpmn.infrastructure.workflow.tasks.WorkflowActionConstants.CONTROLLER;
-import static org.onap.so.bpmn.infrastructure.workflow.tasks.WorkflowActionConstants.CREATE_INSTANCE;
-import static org.onap.so.bpmn.infrastructure.workflow.tasks.WorkflowActionConstants.NETWORKCOLLECTION;
-import static org.onap.so.bpmn.infrastructure.workflow.tasks.WorkflowActionConstants.REPLACEINSTANCE;
-import static org.onap.so.bpmn.infrastructure.workflow.tasks.WorkflowActionConstants.REPLACEINSTANCERETAINASSIGNMENTS;
-import static org.onap.so.bpmn.infrastructure.workflow.tasks.WorkflowActionConstants.SERVICE;
-import static org.onap.so.bpmn.infrastructure.workflow.tasks.WorkflowActionConstants.VOLUMEGROUP;
+import static org.onap.so.bpmn.infrastructure.workflow.tasks.WorkflowActionConstants.*;
 
 @Component
 public class ExecuteBuildingBlockBuilder {
 
 @Component
 public class ExecuteBuildingBlockBuilder {
@@ -63,80 +56,117 @@ public class ExecuteBuildingBlockBuilder {
     private static final String NETWORK = "Network";
 
     protected List<ExecuteBuildingBlock> buildExecuteBuildingBlockList(List<OrchestrationFlow> orchFlows,
     private static final String NETWORK = "Network";
 
     protected List<ExecuteBuildingBlock> buildExecuteBuildingBlockList(List<OrchestrationFlow> orchFlows,
-            List<Resource> resourceList, String requestId, String apiVersion, String resourceId, String requestAction,
-            String vnfType, WorkflowResourceIds workflowResourceIds, RequestDetails requestDetails,
-            boolean replaceVnf) {
+            List<Resource> originalResourceList, String requestId, String apiVersion, String resourceId,
+            String requestAction, String vnfType, WorkflowResourceIds workflowResourceIds,
+            RequestDetails requestDetails, boolean replaceVnf) {
+        List<Resource> resourceList = getOnlyRootResourceList(originalResourceList);
+
         List<ExecuteBuildingBlock> flowsToExecute = new ArrayList<>();
         List<ExecuteBuildingBlock> flowsToExecute = new ArrayList<>();
+
+        boolean ascendingOrder = requestAction.equals(CREATE_INSTANCE) || requestAction.equals(ASSIGN_INSTANCE)
+                || requestAction.equals(ACTIVATE_INSTANCE);
+
+        ExecutionPlan plan = ExecutionPlan.build(resourceList, ascendingOrder);
+
+        logger.info("Orchestration Flows");
         for (OrchestrationFlow orchFlow : orchFlows) {
         for (OrchestrationFlow orchFlow : orchFlows) {
-            if (orchFlow.getFlowName().contains(SERVICE)) {
-                if (!replaceVnf) {
-                    workflowResourceIds.setServiceInstanceId(resourceId);
-                }
-                addBuildingBlockToExecuteBBList(flowsToExecute, resourceList, WorkflowType.SERVICE, orchFlow, requestId,
-                        apiVersion, resourceId, requestAction, vnfType, workflowResourceIds, requestDetails, false,
-                        false);
-            } else if (orchFlow.getFlowName().contains(VNF) || (orchFlow.getFlowName().contains(CONTROLLER)
-                    && (VNF).equalsIgnoreCase(orchFlow.getBpmnScope()))) {
-                addBuildingBlockToExecuteBBList(flowsToExecute, resourceList, WorkflowType.VNF, orchFlow, requestId,
-                        apiVersion, resourceId, requestAction, vnfType, workflowResourceIds, requestDetails, false,
-                        false);
-            } else if (orchFlow.getFlowName().contains(PNF) || (orchFlow.getFlowName().contains(CONTROLLER)
-                    && (PNF).equalsIgnoreCase(orchFlow.getBpmnScope()))) {
-                addBuildingBlockToExecuteBBList(flowsToExecute, resourceList, WorkflowType.PNF, orchFlow, requestId,
-                        apiVersion, resourceId, requestAction, vnfType, workflowResourceIds, requestDetails, false,
-                        false);
-            } else if (orchFlow.getFlowName().contains(NETWORK)
-                    && !orchFlow.getFlowName().contains(NETWORKCOLLECTION)) {
-                addBuildingBlockToExecuteBBList(flowsToExecute, resourceList, WorkflowType.NETWORK, orchFlow, requestId,
-                        apiVersion, resourceId, requestAction, vnfType, workflowResourceIds, requestDetails, false,
-                        false);
-                addBuildingBlockToExecuteBBList(flowsToExecute, resourceList, WorkflowType.VIRTUAL_LINK, orchFlow,
-                        requestId, apiVersion, resourceId, requestAction, vnfType, workflowResourceIds, requestDetails,
-                        true, false);
-            } else if (orchFlow.getFlowName().contains(VFMODULE) || (orchFlow.getFlowName().contains(CONTROLLER)
-                    && (VFMODULE).equalsIgnoreCase(orchFlow.getBpmnScope()))) {
-                Comparator<Resource> resourceComparator;
-                if (requestAction.equals(CREATE_INSTANCE) || requestAction.equals(ASSIGN_INSTANCE)
-                        || requestAction.equals(ACTIVATE_INSTANCE)) {
-                    resourceComparator = Resource.sortBaseFirst;
-                } else {
-                    resourceComparator = Resource.sortBaseLast;
-                }
-                List<Resource> vfModuleResourcesSorted =
-                        resourceList.stream().filter(x -> WorkflowType.VFMODULE == x.getResourceType())
-                                .sorted(resourceComparator).collect(Collectors.toList());
-
-                for (Resource resource : vfModuleResourcesSorted) {
-                    flowsToExecute.add(buildExecuteBuildingBlock(orchFlow, requestId, resource, apiVersion, resourceId,
-                            requestAction, false, vnfType, workflowResourceIds, requestDetails, false, null, null,
-                            false, null));
-                }
-            } else if (orchFlow.getFlowName().contains(VOLUMEGROUP)) {
-                if (requestAction.equalsIgnoreCase(REPLACEINSTANCE)
-                        || requestAction.equalsIgnoreCase(REPLACEINSTANCERETAINASSIGNMENTS)) {
-                    logger.debug("Replacing workflow resource id by volume group id");
-                    resourceId = workflowResourceIds.getVolumeGroupId();
-                }
-                addBuildingBlockToExecuteBBList(flowsToExecute, resourceList, WorkflowType.VOLUMEGROUP, orchFlow,
-                        requestId, apiVersion, resourceId, requestAction, vnfType, workflowResourceIds, requestDetails,
-                        false, false);
-            } else if (orchFlow.getFlowName().contains(NETWORKCOLLECTION)) {
-                addBuildingBlockToExecuteBBList(flowsToExecute, resourceList, WorkflowType.NETWORKCOLLECTION, orchFlow,
-                        requestId, apiVersion, resourceId, requestAction, vnfType, workflowResourceIds, requestDetails,
-                        false, false);
-            } else if (orchFlow.getFlowName().contains(CONFIGURATION)) {
-                addBuildingBlockToExecuteBBList(flowsToExecute, resourceList, WorkflowType.CONFIGURATION, orchFlow,
-                        requestId, apiVersion, resourceId, requestAction, vnfType, workflowResourceIds, requestDetails,
-                        false, true);
-            } else {
-                flowsToExecute
-                        .add(buildExecuteBuildingBlock(orchFlow, requestId, null, apiVersion, resourceId, requestAction,
-                                false, vnfType, workflowResourceIds, requestDetails, false, null, null, false, null));
+            String flowDetails = new ToStringBuilder(this).append("id", orchFlow.getId())
+                    .append("action", orchFlow.getAction()).append("sequenceNumber", orchFlow.getSequenceNumber())
+                    .append("flowName", orchFlow.getFlowName()).append("flowVersion", orchFlow.getFlowVersion())
+                    .append("bpmnAction", orchFlow.getBpmnAction()).append("bpmnScope", orchFlow.getBpmnScope())
+                    .toString();
+            logger.info("Flow: " + flowDetails);
+            buildExecuteBuildingBlockListPlan(orchFlow, plan, requestId, apiVersion, resourceId, requestAction, vnfType,
+                    workflowResourceIds, requestDetails, replaceVnf);
+        }
+
+        plan.flushBlocksFromCache(flowsToExecute);
+
+        return flowsToExecute;
+    }
+
+    protected void buildExecuteBuildingBlockListPlan(OrchestrationFlow flow, ExecutionPlan plan, String requestId,
+            String apiVersion, String resourceId, String requestAction, String vnfType,
+            WorkflowResourceIds workflowResourceIds, RequestDetails requestDetails, boolean replaceVnf) {
+
+        List<ExecuteBuildingBlock> mainFlows = buildExecuteBuildingBlockListRaw(flow, plan.getResource(), requestId,
+                apiVersion, resourceId, requestAction, vnfType, workflowResourceIds, requestDetails, replaceVnf);
+
+        plan.pushBlockToCache(mainFlows);
+
+        for (ExecutionGroup nestedGroup : plan.getNestedExecutions()) {
+            for (ExecutionPlan nestedPlan : nestedGroup.getNestedExecutions()) {
+                buildExecuteBuildingBlockListPlan(flow, nestedPlan, requestId, apiVersion, resourceId, requestAction,
+                        vnfType, workflowResourceIds, requestDetails, replaceVnf);
+            }
+            if (nestedGroup.getCacheSize() > 0)
+                plan.changeCurrentGroup(nestedGroup);
+        }
+    }
+
+    private List<ExecuteBuildingBlock> buildExecuteBuildingBlockListRaw(OrchestrationFlow orchFlow, Resource resource,
+            String requestId, String apiVersion, String resourceId, String requestAction, String vnfType,
+            WorkflowResourceIds workflowResourceIds, RequestDetails requestDetails, boolean replaceVnf) {
+        List<ExecuteBuildingBlock> flowsToExecute = new ArrayList<>();
+        if (orchFlow.getFlowName().contains(SERVICE) || (orchFlow.getFlowName().contains(CONTROLLER)
+                && (SERVICE).equalsIgnoreCase(orchFlow.getBpmnScope()))) {
+            if (!replaceVnf) {
+                workflowResourceIds.setServiceInstanceId(resourceId);
+            }
+            addBuildingBlockToExecuteBBList(flowsToExecute, resource, WorkflowType.SERVICE, orchFlow, requestId,
+                    apiVersion, resourceId, requestAction, vnfType, workflowResourceIds, requestDetails, false, false);
+        } else if (orchFlow.getFlowName().contains(VNF)
+                || (orchFlow.getFlowName().contains(CONTROLLER) && (VNF).equalsIgnoreCase(orchFlow.getBpmnScope()))) {
+            addBuildingBlockToExecuteBBList(flowsToExecute, resource, WorkflowType.VNF, orchFlow, requestId, apiVersion,
+                    resourceId, requestAction, vnfType, workflowResourceIds, requestDetails, false, false);
+        } else if (orchFlow.getFlowName().contains(PNF)
+                || (orchFlow.getFlowName().contains(CONTROLLER) && (PNF).equalsIgnoreCase(orchFlow.getBpmnScope()))) {
+            addBuildingBlockToExecuteBBList(flowsToExecute, resource, WorkflowType.PNF, orchFlow, requestId, apiVersion,
+                    resourceId, requestAction, vnfType, workflowResourceIds, requestDetails, false, false);
+        } else if (orchFlow.getFlowName().contains(NETWORK) && !orchFlow.getFlowName().contains(NETWORKCOLLECTION)) {
+            addBuildingBlockToExecuteBBList(flowsToExecute, resource, WorkflowType.NETWORK, orchFlow, requestId,
+                    apiVersion, resourceId, requestAction, vnfType, workflowResourceIds, requestDetails, false, false);
+            addBuildingBlockToExecuteBBList(flowsToExecute, resource, WorkflowType.VIRTUAL_LINK, orchFlow, requestId,
+                    apiVersion, resourceId, requestAction, vnfType, workflowResourceIds, requestDetails, true, false);
+        } else if (orchFlow.getFlowName().contains(VFMODULE) || (orchFlow.getFlowName().contains(CONTROLLER)
+                && (VFMODULE).equalsIgnoreCase(orchFlow.getBpmnScope()))) {
+            addBuildingBlockToExecuteBBList(flowsToExecute, resource, WorkflowType.VFMODULE, orchFlow, requestId,
+                    apiVersion, resourceId, requestAction, vnfType, workflowResourceIds, requestDetails, false, false);
+        } else if (orchFlow.getFlowName().contains(VOLUMEGROUP)) {
+            if (requestAction.equalsIgnoreCase(REPLACEINSTANCE)
+                    || requestAction.equalsIgnoreCase(REPLACEINSTANCERETAINASSIGNMENTS)) {
+                logger.debug("Replacing workflow resource id by volume group id");
+                resourceId = workflowResourceIds.getVolumeGroupId();
             }
             }
+            addBuildingBlockToExecuteBBList(flowsToExecute, resource, WorkflowType.VOLUMEGROUP, orchFlow, requestId,
+                    apiVersion, resourceId, requestAction, vnfType, workflowResourceIds, requestDetails, false, false);
+        } else if (orchFlow.getFlowName().contains(NETWORKCOLLECTION)) {
+            addBuildingBlockToExecuteBBList(flowsToExecute, resource, WorkflowType.NETWORKCOLLECTION, orchFlow,
+                    requestId, apiVersion, resourceId, requestAction, vnfType, workflowResourceIds, requestDetails,
+                    false, false);
+        } else if (orchFlow.getFlowName().contains(CONFIGURATION)) {
+            addBuildingBlockToExecuteBBList(flowsToExecute, resource, WorkflowType.CONFIGURATION, orchFlow, requestId,
+                    apiVersion, resourceId, requestAction, vnfType, workflowResourceIds, requestDetails, false, true);
+        } else {
+            flowsToExecute
+                    .add(buildExecuteBuildingBlock(orchFlow, requestId, null, apiVersion, resourceId, requestAction,
+                            false, vnfType, workflowResourceIds, requestDetails, false, null, null, false, null));
         }
         return flowsToExecute;
     }
 
         }
         return flowsToExecute;
     }
 
+    protected List<Resource> getOnlyRootResourceList(List<Resource> resourceList) {
+        return resourceList.stream().filter(x -> countResourceOnTheResourceList(x, resourceList) == 1)
+                .collect(Collectors.toList());
+    }
+
+    protected int countResourceOnTheResourceList(Resource resource, List<Resource> resourceList) {
+        int count = resourceList.stream()
+                .mapToInt(x -> (x.equals(resource) ? 1 : 0) + countResourceOnTheResourceList(resource, x.getChildren()))
+                .reduce(0, Integer::sum);
+        return count;
+    }
+
     protected ExecuteBuildingBlock buildExecuteBuildingBlock(OrchestrationFlow orchFlow, String requestId,
             Resource resource, String apiVersion, String resourceId, String requestAction, boolean aLaCarte,
             String vnfType, WorkflowResourceIds workflowResourceIds, RequestDetails requestDetails,
     protected ExecuteBuildingBlock buildExecuteBuildingBlock(OrchestrationFlow orchFlow, String requestId,
             Resource resource, String apiVersion, String resourceId, String requestAction, boolean aLaCarte,
             String vnfType, WorkflowResourceIds workflowResourceIds, RequestDetails requestDetails,
@@ -172,15 +202,16 @@ public class ExecuteBuildingBlockBuilder {
         return executeBuildingBlock;
     }
 
         return executeBuildingBlock;
     }
 
-    private void addBuildingBlockToExecuteBBList(List<ExecuteBuildingBlock> flowsToExecute, List<Resource> resourceList,
+    private void addBuildingBlockToExecuteBBList(List<ExecuteBuildingBlock> flowsToExecute, Resource resource,
             WorkflowType workflowType, OrchestrationFlow orchFlow, String requestId, String apiVersion,
             String resourceId, String requestAction, String vnfType, WorkflowResourceIds workflowResourceIds,
             RequestDetails requestDetails, boolean isVirtualLink, boolean isConfiguration) {
 
             WorkflowType workflowType, OrchestrationFlow orchFlow, String requestId, String apiVersion,
             String resourceId, String requestAction, String vnfType, WorkflowResourceIds workflowResourceIds,
             RequestDetails requestDetails, boolean isVirtualLink, boolean isConfiguration) {
 
-        resourceList.stream().filter(resource -> resource.getResourceType().equals(workflowType))
-                .forEach(resource -> flowsToExecute.add(buildExecuteBuildingBlock(orchFlow, requestId, resource,
-                        apiVersion, resourceId, requestAction, false, vnfType, workflowResourceIds, requestDetails,
-                        isVirtualLink, resource.getVirtualLinkKey(), null, isConfiguration, null)));
+        if (resource == null || !resource.getResourceType().equals(workflowType))
+            return;
+        flowsToExecute.add(buildExecuteBuildingBlock(orchFlow, requestId, resource, apiVersion, resourceId,
+                requestAction, false, vnfType, workflowResourceIds, requestDetails, isVirtualLink,
+                resource.getVirtualLinkKey(), null, isConfiguration, null));
     }
 
     protected ConfigurationResourceKeys getConfigurationResourceKeys(Resource resource, String vnfcName) {
     }
 
     protected ConfigurationResourceKeys getConfigurationResourceKeys(Resource resource, String vnfcName) {
@@ -191,6 +222,4 @@ public class ExecuteBuildingBlockBuilder {
         configurationResourceKeys.setVnfResourceCustomizationUUID(resource.getVnfCustomizationId());
         return configurationResourceKeys;
     }
         configurationResourceKeys.setVnfResourceCustomizationUUID(resource.getVnfCustomizationId());
         return configurationResourceKeys;
     }
-
-
 }
 }
diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ExecutionPlan.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ExecutionPlan.java
new file mode 100644 (file)
index 0000000..77cb616
--- /dev/null
@@ -0,0 +1,167 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2021 Orange Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.bpmn.infrastructure.workflow.tasks;
+
+import org.onap.so.bpmn.servicedecomposition.entities.ExecuteBuildingBlock;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+import java.util.stream.Collectors;
+
+class ExecutionPlan extends ExecutionCollection<ExecutionGroup> {
+    private final Resource resource;
+    private ExecutionGroup currentGroup = null;
+
+    public ExecutionPlan(Resource resource, ExecutionGroup group) {
+        super(resource != null ? resource.getResourceType() : WorkflowType.SERVICE);
+        this.resource = resource;
+        if (group != null) {
+            group.addNestedPlans(Collections.singletonList(this));
+        }
+    }
+
+    public void changeCurrentGroup(ExecutionGroup group) {
+        if (currentGroup == null || !currentGroup.equals(group)) {
+            logger.info("Change " + getName() + " group[" + group.getName() + "]");
+            if (currentGroup != null)
+                currentGroup.flushBlocksFromCache(this.blocksBuiltCache);
+        }
+        currentGroup = group;
+    }
+
+    Resource getResource() {
+        return resource;
+    }
+
+    protected String getName() {
+        return super.getName() + "["
+                + (resource != null ? (resource.getProcessingPriority() + ", " + resource.getResourceId()) : "") + "]";
+    }
+
+    public static ExecutionPlan build(List<Resource> resourceList, boolean ascendingOrder) {
+        ExecutionPlan plan = new ExecutionPlan(null, null);
+        buildExecutionPlan(plan, resourceList, ascendingOrder);
+        if (plan.getNestedExecutions().size() == 1
+                && plan.getNestedExecutions().get(0).getNestedExecutions().size() == 1)
+            plan = plan.getNestedExecutions().get(0).getNestedExecutions().get(0);
+        return plan;
+    }
+
+    private static void buildExecutionPlan(ExecutionPlan plan, List<Resource> resourceList, boolean ascendingOrder) {
+        Map<WorkflowType, List<Resource>> resourceGroups = new TreeMap<>();
+        for (Resource resource : resourceList) {
+            if (!resourceGroups.containsKey(resource.getResourceType())) {
+                resourceGroups.put(resource.getResourceType(), new ArrayList<>());
+            }
+            resourceGroups.get(resource.getResourceType()).add(resource);
+        }
+        for (WorkflowType type : resourceGroups.keySet()) {
+            ExecutionGroup nestedGroup = new ExecutionGroup(type, plan);
+            List<Resource> resourceGroupSorted = resourceGroups.get(type).stream()
+                    .sorted(ascendingOrder ? Resource.sortByPriorityAsc : Resource.sortByPriorityDesc)
+                    .collect(Collectors.toList());
+            for (Resource resource : resourceGroupSorted) {
+                ExecutionPlan planInGroup = new ExecutionPlan(resource, nestedGroup);
+                if (resource.getChildren().size() > 0)
+                    buildExecutionPlan(planInGroup, resource.getChildren(), ascendingOrder);
+            }
+        }
+    }
+}
+
+
+class ExecutionGroup extends ExecutionCollection<ExecutionPlan> {
+
+    public ExecutionGroup(WorkflowType groupType, ExecutionPlan plan) {
+        super(groupType);
+        plan.addNestedPlans(Collections.singletonList(this));
+    }
+}
+
+
+class ExecutionCollection<T extends ExecutionCollection<?>> {
+
+    protected static final Logger logger = LoggerFactory.getLogger(ExecutionCollection.class);
+
+    protected final WorkflowType type;
+    protected List<ExecuteBuildingBlock> blocksBuiltCache;
+    protected final List<T> nestedExecutions;
+
+    public ExecutionCollection(WorkflowType type) {
+        this.type = type;
+        this.nestedExecutions = new ArrayList<>();
+        this.blocksBuiltCache = new ArrayList<>();
+    }
+
+    public WorkflowType getType() {
+        return type;
+    }
+
+    public List<T> getNestedExecutions() {
+        return nestedExecutions;
+    }
+
+    public void addNestedPlans(List<T> executions) {
+        nestedExecutions.addAll(executions);
+    }
+
+    public void pushBlockToCache(List<ExecuteBuildingBlock> blocksCache) {
+        if (blocksCache.size() == 0)
+            return;
+        this.flushNestedBlocksToCache();
+        String blocks =
+                blocksCache.stream().map(x -> x.getBuildingBlock().getBpmnFlowName() + ", ").reduce("", String::concat);
+        blocks = blocks.substring(0, blocks.length() - 2);
+        logger.info("Push " + getName() + " (" + blocksCache.size() + ") blocks [" + blocks + "]");
+        this.blocksBuiltCache.addAll(blocksCache);
+    }
+
+    private void flushNestedBlocksToCache() {
+        for (T collection : nestedExecutions) {
+            collection.flushBlocksFromCache(this.blocksBuiltCache);
+        }
+    }
+
+    public void flushBlocksFromCache(List<ExecuteBuildingBlock> blockList) {
+        flushNestedBlocksToCache();
+        if (this.blocksBuiltCache.size() > 0) {
+            String blocks = this.blocksBuiltCache.stream().map(x -> x.getBuildingBlock().getBpmnFlowName() + ", ")
+                    .reduce("", String::concat);
+            blocks = blocks.substring(0, blocks.length() - 2);
+            logger.info("Flush " + getName() + " (" + blocksBuiltCache.size() + ") blocks [" + blocks + "]");
+            blockList.addAll(this.blocksBuiltCache);
+            this.blocksBuiltCache.clear();
+        }
+    }
+
+    public int getCacheSize() {
+        return blocksBuiltCache.size()
+                + getNestedExecutions().stream().mapToInt(x -> x.getCacheSize()).reduce(0, Integer::sum);
+    }
+
+    protected String getName() {
+        return type.name();
+    }
+}
index 692d8bc..0d2844d 100644 (file)
@@ -4,6 +4,8 @@
  * ================================================================================
  * Copyright (C) 2017 - 2018 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
  * ================================================================================
  * Copyright (C) 2017 - 2018 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
+ * Modifications Copyright (c) 2021 Orange
+ * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
 
 package org.onap.so.bpmn.infrastructure.workflow.tasks;
 
 
 package org.onap.so.bpmn.infrastructure.workflow.tasks;
 
+import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Comparator;
 import java.util.Comparator;
+import java.util.List;
 
 public class Resource {
 
 
 public class Resource {
 
@@ -32,14 +37,24 @@ public class Resource {
     private String vnfCustomizationId;
     private String vfModuleCustomizationId;
     private String cvnfModuleCustomizationId;
     private String vnfCustomizationId;
     private String vfModuleCustomizationId;
     private String cvnfModuleCustomizationId;
+    private int processingPriority;
+    private Resource parent;
+    private List<Resource> children;
 
 
-    public static final Comparator<Resource> sortBaseFirst = Comparator.comparingInt(x -> x.isBaseVfModule() ? 0 : 1);
-    public static final Comparator<Resource> sortBaseLast = Comparator.comparingInt(x -> x.isBaseVfModule() ? 1 : 0);
+    public static final Comparator<Resource> sortByPriorityAsc =
+            Comparator.comparingInt(Resource::getProcessingPriority);
+    public static final Comparator<Resource> sortByPriorityDesc =
+            Comparator.comparingInt(x -> -x.getProcessingPriority());
 
 
-    public Resource(WorkflowType resourceType, String resourceId, boolean generated) {
+    public Resource(WorkflowType resourceType, String resourceId, boolean generated, Resource parent) {
         this.resourceId = resourceId;
         this.resourceType = resourceType;
         this.generated = generated;
         this.resourceId = resourceId;
         this.resourceType = resourceType;
         this.generated = generated;
+        this.processingPriority = 0;
+        this.children = new ArrayList<>();
+        this.parent = parent;
+        if (parent != null)
+            this.parent.children.add(this);
     }
 
     public String getResourceId() {
     }
 
     public String getResourceId() {
@@ -105,4 +120,20 @@ public class Resource {
     public void setCvnfModuleCustomizationId(String cvnfModuleCustomizationId) {
         this.cvnfModuleCustomizationId = cvnfModuleCustomizationId;
     }
     public void setCvnfModuleCustomizationId(String cvnfModuleCustomizationId) {
         this.cvnfModuleCustomizationId = cvnfModuleCustomizationId;
     }
+
+    public int getProcessingPriority() {
+        return processingPriority == 0 ? (isBaseVfModule() ? Integer.MIN_VALUE + 1 : 0) : processingPriority;
+    }
+
+    public void setProcessingPriority(int processingPriority) {
+        this.processingPriority = processingPriority;
+    }
+
+    public Resource getParent() {
+        return this.parent;
+    }
+
+    public List<Resource> getChildren() {
+        return this.children;
+    }
 }
 }
index 8a92899..ce775af 100644 (file)
@@ -10,6 +10,8 @@
  * ================================================================================
  * Modifications Copyright (c) 2020 Tech Mahindra
  * ================================================================================
  * ================================================================================
  * Modifications Copyright (c) 2020 Tech Mahindra
  * ================================================================================
+ * Modifications Copyright (c) 2021 Orange
+ * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
@@ -318,6 +320,24 @@ public class WorkflowAction {
             logger.info("Sorting for Vlan Tagging");
             flowsToExecute = sortExecutionPathByObjectForVlanTagging(flowsToExecute, requestAction);
         }
             logger.info("Sorting for Vlan Tagging");
             flowsToExecute = sortExecutionPathByObjectForVlanTagging(flowsToExecute, requestAction);
         }
+        logger.info("Building Block Execution Order");
+        for (ExecuteBuildingBlock block : flowsToExecute) {
+            Resource res = resourceList.stream()
+                    .filter(resource -> resource.getResourceId() == block.getBuildingBlock().getKey()).findAny()
+                    .orElse(null);
+            String log = "Block: " + block.getBuildingBlock().getBpmnFlowName();
+            if (res != null) {
+                log += ", Resource: " + res.getResourceType() + "[" + res.getResourceId() + "]";
+                log += ", Priority: " + res.getProcessingPriority();
+                if (res.getResourceType() == WorkflowType.VFMODULE)
+                    log += ", Base: " + res.isBaseVfModule();
+            }
+            if (block.getBuildingBlock().getBpmnScope() != null)
+                log += ", Scope: " + block.getBuildingBlock().getBpmnScope();
+            if (block.getBuildingBlock().getBpmnAction() != null)
+                log += ", Action: " + block.getBuildingBlock().getBpmnAction();
+            logger.info(log);
+        }
         // By default, enable homing at VNF level for CREATE_INSTANCE and ASSIGNINSTANCE
         if (resourceType == WorkflowType.SERVICE
                 && (requestAction.equals(CREATE_INSTANCE) || requestAction.equals(ASSIGN_INSTANCE))
         // By default, enable homing at VNF level for CREATE_INSTANCE and ASSIGNINSTANCE
         if (resourceType == WorkflowType.SERVICE
                 && (requestAction.equals(CREATE_INSTANCE) || requestAction.equals(ASSIGN_INSTANCE))
@@ -417,7 +437,7 @@ public class WorkflowAction {
                 resourceId = modelInfo.getModelCustomizationId();
             }
         }
                 resourceId = modelInfo.getModelCustomizationId();
             }
         }
-        return new Resource(resourceType, resourceId, true);
+        return new Resource(resourceType, resourceId, true, null);
     }
 
     private String getCloudOwner(CloudConfiguration cloudConfiguration) {
     }
 
     private String getCloudOwner(CloudConfiguration cloudConfiguration) {
@@ -732,7 +752,7 @@ public class WorkflowAction {
                     type = action;
                 }
             }
                     type = action;
                 }
             }
-            return new Resource(WorkflowType.fromString(convertTypeFromPlural(type)), id, generated);
+            return new Resource(WorkflowType.fromString(convertTypeFromPlural(type)), id, generated, null);
         } else {
             throw new IllegalArgumentException("Uri could not be parsed: " + uri);
         }
         } else {
             throw new IllegalArgumentException("Uri could not be parsed: " + uri);
         }
index 6d02594..e4c6d29 100644 (file)
@@ -1,3 +1,25 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (c) 2020 Nokia
+ * ================================================================================
+ * Modifications Copyright (c) 2021 Orange
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
 package org.onap.so.bpmn.infrastructure.workflow.tasks.ebb.loader;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
 package org.onap.so.bpmn.infrastructure.workflow.tasks.ebb.loader;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
@@ -121,7 +143,7 @@ public class ServiceEBBLoader {
             // to query the SI in AAI to find related instances.
             traverseAAIService(execution, resourceList, resourceId, aaiResourceIds);
         } else if (DEACTIVATE_INSTANCE.equalsIgnoreCase(requestAction)) {
             // to query the SI in AAI to find related instances.
             traverseAAIService(execution, resourceList, resourceId, aaiResourceIds);
         } else if (DEACTIVATE_INSTANCE.equalsIgnoreCase(requestAction)) {
-            resourceList.add(new Resource(WorkflowType.SERVICE, "", false));
+            resourceList.add(new Resource(WorkflowType.SERVICE, "", false, null));
         }
         return resourceList;
     }
         }
         return resourceList;
     }
@@ -142,16 +164,18 @@ public class ServiceEBBLoader {
         if (service == null) {
             buildAndThrowException(execution, "Could not find the service model in catalog db.");
         } else {
         if (service == null) {
             buildAndThrowException(execution, "Could not find the service model in catalog db.");
         } else {
-            resourceList.add(new Resource(WorkflowType.SERVICE, service.getModelUUID(), false));
+            Resource serviceResource = new Resource(WorkflowType.SERVICE, service.getModelUUID(), false, null);
+            resourceList.add(serviceResource);
             RelatedInstance relatedVpnBinding =
                     bbInputSetupUtils.getRelatedInstanceByType(sIRequest.getRequestDetails(), ModelType.vpnBinding);
             RelatedInstance relatedLocalNetwork =
                     bbInputSetupUtils.getRelatedInstanceByType(sIRequest.getRequestDetails(), ModelType.network);
 
             if (relatedVpnBinding != null && relatedLocalNetwork != null) {
             RelatedInstance relatedVpnBinding =
                     bbInputSetupUtils.getRelatedInstanceByType(sIRequest.getRequestDetails(), ModelType.vpnBinding);
             RelatedInstance relatedLocalNetwork =
                     bbInputSetupUtils.getRelatedInstanceByType(sIRequest.getRequestDetails(), ModelType.network);
 
             if (relatedVpnBinding != null && relatedLocalNetwork != null) {
-                traverseVrfConfiguration(aaiResourceIds, resourceList, service, relatedVpnBinding, relatedLocalNetwork);
+                traverseVrfConfiguration(aaiResourceIds, resourceList, serviceResource, service, relatedVpnBinding,
+                        relatedLocalNetwork);
             } else {
             } else {
-                traverseNetworkCollection(execution, resourceList, service);
+                traverseNetworkCollection(execution, resourceList, serviceResource, service);
             }
         }
     }
             }
         }
     }
@@ -169,14 +193,17 @@ public class ServiceEBBLoader {
             ServiceInstance serviceInstanceAAI = bbInputSetupUtils.getAAIServiceInstanceById(resourceId);
             org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance serviceInstanceMSO =
                     bbInputSetup.getExistingServiceInstance(serviceInstanceAAI);
             ServiceInstance serviceInstanceAAI = bbInputSetupUtils.getAAIServiceInstanceById(resourceId);
             org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance serviceInstanceMSO =
                     bbInputSetup.getExistingServiceInstance(serviceInstanceAAI);
-            resourceList.add(new Resource(WorkflowType.SERVICE, serviceInstanceMSO.getServiceInstanceId(), false));
-            traverseServiceInstanceMSOVnfs(resourceList, aaiResourceIds, serviceInstanceMSO);
-            traverseServiceInstanceMSOPnfs(resourceList, aaiResourceIds, serviceInstanceMSO);
+            Resource serviceResource =
+                    new Resource(WorkflowType.SERVICE, serviceInstanceMSO.getServiceInstanceId(), false, null);
+            resourceList.add(serviceResource);
+            traverseServiceInstanceMSOVnfs(resourceList, serviceResource, aaiResourceIds, serviceInstanceMSO);
+            traverseServiceInstanceMSOPnfs(resourceList, serviceResource, aaiResourceIds, serviceInstanceMSO);
             if (serviceInstanceMSO.getNetworks() != null) {
                 for (org.onap.so.bpmn.servicedecomposition.bbobjects.L3Network network : serviceInstanceMSO
                         .getNetworks()) {
                     aaiResourceIds.add(new Pair<>(WorkflowType.NETWORK, network.getNetworkId()));
             if (serviceInstanceMSO.getNetworks() != null) {
                 for (org.onap.so.bpmn.servicedecomposition.bbobjects.L3Network network : serviceInstanceMSO
                         .getNetworks()) {
                     aaiResourceIds.add(new Pair<>(WorkflowType.NETWORK, network.getNetworkId()));
-                    resourceList.add(new Resource(WorkflowType.NETWORK, network.getNetworkId(), false));
+                    resourceList
+                            .add(new Resource(WorkflowType.NETWORK, network.getNetworkId(), false, serviceResource));
                 }
             }
             if (serviceInstanceMSO.getCollection() != null) {
                 }
             }
             if (serviceInstanceMSO.getCollection() != null) {
@@ -184,7 +211,7 @@ public class ServiceEBBLoader {
                 aaiResourceIds
                         .add(new Pair<>(WorkflowType.NETWORKCOLLECTION, serviceInstanceMSO.getCollection().getId()));
                 resourceList.add(new Resource(WorkflowType.NETWORKCOLLECTION,
                 aaiResourceIds
                         .add(new Pair<>(WorkflowType.NETWORKCOLLECTION, serviceInstanceMSO.getCollection().getId()));
                 resourceList.add(new Resource(WorkflowType.NETWORKCOLLECTION,
-                        serviceInstanceMSO.getCollection().getId(), false));
+                        serviceInstanceMSO.getCollection().getId(), false, serviceResource));
             }
             if (serviceInstanceMSO.getConfigurations() != null) {
                 for (Configuration config : serviceInstanceMSO.getConfigurations()) {
             }
             if (serviceInstanceMSO.getConfigurations() != null) {
                 for (Configuration config : serviceInstanceMSO.getConfigurations()) {
@@ -195,8 +222,8 @@ public class ServiceEBBLoader {
                             if (relationship.getRelatedTo().contains("vnfc")
                                     || relationship.getRelatedTo().contains("vpn-binding")) {
                                 aaiResourceIds.add(new Pair<>(WorkflowType.CONFIGURATION, config.getConfigurationId()));
                             if (relationship.getRelatedTo().contains("vnfc")
                                     || relationship.getRelatedTo().contains("vpn-binding")) {
                                 aaiResourceIds.add(new Pair<>(WorkflowType.CONFIGURATION, config.getConfigurationId()));
-                                resourceList.add(
-                                        new Resource(WorkflowType.CONFIGURATION, config.getConfigurationId(), false));
+                                resourceList.add(new Resource(WorkflowType.CONFIGURATION, config.getConfigurationId(),
+                                        false, serviceResource));
                                 break;
                             }
                         }
                                 break;
                             }
                         }
@@ -210,7 +237,7 @@ public class ServiceEBBLoader {
         }
     }
 
         }
     }
 
-    private void traverseServiceInstanceMSOVnfs(List<Resource> resourceList,
+    private void traverseServiceInstanceMSOVnfs(List<Resource> resourceList, Resource serviceResource,
             List<Pair<WorkflowType, String>> aaiResourceIds,
             org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance serviceInstanceMSO) {
         if (serviceInstanceMSO.getVnfs() == null) {
             List<Pair<WorkflowType, String>> aaiResourceIds,
             org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance serviceInstanceMSO) {
         if (serviceInstanceMSO.getVnfs() == null) {
@@ -218,18 +245,20 @@ public class ServiceEBBLoader {
         }
         for (org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf vnf : serviceInstanceMSO.getVnfs()) {
             aaiResourceIds.add(new Pair<>(WorkflowType.VNF, vnf.getVnfId()));
         }
         for (org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf vnf : serviceInstanceMSO.getVnfs()) {
             aaiResourceIds.add(new Pair<>(WorkflowType.VNF, vnf.getVnfId()));
-            resourceList.add(new Resource(WorkflowType.VNF, vnf.getVnfId(), false));
-            traverseVnfModules(resourceList, aaiResourceIds, vnf);
+            Resource vnfResource = new Resource(WorkflowType.VNF, vnf.getVnfId(), false, serviceResource);
+            resourceList.add(vnfResource);
+            traverseVnfModules(resourceList, vnfResource, aaiResourceIds, vnf);
             if (vnf.getVolumeGroups() != null) {
                 for (org.onap.so.bpmn.servicedecomposition.bbobjects.VolumeGroup volumeGroup : vnf.getVolumeGroups()) {
                     aaiResourceIds.add(new Pair<>(WorkflowType.VOLUMEGROUP, volumeGroup.getVolumeGroupId()));
             if (vnf.getVolumeGroups() != null) {
                 for (org.onap.so.bpmn.servicedecomposition.bbobjects.VolumeGroup volumeGroup : vnf.getVolumeGroups()) {
                     aaiResourceIds.add(new Pair<>(WorkflowType.VOLUMEGROUP, volumeGroup.getVolumeGroupId()));
-                    resourceList.add(new Resource(WorkflowType.VOLUMEGROUP, volumeGroup.getVolumeGroupId(), false));
+                    resourceList.add(
+                            new Resource(WorkflowType.VOLUMEGROUP, volumeGroup.getVolumeGroupId(), false, vnfResource));
                 }
             }
         }
     }
 
                 }
             }
         }
     }
 
-    private void traverseServiceInstanceMSOPnfs(List<Resource> resourceList,
+    private void traverseServiceInstanceMSOPnfs(List<Resource> resourceList, Resource serviceResource,
             List<Pair<WorkflowType, String>> aaiResourceIds,
             org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance serviceInstanceMSO) {
         if (serviceInstanceMSO.getPnfs() == null) {
             List<Pair<WorkflowType, String>> aaiResourceIds,
             org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance serviceInstanceMSO) {
         if (serviceInstanceMSO.getPnfs() == null) {
@@ -237,12 +266,12 @@ public class ServiceEBBLoader {
         }
         for (org.onap.so.bpmn.servicedecomposition.bbobjects.Pnf pnf : serviceInstanceMSO.getPnfs()) {
             aaiResourceIds.add(new Pair<>(WorkflowType.PNF, pnf.getPnfId()));
         }
         for (org.onap.so.bpmn.servicedecomposition.bbobjects.Pnf pnf : serviceInstanceMSO.getPnfs()) {
             aaiResourceIds.add(new Pair<>(WorkflowType.PNF, pnf.getPnfId()));
-            resourceList.add(new Resource(WorkflowType.PNF, pnf.getPnfId(), false));
+            resourceList.add(new Resource(WorkflowType.PNF, pnf.getPnfId(), false, serviceResource));
         }
     }
 
     protected void traverseVrfConfiguration(List<Pair<WorkflowType, String>> aaiResourceIds,
         }
     }
 
     protected void traverseVrfConfiguration(List<Pair<WorkflowType, String>> aaiResourceIds,
-            List<Resource> resourceList, org.onap.so.db.catalog.beans.Service service,
+            List<Resource> resourceList, Resource serviceResource, org.onap.so.db.catalog.beans.Service service,
             RelatedInstance relatedVpnBinding, RelatedInstance relatedLocalNetwork)
             throws VrfBondingServiceException, JsonProcessingException {
         org.onap.aai.domain.yang.L3Network aaiLocalNetwork =
             RelatedInstance relatedVpnBinding, RelatedInstance relatedLocalNetwork)
             throws VrfBondingServiceException, JsonProcessingException {
         org.onap.aai.domain.yang.L3Network aaiLocalNetwork =
@@ -260,12 +289,12 @@ public class ServiceEBBLoader {
             aaiResourceIds.add(new Pair<>(WorkflowType.CONFIGURATION, existingAAIVrfConfiguration));
         }
         resourceList.add(new Resource(WorkflowType.CONFIGURATION,
             aaiResourceIds.add(new Pair<>(WorkflowType.CONFIGURATION, existingAAIVrfConfiguration));
         }
         resourceList.add(new Resource(WorkflowType.CONFIGURATION,
-                service.getConfigurationCustomizations().get(0).getModelCustomizationUUID(), false));
+                service.getConfigurationCustomizations().get(0).getModelCustomizationUUID(), false, serviceResource));
 
     }
 
     protected void traverseNetworkCollection(DelegateExecution execution, List<Resource> resourceList,
 
     }
 
     protected void traverseNetworkCollection(DelegateExecution execution, List<Resource> resourceList,
-            org.onap.so.db.catalog.beans.Service service) {
+            Resource serviceResource, org.onap.so.db.catalog.beans.Service service) {
         if (isVnfCustomizationsInTheService(service)) {
             buildAndThrowException(execution,
                     "Cannot orchestrate Service-Macro-Create without user params with a vnf. Please update ASDC model for new macro orchestration support or add service_recipe records to route to old macro flows");
         if (isVnfCustomizationsInTheService(service)) {
             buildAndThrowException(execution,
                     "Cannot orchestrate Service-Macro-Create without user params with a vnf. Please update ASDC model for new macro orchestration support or add service_recipe records to route to old macro flows");
@@ -280,14 +309,16 @@ public class ServiceEBBLoader {
         } else {
             CollectionResourceCustomization collectionResourceCustomization =
                     findCatalogNetworkCollection(execution, service);
         } else {
             CollectionResourceCustomization collectionResourceCustomization =
                     findCatalogNetworkCollection(execution, service);
-            traverseNetworkCollectionResourceCustomization(resourceList, collectionResourceCustomization);
+            traverseNetworkCollectionResourceCustomization(resourceList, serviceResource,
+                    collectionResourceCustomization);
         }
         }
-        traverseNetworkCollectionCustomization(resourceList, service);
+        traverseNetworkCollectionCustomization(resourceList, serviceResource, service);
     }
 
     }
 
-    private void traverseNetworkCollectionResourceCustomization(List<Resource> resourceList,
+    private void traverseNetworkCollectionResourceCustomization(List<Resource> resourceList, Resource serviceResource,
             CollectionResourceCustomization collectionResourceCustomization) {
             CollectionResourceCustomization collectionResourceCustomization) {
-        if (collectionResourceCustomizationShouldNotBeProcessed(resourceList, collectionResourceCustomization))
+        if (collectionResourceCustomizationShouldNotBeProcessed(resourceList, serviceResource,
+                collectionResourceCustomization))
             return;
         int minNetworks = 0;
         org.onap.so.db.catalog.beans.InstanceGroup instanceGroup =
             return;
         int minNetworks = 0;
         org.onap.so.db.catalog.beans.InstanceGroup instanceGroup =
@@ -312,7 +343,7 @@ public class ServiceEBBLoader {
         for (int i = 0; i < minNetworks; i++) {
             if (collectionNetworkResourceCust != null) {
                 Resource resource = new Resource(WorkflowType.VIRTUAL_LINK,
         for (int i = 0; i < minNetworks; i++) {
             if (collectionNetworkResourceCust != null) {
                 Resource resource = new Resource(WorkflowType.VIRTUAL_LINK,
-                        collectionNetworkResourceCust.getModelCustomizationUUID(), false);
+                        collectionNetworkResourceCust.getModelCustomizationUUID(), false, serviceResource);
                 resource.setVirtualLinkKey(Integer.toString(i));
                 resourceList.add(resource);
             }
                 resource.setVirtualLinkKey(Integer.toString(i));
                 resourceList.add(resource);
             }
@@ -334,13 +365,13 @@ public class ServiceEBBLoader {
     }
 
     private boolean collectionResourceCustomizationShouldNotBeProcessed(List<Resource> resourceList,
     }
 
     private boolean collectionResourceCustomizationShouldNotBeProcessed(List<Resource> resourceList,
-            CollectionResourceCustomization collectionResourceCustomization) {
+            Resource serviceResource, CollectionResourceCustomization collectionResourceCustomization) {
         if (collectionResourceCustomization == null) {
             logger.debug("No Network Collection Customization found");
             return true;
         }
         resourceList.add(new Resource(WorkflowType.NETWORKCOLLECTION,
         if (collectionResourceCustomization == null) {
             logger.debug("No Network Collection Customization found");
             return true;
         }
         resourceList.add(new Resource(WorkflowType.NETWORKCOLLECTION,
-                collectionResourceCustomization.getModelCustomizationUUID(), false));
+                collectionResourceCustomization.getModelCustomizationUUID(), false, serviceResource));
         logger.debug("Found a network collection");
         if (collectionResourceCustomization.getCollectionResource() == null) {
             logger.debug("No Network Collection found. collectionResource is null");
         logger.debug("Found a network collection");
         if (collectionResourceCustomization.getCollectionResource() == null) {
             logger.debug("No Network Collection found. collectionResource is null");
@@ -368,7 +399,7 @@ public class ServiceEBBLoader {
         return toscaNodeType != null && toscaNodeType.contains(NETWORKCOLLECTION);
     }
 
         return toscaNodeType != null && toscaNodeType.contains(NETWORKCOLLECTION);
     }
 
-    private void traverseNetworkCollectionCustomization(List<Resource> resourceList,
+    private void traverseNetworkCollectionCustomization(List<Resource> resourceList, Resource serviceResource,
             org.onap.so.db.catalog.beans.Service service) {
         if (isNetworkCollectionInTheResourceList(resourceList)) {
             return;
             org.onap.so.db.catalog.beans.Service service) {
         if (isNetworkCollectionInTheResourceList(resourceList)) {
             return;
@@ -379,7 +410,7 @@ public class ServiceEBBLoader {
         }
         for (int i = 0; i < service.getNetworkCustomizations().size(); i++) {
             resourceList.add(new Resource(WorkflowType.NETWORK,
         }
         for (int i = 0; i < service.getNetworkCustomizations().size(); i++) {
             resourceList.add(new Resource(WorkflowType.NETWORK,
-                    service.getNetworkCustomizations().get(i).getModelCustomizationUUID(), false));
+                    service.getNetworkCustomizations().get(i).getModelCustomizationUUID(), false, serviceResource));
         }
     }
 
         }
     }
 
@@ -391,14 +422,15 @@ public class ServiceEBBLoader {
         return !(service.getPnfCustomizations() == null || service.getPnfCustomizations().isEmpty());
     }
 
         return !(service.getPnfCustomizations() == null || service.getPnfCustomizations().isEmpty());
     }
 
-    private void traverseVnfModules(List<Resource> resourceList, List<Pair<WorkflowType, String>> aaiResourceIds,
+    private void traverseVnfModules(List<Resource> resourceList, Resource vnfResource,
+            List<Pair<WorkflowType, String>> aaiResourceIds,
             org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf vnf) {
         if (vnf.getVfModules() == null) {
             return;
         }
         for (VfModule vfModule : vnf.getVfModules()) {
             aaiResourceIds.add(new Pair<>(WorkflowType.VFMODULE, vfModule.getVfModuleId()));
             org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf vnf) {
         if (vnf.getVfModules() == null) {
             return;
         }
         for (VfModule vfModule : vnf.getVfModules()) {
             aaiResourceIds.add(new Pair<>(WorkflowType.VFMODULE, vfModule.getVfModuleId()));
-            Resource resource = new Resource(WorkflowType.VFMODULE, vfModule.getVfModuleId(), false);
+            Resource resource = new Resource(WorkflowType.VFMODULE, vfModule.getVfModuleId(), false, vnfResource);
             resource.setBaseVfModule(vfModule.getModelInfoVfModule().getIsBaseBoolean());
             resourceList.add(resource);
         }
             resource.setBaseVfModule(vfModule.getModelInfoVfModule().getIsBaseBoolean());
             resourceList.add(resource);
         }
index 4b1fdd8..1f93274 100644 (file)
@@ -10,6 +10,8 @@
  * ================================================================================
  * Modifications Copyright (c) 2020 Tech Mahindra
  * ================================================================================
  * ================================================================================
  * Modifications Copyright (c) 2020 Tech Mahindra
  * ================================================================================
+ * Modifications Copyright (c) 2021 Orange
+ * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
@@ -89,38 +91,45 @@ public class UserParamsServiceTraversal {
     private List<Resource> getResourceList(DelegateExecution execution, String serviceModelVersionId,
             String requestAction, Service validate) {
         List<Resource> resourceList = new ArrayList<>();
     private List<Resource> getResourceList(DelegateExecution execution, String serviceModelVersionId,
             String requestAction, Service validate) {
         List<Resource> resourceList = new ArrayList<>();
-        resourceList.add(new Resource(WorkflowType.SERVICE, validate.getModelInfo().getModelVersionId(), false));
+        Resource serviceResource =
+                new Resource(WorkflowType.SERVICE, validate.getModelInfo().getModelVersionId(), false, null);
+        resourceList.add(serviceResource);
         if (validate.getResources().getVnfs() != null) {
         if (validate.getResources().getVnfs() != null) {
-            setResourceListForVnfs(execution, resourceList, validate);
+            setResourceListForVnfs(execution, resourceList, serviceResource, validate);
         }
         if (validate.getResources().getPnfs() != null) {
         }
         if (validate.getResources().getPnfs() != null) {
-            setResourceListForPnfs(resourceList, validate);
+            setResourceListForPnfs(resourceList, serviceResource, validate);
         }
         if (validate.getResources().getNetworks() != null) {
         }
         if (validate.getResources().getNetworks() != null) {
-            setResourceListForNetworks(execution, serviceModelVersionId, requestAction, resourceList, validate);
+            setResourceListForNetworks(execution, serviceModelVersionId, requestAction, resourceList, serviceResource,
+                    validate);
         }
         return resourceList;
     }
 
         }
         return resourceList;
     }
 
-    private void setResourceListForVnfs(DelegateExecution execution, List<Resource> resourceList, Service validate) {
+    private void setResourceListForVnfs(DelegateExecution execution, List<Resource> resourceList,
+            Resource serviceResource, Service validate) {
         for (Vnfs vnf : validate.getResources().getVnfs()) {
             setVnfCustomizationUUID(vnf);
         for (Vnfs vnf : validate.getResources().getVnfs()) {
             setVnfCustomizationUUID(vnf);
-            resourceList.add(new Resource(WorkflowType.VNF, vnf.getModelInfo().getModelCustomizationId(), false));
-            setResourceListForVfModules(execution, resourceList, validate, vnf);
+            Resource vnfResource = new Resource(WorkflowType.VNF, vnf.getModelInfo().getModelCustomizationId(), false,
+                    serviceResource);
+            vnfResource.setProcessingPriority(vnf.getProcessingPriority());
+            resourceList.add(vnfResource);
+            setResourceListForVfModules(execution, resourceList, vnfResource, validate, vnf);
         }
     }
 
         }
     }
 
-    private void setResourceListForVfModules(DelegateExecution execution, List<Resource> resourceList, Service validate,
-            Vnfs vnf) {
+    private void setResourceListForVfModules(DelegateExecution execution, List<Resource> resourceList,
+            Resource vnfResource, Service validate, Vnfs vnf) {
         if (vnf.getVfModules() != null) {
             for (VfModules vfModule : vnf.getVfModules()) {
                 setVfModuleCustomizationUUID(vfModule);
                 VfModuleCustomization vfModuleCustomization =
                         catalogDbClient.getVfModuleCustomizationByModelCuztomizationUUID(vfModuleCustomizationUUID);
                 if (vfModuleCustomization != null && vfModuleCustomization.getVfModule() != null) {
         if (vnf.getVfModules() != null) {
             for (VfModules vfModule : vnf.getVfModules()) {
                 setVfModuleCustomizationUUID(vfModule);
                 VfModuleCustomization vfModuleCustomization =
                         catalogDbClient.getVfModuleCustomizationByModelCuztomizationUUID(vfModuleCustomizationUUID);
                 if (vfModuleCustomization != null && vfModuleCustomization.getVfModule() != null) {
-                    setVolumeGroupWorkFlowTypeToResourceList(resourceList, vfModuleCustomization);
-                    setVfModuleAndConfigurationWorkFlowTypeToResourceList(resourceList, validate, vnf, vfModule,
-                            vfModuleCustomization);
+                    setVolumeGroupWorkFlowTypeToResourceList(resourceList, vnfResource, vfModuleCustomization);
+                    setVfModuleAndConfigurationWorkFlowTypeToResourceList(resourceList, vnfResource, validate, vnf,
+                            vfModule, vfModuleCustomization);
                     if (!foundVfModuleOrVG) {
                         buildAndThrowException(execution,
                                 "Could not determine if vfModule was a vfModule or volume group. Heat template and Heat env are null");
                     if (!foundVfModuleOrVG) {
                         buildAndThrowException(execution,
                                 "Could not determine if vfModule was a vfModule or volume group. Heat template and Heat env are null");
@@ -130,46 +139,49 @@ public class UserParamsServiceTraversal {
         }
     }
 
         }
     }
 
-    private void setVolumeGroupWorkFlowTypeToResourceList(List<Resource> resourceList,
+    private void setVolumeGroupWorkFlowTypeToResourceList(List<Resource> resourceList, Resource vnfResource,
             VfModuleCustomization vfModuleCustomization) {
         if (vfModuleCustomization.getVfModule().getVolumeHeatTemplate() != null
                 && vfModuleCustomization.getVolumeHeatEnv() != null) {
             foundVfModuleOrVG = true;
             VfModuleCustomization vfModuleCustomization) {
         if (vfModuleCustomization.getVfModule().getVolumeHeatTemplate() != null
                 && vfModuleCustomization.getVolumeHeatEnv() != null) {
             foundVfModuleOrVG = true;
-            resourceList.add(
-                    new Resource(WorkflowType.VOLUMEGROUP, vfModuleCustomization.getModelCustomizationUUID(), false));
+            resourceList.add(new Resource(WorkflowType.VOLUMEGROUP, vfModuleCustomization.getModelCustomizationUUID(),
+                    false, vnfResource));
         }
     }
 
         }
     }
 
-    private void setVfModuleAndConfigurationWorkFlowTypeToResourceList(List<Resource> resourceList, Service validate,
-            Vnfs vnf, VfModules vfModule, VfModuleCustomization vfModuleCustomization) {
+    private void setVfModuleAndConfigurationWorkFlowTypeToResourceList(List<Resource> resourceList,
+            Resource vnfResource, Service validate, Vnfs vnf, VfModules vfModule,
+            VfModuleCustomization vfModuleCustomization) {
         if ((vfModuleCustomization.getVfModule().getModuleHeatTemplate() != null
                 && vfModuleCustomization.getHeatEnvironment() != null)
                 || (vfModuleCustomization.getVfModule().getModelName() != null
                         && vfModuleCustomization.getVfModule().getModelName().contains("helm"))) {
             foundVfModuleOrVG = true;
         if ((vfModuleCustomization.getVfModule().getModuleHeatTemplate() != null
                 && vfModuleCustomization.getHeatEnvironment() != null)
                 || (vfModuleCustomization.getVfModule().getModelName() != null
                         && vfModuleCustomization.getVfModule().getModelName().contains("helm"))) {
             foundVfModuleOrVG = true;
-            Resource resource = setVfModuleWorkFlowTypeToResourceList(resourceList, vfModuleCustomization);
-            setConfigurationWorkFlowTypeToResourceList(resourceList, validate, vnf, vfModule, resource);
+            Resource resource =
+                    setVfModuleWorkFlowTypeToResourceList(resourceList, vnfResource, vfModuleCustomization, vfModule);
+            setConfigurationWorkFlowTypeToResourceList(resourceList, vnfResource, validate, vnf, vfModule, resource);
         }
     }
 
         }
     }
 
-    private Resource setVfModuleWorkFlowTypeToResourceList(List<Resource> resourceList,
-            VfModuleCustomization vfModuleCustomization) {
-        Resource resource =
-                new Resource(WorkflowType.VFMODULE, vfModuleCustomization.getModelCustomizationUUID(), false);
+    private Resource setVfModuleWorkFlowTypeToResourceList(List<Resource> resourceList, Resource vnfResource,
+            VfModuleCustomization vfModuleCustomization, VfModules vfModule) {
+        Resource resource = new Resource(WorkflowType.VFMODULE, vfModuleCustomization.getModelCustomizationUUID(),
+                false, vnfResource);
+        resource.setProcessingPriority(vfModule.getProcessingPriority());
         resource.setBaseVfModule(vfModuleCustomization.getVfModule().getIsBase() != null
                 && vfModuleCustomization.getVfModule().getIsBase());
         resourceList.add(resource);
         return resource;
     }
 
         resource.setBaseVfModule(vfModuleCustomization.getVfModule().getIsBase() != null
                 && vfModuleCustomization.getVfModule().getIsBase());
         resourceList.add(resource);
         return resource;
     }
 
-    private void setConfigurationWorkFlowTypeToResourceList(List<Resource> resourceList, Service validate, Vnfs vnf,
-            VfModules vfModule, Resource resource) {
+    private void setConfigurationWorkFlowTypeToResourceList(List<Resource> resourceList, Resource vnfResource,
+            Service validate, Vnfs vnf, VfModules vfModule, Resource resource) {
         if (!vnfCustomizationUUID.isEmpty() && !vfModuleCustomizationUUID.isEmpty()) {
             List<CvnfcConfigurationCustomization> configs =
                     traverseCatalogDbForConfiguration(validate.getModelInfo().getModelVersionId());
             for (CvnfcConfigurationCustomization config : configs) {
                 Resource configResource = new Resource(WorkflowType.CONFIGURATION,
         if (!vnfCustomizationUUID.isEmpty() && !vfModuleCustomizationUUID.isEmpty()) {
             List<CvnfcConfigurationCustomization> configs =
                     traverseCatalogDbForConfiguration(validate.getModelInfo().getModelVersionId());
             for (CvnfcConfigurationCustomization config : configs) {
                 Resource configResource = new Resource(WorkflowType.CONFIGURATION,
-                        config.getConfigurationResource().getModelUUID(), false);
+                        config.getConfigurationResource().getModelUUID(), false, vnfResource);
                 resource.setVnfCustomizationId(vnf.getModelInfo().getModelCustomizationId());
                 resource.setVfModuleCustomizationId(vfModule.getModelInfo().getModelCustomizationId());
                 resourceList.add(configResource);
                 resource.setVnfCustomizationId(vnf.getModelInfo().getModelCustomizationId());
                 resource.setVfModuleCustomizationId(vfModule.getModelInfo().getModelCustomizationId());
                 resourceList.add(configResource);
@@ -193,22 +205,28 @@ public class UserParamsServiceTraversal {
         }
     }
 
         }
     }
 
-    private void setResourceListForPnfs(List<Resource> resourceList, Service validate) {
+    private void setResourceListForPnfs(List<Resource> resourceList, Resource serviceResource, Service validate) {
         for (Pnfs pnf : validate.getResources().getPnfs()) {
         for (Pnfs pnf : validate.getResources().getPnfs()) {
-            resourceList.add(new Resource(WorkflowType.PNF, pnf.getModelInfo().getModelCustomizationId(), false));
+            Resource pnfResource = new Resource(WorkflowType.PNF, pnf.getModelInfo().getModelCustomizationId(), false,
+                    serviceResource);
+            pnfResource.setProcessingPriority(pnf.getProcessingPriority());
+            resourceList.add(pnfResource);
         }
     }
 
     private void setResourceListForNetworks(DelegateExecution execution, String serviceModelVersionId,
         }
     }
 
     private void setResourceListForNetworks(DelegateExecution execution, String serviceModelVersionId,
-            String requestAction, List<Resource> resourceList, Service validate) {
+            String requestAction, List<Resource> resourceList, Resource serviceResource, Service validate) {
         for (Networks network : validate.getResources().getNetworks()) {
         for (Networks network : validate.getResources().getNetworks()) {
-            resourceList
-                    .add(new Resource(WorkflowType.NETWORK, network.getModelInfo().getModelCustomizationId(), false));
+            Resource networkResource = new Resource(WorkflowType.NETWORK,
+                    network.getModelInfo().getModelCustomizationId(), false, serviceResource);
+            networkResource.setProcessingPriority(network.getProcessingPriority());
+            resourceList.add(networkResource);
         }
         if (requestAction.equals(CREATE_INSTANCE)) {
             String networkColCustId = queryCatalogDbForNetworkCollection(execution, serviceModelVersionId);
             if (networkColCustId != null) {
         }
         if (requestAction.equals(CREATE_INSTANCE)) {
             String networkColCustId = queryCatalogDbForNetworkCollection(execution, serviceModelVersionId);
             if (networkColCustId != null) {
-                resourceList.add(new Resource(WorkflowType.NETWORKCOLLECTION, networkColCustId, false));
+                resourceList
+                        .add(new Resource(WorkflowType.NETWORKCOLLECTION, networkColCustId, false, serviceResource));
             }
         }
     }
             }
         }
     }
index b271226..c1d1d7a 100644 (file)
@@ -10,6 +10,8 @@
  * ================================================================================
  * Modifications Copyright (c) 2020 Tech Mahindra
  * ================================================================================
  * ================================================================================
  * Modifications Copyright (c) 2020 Tech Mahindra
  * ================================================================================
+ * Modifications Copyright (c) 2021 Orange
+ * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
@@ -73,9 +75,11 @@ public class VnfEBBLoader {
             org.onap.aai.domain.yang.ServiceInstance serviceInstanceAAI =
                     bbInputSetupUtils.getAAIServiceInstanceById(serviceId);
             ServiceInstance serviceInstanceMSO = bbInputSetup.getExistingServiceInstance(serviceInstanceAAI);
             org.onap.aai.domain.yang.ServiceInstance serviceInstanceAAI =
                     bbInputSetupUtils.getAAIServiceInstanceById(serviceId);
             ServiceInstance serviceInstanceMSO = bbInputSetup.getExistingServiceInstance(serviceInstanceAAI);
-            resourceList.add(new Resource(WorkflowType.SERVICE, serviceInstanceMSO.getServiceInstanceId(), false));
+            Resource serviceResource =
+                    new Resource(WorkflowType.SERVICE, serviceInstanceMSO.getServiceInstanceId(), false, null);
+            resourceList.add(serviceResource);
             if (serviceInstanceMSO.getVnfs() != null) {
             if (serviceInstanceMSO.getVnfs() != null) {
-                findVnfWithGivenId(serviceInstanceMSO, vnfId, aaiResourceIds, resourceList, execution);
+                findVnfWithGivenId(serviceInstanceMSO, vnfId, aaiResourceIds, resourceList, serviceResource, execution);
             }
         } catch (Exception ex) {
             logger.error("Exception in traverseAAIVnf", ex);
             }
         } catch (Exception ex) {
             logger.error("Exception in traverseAAIVnf", ex);
@@ -90,10 +94,12 @@ public class VnfEBBLoader {
             org.onap.aai.domain.yang.ServiceInstance serviceInstanceAAI =
                     bbInputSetupUtils.getAAIServiceInstanceById(serviceId);
             ServiceInstance serviceInstanceMSO = bbInputSetup.getExistingServiceInstance(serviceInstanceAAI);
             org.onap.aai.domain.yang.ServiceInstance serviceInstanceAAI =
                     bbInputSetupUtils.getAAIServiceInstanceById(serviceId);
             ServiceInstance serviceInstanceMSO = bbInputSetup.getExistingServiceInstance(serviceInstanceAAI);
-            resourceList.add(new Resource(WorkflowType.SERVICE, serviceInstanceMSO.getServiceInstanceId(), false));
+            Resource serviceResource =
+                    new Resource(WorkflowType.SERVICE, serviceInstanceMSO.getServiceInstanceId(), false, null);
+            resourceList.add(serviceResource);
             if (serviceInstanceMSO.getVnfs() != null) {
                 findVnfWithGivenIdAndAddCustomizationUUID(serviceInstanceMSO, vnfId, aaiResourceIds, resourceList,
             if (serviceInstanceMSO.getVnfs() != null) {
                 findVnfWithGivenIdAndAddCustomizationUUID(serviceInstanceMSO, vnfId, aaiResourceIds, resourceList,
-                        execution);
+                        serviceResource, execution);
             }
         } catch (Exception ex) {
             logger.error("Exception in customTraverseAAIVnf", ex);
             }
         } catch (Exception ex) {
             logger.error("Exception in customTraverseAAIVnf", ex);
@@ -104,34 +110,38 @@ public class VnfEBBLoader {
     }
 
     private void findVnfWithGivenId(ServiceInstance serviceInstanceMSO, String vnfId,
     }
 
     private void findVnfWithGivenId(ServiceInstance serviceInstanceMSO, String vnfId,
-            List<Pair<WorkflowType, String>> aaiResourceIds, List<Resource> resourceList, DelegateExecution execution) {
+            List<Pair<WorkflowType, String>> aaiResourceIds, List<Resource> resourceList, Resource serviceResource,
+            DelegateExecution execution) {
         for (GenericVnf vnf : serviceInstanceMSO.getVnfs()) {
             if (vnf.getVnfId().equals(vnfId)) {
                 aaiResourceIds.add(new Pair<>(WorkflowType.VNF, vnf.getVnfId()));
         for (GenericVnf vnf : serviceInstanceMSO.getVnfs()) {
             if (vnf.getVnfId().equals(vnfId)) {
                 aaiResourceIds.add(new Pair<>(WorkflowType.VNF, vnf.getVnfId()));
-                resourceList.add(new Resource(WorkflowType.VNF, vnf.getVnfId(), false));
-                processVfModules(vnf, aaiResourceIds, resourceList, execution);
-                processVolumeGroups(vnf, aaiResourceIds, resourceList);
+                Resource vnfResource = new Resource(WorkflowType.VNF, vnf.getVnfId(), false, serviceResource);
+                resourceList.add(vnfResource);
+                processVfModules(vnf, aaiResourceIds, resourceList, vnfResource, execution);
+                processVolumeGroups(vnf, aaiResourceIds, resourceList, vnfResource);
                 break;
             }
         }
     }
 
     private void findVnfWithGivenIdAndAddCustomizationUUID(ServiceInstance serviceInstanceMSO, String vnfId,
                 break;
             }
         }
     }
 
     private void findVnfWithGivenIdAndAddCustomizationUUID(ServiceInstance serviceInstanceMSO, String vnfId,
-            List<Pair<WorkflowType, String>> aaiResourceIds, List<Resource> resourceList, DelegateExecution execution) {
+            List<Pair<WorkflowType, String>> aaiResourceIds, List<Resource> resourceList, Resource serviceResource,
+            DelegateExecution execution) {
         for (GenericVnf vnf : serviceInstanceMSO.getVnfs()) {
             if (vnf.getVnfId().equals(vnfId)) {
                 aaiResourceIds.add(new Pair<>(WorkflowType.VNF, vnf.getVnfId()));
         for (GenericVnf vnf : serviceInstanceMSO.getVnfs()) {
             if (vnf.getVnfId().equals(vnfId)) {
                 aaiResourceIds.add(new Pair<>(WorkflowType.VNF, vnf.getVnfId()));
-                resourceList.add(new Resource(WorkflowType.VNF,
-                        bbInputSetupUtils.getAAIGenericVnf(vnfId).getModelCustomizationId(), false));
-                processVfModules(vnf, aaiResourceIds, resourceList, execution);
-                processVolumeGroups(vnf, aaiResourceIds, resourceList);
+                Resource vnfResource = new Resource(WorkflowType.VNF,
+                        bbInputSetupUtils.getAAIGenericVnf(vnfId).getModelCustomizationId(), false, serviceResource);
+                resourceList.add(vnfResource);
+                processVfModules(vnf, aaiResourceIds, resourceList, vnfResource, execution);
+                processVolumeGroups(vnf, aaiResourceIds, resourceList, vnfResource);
                 break;
             }
         }
     }
 
     private void findConfigurationsInsideVfModule(DelegateExecution execution, String vnfId, String vfModuleId,
                 break;
             }
         }
     }
 
     private void findConfigurationsInsideVfModule(DelegateExecution execution, String vnfId, String vfModuleId,
-            List<Resource> resourceList, List<Pair<WorkflowType, String>> aaiResourceIds) {
+            List<Resource> resourceList, Resource vfModuleResource, List<Pair<WorkflowType, String>> aaiResourceIds) {
         try {
             org.onap.aai.domain.yang.VfModule aaiVfModule = bbInputSetupUtils.getAAIVfModule(vnfId, vfModuleId);
             AAIResultWrapper vfModuleWrapper = new AAIResultWrapper(
         try {
             org.onap.aai.domain.yang.VfModule aaiVfModule = bbInputSetupUtils.getAAIVfModule(vnfId, vfModuleId);
             AAIResultWrapper vfModuleWrapper = new AAIResultWrapper(
@@ -140,7 +150,7 @@ public class VnfEBBLoader {
             relationshipsOp = vfModuleWrapper.getRelationships();
             if (relationshipsOp.isPresent()) {
                 relationshipsOp = workflowActionUtils.extractRelationshipsVnfc(relationshipsOp.get());
             relationshipsOp = vfModuleWrapper.getRelationships();
             if (relationshipsOp.isPresent()) {
                 relationshipsOp = workflowActionUtils.extractRelationshipsVnfc(relationshipsOp.get());
-                addConfigToResources(relationshipsOp, resourceList, aaiResourceIds);
+                addConfigToResources(relationshipsOp, resourceList, vfModuleResource, aaiResourceIds);
             }
         } catch (Exception ex) {
             logger.error("Exception in findConfigurationsInsideVfModule", ex);
             }
         } catch (Exception ex) {
             logger.error("Exception in findConfigurationsInsideVfModule", ex);
@@ -149,35 +159,39 @@ public class VnfEBBLoader {
     }
 
     private void processVfModules(GenericVnf vnf, List<Pair<WorkflowType, String>> aaiResourceIds,
     }
 
     private void processVfModules(GenericVnf vnf, List<Pair<WorkflowType, String>> aaiResourceIds,
-            List<Resource> resourceList, DelegateExecution execution) {
+            List<Resource> resourceList, Resource vnfResource, DelegateExecution execution) {
         if (vnf.getVfModules() != null) {
             for (VfModule vfModule : vnf.getVfModules()) {
                 aaiResourceIds.add(new Pair<>(WorkflowType.VFMODULE, vfModule.getVfModuleId()));
         if (vnf.getVfModules() != null) {
             for (VfModule vfModule : vnf.getVfModules()) {
                 aaiResourceIds.add(new Pair<>(WorkflowType.VFMODULE, vfModule.getVfModuleId()));
-                resourceList.add(new Resource(WorkflowType.VFMODULE, vfModule.getVfModuleId(), false));
+                Resource vfModuleResource =
+                        new Resource(WorkflowType.VFMODULE, vfModule.getVfModuleId(), false, vnfResource);
+                resourceList.add(vfModuleResource);
                 findConfigurationsInsideVfModule(execution, vnf.getVnfId(), vfModule.getVfModuleId(), resourceList,
                 findConfigurationsInsideVfModule(execution, vnf.getVnfId(), vfModule.getVfModuleId(), resourceList,
-                        aaiResourceIds);
+                        vfModuleResource, aaiResourceIds);
             }
         }
     }
 
     private void processVolumeGroups(GenericVnf vnf, List<Pair<WorkflowType, String>> aaiResourceIds,
             }
         }
     }
 
     private void processVolumeGroups(GenericVnf vnf, List<Pair<WorkflowType, String>> aaiResourceIds,
-            List<Resource> resourceList) {
+            List<Resource> resourceList, Resource vnfResource) {
         if (vnf.getVolumeGroups() != null) {
             for (VolumeGroup volumeGroup : vnf.getVolumeGroups()) {
                 aaiResourceIds.add(new Pair<>(WorkflowType.VOLUMEGROUP, volumeGroup.getVolumeGroupId()));
         if (vnf.getVolumeGroups() != null) {
             for (VolumeGroup volumeGroup : vnf.getVolumeGroups()) {
                 aaiResourceIds.add(new Pair<>(WorkflowType.VOLUMEGROUP, volumeGroup.getVolumeGroupId()));
-                resourceList.add(new Resource(WorkflowType.VOLUMEGROUP, volumeGroup.getVolumeGroupId(), false));
+                resourceList.add(
+                        new Resource(WorkflowType.VOLUMEGROUP, volumeGroup.getVolumeGroupId(), false, vnfResource));
             }
         }
     }
 
     private void addConfigToResources(Optional<Relationships> relationshipsOp, List<Resource> resourceList,
             }
         }
     }
 
     private void addConfigToResources(Optional<Relationships> relationshipsOp, List<Resource> resourceList,
-            List<Pair<WorkflowType, String>> aaiResourceIds) {
+            Resource vfModuleResource, List<Pair<WorkflowType, String>> aaiResourceIds) {
         if (relationshipsOp.isPresent()) {
             Optional<Configuration> config =
                     workflowActionUtils.extractRelationshipsConfiguration(relationshipsOp.get());
             if (config.isPresent()) {
                 aaiResourceIds.add(new Pair<>(WorkflowType.CONFIGURATION, config.get().getConfigurationId()));
         if (relationshipsOp.isPresent()) {
             Optional<Configuration> config =
                     workflowActionUtils.extractRelationshipsConfiguration(relationshipsOp.get());
             if (config.isPresent()) {
                 aaiResourceIds.add(new Pair<>(WorkflowType.CONFIGURATION, config.get().getConfigurationId()));
-                resourceList.add(new Resource(WorkflowType.CONFIGURATION, config.get().getConfigurationId(), false));
+                resourceList.add(new Resource(WorkflowType.CONFIGURATION, config.get().getConfigurationId(), false,
+                        vfModuleResource));
             }
         }
     }
             }
         }
     }
index cc3da99..61b5740 100644 (file)
@@ -10,6 +10,8 @@
  * ================================================================================
  * Modifications Copyright (c) 2020 Tech Mahindra
  * ================================================================================
  * ================================================================================
  * Modifications Copyright (c) 2020 Tech Mahindra
  * ================================================================================
+ * Modifications Copyright (c) 2021 Orange
+ * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
@@ -29,8 +31,10 @@ package org.onap.so.bpmn.infrastructure.workflow.tasks;
 import org.junit.Test;
 import org.onap.so.bpmn.servicedecomposition.entities.ConfigurationResourceKeys;
 import org.onap.so.bpmn.servicedecomposition.entities.ExecuteBuildingBlock;
 import org.junit.Test;
 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.db.catalog.beans.macro.OrchestrationFlow;
 import java.util.ArrayList;
 import org.onap.so.db.catalog.beans.macro.OrchestrationFlow;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import java.util.List;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
@@ -59,7 +63,7 @@ public class ExecuteBuildingBlockBuilderTest {
         String cvnfModuleCustomizationId = "2b1a3c";
         String vnfCustomizationId = "zz12aa";
 
         String cvnfModuleCustomizationId = "2b1a3c";
         String vnfCustomizationId = "zz12aa";
 
-        Resource resource = new Resource(WorkflowType.SERVICE, "123", true);
+        Resource resource = new Resource(WorkflowType.SERVICE, "123", true, null);
 
         resource.setCvnfModuleCustomizationId(vfModuleCustomizationId);
         resource.setCvnfModuleCustomizationId(cvnfModuleCustomizationId);
 
         resource.setCvnfModuleCustomizationId(vfModuleCustomizationId);
         resource.setCvnfModuleCustomizationId(cvnfModuleCustomizationId);
@@ -73,4 +77,170 @@ public class ExecuteBuildingBlockBuilderTest {
         assertEquals(vnfCustomizationId, confResourceKeys.getVnfResourceCustomizationUUID());
 
     }
         assertEquals(vnfCustomizationId, confResourceKeys.getVnfResourceCustomizationUUID());
 
     }
+
+    private Resource getResource(List<Resource> resources, ExecuteBuildingBlock block) {
+        Resource res =
+                resources.stream().filter(resource -> resource.getResourceId() == block.getBuildingBlock().getKey())
+                        .findAny().orElse(null);
+        return res;
+    }
+
+    private void buildExecuteBuildingBlockListOrderOfVnf(int vnfCount, boolean addPnf, boolean priorities) {
+        WorkflowResourceIds wfIds = new WorkflowResourceIds();
+        wfIds.setServiceInstanceId("1");
+        List<Resource> resources = new ArrayList<>();
+        Resource r1 = new Resource(WorkflowType.SERVICE, "1", false, null);
+        resources.add(r1);
+        for (int i = 0; i < vnfCount; i++) {
+            Resource r2 = new Resource(WorkflowType.VNF, Integer.toString(2 + i * 3), false, r1);
+            Resource r3 = new Resource(WorkflowType.VFMODULE, Integer.toString(3 + i * 3), false, r2);
+            Resource r4 = new Resource(WorkflowType.VFMODULE, Integer.toString(4 + i * 3), false, r2);
+            r4.setBaseVfModule(true);
+            resources.add(r2);
+            resources.add(r3);
+            resources.add(r4);
+            if (priorities) {
+                r2.setProcessingPriority(vnfCount - i);
+                r3.setProcessingPriority(1);
+                r4.setProcessingPriority(2);
+            }
+        }
+        if (addPnf) {
+            Resource r5 = new Resource(WorkflowType.PNF, Integer.toString(5 + (vnfCount - 1) * 3), false, r1);
+            resources.add(r5);
+        }
+
+        OrchestrationFlow f1 = new OrchestrationFlow();
+        f1.setFlowName("AssignServiceInstanceBB");
+        OrchestrationFlow f2 = new OrchestrationFlow();
+        f2.setFlowName("AssignVnfBB");
+        OrchestrationFlow f3 = new OrchestrationFlow();
+        f3.setFlowName("AssignVfModuleBB");
+        OrchestrationFlow f4 = new OrchestrationFlow();
+        f4.setFlowName("ControllerExecutionBB");
+        f4.setBpmnAction("config-assign");
+        f4.setBpmnScope("vnf");
+        OrchestrationFlow f5 = new OrchestrationFlow();
+        f5.setFlowName("AssignPnfBB");
+        OrchestrationFlow f6 = new OrchestrationFlow();
+        f6.setFlowName("WaitForPnfReadyBB");
+        OrchestrationFlow f7 = new OrchestrationFlow();
+        f7.setFlowName("ControllerExecutionBB");
+        f7.setBpmnAction("config-assign");
+        f7.setBpmnScope("pnf");
+        OrchestrationFlow f8 = new OrchestrationFlow();
+        f8.setFlowName("ControllerExecutionBB");
+        f8.setBpmnAction("config-deploy");
+        f8.setBpmnScope("pnf");
+        OrchestrationFlow f9 = new OrchestrationFlow();
+        f9.setFlowName("ActivatePnfBB");
+        OrchestrationFlow f10 = new OrchestrationFlow();
+        f10.setFlowName("CreateVfModuleBB");
+        OrchestrationFlow f11 = new OrchestrationFlow();
+        f11.setFlowName("ActivateVfModuleBB");
+        OrchestrationFlow f12 = new OrchestrationFlow();
+        f12.setFlowName("ControllerExecutionBB");
+        f12.setBpmnAction("config-deploy");
+        f12.setBpmnScope("vnf");
+        OrchestrationFlow f13 = new OrchestrationFlow();
+        f13.setFlowName("ActivateVnfBB");
+        OrchestrationFlow f14 = new OrchestrationFlow();
+        f14.setFlowName("ActivateServiceInstanceBB");
+
+        List<OrchestrationFlow> flows = Arrays.asList(f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14);
+        for (int i = 0; i < flows.size(); i++) {
+            OrchestrationFlow flow = flows.get(i);
+            flow.setId(i + 1);
+            flow.setSequenceNumber(i + 1);
+            flow.setFlowVersion(1.0);
+            flow.setAction("Service-Macro-Create");
+        }
+
+        List<ExecuteBuildingBlock> flowsToExecute = executeBBBuilder.buildExecuteBuildingBlockList(flows, resources,
+                "1", "1", "1", WorkflowActionConstants.CREATE_INSTANCE, "type", wfIds, null, false);
+
+        for (ExecuteBuildingBlock block : flowsToExecute) {
+            String name = block.getBuildingBlock().getBpmnFlowName();
+            if (name.equals("ControllerExecutionBB"))
+                name += " [" + block.getBuildingBlock().getBpmnScope() + ", " + block.getBuildingBlock().getBpmnAction()
+                        + "]";
+            System.out.println(name);
+        }
+        assertNotNull(flowsToExecute);
+        assertEquals((addPnf ? 7 : 2) + vnfCount * 4L + vnfCount * 2L * 3, flowsToExecute.size());
+
+        for (ExecuteBuildingBlock block : flowsToExecute)
+            assertNotNull(getResource(resources, block));
+
+        if (priorities) {
+            if (vnfCount > 1)
+                assertEquals("5", getResource(resources, flowsToExecute.get(1)).getResourceId());
+            else
+                assertEquals("3", getResource(resources, flowsToExecute.get(2)).getResourceId());
+        } else {
+            if (vnfCount > 1)
+                assertEquals("2", getResource(resources, flowsToExecute.get(1)).getResourceId());
+            else
+                assertEquals("4", getResource(resources, flowsToExecute.get(2)).getResourceId());
+        }
+
+        // AssignVfModuleBB
+        assertEquals(f3.getFlowName(), flowsToExecute.get(2).getBuildingBlock().getBpmnFlowName());
+        // ControllerExecutionBB
+        assertEquals(f4.getFlowName(), flowsToExecute.get(4).getBuildingBlock().getBpmnFlowName());
+        if (vnfCount > 1) {
+            // AssignVnfBB
+            if (addPnf)
+                assertEquals(f2.getFlowName(), flowsToExecute.get(5).getBuildingBlock().getBpmnFlowName());
+            else
+                assertEquals(f2.getFlowName(), flowsToExecute.get(11).getBuildingBlock().getBpmnFlowName());
+        }
+        int pnfOffset = -5;
+        if (addPnf) {
+            pnfOffset = (vnfCount - 1) * 4;
+            // AssignPnfBB
+            assertEquals(f5.getFlowName(), flowsToExecute.get(5 + pnfOffset).getBuildingBlock().getBpmnFlowName());
+            // WaitForPnfReadyBB
+            assertEquals(f6.getFlowName(), flowsToExecute.get(6 + pnfOffset).getBuildingBlock().getBpmnFlowName());
+            // ControllerExecutionBB
+            assertEquals(f7.getFlowName(), flowsToExecute.get(7 + pnfOffset).getBuildingBlock().getBpmnFlowName());
+            // ControllerExecutionBB
+            assertEquals(f8.getFlowName(), flowsToExecute.get(8 + pnfOffset).getBuildingBlock().getBpmnFlowName());
+            // ActivatePnfBB
+            assertEquals(f9.getFlowName(), flowsToExecute.get(9 + pnfOffset).getBuildingBlock().getBpmnFlowName());
+        }
+        // CreateVfModuleBB
+        assertEquals(f10.getFlowName(), flowsToExecute.get(10 + pnfOffset).getBuildingBlock().getBpmnFlowName());
+        // ActivateVfModuleBB
+        assertEquals(f11.getFlowName(), flowsToExecute.get(11 + pnfOffset).getBuildingBlock().getBpmnFlowName());
+        // ControllerExecutionBB
+        assertEquals(f12.getFlowName(), flowsToExecute.get(14 + pnfOffset).getBuildingBlock().getBpmnFlowName());
+        // ActivateVnfBB
+        assertEquals(f13.getFlowName(), flowsToExecute.get(15 + pnfOffset).getBuildingBlock().getBpmnFlowName());
+    }
+
+    @Test
+    public void buildExecuteBuildingBlockListSortByBaseVfModuleTest() {
+        buildExecuteBuildingBlockListOrderOfVnf(1, false, false);
+    }
+
+    @Test
+    public void buildExecuteBuildingBlockListSortByPriorityTest() {
+        buildExecuteBuildingBlockListOrderOfVnf(1, false, true);
+    }
+
+    @Test
+    public void buildExecuteBuildingBlockListGroupByResourceTypeAndSortByPriorityTest() {
+        buildExecuteBuildingBlockListOrderOfVnf(2, false, true);
+    }
+
+    @Test
+    public void buildExecuteBuildingBlockListGroupByResourceTypeTest() {
+        buildExecuteBuildingBlockListOrderOfVnf(2, false, false);
+    }
+
+    @Test
+    public void buildExecuteBuildingBlockListGroupByResourceTypeVnfAndPnfTest() {
+        buildExecuteBuildingBlockListOrderOfVnf(2, true, false);
+    }
 }
 }
index 5e3afa1..cd98792 100644 (file)
@@ -4,6 +4,8 @@
  * ================================================================================
  * Copyright (C) 2021 Bell Canada. All rights reserved.
  * ================================================================================
  * ================================================================================
  * Copyright (C) 2021 Bell Canada. All rights reserved.
  * ================================================================================
+ * Modifications Copyright (c) 2021 Orange
+ * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
@@ -30,26 +32,84 @@ public class ResourceTest {
 
     @Test
     public void testBaseFirstComparator() {
 
     @Test
     public void testBaseFirstComparator() {
-        Resource r1 = new Resource(null, "1", false);
-        Resource r2 = new Resource(null, "2", false);
+        Resource r1 = new Resource(null, "1", false, null);
+        Resource r2 = new Resource(null, "2", false, null);
+        r2.setBaseVfModule(true);
+
+        List<Resource> sorted =
+                Arrays.asList(r1, r2).stream().sorted(Resource.sortByPriorityAsc).collect(Collectors.toList());
+
+        assertEquals("2", sorted.get(0).getResourceId());
+    }
+
+    @Test
+    public void testPriorityAscComparator() {
+        Resource r1 = new Resource(null, "1", false, null);
+        Resource r2 = new Resource(null, "2", false, null);
+        Resource r3 = new Resource(null, "3", false, null);
+        Resource r4 = new Resource(null, "4", false, null);
+        r1.setProcessingPriority(4);
         r2.setBaseVfModule(true);
         r2.setBaseVfModule(true);
+        r3.setProcessingPriority(2);
+        r4.setProcessingPriority(1);
 
         List<Resource> sorted =
 
         List<Resource> sorted =
-                Arrays.asList(r1, r2).stream().sorted(Resource.sortBaseFirst).collect(Collectors.toList());
+                Arrays.asList(r1, r2, r3, r4).stream().sorted(Resource.sortByPriorityAsc).collect(Collectors.toList());
 
         assertEquals("2", sorted.get(0).getResourceId());
 
         assertEquals("2", sorted.get(0).getResourceId());
+        assertEquals("4", sorted.get(1).getResourceId());
+        assertEquals("3", sorted.get(2).getResourceId());
     }
 
     @Test
     public void testBaseLastComparator() {
     }
 
     @Test
     public void testBaseLastComparator() {
-        Resource r1 = new Resource(null, "1", false);
-        Resource r2 = new Resource(null, "2", false);
+        Resource r1 = new Resource(null, "1", false, null);
+        Resource r2 = new Resource(null, "2", false, null);
         r1.setBaseVfModule(true);
 
         List<Resource> sorted =
         r1.setBaseVfModule(true);
 
         List<Resource> sorted =
-                Arrays.asList(r1, r2).stream().sorted(Resource.sortBaseLast).collect(Collectors.toList());
+                Arrays.asList(r1, r2).stream().sorted(Resource.sortByPriorityDesc).collect(Collectors.toList());
 
         assertEquals("1", sorted.get(1).getResourceId());
     }
 
 
         assertEquals("1", sorted.get(1).getResourceId());
     }
 
+    @Test
+    public void testPriorityDescComparator() {
+        Resource r1 = new Resource(null, "1", false, null);
+        Resource r2 = new Resource(null, "2", false, null);
+        Resource r3 = new Resource(null, "3", false, null);
+        Resource r4 = new Resource(null, "4", false, null);
+        r1.setProcessingPriority(4);
+        r2.setBaseVfModule(true);
+        r3.setProcessingPriority(2);
+        r4.setProcessingPriority(1);
+
+        List<Resource> sorted =
+                Arrays.asList(r1, r2, r3, r4).stream().sorted(Resource.sortByPriorityDesc).collect(Collectors.toList());
+
+        assertEquals("1", sorted.get(0).getResourceId());
+        assertEquals("3", sorted.get(1).getResourceId());
+        assertEquals("4", sorted.get(2).getResourceId());
+    }
+
+    @Test
+    public void testPriorityReplaceBase() {
+        Resource r1 = new Resource(null, "1", false, null);
+        Resource r2 = new Resource(null, "2", false, null);
+        Resource r3 = new Resource(null, "3", false, null);
+        Resource r4 = new Resource(null, "4", false, null);
+        r1.setProcessingPriority(4);
+        r2.setBaseVfModule(true);
+        r2.setProcessingPriority(6);
+        r3.setProcessingPriority(2);
+        r4.setProcessingPriority(1);
+
+        List<Resource> sorted =
+                Arrays.asList(r1, r2, r3, r4).stream().sorted(Resource.sortByPriorityAsc).collect(Collectors.toList());
+
+        assertEquals("4", sorted.get(0).getResourceId());
+        assertEquals("3", sorted.get(1).getResourceId());
+        assertEquals("1", sorted.get(2).getResourceId());
+    }
+
 }
 }
index 10e6ed4..e52d2df 100644 (file)
@@ -8,6 +8,8 @@
  * ================================================================================
  * Modifications Copyright (c) 2020 Nokia
  * ================================================================================
  * ================================================================================
  * Modifications Copyright (c) 2020 Nokia
  * ================================================================================
+ * Modifications Copyright (c) 2021 Orange
+ * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
@@ -115,6 +117,7 @@ public class WorkflowActionTest extends BaseTaskTest {
             "VfModuleReplaceRebuildVolumeGroups.json";
     private static final String MACRO_CREATE_NETWORK_COLLECTION_JSON = "Macro/CreateNetworkCollection.json";
     private static final String MACRO_VNF_MACRO_REPLACE_JSON = "Macro/VnfMacroReplace.json";
             "VfModuleReplaceRebuildVolumeGroups.json";
     private static final String MACRO_CREATE_NETWORK_COLLECTION_JSON = "Macro/CreateNetworkCollection.json";
     private static final String MACRO_VNF_MACRO_REPLACE_JSON = "Macro/VnfMacroReplace.json";
+    private static final String MACRO_CREATE_JSON = "Macro/ServiceMacroAssignVnfAndPnf.json";
 
     @Mock
     protected Environment environment;
 
     @Mock
     protected Environment environment;
@@ -298,7 +301,7 @@ public class WorkflowActionTest extends BaseTaskTest {
         vfModuleCustomization3.setModelCustomizationUUID("72d9d1cd-f46d-447a-abdb-451d6fb05fa8");
 
         when(userParamsServiceTraversal.getResourceListFromUserParams(any(), anyList(), anyString(), anyString()))
         vfModuleCustomization3.setModelCustomizationUUID("72d9d1cd-f46d-447a-abdb-451d6fb05fa8");
 
         when(userParamsServiceTraversal.getResourceListFromUserParams(any(), anyList(), anyString(), anyString()))
-                .thenReturn(prepareListWithResources());
+                .thenReturn(prepareListWithResources(false, false));
         when(catalogDbClient.getNorthBoundRequestByActionAndIsALaCarteAndRequestScopeAndCloudOwner(gAction, resource,
                 false, "my-custom-cloud-owner")).thenReturn(northBoundRequest);
         when(catalogDbClient.getVfModuleCustomizationByModelCuztomizationUUID("a25e8e8c-58b8-4eec-810c-97dcc1f5cb7f"))
         when(catalogDbClient.getNorthBoundRequestByActionAndIsALaCarteAndRequestScopeAndCloudOwner(gAction, resource,
                 false, "my-custom-cloud-owner")).thenReturn(northBoundRequest);
         when(catalogDbClient.getVfModuleCustomizationByModelCuztomizationUUID("a25e8e8c-58b8-4eec-810c-97dcc1f5cb7f"))
@@ -349,7 +352,7 @@ public class WorkflowActionTest extends BaseTaskTest {
         vfModuleCustomization3.setModelCustomizationUUID("72d9d1cd-f46d-447a-abdb-451d6fb05fa8");
 
         when(userParamsServiceTraversal.getResourceListFromUserParams(any(), anyList(), anyString(), anyString()))
         vfModuleCustomization3.setModelCustomizationUUID("72d9d1cd-f46d-447a-abdb-451d6fb05fa8");
 
         when(userParamsServiceTraversal.getResourceListFromUserParams(any(), anyList(), anyString(), anyString()))
-                .thenReturn(prepareListWithResources());
+                .thenReturn(prepareListWithResources(false, false));
         when(environment.getProperty("org.onap.so.cloud-owner")).thenReturn("att-aic");
         when(catalogDbClient.getNorthBoundRequestByActionAndIsALaCarteAndRequestScopeAndCloudOwner(gAction, resource,
                 false, "att-aic")).thenReturn(northBoundRequest);
         when(environment.getProperty("org.onap.so.cloud-owner")).thenReturn("att-aic");
         when(catalogDbClient.getNorthBoundRequestByActionAndIsALaCarteAndRequestScopeAndCloudOwner(gAction, resource,
                 false, "att-aic")).thenReturn(northBoundRequest);
@@ -406,13 +409,13 @@ public class WorkflowActionTest extends BaseTaskTest {
         workflowAction.selectExecutionList(execution);
         List<ExecuteBuildingBlock> ebbs = (List<ExecuteBuildingBlock>) execution.getVariable("flowsToExecute");
         assertEqualsBulkFlowName(ebbs, "CreateVolumeGroupBB", "ActivateVolumeGroupBB", "CreateVfModuleBB",
         workflowAction.selectExecutionList(execution);
         List<ExecuteBuildingBlock> ebbs = (List<ExecuteBuildingBlock>) execution.getVariable("flowsToExecute");
         assertEqualsBulkFlowName(ebbs, "CreateVolumeGroupBB", "ActivateVolumeGroupBB", "CreateVfModuleBB",
-                "CreateVfModuleBB", "ActivateVfModuleBB", "ActivateVfModuleBB", "ActivateVnfBB",
+                "ActivateVfModuleBB", "CreateVfModuleBB", "ActivateVfModuleBB", "ActivateVnfBB",
                 "ActivateServiceInstanceBB");
         assertEquals("volumeGroup0", ebbs.get(0).getWorkflowResourceIds().getVolumeGroupId());
         assertEquals("volumeGroup0", ebbs.get(1).getWorkflowResourceIds().getVolumeGroupId());
         assertEquals("testVfModuleId1", ebbs.get(2).getWorkflowResourceIds().getVfModuleId());
                 "ActivateServiceInstanceBB");
         assertEquals("volumeGroup0", ebbs.get(0).getWorkflowResourceIds().getVolumeGroupId());
         assertEquals("volumeGroup0", ebbs.get(1).getWorkflowResourceIds().getVolumeGroupId());
         assertEquals("testVfModuleId1", ebbs.get(2).getWorkflowResourceIds().getVfModuleId());
-        assertEquals("testVfModuleId2", ebbs.get(3).getWorkflowResourceIds().getVfModuleId());
-        assertEquals("testVfModuleId1", ebbs.get(4).getWorkflowResourceIds().getVfModuleId());
+        assertEquals("testVfModuleId1", ebbs.get(3).getWorkflowResourceIds().getVfModuleId());
+        assertEquals("testVfModuleId2", ebbs.get(4).getWorkflowResourceIds().getVfModuleId());
         assertEquals("testVfModuleId2", ebbs.get(5).getWorkflowResourceIds().getVfModuleId());
         assertEquals("vnf0", ebbs.get(6).getWorkflowResourceIds().getVnfId());
         assertEquals("si0", ebbs.get(7).getWorkflowResourceIds().getServiceInstanceId());
         assertEquals("testVfModuleId2", ebbs.get(5).getWorkflowResourceIds().getVfModuleId());
         assertEquals("vnf0", ebbs.get(6).getWorkflowResourceIds().getVnfId());
         assertEquals("si0", ebbs.get(7).getWorkflowResourceIds().getServiceInstanceId());
@@ -624,7 +627,7 @@ public class WorkflowActionTest extends BaseTaskTest {
         vfModuleCustomization3.setModelCustomizationUUID("72d9d1cd-f46d-447a-abdb-451d6fb05fa8");
 
         when(userParamsServiceTraversal.getResourceListFromUserParams(any(), anyList(), anyString(), anyString()))
         vfModuleCustomization3.setModelCustomizationUUID("72d9d1cd-f46d-447a-abdb-451d6fb05fa8");
 
         when(userParamsServiceTraversal.getResourceListFromUserParams(any(), anyList(), anyString(), anyString()))
-                .thenReturn(prepareListWithResources());
+                .thenReturn(prepareListWithResources(false, false));
         when(catalogDbClient.getNorthBoundRequestByActionAndIsALaCarteAndRequestScopeAndCloudOwner(gAction, resource,
                 false, "my-custom-cloud-owner")).thenReturn(northBoundRequest);
         when(catalogDbClient.getVfModuleCustomizationByModelCuztomizationUUID("a25e8e8c-58b8-4eec-810c-97dcc1f5cb7f"))
         when(catalogDbClient.getNorthBoundRequestByActionAndIsALaCarteAndRequestScopeAndCloudOwner(gAction, resource,
                 false, "my-custom-cloud-owner")).thenReturn(northBoundRequest);
         when(catalogDbClient.getVfModuleCustomizationByModelCuztomizationUUID("a25e8e8c-58b8-4eec-810c-97dcc1f5cb7f"))
@@ -638,8 +641,8 @@ public class WorkflowActionTest extends BaseTaskTest {
         List<ExecuteBuildingBlock> ebbs = (List<ExecuteBuildingBlock>) execution.getVariable("flowsToExecute");
         assertEqualsBulkFlowName(ebbs, "AssignServiceInstanceBB", "AssignVnfBB", "AssignVolumeGroupBB",
                 "AssignVfModuleBB", "AssignVfModuleBB", "AssignVfModuleBB", "CreateVolumeGroupBB",
         List<ExecuteBuildingBlock> ebbs = (List<ExecuteBuildingBlock>) execution.getVariable("flowsToExecute");
         assertEqualsBulkFlowName(ebbs, "AssignServiceInstanceBB", "AssignVnfBB", "AssignVolumeGroupBB",
                 "AssignVfModuleBB", "AssignVfModuleBB", "AssignVfModuleBB", "CreateVolumeGroupBB",
-                "ActivateVolumeGroupBB", "CreateVfModuleBB", "CreateVfModuleBB", "CreateVfModuleBB",
-                "ActivateVfModuleBB", "ActivateVfModuleBB", "ActivateVfModuleBB", "ActivateVnfBB",
+                "ActivateVolumeGroupBB", "CreateVfModuleBB", "ActivateVfModuleBB", "CreateVfModuleBB",
+                "ActivateVfModuleBB", "CreateVfModuleBB", "ActivateVfModuleBB", "ActivateVnfBB",
                 "ActivateServiceInstanceBB");
 
         assertEquals(3, ebbs.get(0).getWorkflowResourceIds().getServiceInstanceId().length());
                 "ActivateServiceInstanceBB");
 
         assertEquals(3, ebbs.get(0).getWorkflowResourceIds().getServiceInstanceId().length());
@@ -662,6 +665,92 @@ public class WorkflowActionTest extends BaseTaskTest {
         assertEquals(true, execution.getVariable("homing"));
     }
 
         assertEquals(true, execution.getVariable("homing"));
     }
 
+    @Test
+    public void selectExecutionListServiceMacroCreateWithUserParamsAndPriorities() throws Exception {
+        String gAction = "createInstance";
+        String resource = "Service";
+        String bpmnRequest = readBpmnRequestFromFile(MACRO_CREATE_JSON);
+        initExecution(gAction, bpmnRequest, false);
+        execution.setVariable("requestUri", "v6/serviceInstances/123");
+
+        NorthBoundRequest northBoundRequest = new NorthBoundRequest();
+        List<OrchestrationFlow> orchFlows = createFlowList("AssignServiceInstanceBB", "CreateNetworkCollectionBB",
+                "AssignNetworkBB", "AssignVnfBB", "AssignVolumeGroupBB", "AssignVfModuleBB", "AssignPnfBB",
+                "WaitForPnfReadyBB", "ActivatePnfBB", "CreateNetworkBB", "ActivateNetworkBB", "CreateVolumeGroupBB",
+                "ActivateVolumeGroupBB", "CreateVfModuleBB", "ActivateVfModuleBB", "AssignFabricConfigurationBB",
+                "ActivateFabricConfigurationBB", "ActivateVnfBB", "ActivateNetworkCollectionBB",
+                "ActivateServiceInstanceBB");
+        northBoundRequest.setOrchestrationFlowList(orchFlows);
+
+        Service service = new Service();
+        service.setModelUUID("3c40d244-808e-42ca-b09a-256d83d19d0a");
+
+        VfModuleCustomization vfModuleCustomization = new VfModuleCustomization();
+        vfModuleCustomization.setModelCustomizationUUID("a25e8e8c-58b8-4eec-810c-97dcc1f5cb7f");
+        HeatEnvironment volumeHeatEnv = new HeatEnvironment();
+        vfModuleCustomization.setVolumeHeatEnv(volumeHeatEnv);
+        org.onap.so.db.catalog.beans.VfModule vfModule = new org.onap.so.db.catalog.beans.VfModule();
+        HeatTemplate volumeHeatTemplate = new HeatTemplate();
+        vfModule.setVolumeHeatTemplate(volumeHeatTemplate);
+        vfModuleCustomization.setVfModule(vfModule);
+
+        VfModuleCustomization vfModuleCustomization2 = new VfModuleCustomization();
+        vfModuleCustomization2.setModelCustomizationUUID("72d9d1cd-f46d-447a-abdb-451d6fb05fa8");
+        HeatEnvironment heatEnvironment = new HeatEnvironment();
+        vfModuleCustomization2.setHeatEnvironment(heatEnvironment);
+        org.onap.so.db.catalog.beans.VfModule vfModule2 = new org.onap.so.db.catalog.beans.VfModule();
+        HeatTemplate moduleHeatTemplate = new HeatTemplate();
+        vfModule2.setModuleHeatTemplate(moduleHeatTemplate);
+        vfModuleCustomization2.setVfModule(vfModule2);
+
+        VfModuleCustomization vfModuleCustomization3 = vfModuleCustomization2;
+        vfModuleCustomization3.setModelCustomizationUUID("72d9d1cd-f46d-447a-abdb-451d6fb05fa8");
+
+        when(userParamsServiceTraversal.getResourceListFromUserParams(any(), anyList(), anyString(), anyString()))
+                .thenReturn(prepareListWithResources(true, true));
+        when(catalogDbClient.getNorthBoundRequestByActionAndIsALaCarteAndRequestScopeAndCloudOwner(gAction, resource,
+                false, "my-custom-cloud-owner")).thenReturn(northBoundRequest);
+        when(catalogDbClient.getVfModuleCustomizationByModelCuztomizationUUID("a25e8e8c-58b8-4eec-810c-97dcc1f5cb7f"))
+                .thenReturn(vfModuleCustomization);
+        when(catalogDbClient.getVfModuleCustomizationByModelCuztomizationUUID("72d9d1cd-f46d-447a-abdb-451d6fb05fa8"))
+                .thenReturn(vfModuleCustomization2);
+        when(catalogDbClient.getVfModuleCustomizationByModelCuztomizationUUID("da4d4327-fb7d-4311-ac7a-be7ba60cf969"))
+                .thenReturn(vfModuleCustomization3);
+        when(catalogDbClient.getServiceByID("3c40d244-808e-42ca-b09a-256d83d19d0a")).thenReturn(service);
+        workflowAction.selectExecutionList(execution);
+        List<ExecuteBuildingBlock> ebbs = (List<ExecuteBuildingBlock>) execution.getVariable("flowsToExecute");
+        assertEqualsBulkFlowName(ebbs, "AssignServiceInstanceBB", "AssignVnfBB", "AssignVolumeGroupBB",
+                "AssignVfModuleBB", "AssignVfModuleBB", "AssignVfModuleBB", "AssignPnfBB", "WaitForPnfReadyBB",
+                "ActivatePnfBB", "CreateVolumeGroupBB", "ActivateVolumeGroupBB", "CreateVfModuleBB",
+                "ActivateVfModuleBB", "CreateVfModuleBB", "ActivateVfModuleBB", "CreateVfModuleBB",
+                "ActivateVfModuleBB", "ActivateVnfBB", "ActivateServiceInstanceBB");
+
+        assertEquals(3, ebbs.get(0).getWorkflowResourceIds().getServiceInstanceId().length());
+        int randomUUIDLength = UUID.randomUUID().toString().length();
+        assertEquals(randomUUIDLength, ebbs.get(1).getWorkflowResourceIds().getVnfId().length());
+        assertEquals(randomUUIDLength, ebbs.get(2).getWorkflowResourceIds().getVolumeGroupId().length());
+        assertEquals(randomUUIDLength, ebbs.get(3).getWorkflowResourceIds().getVfModuleId().length());
+        assertEquals(randomUUIDLength, ebbs.get(4).getWorkflowResourceIds().getVfModuleId().length());
+        assertEquals(randomUUIDLength, ebbs.get(5).getWorkflowResourceIds().getVfModuleId().length());
+        assertEquals("72d9d1cd-f46d-447a-abdb-451d6fb05fa8", ebbs.get(3).getBuildingBlock().getKey());
+        assertEquals("da4d4327-fb7d-4311-ac7a-be7ba60cf969", ebbs.get(4).getBuildingBlock().getKey());
+        assertEquals("3c40d244-808e-42ca-b09a-256d83d19d0a", ebbs.get(5).getBuildingBlock().getKey());
+        assertEquals(randomUUIDLength, ebbs.get(6).getWorkflowResourceIds().getPnfId().length());
+        assertEquals(randomUUIDLength, ebbs.get(7).getWorkflowResourceIds().getPnfId().length());
+        assertEquals(randomUUIDLength, ebbs.get(8).getWorkflowResourceIds().getPnfId().length());
+        assertEquals(randomUUIDLength, ebbs.get(9).getWorkflowResourceIds().getVolumeGroupId().length());
+        assertEquals(randomUUIDLength, ebbs.get(10).getWorkflowResourceIds().getVolumeGroupId().length());
+        assertEquals(randomUUIDLength, ebbs.get(11).getWorkflowResourceIds().getVfModuleId().length());
+        assertEquals(randomUUIDLength, ebbs.get(12).getWorkflowResourceIds().getVfModuleId().length());
+        assertEquals(randomUUIDLength, ebbs.get(13).getWorkflowResourceIds().getVfModuleId().length());
+        assertEquals(randomUUIDLength, ebbs.get(14).getWorkflowResourceIds().getVfModuleId().length());
+        assertEquals(randomUUIDLength, ebbs.get(15).getWorkflowResourceIds().getVfModuleId().length());
+        assertEquals(randomUUIDLength, ebbs.get(16).getWorkflowResourceIds().getVfModuleId().length());
+        assertEquals(randomUUIDLength, ebbs.get(17).getWorkflowResourceIds().getVnfId().length());
+        assertEquals(3, ebbs.get(0).getWorkflowResourceIds().getServiceInstanceId().length());
+        assertEquals(true, execution.getVariable("homing"));
+    }
+
     @Test
     public void selectExecutionListServiceMacroDeleteTest() throws Exception {
         String gAction = "deleteInstance";
     @Test
     public void selectExecutionListServiceMacroDeleteTest() throws Exception {
         String gAction = "deleteInstance";
@@ -708,7 +797,7 @@ public class WorkflowActionTest extends BaseTaskTest {
                 false, "my-custom-cloud-owner")).thenReturn(northBoundRequest);
         workflowAction.selectExecutionList(execution);
         List<ExecuteBuildingBlock> ebbs = (List<ExecuteBuildingBlock>) execution.getVariable("flowsToExecute");
                 false, "my-custom-cloud-owner")).thenReturn(northBoundRequest);
         workflowAction.selectExecutionList(execution);
         List<ExecuteBuildingBlock> ebbs = (List<ExecuteBuildingBlock>) execution.getVariable("flowsToExecute");
-        assertEqualsBulkFlowName(ebbs, "DeactivateVfModuleBB", "DeactivateVfModuleBB", "DeleteVfModuleBB",
+        assertEqualsBulkFlowName(ebbs, "DeactivateVfModuleBB", "DeleteVfModuleBB", "DeactivateVfModuleBB",
                 "DeleteVfModuleBB", "DeactivateVolumeGroupBB", "DeleteVolumeGroupBB", "DeactivateVnfBB",
                 "DeactivatePnfBB", "DeactivateServiceInstanceBB", "UnassignVfModuleBB", "UnassignVfModuleBB",
                 "UnassignVolumeGroupBB", "UnassignVnfBB", "UnassignServiceInstanceBB");
                 "DeleteVfModuleBB", "DeactivateVolumeGroupBB", "DeleteVolumeGroupBB", "DeactivateVnfBB",
                 "DeactivatePnfBB", "DeactivateServiceInstanceBB", "UnassignVfModuleBB", "UnassignVfModuleBB",
                 "UnassignVolumeGroupBB", "UnassignVnfBB", "UnassignServiceInstanceBB");
@@ -879,8 +968,8 @@ public class WorkflowActionTest extends BaseTaskTest {
         workflowAction.selectExecutionList(execution);
         List<ExecuteBuildingBlock> ebbs = (List<ExecuteBuildingBlock>) execution.getVariable("flowsToExecute");
         assertEqualsBulkFlowName(ebbs, "AAICheckVnfInMaintBB", "AAISetVnfInMaintBB", "DeactivateVfModuleBB",
         workflowAction.selectExecutionList(execution);
         List<ExecuteBuildingBlock> ebbs = (List<ExecuteBuildingBlock>) execution.getVariable("flowsToExecute");
         assertEqualsBulkFlowName(ebbs, "AAICheckVnfInMaintBB", "AAISetVnfInMaintBB", "DeactivateVfModuleBB",
-                "DeactivateVfModuleBB", "DeleteVfModuleBB", "DeleteVfModuleBB", "DeactivateVnfBB", "CreateVfModuleBB",
-                "CreateVfModuleBB", "ActivateVfModuleBB", "ActivateVfModuleBB", "ActivateVnfBB", "SDNOVnfHealthCheckBB",
+                "DeleteVfModuleBB", "DeactivateVfModuleBB", "DeleteVfModuleBB", "DeactivateVnfBB", "CreateVfModuleBB",
+                "ActivateVfModuleBB", "CreateVfModuleBB", "ActivateVfModuleBB", "ActivateVnfBB", "SDNOVnfHealthCheckBB",
                 "AAIUnsetVnfInMaintBB");
     }
 
                 "AAIUnsetVnfInMaintBB");
     }
 
@@ -940,12 +1029,13 @@ public class WorkflowActionTest extends BaseTaskTest {
                 false, "cloud-owner")).thenReturn(northBoundRequest);
         workflowAction.selectExecutionList(execution);
         List<ExecuteBuildingBlock> ebbs = (List<ExecuteBuildingBlock>) execution.getVariable("flowsToExecute");
                 false, "cloud-owner")).thenReturn(northBoundRequest);
         workflowAction.selectExecutionList(execution);
         List<ExecuteBuildingBlock> ebbs = (List<ExecuteBuildingBlock>) execution.getVariable("flowsToExecute");
-        assertEqualsBulkFlowName(ebbs, "AAICheckVnfInMaintBB", "AAISetVnfInMaintBB", "DeactivateFabricConfigurationBB",
-                "UnassignFabricConfigurationBB", "DeactivateVfModuleBB", "DeactivateVfModuleBB", "DeleteVfModuleBB",
-                "DeleteVfModuleBB", "DeactivateVnfBB", "ChangeModelVfModuleBB", "ChangeModelVfModuleBB",
-                "CreateVfModuleBB", "CreateVfModuleBB", "ActivateVfModuleBB", "ActivateVfModuleBB",
-                "AssignFabricConfigurationBB", "ActivateFabricConfigurationBB", "ChangeModelVnfBB", "ActivateVnfBB",
-                "ChangeModelServiceInstanceBB", "SDNOVnfHealthCheckBB", "AAIUnsetVnfInMaintBB");
+        assertEqualsBulkFlowName(ebbs, "AAICheckVnfInMaintBB", "AAISetVnfInMaintBB", "DeactivateVfModuleBB",
+                "DeleteVfModuleBB", "DeactivateFabricConfigurationBB", "UnassignFabricConfigurationBB",
+                "DeactivateVfModuleBB", "DeleteVfModuleBB", "DeactivateVnfBB", "ChangeModelVfModuleBB",
+                "CreateVfModuleBB", "ActivateVfModuleBB", "ChangeModelVfModuleBB", "CreateVfModuleBB",
+                "ActivateVfModuleBB", "AssignFabricConfigurationBB", "ActivateFabricConfigurationBB",
+                "ChangeModelVnfBB", "ActivateVnfBB", "ChangeModelServiceInstanceBB", "SDNOVnfHealthCheckBB",
+                "AAIUnsetVnfInMaintBB");
         for (ExecuteBuildingBlock executeBuildingBlock : ebbs) {
             assertEquals("123", executeBuildingBlock.getWorkflowResourceIds().getServiceInstanceId());
         }
         for (ExecuteBuildingBlock executeBuildingBlock : ebbs) {
             assertEquals("123", executeBuildingBlock.getWorkflowResourceIds().getServiceInstanceId());
         }
@@ -1540,7 +1630,7 @@ public class WorkflowActionTest extends BaseTaskTest {
         String vnfType = "vnfType";
         String key = "00d15ebb-c80e-43c1-80f0-90c40dde70b0";
         String resourceId = "d1d35800-783d-42d3-82f6-d654c5054a6e";
         String vnfType = "vnfType";
         String key = "00d15ebb-c80e-43c1-80f0-90c40dde70b0";
         String resourceId = "d1d35800-783d-42d3-82f6-d654c5054a6e";
-        Resource resourceKey = new Resource(resourceType, key, aLaCarte);
+        Resource resourceKey = new Resource(resourceType, key, aLaCarte, null);
         WorkflowResourceIds workflowResourceIds = SPY_workflowAction.populateResourceIdsFromApiHandler(execution);
 
         thrown.expect(AAIEntityNotFoundException.class);
         WorkflowResourceIds workflowResourceIds = SPY_workflowAction.populateResourceIdsFromApiHandler(execution);
 
         thrown.expect(AAIEntityNotFoundException.class);
@@ -1592,7 +1682,7 @@ public class WorkflowActionTest extends BaseTaskTest {
         String vnfType = "vnfType";
         String key = "00d15ebb-c80e-43c1-80f0-90c40dde70b0";
         String resourceId = "d1d35800-783d-42d3-82f6-d654c5054a6e";
         String vnfType = "vnfType";
         String key = "00d15ebb-c80e-43c1-80f0-90c40dde70b0";
         String resourceId = "d1d35800-783d-42d3-82f6-d654c5054a6e";
-        Resource resourceKey = new Resource(resourceType, key, aLaCarte);
+        Resource resourceKey = new Resource(resourceType, key, aLaCarte, null);
         WorkflowResourceIds workflowResourceIds = SPY_workflowAction.populateResourceIdsFromApiHandler(execution);
 
         List<OrchestrationFlow> orchFlows = createFlowList("DeactivateVfModuleBB", "DeleteVfModuleBB",
         WorkflowResourceIds workflowResourceIds = SPY_workflowAction.populateResourceIdsFromApiHandler(execution);
 
         List<OrchestrationFlow> orchFlows = createFlowList("DeactivateVfModuleBB", "DeleteVfModuleBB",
@@ -1667,7 +1757,7 @@ public class WorkflowActionTest extends BaseTaskTest {
         String vnfType = "vnfType";
         String key = "00d15ebb-c80e-43c1-80f0-90c40dde70b0";
         String resourceId = "d1d35800-783d-42d3-82f6-d654c5054a6e";
         String vnfType = "vnfType";
         String key = "00d15ebb-c80e-43c1-80f0-90c40dde70b0";
         String resourceId = "d1d35800-783d-42d3-82f6-d654c5054a6e";
-        Resource resourceKey = new Resource(resourceType, key, aLaCarte);
+        Resource resourceKey = new Resource(resourceType, key, aLaCarte, null);
         WorkflowResourceIds workflowResourceIds = SPY_workflowAction.populateResourceIdsFromApiHandler(execution);
 
         List<OrchestrationFlow> orchFlows = createFlowList("DeactivateVfModuleBB", "DeleteVfModuleBB",
         WorkflowResourceIds workflowResourceIds = SPY_workflowAction.populateResourceIdsFromApiHandler(execution);
 
         List<OrchestrationFlow> orchFlows = createFlowList("DeactivateVfModuleBB", "DeleteVfModuleBB",
@@ -1948,10 +2038,10 @@ public class WorkflowActionTest extends BaseTaskTest {
         String uri6 = "/v6/serviceInstances/123/vnfs/1234/someAction";
         String uri7 = "/v6/serviceInstances/123/vnfs/1234/vfModules/5678/replace";
         String uri8 = "/v6/serviceInstances/123/vnfs/1234/vfModules/scaleOut";
         String uri6 = "/v6/serviceInstances/123/vnfs/1234/someAction";
         String uri7 = "/v6/serviceInstances/123/vnfs/1234/vfModules/5678/replace";
         String uri8 = "/v6/serviceInstances/123/vnfs/1234/vfModules/scaleOut";
-        Resource expected1 = new Resource(WorkflowType.SERVICE, "123", true);
-        Resource expected2 = new Resource(WorkflowType.VNF, "1234", false);
-        Resource expected3 = new Resource(WorkflowType.VNF, "1234", false);
-        Resource expected4 = new Resource(WorkflowType.VFMODULE, "5678", false);
+        Resource expected1 = new Resource(WorkflowType.SERVICE, "123", true, null);
+        Resource expected2 = new Resource(WorkflowType.VNF, "1234", false, expected1);
+        Resource expected3 = new Resource(WorkflowType.VNF, "1234", false, expected1);
+        Resource expected4 = new Resource(WorkflowType.VFMODULE, "5678", false, expected2);
         Resource result = workflowAction.extractResourceIdAndTypeFromUri(uri);
         assertEquals(expected1.getResourceId(), result.getResourceId());
         assertEquals(expected1.getResourceType(), result.getResourceType());
         Resource result = workflowAction.extractResourceIdAndTypeFromUri(uri);
         assertEquals(expected1.getResourceId(), result.getResourceId());
         assertEquals(expected1.getResourceType(), result.getResourceType());
@@ -2091,14 +2181,31 @@ public class WorkflowActionTest extends BaseTaskTest {
         return new String(Files.readAllBytes(Paths.get("src/test/resources/__files/" + fileName)));
     }
 
         return new String(Files.readAllBytes(Paths.get("src/test/resources/__files/" + fileName)));
     }
 
-    private List<Resource> prepareListWithResources() {
+    private List<Resource> prepareListWithResources(boolean addPnf, boolean addPriorites) {
         List<Resource> resourceList = new ArrayList<>();
         List<Resource> resourceList = new ArrayList<>();
-        resourceList.add(new Resource(WorkflowType.SERVICE, "3c40d244-808e-42ca-b09a-256d83d19d0a", false));
-        resourceList.add(new Resource(WorkflowType.VNF, "ab153b6e-c364-44c0-bef6-1f2982117f04", false));
-        resourceList.add(new Resource(WorkflowType.VOLUMEGROUP, "a25e8e8c-58b8-4eec-810c-97dcc1f5cb7f", false));
-        resourceList.add(new Resource(WorkflowType.VFMODULE, "72d9d1cd-f46d-447a-abdb-451d6fb05fa8", false));
-        resourceList.add(new Resource(WorkflowType.VFMODULE, "3c40d244-808e-42ca-b09a-256d83d19d0a", false));
-        resourceList.add(new Resource(WorkflowType.VFMODULE, "72d9d1cd-f46d-447a-abdb-451d6fb05fa8", false));
+        Resource r1 = new Resource(WorkflowType.SERVICE, "3c40d244-808e-42ca-b09a-256d83d19d0a", false, null);
+        resourceList.add(r1);
+        Resource r2 = new Resource(WorkflowType.VNF, "ab153b6e-c364-44c0-bef6-1f2982117f04", false, r1);
+        resourceList.add(r2);
+        Resource r3 = new Resource(WorkflowType.VOLUMEGROUP, "a25e8e8c-58b8-4eec-810c-97dcc1f5cb7f", false, r2);
+        resourceList.add(r3);
+        Resource r4 = new Resource(WorkflowType.VFMODULE, "72d9d1cd-f46d-447a-abdb-451d6fb05fa8", false, r2);
+        resourceList.add(r4);
+        Resource r5 = new Resource(WorkflowType.VFMODULE, "3c40d244-808e-42ca-b09a-256d83d19d0a", false, r2);
+        resourceList.add(r5);
+        Resource r6 = new Resource(WorkflowType.VFMODULE, "da4d4327-fb7d-4311-ac7a-be7ba60cf969", false, r2);
+        resourceList.add(r6);
+        if (addPnf) {
+            Resource r7 = new Resource(WorkflowType.PNF, "aa153b6e-c364-44c0-bef6-1f2982117f04", false, r1);
+            resourceList.add(r7);
+        }
+        if (addPriorites) {
+            r3.setProcessingPriority(2);
+            r4.setProcessingPriority(1);
+            r5.setProcessingPriority(4);
+            r5.setBaseVfModule(true);
+            r6.setProcessingPriority(3);
+        }
         return resourceList;
     }
 }
         return resourceList;
     }
 }
index a5ecf36..7a26422 100644 (file)
@@ -4,6 +4,8 @@
  * ================================================================================
  * Copyright (c) 2020 Nokia
  * ================================================================================
  * ================================================================================
  * Copyright (c) 2020 Nokia
  * ================================================================================
+ * Modifications Copyright (c) 2021 Orange
+ * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
@@ -171,10 +173,10 @@ public class ServiceEBBLoaderTest extends BaseTaskTest {
     @Test
     public void foundRelatedTest() {
         List<Resource> resourceList = new ArrayList<>();
     @Test
     public void foundRelatedTest() {
         List<Resource> resourceList = new ArrayList<>();
-        resourceList.add(new Resource(WorkflowType.PNF, "model customization id", false));
-        resourceList.add(new Resource(WorkflowType.VNF, "model customization id", false));
-        resourceList.add(new Resource(WorkflowType.NETWORK, "model customization id", false));
-        resourceList.add(new Resource(WorkflowType.NETWORKCOLLECTION, "model customization id", false));
+        resourceList.add(new Resource(WorkflowType.PNF, "model customization id", false, null));
+        resourceList.add(new Resource(WorkflowType.VNF, "model customization id", false, null));
+        resourceList.add(new Resource(WorkflowType.NETWORK, "model customization id", false, null));
+        resourceList.add(new Resource(WorkflowType.NETWORKCOLLECTION, "model customization id", false, null));
 
         assertTrue(serviceEBBLoader.foundRelated(resourceList));
     }
 
         assertTrue(serviceEBBLoader.foundRelated(resourceList));
     }
@@ -182,10 +184,10 @@ public class ServiceEBBLoaderTest extends BaseTaskTest {
     @Test
     public void containsWorkflowTypeTest() {
         List<Resource> resourceList = new ArrayList<>();
     @Test
     public void containsWorkflowTypeTest() {
         List<Resource> resourceList = new ArrayList<>();
-        resourceList.add(new Resource(WorkflowType.PNF, "resource id", false));
-        resourceList.add(new Resource(WorkflowType.VNF, "model customization id", false));
-        resourceList.add(new Resource(WorkflowType.NETWORK, "model customization id", false));
-        resourceList.add(new Resource(WorkflowType.NETWORKCOLLECTION, "model customization id", false));
+        resourceList.add(new Resource(WorkflowType.PNF, "resource id", false, null));
+        resourceList.add(new Resource(WorkflowType.VNF, "model customization id", false, null));
+        resourceList.add(new Resource(WorkflowType.NETWORK, "model customization id", false, null));
+        resourceList.add(new Resource(WorkflowType.NETWORKCOLLECTION, "model customization id", false, null));
 
         assertTrue(serviceEBBLoader.containsWorkflowType(resourceList, WorkflowType.PNF));
         assertTrue(serviceEBBLoader.containsWorkflowType(resourceList, WorkflowType.VNF));
 
         assertTrue(serviceEBBLoader.containsWorkflowType(resourceList, WorkflowType.PNF));
         assertTrue(serviceEBBLoader.containsWorkflowType(resourceList, WorkflowType.VNF));
@@ -280,7 +282,8 @@ public class ServiceEBBLoaderTest extends BaseTaskTest {
 
         doReturn(aaiLocalNetwork).when(mockBbInputSetupUtils).getAAIL3Network("localNetworkInstanceId");
 
 
         doReturn(aaiLocalNetwork).when(mockBbInputSetupUtils).getAAIL3Network("localNetworkInstanceId");
 
-        serviceEBBLoader.traverseVrfConfiguration(aaiResourceIds, resource, service, relatedVpnBinding,
+        Resource serviceResource = new Resource(WorkflowType.SERVICE, "1", false, null);
+        serviceEBBLoader.traverseVrfConfiguration(aaiResourceIds, resource, serviceResource, service, relatedVpnBinding,
                 relatedLocalNetwork);
         assertEquals(resource.size(), 1);
         assertEquals(aaiResourceIds.size(), 0);
                 relatedLocalNetwork);
         assertEquals(resource.size(), 1);
         assertEquals(aaiResourceIds.size(), 0);
@@ -346,12 +349,14 @@ public class ServiceEBBLoaderTest extends BaseTaskTest {
 
     private List<Resource> prepareListWithResources() {
         List<Resource> resourceList = new ArrayList<>();
 
     private List<Resource> prepareListWithResources() {
         List<Resource> resourceList = new ArrayList<>();
-        resourceList.add(new Resource(WorkflowType.SERVICE, "3c40d244-808e-42ca-b09a-256d83d19d0a", false));
-        resourceList.add(new Resource(WorkflowType.VNF, "ab153b6e-c364-44c0-bef6-1f2982117f04", false));
-        resourceList.add(new Resource(WorkflowType.VOLUMEGROUP, "a25e8e8c-58b8-4eec-810c-97dcc1f5cb7f", false));
-        resourceList.add(new Resource(WorkflowType.VFMODULE, "72d9d1cd-f46d-447a-abdb-451d6fb05fa8", false));
-        resourceList.add(new Resource(WorkflowType.VFMODULE, "3c40d244-808e-42ca-b09a-256d83d19d0a", false));
-        resourceList.add(new Resource(WorkflowType.VFMODULE, "72d9d1cd-f46d-447a-abdb-451d6fb05fa8", false));
+        Resource r1 = new Resource(WorkflowType.SERVICE, "3c40d244-808e-42ca-b09a-256d83d19d0a", false, null);
+        resourceList.add(r1);
+        Resource r2 = new Resource(WorkflowType.VNF, "ab153b6e-c364-44c0-bef6-1f2982117f04", false, r1);
+        resourceList.add(r2);
+        resourceList.add(new Resource(WorkflowType.VOLUMEGROUP, "a25e8e8c-58b8-4eec-810c-97dcc1f5cb7f", false, r2));
+        resourceList.add(new Resource(WorkflowType.VFMODULE, "72d9d1cd-f46d-447a-abdb-451d6fb05fa8", false, r2));
+        resourceList.add(new Resource(WorkflowType.VFMODULE, "3c40d244-808e-42ca-b09a-256d83d19d0a", false, r2));
+        resourceList.add(new Resource(WorkflowType.VFMODULE, "72d9d1cd-f46d-447a-abdb-451d6fb05fa8", false, r2));
         return resourceList;
     }
 }
         return resourceList;
     }
 }
index 9f4bd97..58fee86 100644 (file)
@@ -59,6 +59,7 @@ import static org.mockito.Mockito.mock;
 public class UserParamsServiceTraversalTest extends BaseTaskTest {
 
     private static final String MACRO_ASSIGN_JSON = "Macro/ServiceMacroAssign.json";
 public class UserParamsServiceTraversalTest extends BaseTaskTest {
 
     private static final String MACRO_ASSIGN_JSON = "Macro/ServiceMacroAssign.json";
+    private static final String MACRO_CREATE_JSON = "Macro/ServiceMacroAssignVnfAndPnf.json";
     private static final String MACRO_ASSIGN_PNF_JSON = "Macro/ServiceMacroAssignPnf.json";
     private static final String NETWORK_COLLECTION_JSON = "Macro/CreateNetworkCollection.json";
     private static final String MACRO_CREATE_WITHOUT_RESOURCES_JSON = "Macro/ServiceMacroCreateWithoutResources.json";
     private static final String MACRO_ASSIGN_PNF_JSON = "Macro/ServiceMacroAssignPnf.json";
     private static final String NETWORK_COLLECTION_JSON = "Macro/CreateNetworkCollection.json";
     private static final String MACRO_CREATE_WITHOUT_RESOURCES_JSON = "Macro/ServiceMacroCreateWithoutResources.json";
@@ -113,6 +114,26 @@ public class UserParamsServiceTraversalTest extends BaseTaskTest {
         assertThat(expected, is(result));
     }
 
         assertThat(expected, is(result));
     }
 
+    @Test
+    public void getResourceListFromUserParamsForVnfsWithPriorities() throws Exception {
+        initExecution(requestAction, readBpmnRequestFromFile(MACRO_CREATE_JSON), false);
+        Mockito.doReturn(getVfModuleCustomization()).when(mockCatalogDbClient)
+                .getVfModuleCustomizationByModelCuztomizationUUID("a25e8e8c-58b8-4eec-810c-97dcc1f5cb7f");
+        Mockito.doReturn(getCvnfcCustomizations()).when(mockCatalogDbClient).getCvnfcCustomization(anyString(),
+                anyString(), anyString());
+
+        List<Resource> resourceListFromUserParams = userParamsServiceTraversal.getResourceListFromUserParams(execution,
+                getUserParams(), serviceInstanceId, requestAction);
+        List<WorkflowType> expected = List.of(WorkflowType.SERVICE, WorkflowType.VNF, WorkflowType.VOLUMEGROUP,
+                WorkflowType.VFMODULE, WorkflowType.CONFIGURATION, WorkflowType.PNF);
+        List<WorkflowType> result =
+                resourceListFromUserParams.stream().map(Resource::getResourceType).collect(Collectors.toList());
+
+        assertEquals(6, resourceListFromUserParams.size());
+        assertThat(expected, is(result));
+        assertEquals(2, resourceListFromUserParams.get(1).getChildren().get(1).getProcessingPriority());
+    }
+
     @Test
     public void getResourceListFromUserParamsForPnfs() throws Exception {
         initExecution(requestAction, readBpmnRequestFromFile(MACRO_ASSIGN_PNF_JSON), false);
     @Test
     public void getResourceListFromUserParamsForPnfs() throws Exception {
         initExecution(requestAction, readBpmnRequestFromFile(MACRO_ASSIGN_PNF_JSON), false);
diff --git a/bpmn/so-bpmn-tasks/src/test/resources/__files/Macro/ServiceMacroAssignVnfAndPnf.json b/bpmn/so-bpmn-tasks/src/test/resources/__files/Macro/ServiceMacroAssignVnfAndPnf.json
new file mode 100644 (file)
index 0000000..5a2c963
--- /dev/null
@@ -0,0 +1,157 @@
+{
+  "requestDetails": {
+    "modelInfo": {
+      "modelType": "service",
+      "modelInvariantId": "5d48acb5-097d-4982-aeb2-f4a3bd87d31b",
+      "modelVersionId": "3c40d244-808e-42ca-b09a-256d83d19d0a",
+      "modelName": "Sample Service Model",
+      "modelVersion": "10.0"
+    },
+    "cloudConfiguration": {
+      "cloudOwner": "my-custom-cloud-owner"
+    },
+    "owningEntity": {
+      "owningEntityId": "038d99af-0427-42c2-9d15-971b99b9b489",
+      "owningEntityName": "PACKET CORE"
+    },
+    "project": {
+      "projectName": "{some project name}"
+    },
+    "subscriberInfo": {
+      "globalSubscriberId": "{some subscriber id}"
+    },
+    "requestInfo": {
+      "productFamilyId": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+      "source": "VID",
+      "suppressRollback": true,
+      "requestorId": "xxxxxx",
+      "instanceName": "test"
+    },
+    "requestParameters": {
+      "subscriptionServiceType": "VMX",
+      "aLaCarte": false,
+      "userParams": [
+        {
+          "service": {
+            "modelInfo": {
+              "modelType": "service",
+              "modelName": "Sample Service Model",
+              "modelVersionId": "3c40d244-808e-42ca-b09a-256d83d19d0a"
+            },
+            "instanceParams": [],
+            "resources": {
+              "pnfs": [
+                {
+                  "modelInfo": {
+                    "modelType": "pnf",
+                    "modelName": "2016-73_MOW-AVPN-vPE-BV-L-PNF",
+                    "modelVersionId": "1f40c192-f63c-463e-ba94-286933b895f8",
+                    "modelCustomizationName": "2016-73_MOW-AVPN-vPE-BV-L-PNF 0",
+                    "modelCustomizationId": "aa153b6e-c364-44c0-bef6-1f2982117f04"
+                  },
+                  "cloudConfiguration": {
+                    "lcpCloudRegionId": "mdt1",
+                    "tenantId": "88a6ca3ee0394ade9403f075db23167e"
+                  },
+                  "platform": {
+                    "platformName": "test"
+                  },
+                  "lineOfBusiness": {
+                    "lineOfBusinessName": "someValue"
+                  },
+                  "productFamilyId": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+                  "instanceParams": []
+                }
+              ],
+              "vnfs": [
+                {
+                  "modelInfo": {
+                    "modelType": "vnf",
+                    "modelName": "2016-73_MOW-AVPN-vPE-BV-L",
+                    "modelVersionId": "7f40c192-f63c-463e-ba94-286933b895f8",
+                    "modelCustomizationName": "2016-73_MOW-AVPN-vPE-BV-L 0",
+                    "modelCustomizationId": "ab153b6e-c364-44c0-bef6-1f2982117f04"
+                  },
+                  "cloudConfiguration": {
+                    "lcpCloudRegionId": "mdt1",
+                    "tenantId": "88a6ca3ee0394ade9403f075db23167e"
+                  },
+                  "platform": {
+                    "platformName": "test"
+                  },
+                  "lineOfBusiness": {
+                    "lineOfBusinessName": "someValue"
+                  },
+                  "productFamilyId": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+                  "instanceParams": [],
+                  "processingPriority": 2,
+                  "vfModules": [
+                    {
+                      "modelInfo": {
+                        "modelType": "vfModule",
+                        "modelName": "201673MowAvpnVpeBvL..AVPN_base_vPE_BV..module-0",
+                        "modelVersionId": "4c75f813-fa91-45a4-89d0-790ff5f1ae79",
+                        "modelCustomizationId": "a25e8e8c-58b8-4eec-810c-97dcc1f5cb7f"
+                      },
+                      "processingPriority": 2,
+                      "instanceParams": [
+                        {
+                          "vmx_int_net_len": "24"
+                        }
+                      ]
+                    },
+                    {
+                      "modelInfo": {
+                        "modelType": "vfModule",
+                        "modelName": "201673MowAvpnVpeBvL..AVPN_vRE_BV..module-1",
+                        "modelVersionId": "56e2b103-637c-4d1a-adc8-3a7f4a6c3240",
+                        "modelCustomizationId": "72d9d1cd-f46d-447a-abdb-451d6fb05fa8"
+                      },
+                      "processingPriority": 1,
+                      "instanceParams": [
+                        {
+                          "availability_zone_0": "mtpocdv-kvm-az01",
+                          "vre_a_volume_size_0": "100"
+                        }
+                      ]
+                    },
+                    {
+                      "modelInfo": {
+                        "modelType": "vfModule",
+                        "modelName": "201673MowAvpnVpeBvL..AVPN_vPFE_BV..module-3",
+                        "modelVersionId": "f555558f-d538-4876-8ffa-b102650fad64",
+                        "modelCustomizationId": "3c40d244-808e-42ca-b09a-256d83d19d0a"
+                      },
+                      "processingPriority": 4,
+                      "instanceParams": [
+                        {
+                          "availability_zone_0": "mtpocdv-kvm-az01",
+                          "vmx_vpfe_int_ip_0": "192.168.0.16"
+                        }
+                      ]
+                    },
+                    {
+                      "modelInfo": {
+                        "modelType": "vfModule",
+                        "modelName": "201673MowAvpnVpeBvL..AVPN_vRE_BV..module-2",
+                        "modelVersionId": "16e2b103-637c-4d1a-adc8-3a7f4a6c3240",
+                        "modelCustomizationId": "da4d4327-fb7d-4311-ac7a-be7ba60cf969"
+                      },
+                      "processingPriority": 3,
+                      "instanceParams": [
+                        {
+                          "availability_zone_0": "mtpocdv-kvm-az01",
+                          "vre_a_volume_size_0": "50"
+                        }
+                      ]
+                    }
+                  ]
+                }
+              ]
+            }
+          }
+        }
+      ]
+    }
+  }
+}
\ No newline at end of file
index 8f795df..8e8f40c 100644 (file)
@@ -5,6 +5,8 @@
  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
  * Copyright (C) 2017 Huawei Technologies Co., Ltd. All rights reserved.
  * ================================================================================
  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
  * Copyright (C) 2017 Huawei Technologies Co., Ltd. All rights reserved.
  * ================================================================================
+ * Modifications Copyright (c) 2021 Orange
+ * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
@@ -45,6 +47,8 @@ public class Networks implements Serializable {
     protected String productFamilyId;
     @JsonProperty("instanceParams")
     private List<Map<String, String>> instanceParams = new ArrayList<>();
     protected String productFamilyId;
     @JsonProperty("instanceParams")
     private List<Map<String, String>> instanceParams = new ArrayList<>();
+    @JsonProperty("processingPriority")
+    protected Integer processingPriority = 0;
 
     public ModelInfo getModelInfo() {
         return modelInfo;
 
     public ModelInfo getModelInfo() {
         return modelInfo;
@@ -86,10 +90,19 @@ public class Networks implements Serializable {
         this.instanceParams = instanceParams;
     }
 
         this.instanceParams = instanceParams;
     }
 
+    public Integer getProcessingPriority() {
+        return processingPriority;
+    }
+
+    public void setProcessingPriority(Integer processingPriority) {
+        this.processingPriority = processingPriority;
+    }
+
     @Override
     public String toString() {
         return "Networks [modelInfo=" + modelInfo + ", cloudConfiguration=" + cloudConfiguration + ", instanceName="
     @Override
     public String toString() {
         return "Networks [modelInfo=" + modelInfo + ", cloudConfiguration=" + cloudConfiguration + ", instanceName="
-                + instanceName + ", productFamilyId=" + productFamilyId + ", instanceParams=" + instanceParams + "]";
+                + instanceName + ", productFamilyId=" + productFamilyId + ", instanceParams=" + instanceParams
+                + ", processingPriority=" + processingPriority + "]";
     }
 
 }
     }
 
 }
index f601ebc..027a3be 100644 (file)
@@ -4,6 +4,8 @@
  * ================================================================================
  * Copyright (C) 2019 Nokia
  * ================================================================================
  * ================================================================================
  * Copyright (C) 2019 Nokia
  * ================================================================================
+ * Modifications Copyright (c) 2021 Orange
+ * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
@@ -46,7 +48,8 @@ public class Pnfs implements Serializable {
     protected String productFamilyId;
     @JsonProperty("instanceParams")
     private List<Map<String, String>> instanceParams = new ArrayList<>();
     protected String productFamilyId;
     @JsonProperty("instanceParams")
     private List<Map<String, String>> instanceParams = new ArrayList<>();
-
+    @JsonProperty("processingPriority")
+    protected Integer processingPriority = 0;
 
     public ModelInfo getModelInfo() {
         return modelInfo;
 
     public ModelInfo getModelInfo() {
         return modelInfo;
@@ -104,11 +107,20 @@ public class Pnfs implements Serializable {
         this.instanceParams = instanceParams;
     }
 
         this.instanceParams = instanceParams;
     }
 
+    public Integer getProcessingPriority() {
+        return processingPriority;
+    }
+
+    public void setProcessingPriority(Integer processingPriority) {
+        this.processingPriority = processingPriority;
+    }
+
     @Override
     public String toString() {
         return "Pnfs [modelInfo=" + modelInfo + ", cloudConfiguration=" + cloudConfiguration + ", instanceName="
                 + instanceName + ", platform=" + platform + ", " + "lineOfBusiness=" + lineOfBusiness
     @Override
     public String toString() {
         return "Pnfs [modelInfo=" + modelInfo + ", cloudConfiguration=" + cloudConfiguration + ", instanceName="
                 + instanceName + ", platform=" + platform + ", " + "lineOfBusiness=" + lineOfBusiness
-                + ", productFamilyId=" + productFamilyId + ", instanceParams=" + instanceParams + "]";
+                + ", productFamilyId=" + productFamilyId + ", instanceParams=" + instanceParams
+                + ", processingPriority=" + processingPriority + "]";
     }
 
 }
     }
 
 }
index 5c4834d..d4d1f89 100644 (file)
@@ -5,6 +5,8 @@
  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
  * Copyright (C) 2017 Huawei Technologies Co., Ltd. All rights reserved.
  * ================================================================================
  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
  * Copyright (C) 2017 Huawei Technologies Co., Ltd. All rights reserved.
  * ================================================================================
+ * Modifications Copyright (c) 2021 Orange
+ * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
@@ -45,7 +47,8 @@ public class VfModules implements Serializable {
     protected String volumeGroupInstanceName;
     @JsonProperty("instanceParams")
     private List<Map<String, String>> instanceParams = new ArrayList<>();
     protected String volumeGroupInstanceName;
     @JsonProperty("instanceParams")
     private List<Map<String, String>> instanceParams = new ArrayList<>();
-
+    @JsonProperty("processingPriority")
+    protected Integer processingPriority = 0;
 
     public ModelInfo getModelInfo() {
         return modelInfo;
 
     public ModelInfo getModelInfo() {
         return modelInfo;
@@ -87,11 +90,19 @@ public class VfModules implements Serializable {
         this.instanceParams = instanceParams;
     }
 
         this.instanceParams = instanceParams;
     }
 
+    public Integer getProcessingPriority() {
+        return processingPriority;
+    }
+
+    public void setProcessingPriority(Integer processingPriority) {
+        this.processingPriority = processingPriority;
+    }
+
     @Override
     public String toString() {
         return "VfModules [modelInfo=" + modelInfo + ", cloudConfiguration=" + cloudConfiguration + ", instanceName="
                 + instanceName + ", volumeGroupInstanceName=" + volumeGroupInstanceName + ", instanceParams="
     @Override
     public String toString() {
         return "VfModules [modelInfo=" + modelInfo + ", cloudConfiguration=" + cloudConfiguration + ", instanceName="
                 + instanceName + ", volumeGroupInstanceName=" + volumeGroupInstanceName + ", instanceParams="
-                + instanceParams + "]";
+                + instanceParams + ", processingPriority=" + processingPriority + "]";
     }
 
 }
     }
 
 }
index ca67f56..f098d84 100644 (file)
@@ -5,6 +5,8 @@
  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
  * Copyright (C) 2017 Huawei Technologies Co., Ltd. All rights reserved.
  * ================================================================================
  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
  * Copyright (C) 2017 Huawei Technologies Co., Ltd. All rights reserved.
  * ================================================================================
+ * Modifications Copyright (c) 2021 Orange
+ * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
@@ -53,6 +55,8 @@ public class Vnfs implements Serializable {
     private List<VfModules> vfModules = new ArrayList<>();
     @JsonProperty("applicationId")
     protected String applicationId;
     private List<VfModules> vfModules = new ArrayList<>();
     @JsonProperty("applicationId")
     protected String applicationId;
+    @JsonProperty("processingPriority")
+    protected Integer processingPriority = 0;
 
     public ModelInfo getModelInfo() {
         return modelInfo;
 
     public ModelInfo getModelInfo() {
         return modelInfo;
@@ -126,12 +130,20 @@ public class Vnfs implements Serializable {
         this.applicationId = applicationId;
     }
 
         this.applicationId = applicationId;
     }
 
+    public Integer getProcessingPriority() {
+        return processingPriority;
+    }
+
+    public void setProcessingPriority(Integer processingPriority) {
+        this.processingPriority = processingPriority;
+    }
+
     @Override
     public String toString() {
         return "Vnfs [modelInfo=" + modelInfo + ", cloudConfiguration=" + cloudConfiguration + ", instanceName="
                 + instanceName + ", platform=" + platform + ", " + "lineOfBusiness=" + lineOfBusiness
                 + ", productFamilyId=" + productFamilyId + ", instanceParams=" + instanceParams + ", vfModules="
     @Override
     public String toString() {
         return "Vnfs [modelInfo=" + modelInfo + ", cloudConfiguration=" + cloudConfiguration + ", instanceName="
                 + instanceName + ", platform=" + platform + ", " + "lineOfBusiness=" + lineOfBusiness
                 + ", productFamilyId=" + productFamilyId + ", instanceParams=" + instanceParams + ", vfModules="
-                + vfModules + ", applicaionId=" + applicationId + " ]";
+                + vfModules + ", applicaionId=" + applicationId + ", processingPriority=" + processingPriority + " ]";
     }
 
 }
     }
 
 }