From: Lukasz Rajewski Date: Tue, 6 Jul 2021 15:35:37 +0000 (+0200) Subject: Fix macro flow resource blocks processing order X-Git-Tag: 1.9.0~18^2 X-Git-Url: https://gerrit.onap.org/r/gitweb?a=commitdiff_plain;h=ab1c20465e36ed1b645e2ad5dba502c8430a6b88;p=so.git Fix macro flow resource blocks processing order Change-Id: I9941cf15d65b5c463126d99e03aa4eb0c2e8c183 Issue-ID: SO-3705 Signed-off-by: Lukasz Rajewski --- diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ExecuteBuildingBlockBuilder.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ExecuteBuildingBlockBuilder.java index 813dc04ecd..2bd0f2c786 100644 --- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ExecuteBuildingBlockBuilder.java +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ExecuteBuildingBlockBuilder.java @@ -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 buildExecuteBuildingBlockList(List orchFlows, - List resourceList, String requestId, String apiVersion, String resourceId, String requestAction, - String vnfType, WorkflowResourceIds workflowResourceIds, RequestDetails requestDetails, - boolean replaceVnf) { + List originalResourceList, String requestId, String apiVersion, String resourceId, + String requestAction, String vnfType, WorkflowResourceIds workflowResourceIds, + RequestDetails requestDetails, boolean replaceVnf) { + List resourceList = getOnlyRootResourceList(originalResourceList); + List 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 resourceComparator; - if (requestAction.equals(CREATE_INSTANCE) || requestAction.equals(ASSIGN_INSTANCE) - || requestAction.equals(ACTIVATE_INSTANCE)) { - resourceComparator = Resource.sortBaseFirst; - } else { - resourceComparator = Resource.sortBaseLast; - } - List 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 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 buildExecuteBuildingBlockListRaw(OrchestrationFlow orchFlow, Resource resource, + String requestId, String apiVersion, String resourceId, String requestAction, String vnfType, + WorkflowResourceIds workflowResourceIds, RequestDetails requestDetails, boolean replaceVnf) { + List 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 getOnlyRootResourceList(List resourceList) { + return resourceList.stream().filter(x -> countResourceOnTheResourceList(x, resourceList) == 1) + .collect(Collectors.toList()); + } + + protected int countResourceOnTheResourceList(Resource resource, List 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 flowsToExecute, List resourceList, + private void addBuildingBlockToExecuteBBList(List 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 index 0000000000..77cb616eb9 --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ExecutionPlan.java @@ -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 { + 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 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 resourceList, boolean ascendingOrder) { + Map> 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 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 { + + public ExecutionGroup(WorkflowType groupType, ExecutionPlan plan) { + super(groupType); + plan.addNestedPlans(Collections.singletonList(this)); + } +} + + +class ExecutionCollection> { + + protected static final Logger logger = LoggerFactory.getLogger(ExecutionCollection.class); + + protected final WorkflowType type; + protected List blocksBuiltCache; + protected final List nestedExecutions; + + public ExecutionCollection(WorkflowType type) { + this.type = type; + this.nestedExecutions = new ArrayList<>(); + this.blocksBuiltCache = new ArrayList<>(); + } + + public WorkflowType getType() { + return type; + } + + public List getNestedExecutions() { + return nestedExecutions; + } + + public void addNestedPlans(List executions) { + nestedExecutions.addAll(executions); + } + + public void pushBlockToCache(List 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 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(); + } +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/Resource.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/Resource.java index 692d8bccdb..0d2844d08b 100644 --- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/Resource.java +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/Resource.java @@ -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 @@ -20,7 +22,10 @@ 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 children; - public static final Comparator sortBaseFirst = Comparator.comparingInt(x -> x.isBaseVfModule() ? 0 : 1); - public static final Comparator sortBaseLast = Comparator.comparingInt(x -> x.isBaseVfModule() ? 1 : 0); + public static final Comparator sortByPriorityAsc = + Comparator.comparingInt(Resource::getProcessingPriority); + public static final Comparator 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 getChildren() { + return this.children; + } } diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowAction.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowAction.java index 8a9289981d..ce775af476 100644 --- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowAction.java +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowAction.java @@ -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); } diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ebb/loader/ServiceEBBLoader.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ebb/loader/ServiceEBBLoader.java index 6d02594c68..e4c6d2951f 100644 --- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ebb/loader/ServiceEBBLoader.java +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ebb/loader/ServiceEBBLoader.java @@ -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 resourceList, + private void traverseServiceInstanceMSOVnfs(List resourceList, Resource serviceResource, List> 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 resourceList, + private void traverseServiceInstanceMSOPnfs(List resourceList, Resource serviceResource, List> 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> aaiResourceIds, - List resourceList, org.onap.so.db.catalog.beans.Service service, + List 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 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 resourceList, + private void traverseNetworkCollectionResourceCustomization(List 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 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 resourceList, + private void traverseNetworkCollectionCustomization(List 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 resourceList, List> aaiResourceIds, + private void traverseVnfModules(List resourceList, Resource vnfResource, + List> 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); } diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ebb/loader/UserParamsServiceTraversal.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ebb/loader/UserParamsServiceTraversal.java index 4b1fdd8da1..1f932743ca 100644 --- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ebb/loader/UserParamsServiceTraversal.java +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ebb/loader/UserParamsServiceTraversal.java @@ -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 getResourceList(DelegateExecution execution, String serviceModelVersionId, String requestAction, Service validate) { List 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 resourceList, Service validate) { + private void setResourceListForVnfs(DelegateExecution execution, List 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 resourceList, Service validate, - Vnfs vnf) { + private void setResourceListForVfModules(DelegateExecution execution, List 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 resourceList, + private void setVolumeGroupWorkFlowTypeToResourceList(List 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 resourceList, Service validate, - Vnfs vnf, VfModules vfModule, VfModuleCustomization vfModuleCustomization) { + private void setVfModuleAndConfigurationWorkFlowTypeToResourceList(List 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 resourceList, - VfModuleCustomization vfModuleCustomization) { - Resource resource = - new Resource(WorkflowType.VFMODULE, vfModuleCustomization.getModelCustomizationUUID(), false); + private Resource setVfModuleWorkFlowTypeToResourceList(List 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 resourceList, Service validate, Vnfs vnf, - VfModules vfModule, Resource resource) { + private void setConfigurationWorkFlowTypeToResourceList(List resourceList, Resource vnfResource, + Service validate, Vnfs vnf, VfModules vfModule, Resource resource) { if (!vnfCustomizationUUID.isEmpty() && !vfModuleCustomizationUUID.isEmpty()) { List 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 resourceList, Service validate) { + private void setResourceListForPnfs(List 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 resourceList, Service validate) { + String requestAction, List 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)); } } } diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ebb/loader/VnfEBBLoader.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ebb/loader/VnfEBBLoader.java index b271226414..c1d1d7ad5a 100644 --- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ebb/loader/VnfEBBLoader.java +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ebb/loader/VnfEBBLoader.java @@ -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> aaiResourceIds, List resourceList, DelegateExecution execution) { + List> aaiResourceIds, List 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> aaiResourceIds, List resourceList, DelegateExecution execution) { + List> aaiResourceIds, List 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 resourceList, List> aaiResourceIds) { + List resourceList, Resource vfModuleResource, List> 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> aaiResourceIds, - List resourceList, DelegateExecution execution) { + List 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> aaiResourceIds, - List resourceList) { + List 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 relationshipsOp, List resourceList, - List> aaiResourceIds) { + Resource vfModuleResource, List> aaiResourceIds) { if (relationshipsOp.isPresent()) { Optional 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)); } } } diff --git a/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ExecuteBuildingBlockBuilderTest.java b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ExecuteBuildingBlockBuilderTest.java index cc3da9952a..61b5740238 100644 --- a/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ExecuteBuildingBlockBuilderTest.java +++ b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ExecuteBuildingBlockBuilderTest.java @@ -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 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 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 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 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); + } } diff --git a/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ResourceTest.java b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ResourceTest.java index 5e3afa16ac..cd98792938 100644 --- a/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ResourceTest.java +++ b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ResourceTest.java @@ -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 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 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 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 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 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()); + } + } diff --git a/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowActionTest.java b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowActionTest.java index 10e6ed4895..e52d2dfecf 100644 --- a/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowActionTest.java +++ b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowActionTest.java @@ -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 ebbs = (List) 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 ebbs = (List) 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 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 ebbs = (List) 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 ebbs = (List) 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 ebbs = (List) 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 ebbs = (List) 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 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 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 prepareListWithResources() { + private List prepareListWithResources(boolean addPnf, boolean addPriorites) { List 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; } } diff --git a/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ebb/loader/ServiceEBBLoaderTest.java b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ebb/loader/ServiceEBBLoaderTest.java index a5ecf364a6..7a26422eb9 100644 --- a/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ebb/loader/ServiceEBBLoaderTest.java +++ b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ebb/loader/ServiceEBBLoaderTest.java @@ -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 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 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 prepareListWithResources() { List 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; } } diff --git a/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ebb/loader/UserParamsServiceTraversalTest.java b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ebb/loader/UserParamsServiceTraversalTest.java index 9f4bd97ac6..58fee86ade 100644 --- a/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ebb/loader/UserParamsServiceTraversalTest.java +++ b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ebb/loader/UserParamsServiceTraversalTest.java @@ -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 resourceListFromUserParams = userParamsServiceTraversal.getResourceListFromUserParams(execution, + getUserParams(), serviceInstanceId, requestAction); + List expected = List.of(WorkflowType.SERVICE, WorkflowType.VNF, WorkflowType.VOLUMEGROUP, + WorkflowType.VFMODULE, WorkflowType.CONFIGURATION, WorkflowType.PNF); + List 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 index 0000000000..5a2c963135 --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/test/resources/__files/Macro/ServiceMacroAssignVnfAndPnf.json @@ -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 diff --git a/common/src/main/java/org/onap/so/serviceinstancebeans/Networks.java b/common/src/main/java/org/onap/so/serviceinstancebeans/Networks.java index 8f795df654..8e8f40caca 100644 --- a/common/src/main/java/org/onap/so/serviceinstancebeans/Networks.java +++ b/common/src/main/java/org/onap/so/serviceinstancebeans/Networks.java @@ -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> 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 + "]"; } } diff --git a/common/src/main/java/org/onap/so/serviceinstancebeans/Pnfs.java b/common/src/main/java/org/onap/so/serviceinstancebeans/Pnfs.java index f601ebc3bd..027a3be387 100644 --- a/common/src/main/java/org/onap/so/serviceinstancebeans/Pnfs.java +++ b/common/src/main/java/org/onap/so/serviceinstancebeans/Pnfs.java @@ -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> 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 + "]"; } } diff --git a/common/src/main/java/org/onap/so/serviceinstancebeans/VfModules.java b/common/src/main/java/org/onap/so/serviceinstancebeans/VfModules.java index 5c4834d021..d4d1f89577 100644 --- a/common/src/main/java/org/onap/so/serviceinstancebeans/VfModules.java +++ b/common/src/main/java/org/onap/so/serviceinstancebeans/VfModules.java @@ -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> 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 + "]"; } } diff --git a/common/src/main/java/org/onap/so/serviceinstancebeans/Vnfs.java b/common/src/main/java/org/onap/so/serviceinstancebeans/Vnfs.java index ca67f566b1..f098d844a6 100644 --- a/common/src/main/java/org/onap/so/serviceinstancebeans/Vnfs.java +++ b/common/src/main/java/org/onap/so/serviceinstancebeans/Vnfs.java @@ -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 = 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 + " ]"; } }