1 package org.openecomp.sdc.be.components.merge.instance;
3 import static org.junit.Assert.assertEquals;
4 import static org.junit.Assert.assertNotNull;
5 import static org.junit.Assert.assertNull;
6 import static org.mockito.Mockito.verify;
7 import static org.mockito.Mockito.when;
9 import java.util.ArrayList;
10 import java.util.HashMap;
11 import java.util.LinkedList;
12 import java.util.List;
14 import java.util.stream.IntStream;
16 import org.junit.Before;
17 import org.junit.Test;
18 import org.junit.runner.RunWith;
19 import org.mockito.ArgumentCaptor;
20 import org.mockito.Captor;
21 import org.mockito.Mock;
22 import org.mockito.Mockito;
23 import org.mockito.junit.MockitoJUnitRunner;
24 import org.openecomp.sdc.be.components.merge.utils.MergeInstanceUtils;
25 import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
26 import org.openecomp.sdc.be.datatypes.enums.ResourceTypeEnum;
27 import org.openecomp.sdc.be.model.CapabilityDefinition;
28 import org.openecomp.sdc.be.model.CapabilityRequirementRelationship;
29 import org.openecomp.sdc.be.model.Component;
30 import org.openecomp.sdc.be.model.ComponentInstance;
31 import org.openecomp.sdc.be.model.RelationshipImpl;
32 import org.openecomp.sdc.be.model.RelationshipInfo;
33 import org.openecomp.sdc.be.model.RequirementCapabilityRelDef;
34 import org.openecomp.sdc.be.model.RequirementDefinition;
35 import org.openecomp.sdc.be.model.Resource;
36 import org.openecomp.sdc.be.model.Service;
37 import org.openecomp.sdc.be.model.User;
38 import org.openecomp.sdc.be.model.jsontitan.operations.ToscaOperationFacade;
39 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
41 import fj.data.Either;
43 @RunWith(MockitoJUnitRunner.class)
44 public class ComponentInstanceRelationMergeTest {
45 private ComponentInstanceRelationMerge compInstanceRelationMerge;
47 private DataForMergeHolder dataHolder;
48 private Component containerComponent;
49 private Component updatedContainerComponent;
50 private ComponentInstance currentResourceInstance;
52 private RequirementCapabilityRelDef requirementDef1;
53 private RequirementCapabilityRelDef requirementDef2;
54 private RequirementCapabilityRelDef capabilityDef1;
55 private RequirementCapabilityRelDef capabilityDef2;
58 private ToscaOperationFacade toscaOperationFacade;
64 ArgumentCaptor<VfRelationsMergeInfo> argumentCaptor;
68 public void startUp() {
69 compInstanceRelationMerge = new ComponentInstanceRelationMerge();
70 compInstanceRelationMerge.setToscaOperationFacade(toscaOperationFacade);
72 MergeInstanceUtils mergeInstanceUtils = new MergeInstanceUtils();
73 mergeInstanceUtils.setToscaOperationFacade(toscaOperationFacade);
74 compInstanceRelationMerge.setMergeInstanceUtils(mergeInstanceUtils);
76 containerComponent = new Service();
77 List<RequirementCapabilityRelDef> resourceInstancesRelations = new ArrayList<>();
79 requirementDef1 = createRequirementDef("SRV1.VF1.VFI_1", "SRV1.VF2.VFI_1", "SRV1.VF1.VFC_1.VFCI_1", "Requirement1");
80 resourceInstancesRelations.add(requirementDef1);
81 requirementDef2 = createRequirementDef("SRV1.VF1.VFI_1", "SRV1.VF3.VFI_1", "SRV1.VF1.VFC_2.VFCI_2", "Requirement2");
82 resourceInstancesRelations.add(requirementDef2);
85 capabilityDef1 = createCapabilityDef("SRV1.VF4.VFI_1", "SRV1.VF1.VFI_1", "SRV1.VF1.VFC_3.VFCI_3", "Capability3");
86 resourceInstancesRelations.add(capabilityDef1);
87 capabilityDef2 = createCapabilityDef("SRV1.VF5.VFI_1", "SRV1.VF1.VFI_1", "SRV1.VF1.VFC_4.VFCI_1", "Capability4");
88 resourceInstancesRelations.add(capabilityDef2);
90 containerComponent.setComponentInstancesRelations(resourceInstancesRelations );
92 currentResourceInstance = new ComponentInstance();
93 currentResourceInstance.setUniqueId("SRV1.VF1.VFI_1");
94 currentResourceInstance.setComponentUid("SRV1.VF1");
95 currentResourceInstance.setIsProxy(false);
97 updatedContainerComponent = new Service();
98 updatedContainerComponent.setUniqueId("123123123123123123");
102 public void testSaveDataBeforeMerge() {
103 Resource vf = new Resource();
105 List<ComponentInstance> vfcInstances = new ArrayList<>();
106 vfcInstances.add(createVfci("vfc_A", "SRV1.VF1.VFC_1.VFCI_1", "SRV1.VF1.VFC_1", true));
107 vfcInstances.add(createVfci("vfc_B", "SRV1.VF1.VFC_2.VFCI_2", "SRV1.VF1.VFC_2", true));
108 vfcInstances.add(createVfci("vfc_C", "SRV1.VF1.VFC_3.VFCI_3", "SRV1.VF1.VFC_3", false));
109 vfcInstances.add(createVfci("vfc_D", "SRV1.VF1.VFC_4.VFCI_1", "SRV1.VF1.VFC_4", true));
110 vf.setComponentInstances(vfcInstances);
111 vf.setComponentType(ComponentTypeEnum.RESOURCE);
112 vf.setResourceType(ResourceTypeEnum.VF);
114 compInstanceRelationMerge.saveDataBeforeMerge(dataHolder, containerComponent, currentResourceInstance, vf);
116 verify(dataHolder).setVfRelationsInfo(argumentCaptor.capture());
117 VfRelationsMergeInfo relationsMergeInfo = argumentCaptor.getValue();
118 List<RelationMergeInfo> fromRelationsMergeInfo = relationsMergeInfo.getFromRelationsInfo();
119 List<RelationMergeInfo> toRelationsMergeInfo = relationsMergeInfo.getToRelationsInfo();
121 assertNotNull("Expected not null list of relations merge info", fromRelationsMergeInfo);
122 assertNotNull("Expected not null list of relations merge info", toRelationsMergeInfo);
124 assertEquals("Expected 2 elements", 2, fromRelationsMergeInfo.size());
125 assertEquals("Expected 1 elements", 1, toRelationsMergeInfo.size());
129 public void testMergeDataAfterCreate_NoSavedData() {
130 compInstanceRelationMerge.mergeDataAfterCreate(user, dataHolder, updatedContainerComponent, "SRV1.VF1.VFI_2");
132 verify(dataHolder).getVfRelationsMergeInfo();
133 List<RequirementCapabilityRelDef> relations = updatedContainerComponent.getComponentInstancesRelations();
134 assertNull("Expected no relations", relations);
138 public void testMergeDataAfterCreate() {
139 Resource vf = new Resource();
141 List<ComponentInstance> vfcInstances = new ArrayList<>();
142 vfcInstances.add(createVfci("vfc_A", "SRV1.VF1.VFC_1.VFCI_1", "SRV1.VF1.VFC_1", true));
143 vfcInstances.add(createVfci("vfc_B", "SRV1.VF1.VFC_2.VFCI_2", "SRV1.VF1.VFC_2", true));
144 vfcInstances.add(createVfci("vfc_C", "SRV1.VF1.VFC_3.VFCI_3", "SRV1.VF1.VFC_3", false));
145 vfcInstances.add(createVfci("vfc_D", "SRV1.VF1.VFC_4.VFCI_1", "SRV1.VF1.VFC_4", true));
146 vf.setComponentInstances(vfcInstances);
147 vf.setComponentType(ComponentTypeEnum.RESOURCE);
148 vf.setResourceType(ResourceTypeEnum.VF);
150 Either<Component, StorageOperationStatus> eitherVF = Either.left(vf);
151 when(toscaOperationFacade.getToscaElement("SRV1.VF1")).thenReturn(eitherVF);
154 List<RelationMergeInfo> fromRelationsMergeInfo = new ArrayList<>();
155 List<RelationMergeInfo> toRelationsMergeInfo = new ArrayList<>();
157 RelationMergeInfo relationMergeInfo1 = new RelationMergeInfo("CapabilityType1", "capabilityA", "vfc_A", requirementDef1);
158 fromRelationsMergeInfo.add(relationMergeInfo1);
159 RelationMergeInfo relationMergeInfo2 = new RelationMergeInfo("CapabilityType4", "capabilityD", "vfc_D", capabilityDef2);
160 toRelationsMergeInfo.add(relationMergeInfo2);
162 VfRelationsMergeInfo relationsMergeInfo = new VfRelationsMergeInfo(fromRelationsMergeInfo, toRelationsMergeInfo);
164 when(dataHolder.getVfRelationsMergeInfo()).thenReturn(relationsMergeInfo);
166 List<ComponentInstance> componentInstances = new ArrayList<>();
167 componentInstances.add(createVfi("SRV1.VF1", "SRV1.VF1.VFI_2"));
168 componentInstances.add(createVfi("SRV1.VF2", "SRV1.VF2.VFI_1"));
169 componentInstances.add(createVfi("SRV1.VF3", "SRV1.VF3.VFI_1"));
170 componentInstances.add(createVfi("SRV1.VF4", "SRV1.VF4.VFI_1"));
171 componentInstances.add(createVfi("SRV1.VF5", "SRV1.VF5.VFI_1"));
172 updatedContainerComponent.setComponentInstances(componentInstances);
174 List<RequirementCapabilityRelDef> resourceInstancesRelations = new ArrayList<>();
175 updatedContainerComponent.setComponentInstancesRelations(resourceInstancesRelations);
177 when(toscaOperationFacade.associateResourceInstances(Mockito.anyString(), Mockito.anyList())).thenReturn(StorageOperationStatus.OK);
179 compInstanceRelationMerge.mergeDataAfterCreate(user, dataHolder, updatedContainerComponent, "SRV1.VF1.VFI_2");
181 verify(dataHolder).getVfRelationsMergeInfo();
182 verify(toscaOperationFacade).associateResourceInstances(Mockito.anyString(), Mockito.anyList());
184 List<RequirementCapabilityRelDef> relations = updatedContainerComponent.getComponentInstancesRelations();
185 assertEquals("Expected 2 relations", 2, relations.size());
188 RequirementCapabilityRelDef capabilityRelDef = relations.get(0);
189 assertEquals("SRV1.VF1.VFC_4.VFCI_1", capabilityRelDef.resolveSingleRelationship().getRelation().getCapabilityOwnerId());
190 assertEquals("SRV1.VF5.VFI_1", capabilityRelDef.getFromNode());
191 assertEquals("SRV1.VF1.VFI_2", capabilityRelDef.getToNode());
193 RequirementCapabilityRelDef requirementRelDef = relations.get(1);
194 assertEquals("SRV1.VF1.VFC_1.VFCI_1", requirementRelDef.resolveSingleRelationship().getRelation().getRequirementOwnerId());
195 assertEquals("SRV1.VF1.VFI_2", requirementRelDef.getFromNode());
196 assertEquals("SRV1.VF2.VFI_1", requirementRelDef.getToNode());
202 public void testMergeDataAfterCreate_OwnerChanged() {
203 Resource vf = new Resource();
205 List<ComponentInstance> vfcInstances = new ArrayList<>();
206 vfcInstances.add(createVfci("vfc_A", "SRV1.VF1.VFC_1.VFCI_2", "SRV1.VF1.VFC_1", true));
207 vfcInstances.add(createVfci("vfc_B", "SRV1.VF1.VFC_2.VFCI_2", "SRV1.VF1.VFC_2", true));
208 vfcInstances.add(createVfci("vfc_C", "SRV1.VF1.VFC_3.VFCI_3", "SRV1.VF1.VFC_3", false));
209 vfcInstances.add(createVfci("vfc_D", "SRV1.VF1.VFC_4.VFCI_2", "SRV1.VF1.VFC_4", true));
210 vf.setComponentInstances(vfcInstances);
211 vf.setComponentType(ComponentTypeEnum.RESOURCE);
212 vf.setResourceType(ResourceTypeEnum.VF);
214 Either<Component, StorageOperationStatus> eitherVF = Either.left(vf);
215 when(toscaOperationFacade.getToscaElement("SRV1.VF1")).thenReturn(eitherVF);
218 List<RelationMergeInfo> fromRelationsMergeInfo = new ArrayList<>();
219 List<RelationMergeInfo> toRelationsMergeInfo = new ArrayList<>();
221 RelationMergeInfo relationMergeInfo1 = new RelationMergeInfo("CapabilityType1", "capabilityA", "vfc_A", requirementDef1);
222 fromRelationsMergeInfo.add(relationMergeInfo1);
223 RelationMergeInfo relationMergeInfo2 = new RelationMergeInfo("CapabilityType4", "capabilityD", "vfc_D", capabilityDef2);
224 toRelationsMergeInfo.add(relationMergeInfo2);
226 VfRelationsMergeInfo relationsMergeInfo = new VfRelationsMergeInfo(fromRelationsMergeInfo, toRelationsMergeInfo);
228 when(dataHolder.getVfRelationsMergeInfo()).thenReturn(relationsMergeInfo);
230 List<ComponentInstance> componentInstances = new ArrayList<>();
231 componentInstances.add(createVfi("SRV1.VF1", "SRV1.VF1.VFI_2"));
232 componentInstances.add(createVfi("SRV1.VF2", "SRV1.VF2.VFI_1"));
233 componentInstances.add(createVfi("SRV1.VF3", "SRV1.VF3.VFI_1"));
234 componentInstances.add(createVfi("SRV1.VF4", "SRV1.VF4.VFI_1"));
235 componentInstances.add(createVfi("SRV1.VF5", "SRV1.VF5.VFI_1"));
236 updatedContainerComponent.setComponentInstances(componentInstances);
238 List<RequirementCapabilityRelDef> resourceInstancesRelations = new ArrayList<>();
239 updatedContainerComponent.setComponentInstancesRelations(resourceInstancesRelations);
241 when(toscaOperationFacade.associateResourceInstances(Mockito.anyString(), Mockito.anyList())).thenReturn(StorageOperationStatus.OK);
243 compInstanceRelationMerge.mergeDataAfterCreate(user, dataHolder, updatedContainerComponent, "SRV1.VF1.VFI_2");
245 verify(dataHolder).getVfRelationsMergeInfo();
246 verify(toscaOperationFacade).associateResourceInstances(Mockito.anyString(), Mockito.anyList());
248 List<RequirementCapabilityRelDef> relations = updatedContainerComponent.getComponentInstancesRelations();
249 assertEquals("Expected 2 relations", 2, relations.size());
252 RequirementCapabilityRelDef capabilityRelDef = relations.get(0);
253 assertEquals("SRV1.VF1.VFC_4.VFCI_2", capabilityRelDef.resolveSingleRelationship().getRelation().getCapabilityOwnerId());
254 assertEquals("SRV1.VF5.VFI_1", capabilityRelDef.getFromNode());
255 assertEquals("SRV1.VF1.VFI_2", capabilityRelDef.getToNode());
257 RequirementCapabilityRelDef requirementRelDef = relations.get(1);
258 assertEquals("SRV1.VF1.VFC_1.VFCI_2", requirementRelDef.resolveSingleRelationship().getRelation().getRequirementOwnerId());
259 assertEquals("SRV1.VF1.VFI_2", requirementRelDef.getFromNode());
260 assertEquals("SRV1.VF2.VFI_1", requirementRelDef.getToNode());
269 private ComponentInstance createVfi(String vfId, String vfiUniqueId) {
270 ComponentInstance vfi = new ComponentInstance();
271 vfi.setUniqueId(vfiUniqueId);
272 vfi.setComponentUid(vfId);
274 Resource vf = new Resource();
275 vf.setUniqueId(vfId);
279 private ComponentInstance createVfci(String name, String uniqueId, String componentUid, boolean foundVfc) {
280 ComponentInstance compInst = new ComponentInstance();
281 compInst.setName(name);
282 compInst.setUniqueId(uniqueId);
283 compInst.setComponentUid(componentUid);
286 createVfc(componentUid);
289 failLoadVfc(componentUid);
294 private void failLoadVfc(String uid) {
295 Either<Component, StorageOperationStatus> eitherVFC = Either.right(StorageOperationStatus.NOT_FOUND);
296 when(toscaOperationFacade.getToscaElement(uid)).thenReturn(eitherVFC);
299 private Component createVfc(String uid) {
300 Resource vfc = new Resource();
301 vfc.setUniqueId(uid);
303 Map<String, List<CapabilityDefinition>> capabilities = new HashMap<>();
304 Map<String, List<RequirementDefinition>> requirements = new HashMap<>();;
305 IntStream.range(0, 5).forEach(i -> {
307 List<CapabilityDefinition> capList = new LinkedList<>();
309 CapabilityDefinition capDef = new CapabilityDefinition();
310 capDef.setName("CapabilityName" + i);
311 capDef.setUniqueId("Capability" + i);
312 capDef.setType("CapabilityType" + i);
314 capabilities.put("Key" + i, capList);
316 List<RequirementDefinition> reqList = new LinkedList<>();
318 RequirementDefinition reqDef = new RequirementDefinition();
319 reqDef.setName("RequirementName" + i);
320 reqDef.setUniqueId("Requirement" + i);
321 reqDef.setCapability("CapabilityType" + i);
323 requirements.put("Key" + i, reqList);
326 vfc.setCapabilities(capabilities );
327 vfc.setRequirements(requirements);
329 Either<Component, StorageOperationStatus> eitherVFC = Either.left(vfc);
330 when(toscaOperationFacade.getToscaElement(uid)).thenReturn(eitherVFC);
335 private RequirementCapabilityRelDef createRequirementCapabilityDef(String fromNode, String toNode) {
336 RequirementCapabilityRelDef reqCapDef = new RequirementCapabilityRelDef();
338 reqCapDef.setFromNode(fromNode);
339 reqCapDef.setToNode(toNode);
341 List<CapabilityRequirementRelationship> relationships = new ArrayList<>();
342 CapabilityRequirementRelationship capabilityRequirementRelationship = new CapabilityRequirementRelationship();
343 relationships.add(capabilityRequirementRelationship);
344 reqCapDef.setRelationships(relationships);
349 private RequirementCapabilityRelDef createRequirementDef(String fromNode, String toNode, String ownerId, String requirementUid) {
350 RequirementCapabilityRelDef reqCapDef = createRequirementCapabilityDef(fromNode, toNode);
351 CapabilityRequirementRelationship capabilityRequirementRelationship = reqCapDef.resolveSingleRelationship();
353 RelationshipInfo relationshipInfo = new RelationshipInfo();
354 relationshipInfo.setRequirementOwnerId(ownerId);
355 relationshipInfo.setRequirementUid(requirementUid);
356 relationshipInfo.setRelationships(new RelationshipImpl());
357 capabilityRequirementRelationship.setRelation(relationshipInfo );
364 private RequirementCapabilityRelDef createCapabilityDef(String fromNode, String toNode, String ownerId, String capabilityUid) {
365 RequirementCapabilityRelDef reqCapDef = createRequirementCapabilityDef(fromNode, toNode);
366 CapabilityRequirementRelationship capabilityRequirementRelationship = reqCapDef.resolveSingleRelationship();
368 RelationshipInfo relationshipInfo = new RelationshipInfo();
369 relationshipInfo.setCapabilityOwnerId(ownerId);
370 relationshipInfo.setCapabilityUid(capabilityUid);
371 relationshipInfo.setRelationships(new RelationshipImpl());
372 capabilityRequirementRelationship.setRelation(relationshipInfo );