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) 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
@@ -26,7 +28,7 @@
 
 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;
@@ -41,16 +43,7 @@ import java.util.List;
 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 {
@@ -63,80 +56,117 @@ public class ExecuteBuildingBlockBuilder {
     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<>();
+
+        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) {
-            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;
     }
 
+    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,
@@ -172,15 +202,16 @@ public class ExecuteBuildingBlockBuilder {
         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) {
 
-        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) {
@@ -191,6 +222,4 @@ public class ExecuteBuildingBlockBuilder {
         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.
  * ================================================================================
+ * 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
 
 package org.onap.so.bpmn.infrastructure.workflow.tasks;
 
+import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Comparator;
+import java.util.List;
 
 public class Resource {
 
@@ -32,14 +37,24 @@ public class Resource {
     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.processingPriority = 0;
+        this.children = new ArrayList<>();
+        this.parent = parent;
+        if (parent != null)
+            this.parent.children.add(this);
     }
 
     public String getResourceId() {
@@ -105,4 +120,20 @@ public class Resource {
     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) 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
@@ -318,6 +320,24 @@ public class WorkflowAction {
             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))
@@ -417,7 +437,7 @@ public class WorkflowAction {
                 resourceId = modelInfo.getModelCustomizationId();
             }
         }
-        return new Resource(resourceType, resourceId, true);
+        return new Resource(resourceType, resourceId, true, null);
     }
 
     private String getCloudOwner(CloudConfiguration cloudConfiguration) {
@@ -732,7 +752,7 @@ public class WorkflowAction {
                     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);
         }
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;
@@ -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)) {
-            resourceList.add(new Resource(WorkflowType.SERVICE, "", false));
+            resourceList.add(new Resource(WorkflowType.SERVICE, "", false, null));
         }
         return resourceList;
     }
@@ -142,16 +164,18 @@ public class ServiceEBBLoader {
         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) {
-                traverseVrfConfiguration(aaiResourceIds, resourceList, service, relatedVpnBinding, relatedLocalNetwork);
+                traverseVrfConfiguration(aaiResourceIds, resourceList, serviceResource, service, relatedVpnBinding,
+                        relatedLocalNetwork);
             } 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);
-            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()));
-                    resourceList.add(new Resource(WorkflowType.NETWORK, network.getNetworkId(), false));
+                    resourceList
+                            .add(new Resource(WorkflowType.NETWORK, network.getNetworkId(), false, serviceResource));
                 }
             }
             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,
-                        serviceInstanceMSO.getCollection().getId(), false));
+                        serviceInstanceMSO.getCollection().getId(), false, serviceResource));
             }
             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()));
-                                resourceList.add(
-                                        new Resource(WorkflowType.CONFIGURATION, config.getConfigurationId(), false));
+                                resourceList.add(new Resource(WorkflowType.CONFIGURATION, config.getConfigurationId(),
+                                        false, serviceResource));
                                 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) {
@@ -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()));
-            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()));
-                    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) {
@@ -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()));
-            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,
-            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 =
@@ -260,12 +289,12 @@ public class ServiceEBBLoader {
             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,
-            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");
@@ -280,14 +309,16 @@ public class ServiceEBBLoader {
         } 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) {
-        if (collectionResourceCustomizationShouldNotBeProcessed(resourceList, collectionResourceCustomization))
+        if (collectionResourceCustomizationShouldNotBeProcessed(resourceList, serviceResource,
+                collectionResourceCustomization))
             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,
-                        collectionNetworkResourceCust.getModelCustomizationUUID(), false);
+                        collectionNetworkResourceCust.getModelCustomizationUUID(), false, serviceResource);
                 resource.setVirtualLinkKey(Integer.toString(i));
                 resourceList.add(resource);
             }
@@ -334,13 +365,13 @@ public class ServiceEBBLoader {
     }
 
     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,
-                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");
@@ -368,7 +399,7 @@ public class ServiceEBBLoader {
         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;
@@ -379,7 +410,7 @@ public class ServiceEBBLoader {
         }
         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());
     }
 
