1 package org.openecomp.sdc.be.components.merge.instance;
4 import org.junit.Before;
6 import org.junit.runner.RunWith;
7 import org.mockito.ArgumentCaptor;
8 import org.mockito.Captor;
9 import org.mockito.Mock;
10 import org.mockito.Mockito;
11 import org.mockito.junit.MockitoJUnitRunner;
12 import org.openecomp.sdc.be.components.merge.utils.MergeInstanceUtils;
13 import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
14 import org.openecomp.sdc.be.datatypes.enums.ResourceTypeEnum;
15 import org.openecomp.sdc.be.model.CapabilityDefinition;
16 import org.openecomp.sdc.be.model.CapabilityRequirementRelationship;
17 import org.openecomp.sdc.be.model.Component;
18 import org.openecomp.sdc.be.model.ComponentInstance;
19 import org.openecomp.sdc.be.model.RelationshipImpl;
20 import org.openecomp.sdc.be.model.RelationshipInfo;
21 import org.openecomp.sdc.be.model.RequirementCapabilityRelDef;
22 import org.openecomp.sdc.be.model.RequirementDefinition;
23 import org.openecomp.sdc.be.model.Resource;
24 import org.openecomp.sdc.be.model.Service;
25 import org.openecomp.sdc.be.model.User;
26 import org.openecomp.sdc.be.model.jsontitan.operations.ToscaOperationFacade;
27 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
29 import java.util.ArrayList;
30 import java.util.HashMap;
31 import java.util.LinkedList;
32 import java.util.List;
34 import java.util.stream.IntStream;
36 import static org.junit.Assert.assertEquals;
37 import static org.junit.Assert.assertNotNull;
38 import static org.junit.Assert.assertNull;
39 import static org.mockito.Mockito.verify;
40 import static org.mockito.Mockito.when;
42 @RunWith(MockitoJUnitRunner.class)
43 public class ComponentInstanceRelationMergeTest {
44 private ComponentInstanceRelationMerge compInstanceRelationMerge;
46 private DataForMergeHolder dataHolder;
47 private Component containerComponent;
48 private Component updatedContainerComponent;
49 private ComponentInstance currentResourceInstance;
51 private RequirementCapabilityRelDef requirementDef1;
52 private RequirementCapabilityRelDef requirementDef2;
53 private RequirementCapabilityRelDef capabilityDef1;
54 private RequirementCapabilityRelDef capabilityDef2;
57 private ToscaOperationFacade toscaOperationFacade;
63 ArgumentCaptor<VfRelationsMergeInfo> argumentCaptor;
67 public void startUp() {
68 compInstanceRelationMerge = new ComponentInstanceRelationMerge();
69 compInstanceRelationMerge.setToscaOperationFacade(toscaOperationFacade);
71 MergeInstanceUtils mergeInstanceUtils = new MergeInstanceUtils();
72 mergeInstanceUtils.setToscaOperationFacade(toscaOperationFacade);
73 compInstanceRelationMerge.setMergeInstanceUtils(mergeInstanceUtils);
75 containerComponent = new Service();
76 List<RequirementCapabilityRelDef> resourceInstancesRelations = new ArrayList<>();
78 requirementDef1 = createRequirementDef("SRV1.VF1.VFI_1", "SRV1.VF2.VFI_1", "SRV1.VF1.VFC_1.VFCI_1", "Requirement1");
79 resourceInstancesRelations.add(requirementDef1);
80 requirementDef2 = createRequirementDef("SRV1.VF1.VFI_1", "SRV1.VF3.VFI_1", "SRV1.VF1.VFC_2.VFCI_2", "Requirement2");
81 resourceInstancesRelations.add(requirementDef2);
84 capabilityDef1 = createCapabilityDef("SRV1.VF4.VFI_1", "SRV1.VF1.VFI_1", "SRV1.VF1.VFC_3.VFCI_3", "Capability3");
85 resourceInstancesRelations.add(capabilityDef1);
86 capabilityDef2 = createCapabilityDef("SRV1.VF5.VFI_1", "SRV1.VF1.VFI_1", "SRV1.VF1.VFC_4.VFCI_1", "Capability4");
87 resourceInstancesRelations.add(capabilityDef2);
89 containerComponent.setComponentInstancesRelations(resourceInstancesRelations );
91 currentResourceInstance = new ComponentInstance();
92 currentResourceInstance.setUniqueId("SRV1.VF1.VFI_1");
93 currentResourceInstance.setComponentUid("SRV1.VF1");
94 currentResourceInstance.setIsProxy(false);
96 updatedContainerComponent = new Service();
97 updatedContainerComponent.setUniqueId("123123123123123123");
101 public void testSaveDataBeforeMerge() {
102 Resource vf = new Resource();
104 List<ComponentInstance> vfcInstances = new ArrayList<>();
105 vfcInstances.add(createVfci("vfc_A", "SRV1.VF1.VFC_1.VFCI_1", "SRV1.VF1.VFC_1", true));
106 vfcInstances.add(createVfci("vfc_B", "SRV1.VF1.VFC_2.VFCI_2", "SRV1.VF1.VFC_2", true));
107 vfcInstances.add(createVfci("vfc_C", "SRV1.VF1.VFC_3.VFCI_3", "SRV1.VF1.VFC_3", false));
108 vfcInstances.add(createVfci("vfc_D", "SRV1.VF1.VFC_4.VFCI_1", "SRV1.VF1.VFC_4", true));
109 vf.setComponentInstances(vfcInstances);
110 vf.setComponentType(ComponentTypeEnum.RESOURCE);
111 vf.setResourceType(ResourceTypeEnum.VF);
113 compInstanceRelationMerge.saveDataBeforeMerge(dataHolder, containerComponent, currentResourceInstance, vf);
115 verify(dataHolder).setVfRelationsInfo(argumentCaptor.capture());
116 VfRelationsMergeInfo relationsMergeInfo = argumentCaptor.getValue();
117 List<RelationMergeInfo> fromRelationsMergeInfo = relationsMergeInfo.getFromRelationsInfo();
118 List<RelationMergeInfo> toRelationsMergeInfo = relationsMergeInfo.getToRelationsInfo();
120 assertNotNull("Expected not null list of relations merge info", fromRelationsMergeInfo);
121 assertNotNull("Expected not null list of relations merge info", toRelationsMergeInfo);
123 assertEquals("Expected 2 elements", 2, fromRelationsMergeInfo.size());
124 assertEquals("Expected 1 elements", 1, toRelationsMergeInfo.size());
128 public void testMergeDataAfterCreate_NoSavedData() {
129 compInstanceRelationMerge.mergeDataAfterCreate(user, dataHolder, updatedContainerComponent, "SRV1.VF1.VFI_2");
131 verify(dataHolder).getVfRelationsMergeInfo();
132 List<RequirementCapabilityRelDef> relations = updatedContainerComponent.getComponentInstancesRelations();
133 assertNull("Expected no relations", relations);
137 public void testMergeDataAfterCreate() {
138 Resource vf = new Resource();
140 List<ComponentInstance> vfcInstances = new ArrayList<>();
141 vfcInstances.add(createVfci("vfc_A", "SRV1.VF1.VFC_1.VFCI_1", "SRV1.VF1.VFC_1", true));
142 vfcInstances.add(createVfci("vfc_B", "SRV1.VF1.VFC_2.VFCI_2", "SRV1.VF1.VFC_2", true));
143 vfcInstances.add(createVfci("vfc_C", "SRV1.VF1.VFC_3.VFCI_3", "SRV1.VF1.VFC_3", false));
144 vfcInstances.add(createVfci("vfc_D", "SRV1.VF1.VFC_4.VFCI_1", "SRV1.VF1.VFC_4", true));
145 vf.setComponentInstances(vfcInstances);
146 vf.setComponentType(ComponentTypeEnum.RESOURCE);
147 vf.setResourceType(ResourceTypeEnum.VF);
149 Either<Component, StorageOperationStatus> eitherVF = Either.left(vf);
150 when(toscaOperationFacade.getToscaElement("SRV1.VF1")).thenReturn(eitherVF);
153 List<RelationMergeInfo> fromRelationsMergeInfo = new ArrayList<>();
154 List<RelationMergeInfo> toRelationsMergeInfo = new ArrayList<>();
156 RelationMergeInfo relationMergeInfo1 = new RelationMergeInfo("CapabilityType1", "capabilityA", "vfc_A", requirementDef1);
157 fromRelationsMergeInfo.add(relationMergeInfo1);
158 RelationMergeInfo relationMergeInfo2 = new RelationMergeInfo("CapabilityType4", "capabilityD", "vfc_D", capabilityDef2);
159 toRelationsMergeInfo.add(relationMergeInfo2);
161 VfRelationsMergeInfo relationsMergeInfo = new VfRelationsMergeInfo(fromRelationsMergeInfo, toRelationsMergeInfo);
163 when(dataHolder.getVfRelationsMergeInfo()).thenReturn(relationsMergeInfo);
165 List<ComponentInstance> componentInstances = new ArrayList<>();
166 componentInstances.add(createVfi("SRV1.VF1", "SRV1.VF1.VFI_2"));
167 componentInstances.add(createVfi("SRV1.VF2", "SRV1.VF2.VFI_1"));
168 componentInstances.add(createVfi("SRV1.VF3", "SRV1.VF3.VFI_1"));
169 componentInstances.add(createVfi("SRV1.VF4", "SRV1.VF4.VFI_1"));
170 componentInstances.add(createVfi("SRV1.VF5", "SRV1.VF5.VFI_1"));
171 updatedContainerComponent.setComponentInstances(componentInstances);
173 List<RequirementCapabilityRelDef> resourceInstancesRelations = new ArrayList<>();
174 updatedContainerComponent.setComponentInstancesRelations(resourceInstancesRelations);
176 when(toscaOperationFacade.associateResourceInstances(Mockito.anyString(), Mockito.anyList())).thenReturn(StorageOperationStatus.OK);
178 compInstanceRelationMerge.mergeDataAfterCreate(user, dataHolder, updatedContainerComponent, "SRV1.VF1.VFI_2");
180 verify(dataHolder).getVfRelationsMergeInfo();
181 verify(toscaOperationFacade).associateResourceInstances(Mockito.anyString(), Mockito.anyList());
183 List<RequirementCapabilityRelDef> relations = updatedContainerComponent.getComponentInstancesRelations();
184 assertEquals("Expected 2 relations", 2, relations.size());
187 RequirementCapabilityRelDef capabilityRelDef = relations.get(0);
188 assertEquals("SRV1.VF1.VFC_4.VFCI_1", capabilityRelDef.resolveSingleRelationship().getRelation().getCapabilityOwnerId());
189 assertEquals("SRV1.VF5.VFI_1", capabilityRelDef.getFromNode());
190 assertEquals("SRV1.VF1.VFI_2", capabilityRelDef.getToNode());
192 RequirementCapabilityRelDef requirementRelDef = relations.get(1);
193 assertEquals("SRV1.VF1.VFC_1.VFCI_1", requirementRelDef.resolveSingleRelationship().getRelation().getRequirementOwnerId());
194 assertEquals("SRV1.VF1.VFI_2", requirementRelDef.getFromNode());
195 assertEquals("SRV1.VF2.VFI_1", requirementRelDef.getToNode());
201 public void testMergeDataAfterCreate_OwnerChanged() {
202 Resource vf = new Resource();
204 List<ComponentInstance> vfcInstances = new ArrayList<>();
205 vfcInstances.add(createVfci("vfc_A", "SRV1.VF1.VFC_1.VFCI_2", "SRV1.VF1.VFC_1", true));
206 vfcInstances.add(createVfci("vfc_B", "SRV1.VF1.VFC_2.VFCI_2", "SRV1.VF1.VFC_2", true));
207 vfcInstances.add(createVfci("vfc_C", "SRV1.VF1.VFC_3.VFCI_3", "SRV1.VF1.VFC_3", false));
208 vfcInstances.add(createVfci("vfc_D", "SRV1.VF1.VFC_4.VFCI_2", "SRV1.VF1.VFC_4", true));
209 vf.setComponentInstances(vfcInstances);
210 vf.setComponentType(ComponentTypeEnum.RESOURCE);
211 vf.setResourceType(ResourceTypeEnum.VF);
213 Either<Component, StorageOperationStatus> eitherVF = Either.left(vf);
214 when(toscaOperationFacade.getToscaElement("SRV1.VF1")).thenReturn(eitherVF);
217 List<RelationMergeInfo> fromRelationsMergeInfo = new ArrayList<>();
218 List<RelationMergeInfo> toRelationsMergeInfo = new ArrayList<>();
220 RelationMergeInfo relationMergeInfo1 = new RelationMergeInfo("CapabilityType1", "capabilityA", "vfc_A", requirementDef1);
221 fromRelationsMergeInfo.add(relationMergeInfo1);
222 RelationMergeInfo relationMergeInfo2 = new RelationMergeInfo("CapabilityType4", "capabilityD", "vfc_D", capabilityDef2);
223 toRelationsMergeInfo.add(relationMergeInfo2);
225 VfRelationsMergeInfo relationsMergeInfo = new VfRelationsMergeInfo(fromRelationsMergeInfo, toRelationsMergeInfo);
227 when(dataHolder.getVfRelationsMergeInfo()).thenReturn(relationsMergeInfo);
229 List<ComponentInstance> componentInstances = new ArrayList<>();
230 componentInstances.add(createVfi("SRV1.VF1", "SRV1.VF1.VFI_2"));
231 componentInstances.add(createVfi("SRV1.VF2", "SRV1.VF2.VFI_1"));
232 componentInstances.add(createVfi("SRV1.VF3", "SRV1.VF3.VFI_1"));
233 componentInstances.add(createVfi("SRV1.VF4", "SRV1.VF4.VFI_1"));
234 componentInstances.add(createVfi("SRV1.VF5", "SRV1.VF5.VFI_1"));
235 updatedContainerComponent.setComponentInstances(componentInstances);
237 List<RequirementCapabilityRelDef> resourceInstancesRelations = new ArrayList<>();
238 updatedContainerComponent.setComponentInstancesRelations(resourceInstancesRelations);
240 when(toscaOperationFacade.associateResourceInstances(Mockito.anyString(), Mockito.anyList())).thenReturn(StorageOperationStatus.OK);
242 compInstanceRelationMerge.mergeDataAfterCreate(user, dataHolder, updatedContainerComponent, "SRV1.VF1.VFI_2");
244 verify(dataHolder).getVfRelationsMergeInfo();
245 verify(toscaOperationFacade).associateResourceInstances(Mockito.anyString(), Mockito.anyList());
247 List<RequirementCapabilityRelDef> relations = updatedContainerComponent.getComponentInstancesRelations();
248 assertEquals("Expected 2 relations", 2, relations.size());
251 RequirementCapabilityRelDef capabilityRelDef = relations.get(0);
252 assertEquals("SRV1.VF1.VFC_4.VFCI_2", capabilityRelDef.resolveSingleRelationship().getRelation().getCapabilityOwnerId());
253 assertEquals("SRV1.VF5.VFI_1", capabilityRelDef.getFromNode());
254 assertEquals("SRV1.VF1.VFI_2", capabilityRelDef.getToNode());
256 RequirementCapabilityRelDef requirementRelDef = relations.get(1);
257 assertEquals("SRV1.VF1.VFC_1.VFCI_2", requirementRelDef.resolveSingleRelationship().getRelation().getRequirementOwnerId());
258 assertEquals("SRV1.VF1.VFI_2", requirementRelDef.getFromNode());
259 assertEquals("SRV1.VF2.VFI_1", requirementRelDef.getToNode());
268 private ComponentInstance createVfi(String vfId, String vfiUniqueId) {
269 ComponentInstance vfi = new ComponentInstance();
270 vfi.setUniqueId(vfiUniqueId);
271 vfi.setComponentUid(vfId);
273 Resource vf = new Resource();
274 vf.setUniqueId(vfId);
278 private ComponentInstance createVfci(String name, String uniqueId, String componentUid, boolean foundVfc) {
279 ComponentInstance compInst = new ComponentInstance();
280 compInst.setName(name);
281 compInst.setUniqueId(uniqueId);
282 compInst.setComponentUid(componentUid);
285 createVfc(componentUid);
288 failLoadVfc(componentUid);
293 private void failLoadVfc(String uid) {
294 Either<Component, StorageOperationStatus> eitherVFC = Either.right(StorageOperationStatus.NOT_FOUND);
295 when(toscaOperationFacade.getToscaElement(uid)).thenReturn(eitherVFC);
298 private Component createVfc(String uid) {
299 Resource vfc = new Resource();
300 vfc.setUniqueId(uid);
302 Map<String, List<CapabilityDefinition>> capabilities = new HashMap<>();
303 Map<String, List<RequirementDefinition>> requirements = new HashMap<>();;
304 IntStream.range(0, 5).forEach(i -> {
306 List<CapabilityDefinition> capList = new LinkedList<>();
308 CapabilityDefinition capDef = new CapabilityDefinition();
309 capDef.setName("CapabilityName" + i);
310 capDef.setUniqueId("Capability" + i);
311 capDef.setType("CapabilityType" + i);
313 capabilities.put("Key" + i, capList);
315 List<RequirementDefinition> reqList = new LinkedList<>();
317 RequirementDefinition reqDef = new RequirementDefinition();
318 reqDef.setName("RequirementName" + i);
319 reqDef.setUniqueId("Requirement" + i);
320 reqDef.setCapability("CapabilityType" + i);
322 requirements.put("Key" + i, reqList);
325 vfc.setCapabilities(capabilities );
326 vfc.setRequirements(requirements);
328 Either<Component, StorageOperationStatus> eitherVFC = Either.left(vfc);
329 when(toscaOperationFacade.getToscaElement(uid)).thenReturn(eitherVFC);
334 private RequirementCapabilityRelDef createRequirementCapabilityDef(String fromNode, String toNode) {
335 RequirementCapabilityRelDef reqCapDef = new RequirementCapabilityRelDef();
337 reqCapDef.setFromNode(fromNode);
338 reqCapDef.setToNode(toNode);
340 List<CapabilityRequirementRelationship> relationships = new ArrayList<>();
341 CapabilityRequirementRelationship capabilityRequirementRelationship = new CapabilityRequirementRelationship();
342 relationships.add(capabilityRequirementRelationship);
343 reqCapDef.setRelationships(relationships);
348 private RequirementCapabilityRelDef createRequirementDef(String fromNode, String toNode, String ownerId, String requirementUid) {
349 RequirementCapabilityRelDef reqCapDef = createRequirementCapabilityDef(fromNode, toNode);
350 CapabilityRequirementRelationship capabilityRequirementRelationship = reqCapDef.resolveSingleRelationship();
352 RelationshipInfo relationshipInfo = new RelationshipInfo();
353 relationshipInfo.setRequirementOwnerId(ownerId);
354 relationshipInfo.setRequirementUid(requirementUid);
355 relationshipInfo.setRelationships(new RelationshipImpl());
356 capabilityRequirementRelationship.setRelation(relationshipInfo );
363 private RequirementCapabilityRelDef createCapabilityDef(String fromNode, String toNode, String ownerId, String capabilityUid) {
364 RequirementCapabilityRelDef reqCapDef = createRequirementCapabilityDef(fromNode, toNode);
365 CapabilityRequirementRelationship capabilityRequirementRelationship = reqCapDef.resolveSingleRelationship();
367 RelationshipInfo relationshipInfo = new RelationshipInfo();
368 relationshipInfo.setCapabilityOwnerId(ownerId);
369 relationshipInfo.setCapabilityUid(capabilityUid);
370 relationshipInfo.setRelationships(new RelationshipImpl());
371 capabilityRequirementRelationship.setRelation(relationshipInfo );