Fix macro flow resource blocks processing order
[so.git] / bpmn / so-bpmn-tasks / src / test / java / org / onap / so / bpmn / infrastructure / workflow / tasks / ExecuteBuildingBlockBuilderTest.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP - SO
4  * ================================================================================
5  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Modifications Copyright (c) 2019 Samsung
8  * ================================================================================
9  * Modifications Copyright (c) 2021 Nokia
10  * ================================================================================
11  * Modifications Copyright (c) 2020 Tech Mahindra
12  * ================================================================================
13  * Modifications Copyright (c) 2021 Orange
14  * ================================================================================
15  * Licensed under the Apache License, Version 2.0 (the "License");
16  * you may not use this file except in compliance with the License.
17  * You may obtain a copy of the License at
18  *
19  *      http://www.apache.org/licenses/LICENSE-2.0
20  *
21  * Unless required by applicable law or agreed to in writing, software
22  * distributed under the License is distributed on an "AS IS" BASIS,
23  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
24  * See the License for the specific language governing permissions and
25  * limitations under the License.
26  * ============LICENSE_END=========================================================
27  */
28
29 package org.onap.so.bpmn.infrastructure.workflow.tasks;
30
31 import org.junit.Test;
32 import org.onap.so.bpmn.servicedecomposition.entities.ConfigurationResourceKeys;
33 import org.onap.so.bpmn.servicedecomposition.entities.ExecuteBuildingBlock;
34 import org.onap.so.bpmn.servicedecomposition.entities.WorkflowResourceIds;
35 import org.onap.so.db.catalog.beans.macro.OrchestrationFlow;
36 import java.util.ArrayList;
37 import java.util.Arrays;
38 import java.util.List;
39 import static org.junit.Assert.assertEquals;
40 import static org.junit.Assert.assertNotNull;
41 import static org.junit.Assert.fail;
42
43 public class ExecuteBuildingBlockBuilderTest {
44
45     final private ExecuteBuildingBlockBuilder executeBBBuilder = new ExecuteBuildingBlockBuilder();
46
47     @Test
48     public void verifyLackOfNullPointerExceptionForNullResource() {
49         ExecuteBuildingBlock result = null;
50         try {
51             result = executeBBBuilder.buildExecuteBuildingBlock(new OrchestrationFlow(), null, null, null, null, null,
52                     false, null, null, null, false, null, null, true, null);
53         } catch (NullPointerException e) {
54             fail("NullPointerException should not be thrown when 'resource' is null");
55         }
56         assertNotNull(result);
57     }
58
59     @Test
60     public void getConfigurationResourceKeysTest() {
61         String vnfcName = "vnfc";
62         String vfModuleCustomizationId = "1a2b3c4e5d";
63         String cvnfModuleCustomizationId = "2b1a3c";
64         String vnfCustomizationId = "zz12aa";
65
66         Resource resource = new Resource(WorkflowType.SERVICE, "123", true, null);
67
68         resource.setCvnfModuleCustomizationId(vfModuleCustomizationId);
69         resource.setCvnfModuleCustomizationId(cvnfModuleCustomizationId);
70         resource.setVnfCustomizationId(vnfCustomizationId);
71
72         ConfigurationResourceKeys confResourceKeys = executeBBBuilder.getConfigurationResourceKeys(resource, vnfcName);
73
74         assertNotNull(confResourceKeys);
75         assertEquals(vnfcName, confResourceKeys.getVnfcName());
76         assertEquals(cvnfModuleCustomizationId, confResourceKeys.getCvnfcCustomizationUUID());
77         assertEquals(vnfCustomizationId, confResourceKeys.getVnfResourceCustomizationUUID());
78
79     }
80
81     private Resource getResource(List<Resource> resources, ExecuteBuildingBlock block) {
82         Resource res =
83                 resources.stream().filter(resource -> resource.getResourceId() == block.getBuildingBlock().getKey())
84                         .findAny().orElse(null);
85         return res;
86     }
87
88     private void buildExecuteBuildingBlockListOrderOfVnf(int vnfCount, boolean addPnf, boolean priorities) {
89         WorkflowResourceIds wfIds = new WorkflowResourceIds();
90         wfIds.setServiceInstanceId("1");
91         List<Resource> resources = new ArrayList<>();
92         Resource r1 = new Resource(WorkflowType.SERVICE, "1", false, null);
93         resources.add(r1);
94         for (int i = 0; i < vnfCount; i++) {
95             Resource r2 = new Resource(WorkflowType.VNF, Integer.toString(2 + i * 3), false, r1);
96             Resource r3 = new Resource(WorkflowType.VFMODULE, Integer.toString(3 + i * 3), false, r2);
97             Resource r4 = new Resource(WorkflowType.VFMODULE, Integer.toString(4 + i * 3), false, r2);
98             r4.setBaseVfModule(true);
99             resources.add(r2);
100             resources.add(r3);
101             resources.add(r4);
102             if (priorities) {
103                 r2.setProcessingPriority(vnfCount - i);
104                 r3.setProcessingPriority(1);
105                 r4.setProcessingPriority(2);
106             }
107         }
108         if (addPnf) {
109             Resource r5 = new Resource(WorkflowType.PNF, Integer.toString(5 + (vnfCount - 1) * 3), false, r1);
110             resources.add(r5);
111         }
112
113         OrchestrationFlow f1 = new OrchestrationFlow();
114         f1.setFlowName("AssignServiceInstanceBB");
115         OrchestrationFlow f2 = new OrchestrationFlow();
116         f2.setFlowName("AssignVnfBB");
117         OrchestrationFlow f3 = new OrchestrationFlow();
118         f3.setFlowName("AssignVfModuleBB");
119         OrchestrationFlow f4 = new OrchestrationFlow();
120         f4.setFlowName("ControllerExecutionBB");
121         f4.setBpmnAction("config-assign");
122         f4.setBpmnScope("vnf");
123         OrchestrationFlow f5 = new OrchestrationFlow();
124         f5.setFlowName("AssignPnfBB");
125         OrchestrationFlow f6 = new OrchestrationFlow();
126         f6.setFlowName("WaitForPnfReadyBB");
127         OrchestrationFlow f7 = new OrchestrationFlow();
128         f7.setFlowName("ControllerExecutionBB");
129         f7.setBpmnAction("config-assign");
130         f7.setBpmnScope("pnf");
131         OrchestrationFlow f8 = new OrchestrationFlow();
132         f8.setFlowName("ControllerExecutionBB");
133         f8.setBpmnAction("config-deploy");
134         f8.setBpmnScope("pnf");
135         OrchestrationFlow f9 = new OrchestrationFlow();
136         f9.setFlowName("ActivatePnfBB");
137         OrchestrationFlow f10 = new OrchestrationFlow();
138         f10.setFlowName("CreateVfModuleBB");
139         OrchestrationFlow f11 = new OrchestrationFlow();
140         f11.setFlowName("ActivateVfModuleBB");
141         OrchestrationFlow f12 = new OrchestrationFlow();
142         f12.setFlowName("ControllerExecutionBB");
143         f12.setBpmnAction("config-deploy");
144         f12.setBpmnScope("vnf");
145         OrchestrationFlow f13 = new OrchestrationFlow();
146         f13.setFlowName("ActivateVnfBB");
147         OrchestrationFlow f14 = new OrchestrationFlow();
148         f14.setFlowName("ActivateServiceInstanceBB");
149
150         List<OrchestrationFlow> flows = Arrays.asList(f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14);
151         for (int i = 0; i < flows.size(); i++) {
152             OrchestrationFlow flow = flows.get(i);
153             flow.setId(i + 1);
154             flow.setSequenceNumber(i + 1);
155             flow.setFlowVersion(1.0);
156             flow.setAction("Service-Macro-Create");
157         }
158
159         List<ExecuteBuildingBlock> flowsToExecute = executeBBBuilder.buildExecuteBuildingBlockList(flows, resources,
160                 "1", "1", "1", WorkflowActionConstants.CREATE_INSTANCE, "type", wfIds, null, false);
161
162         for (ExecuteBuildingBlock block : flowsToExecute) {
163             String name = block.getBuildingBlock().getBpmnFlowName();
164             if (name.equals("ControllerExecutionBB"))
165                 name += " [" + block.getBuildingBlock().getBpmnScope() + ", " + block.getBuildingBlock().getBpmnAction()
166                         + "]";
167             System.out.println(name);
168         }
169         assertNotNull(flowsToExecute);
170         assertEquals((addPnf ? 7 : 2) + vnfCount * 4L + vnfCount * 2L * 3, flowsToExecute.size());
171
172         for (ExecuteBuildingBlock block : flowsToExecute)
173             assertNotNull(getResource(resources, block));
174
175         if (priorities) {
176             if (vnfCount > 1)
177                 assertEquals("5", getResource(resources, flowsToExecute.get(1)).getResourceId());
178             else
179                 assertEquals("3", getResource(resources, flowsToExecute.get(2)).getResourceId());
180         } else {
181             if (vnfCount > 1)
182                 assertEquals("2", getResource(resources, flowsToExecute.get(1)).getResourceId());
183             else
184                 assertEquals("4", getResource(resources, flowsToExecute.get(2)).getResourceId());
185         }
186
187         // AssignVfModuleBB
188         assertEquals(f3.getFlowName(), flowsToExecute.get(2).getBuildingBlock().getBpmnFlowName());
189         // ControllerExecutionBB
190         assertEquals(f4.getFlowName(), flowsToExecute.get(4).getBuildingBlock().getBpmnFlowName());
191         if (vnfCount > 1) {
192             // AssignVnfBB
193             if (addPnf)
194                 assertEquals(f2.getFlowName(), flowsToExecute.get(5).getBuildingBlock().getBpmnFlowName());
195             else
196                 assertEquals(f2.getFlowName(), flowsToExecute.get(11).getBuildingBlock().getBpmnFlowName());
197         }
198         int pnfOffset = -5;
199         if (addPnf) {
200             pnfOffset = (vnfCount - 1) * 4;
201             // AssignPnfBB
202             assertEquals(f5.getFlowName(), flowsToExecute.get(5 + pnfOffset).getBuildingBlock().getBpmnFlowName());
203             // WaitForPnfReadyBB
204             assertEquals(f6.getFlowName(), flowsToExecute.get(6 + pnfOffset).getBuildingBlock().getBpmnFlowName());
205             // ControllerExecutionBB
206             assertEquals(f7.getFlowName(), flowsToExecute.get(7 + pnfOffset).getBuildingBlock().getBpmnFlowName());
207             // ControllerExecutionBB
208             assertEquals(f8.getFlowName(), flowsToExecute.get(8 + pnfOffset).getBuildingBlock().getBpmnFlowName());
209             // ActivatePnfBB
210             assertEquals(f9.getFlowName(), flowsToExecute.get(9 + pnfOffset).getBuildingBlock().getBpmnFlowName());
211         }
212         // CreateVfModuleBB
213         assertEquals(f10.getFlowName(), flowsToExecute.get(10 + pnfOffset).getBuildingBlock().getBpmnFlowName());
214         // ActivateVfModuleBB
215         assertEquals(f11.getFlowName(), flowsToExecute.get(11 + pnfOffset).getBuildingBlock().getBpmnFlowName());
216         // ControllerExecutionBB
217         assertEquals(f12.getFlowName(), flowsToExecute.get(14 + pnfOffset).getBuildingBlock().getBpmnFlowName());
218         // ActivateVnfBB
219         assertEquals(f13.getFlowName(), flowsToExecute.get(15 + pnfOffset).getBuildingBlock().getBpmnFlowName());
220     }
221
222     @Test
223     public void buildExecuteBuildingBlockListSortByBaseVfModuleTest() {
224         buildExecuteBuildingBlockListOrderOfVnf(1, false, false);
225     }
226
227     @Test
228     public void buildExecuteBuildingBlockListSortByPriorityTest() {
229         buildExecuteBuildingBlockListOrderOfVnf(1, false, true);
230     }
231
232     @Test
233     public void buildExecuteBuildingBlockListGroupByResourceTypeAndSortByPriorityTest() {
234         buildExecuteBuildingBlockListOrderOfVnf(2, false, true);
235     }
236
237     @Test
238     public void buildExecuteBuildingBlockListGroupByResourceTypeTest() {
239         buildExecuteBuildingBlockListOrderOfVnf(2, false, false);
240     }
241
242     @Test
243     public void buildExecuteBuildingBlockListGroupByResourceTypeVnfAndPnfTest() {
244         buildExecuteBuildingBlockListOrderOfVnf(2, true, false);
245     }
246 }