-    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()));
-            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);
         }
index 4b1fdd8..1f93274 100644 (file)
@@ -10,6 +10,8 @@
  * ================================================================================
  * 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
@@ -89,38 +91,45 @@ public class UserParamsServiceTraversal {
     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) {
-            setResourceListForVnfs(execution, resourceList, validate);
+            setResourceListForVnfs(execution, resourceList, serviceResource, validate);
         }
         if (validate.getResources().getPnfs() != null) {
-            setResourceListForPnfs(resourceList, validate);
+            setResourceListForPnfs(resourceList, serviceResource, validate);
         }
         if (validate.getResources().getNetworks() != null) {
-            setResourceListForNetworks(execution, serviceModelVersionId, requestAction, resourceList, validate);
+            setResourceListForNetworks(execution, serviceModelVersionId, requestAction, resourceList, serviceResource,
+                    validate);
         }
         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);
-            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) {
-                    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");
@@ -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;
-            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;
-            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;
     }
 
-    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,
-                        config.getConfigurationResource().getModelUUID(), false);
+                        config.getConfigurationResource().getModelUUID(), false, vnfResource);
                 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()) {
-            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,
-            String requestAction, List<Resource> resourceList, Service validate) {
+            String requestAction, List<Resource> resourceList, Resource serviceResource, Service validate) {
         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) {
-                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) 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
@@ -73,9 +75,11 @@ public class VnfEBBLoader {
             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) {
-                findVnfWithGivenId(serviceInstanceMSO, vnfId, aaiResourceIds, resourceList, execution);
+                findVnfWithGivenId(serviceInstanceMSO, vnfId, aaiResourceIds, resourceList, serviceResource, execution);
             }
         } 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);
-            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,
-                        execution);
+                        serviceResource, execution);
             }
         } catch (Exception ex) {
             logger.error("Exception in customTraverseAAIVnf", ex);
@@ -104,34 +110,38 @@ public class VnfEBBLoader {
     }
 
     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()));
-                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,
-            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()));
-                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,
-            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(
@@ -140,7 +150,7 @@ public class VnfEBBLoader {
             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);
@@ -149,35 +159,39 @@ public class VnfEBBLoader {
     }
 
     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()));
-                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,
-                        aaiResourceIds);
+                        vfModuleResource, 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()));
-                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,
-            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()));
-                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) 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
@@ -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.onap.so.bpmn.servicedecomposition.entities.WorkflowResourceIds;
 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;
@@ -59,7 +63,7 @@ public class ExecuteBuildingBlockBuilderTest {
         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);
@@ -73,4 +77,170 @@ public class ExecuteBuildingBlockBuilderTest {
         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.
  * ================================================================================
+ * 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
@@ -30,26 +32,84 @@ public class ResourceTest {
 
     @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);
+        r3.setProcessingPriority(2);
+        r4.setProcessingPriority(1);
 
         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("4", sorted.get(1).getResourceId());
+        assertEquals("3", sorted.get(2).getResourceId());
     }
 
     @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 =
-                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());
     }
 
+    @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) 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
@@ -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";
+    private static final String MACRO_CREATE_JSON = "Macro/ServiceMacroAssignVnfAndPnf.json";
 
     @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()))
-                .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"))
@@ -349,7 +352,7 @@ public class WorkflowActionTest extends BaseTaskTest {
         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);
@@ -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",
-                "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());
-        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());
@@ -624,7 +627,7 @@ public class WorkflowActionTest extends BaseTaskTest {
         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"))
@@ -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",
-                "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());
@@ -662,6 +665,92 @@ public class WorkflowActionTest extends BaseTaskTest {
         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";
@@ -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");
-        assertEqualsBulkFlowName(ebbs, "DeactivateVfModuleBB", "DeactivateVfModuleBB", "DeleteVfModuleBB",
+        assertEqualsBulkFlowName(ebbs, "DeactivateVfModuleBB", "DeleteVfModuleBB", "DeactivateVfModuleBB",
                 "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",
-                "DeactivateVfModuleBB", "DeleteVfModuleBB", "DeleteVfModuleBB", "DeactivateVnfBB", "CreateVfModuleBB",
-                "CreateVfModuleBB", "ActivateVfModuleBB", "ActivateVfModuleBB", "ActivateVnfBB", "SDNOVnfHealthCheckBB",
+                "DeleteVfModuleBB", "DeactivateVfModuleBB", "DeleteVfModuleBB", "DeactivateVnfBB", "CreateVfModuleBB",
+                "ActivateVfModuleBB", "CreateVfModuleBB", "ActivateVfModuleBB", "ActivateVnfBB", "SDNOVnfHealthCheckBB",
                 "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");
-        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());
         }
@@ -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";
-        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);
@@ -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";
-        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",
@@ -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";
-        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",
@@ -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";
-        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());
@@ -2091,14 +2181,31 @@ public class WorkflowActionTest extends BaseTaskTest {
         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<>();
-        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;
     }
 }
index a5ecf36..7a26422 100644 (file)
@@ -4,6 +4,8 @@
  * ================================================================================
  * 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
@@ -171,10 +173,10 @@ public class ServiceEBBLoaderTest extends BaseTaskTest {
     @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));
     }
@@ -182,10 +184,10 @@ public class ServiceEBBLoaderTest extends BaseTaskTest {
     @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));
@@ -280,7 +282,8 @@ public class ServiceEBBLoaderTest extends BaseTaskTest {
 
         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);
@@ -346,12 +349,14 @@ public class ServiceEBBLoaderTest extends BaseTaskTest {
 
     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;
     }
 }
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";
+    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";
@@ -113,6 +114,26 @@ public class UserParamsServiceTraversalTest extends BaseTaskTest {
         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);
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.
  * ================================================================================
+ * 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
@@ -45,6 +47,8 @@ public class Networks implements Serializable {
     protected String productFamilyId;
     @JsonProperty("instanceParams")
     private List<Map<String, String>> instanceParams = new ArrayList<>();
+    @JsonProperty("processingPriority")
+    protected Integer processingPriority = 0;
 
     public ModelInfo getModelInfo() {
         return modelInfo;
@@ -86,10 +90,19 @@ public class Networks implements Serializable {
         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="
-                + 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
  * ================================================================================
+ * 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
@@ -46,7 +48,8 @@ public class Pnfs implements Serializable {
     protected String productFamilyId;
     @JsonProperty("instanceParams")
     private List<Map<String, String>> instanceParams = new ArrayList<>();
-
+    @JsonProperty("processingPriority")
+    protected Integer processingPriority = 0;
 
     public ModelInfo getModelInfo() {
         return modelInfo;
@@ -104,11 +107,20 @@ public class Pnfs implements Serializable {
         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
-                + ", 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.
  * ================================================================================
+ * 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
@@ -45,7 +47,8 @@ public class VfModules implements Serializable {
     protected String volumeGroupInstanceName;
     @JsonProperty("instanceParams")
     private List<Map<String, String>> instanceParams = new ArrayList<>();
-
+    @JsonProperty("processingPriority")
+    protected Integer processingPriority = 0;
 
     public ModelInfo getModelInfo() {
         return modelInfo;
@@ -87,11 +90,19 @@ public class VfModules implements Serializable {
         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="
-                + 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.
  * ================================================================================
+ * 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
@@ -53,6 +55,8 @@ public class Vnfs implements Serializable {
     private List<VfModules> vfModules = new ArrayList<>();
     @JsonProperty("applicationId")
     protected String applicationId;
+    @JsonProperty("processingPriority")
+    protected Integer processingPriority = 0;
 
     public ModelInfo getModelInfo() {
         return modelInfo;
@@ -126,12 +130,20 @@ public class Vnfs implements Serializable {
         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="
-                + vfModules + ", applicaionId=" + applicationId + " ]";
+                + vfModules + ", applicaionId=" + applicationId + ", processingPriority=" + processingPriority + " ]";
     }
 
 }