2 * Copyright © 2016-2019 European Support Limited
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 package org.openecomp.sdc.be.tosca;
19 import java.util.Iterator;
21 import org.junit.Assert;
22 import org.junit.Before;
23 import org.junit.Test;
24 import org.mockito.InjectMocks;
25 import org.mockito.Mock;
26 import org.mockito.Mockito;
27 import org.mockito.MockitoAnnotations;
28 import org.openecomp.sdc.be.datatypes.elements.RequirementDataDefinition;
29 import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
30 import org.openecomp.sdc.be.model.CapabilityDefinition;
31 import org.openecomp.sdc.be.model.Component;
32 import org.openecomp.sdc.be.model.ComponentInstance;
33 import org.openecomp.sdc.be.model.ComponentInstanceProperty;
34 import org.openecomp.sdc.be.model.ComponentParametersView;
35 import org.openecomp.sdc.be.model.DataTypeDefinition;
36 import org.openecomp.sdc.be.model.RequirementDefinition;
37 import org.openecomp.sdc.be.model.Resource;
38 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ToscaOperationFacade;
39 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
40 import org.openecomp.sdc.be.tosca.model.SubstitutionMapping;
41 import org.openecomp.sdc.be.tosca.model.ToscaNodeTemplate;
42 import org.openecomp.sdc.be.tosca.model.ToscaNodeType;
43 import org.openecomp.sdc.be.tosca.model.ToscaTemplateCapability;
46 import fj.data.Either;
47 import mockit.Deencapsulation;
48 import org.openecomp.sdc.be.tosca.model.ToscaRequirement;
51 import java.util.stream.Collectors;
53 import static java.util.Arrays.asList;
54 import static org.assertj.core.api.Assertions.assertThat;
55 import static org.mockito.Mockito.doReturn;
57 public class CapabilityRequirementConverterTest {
60 CapabilityRequirementConverter testSubject;
63 ToscaOperationFacade toscaOperationFacade;
65 CapabilityRequirementConverter capabiltyRequirementConvertor = Mockito.spy(new CapabilityRequirementConverter());
66 ComponentInstance instanceProxy = Mockito.spy(new ComponentInstance());
67 ComponentInstance vfInstance = Mockito.spy(new ComponentInstance());
68 Component vfComponent = Mockito.spy(new Resource());
69 ComponentInstance vfcInstance = Mockito.spy(new ComponentInstance());
70 Component vfcComponent = Mockito.spy(new Resource());
73 public void setUpMock() throws Exception {
74 MockitoAnnotations.initMocks(this);
78 public void testGetInstance() {
79 CapabilityRequirementConverter.getInstance();
83 public void testConvertComponentInstanceCapabilties() {
84 Map<String, List<CapabilityDefinition>> capabilities = newCapabilities("port");
85 vfInstance.setCapabilities(capabilities);
86 ToscaNodeTemplate nodeTemplate = new ToscaNodeTemplate();
87 Map<String, DataTypeDefinition> testDataTypes = new HashMap<String, DataTypeDefinition>();
89 capabilities.get("att.Node").clear();
90 testSubject.convertComponentInstanceCapabilities(vfInstance, testDataTypes, nodeTemplate);
92 capabilities = newCapabilities("port");
93 vfInstance.setCapabilities(capabilities);
94 vfInstance.setComponentUid("uid");
96 Mockito.when(toscaOperationFacade.getToscaElement(Mockito.any(String.class),
97 Mockito.any(ComponentParametersView.class)))
98 .thenReturn(Either.right(StorageOperationStatus.BAD_REQUEST));
100 testSubject.convertComponentInstanceCapabilities(vfInstance, testDataTypes, nodeTemplate);
105 public void testConvertComponentInstanceCapabilties_1() {
106 Map<String, List<CapabilityDefinition>> capabilities = newCapabilities("port");
107 ToscaNodeTemplate nodeTemplate = new ToscaNodeTemplate();
108 Map<String, DataTypeDefinition> testDataTypes = new HashMap<String, DataTypeDefinition>();
110 vfInstance.setComponentUid("uid");
112 vfInstance.setCapabilities(capabilities);
114 Mockito.when(toscaOperationFacade.getToscaElement(Mockito.any(String.class),
115 Mockito.any(ComponentParametersView.class)))
116 .thenReturn(Either.right(StorageOperationStatus.BAD_REQUEST));
118 testSubject.convertComponentInstanceCapabilities(vfInstance, testDataTypes, nodeTemplate);
125 public void testConvertSubstitutionMappingRequirements() {
126 Map<String, Component> componentsCache = new HashMap<>();
127 SubstitutionMapping substitution = new SubstitutionMapping();
128 Map<String, List<RequirementDefinition>> requirementsMap = new HashMap<String, List<RequirementDefinition>>();
129 List<RequirementDefinition> requirementsArray = new ArrayList<RequirementDefinition>();
130 RequirementDefinition definition = new RequirementDefinition();
131 definition.setOwnerId("id");
132 definition.setName("name");
133 definition.setParentName("parentName");
134 List<String> path = new ArrayList<>();
137 definition.setPath(path);
138 requirementsArray.add(definition);
139 requirementsMap.put("key", requirementsArray);
140 List<ComponentInstance> instances = new ArrayList<>();
141 ComponentInstance instance = new ComponentInstance();
142 instance.setUniqueId("uid");
143 instances.add(instance);
144 vfComponent.setRequirements(requirementsMap);
145 vfComponent.setComponentInstances(instances);
147 testSubject.convertSubstitutionMappingRequirements(componentsCache, vfComponent, substitution);
151 public void testConvertSubstitutionMappingRequirements_1() {
152 Map<String, Component> componentsCache = new HashMap<>();
153 SubstitutionMapping substitution = new SubstitutionMapping();
154 Map<String, List<RequirementDefinition>> requirementsMap = new HashMap<String, List<RequirementDefinition>>();
155 List<RequirementDefinition> requirementsArray = new ArrayList<RequirementDefinition>();
156 RequirementDefinition definition = new RequirementDefinition();
157 definition.setName("name");
158 definition.setParentName("parentName");
159 List<String> path = new ArrayList<>();
162 definition.setPath(path);
163 requirementsArray.add(definition);
164 requirementsMap.put("key", requirementsArray);
165 List<ComponentInstance> instances = new ArrayList<>();
166 ComponentInstance instance = new ComponentInstance();
167 instance.setUniqueId("id");
168 instance.setComponentUid("id");
169 instances.add(instance);
170 vfComponent.setRequirements(requirementsMap);
171 vfComponent.setComponentInstances(instances);
173 Mockito.when(toscaOperationFacade.getToscaElement(Mockito.any(String.class),
174 Mockito.any(ComponentParametersView.class))).thenReturn(Either.left(vfcComponent));
176 testSubject.convertSubstitutionMappingRequirements(componentsCache, vfComponent, substitution);
180 public void testConvertSubstitutionMappingRequirementsAsMap() {
181 Map<String, Component> componentsCache = new HashMap<>();
182 vfComponent.setRequirements(null);
184 Deencapsulation.invoke(testSubject, "convertSubstitutionMappingRequirementsAsMap", componentsCache,
189 public void testBuildAddSubstitutionMappingsRequirements() {
190 Map<String, Component> componentsCache = new HashMap<>();
191 Map<String, List<RequirementDefinition>> requirementsMap = new HashMap<String, List<RequirementDefinition>>();
192 List<RequirementDefinition> requirementsArray = new ArrayList<RequirementDefinition>();
193 RequirementDefinition definition = new RequirementDefinition();
194 definition.setOwnerId("id");
195 definition.setName("name");
196 definition.setParentName("parentName");
197 List<String> path = new ArrayList<>();
200 definition.setPath(path);
201 requirementsArray.add(definition);
202 requirementsMap.put("key", requirementsArray);
203 vfComponent.setRequirements(requirementsMap);
204 List<ComponentInstance> componentInstances = new ArrayList<>();
205 ComponentInstance instance = new ComponentInstance();
206 instance.setUniqueId("id");
207 componentInstances.add(instance);
209 vfComponent.setComponentInstances(componentInstances);
211 Deencapsulation.invoke(testSubject, "buildAddSubstitutionMappingsRequirements", componentsCache, vfComponent,
216 public void testBuildAddSubstitutionMappingsCapabilities() {
217 Map<String, Component> componentsCache = new HashMap<>();
218 Map<String, List<CapabilityDefinition>> capabilities = new HashMap<>();
220 Deencapsulation.invoke(testSubject, "buildAddSubstitutionMappingsCapabilities", componentsCache, vfComponent,
225 public void testBuildAddSubstitutionMappingsCapabilities_1() {
226 Map<String, Component> componentsCache = new HashMap<>();
227 Map<String, List<CapabilityDefinition>> capabilitiesMap = new HashMap<String, List<CapabilityDefinition>>();
228 List<CapabilityDefinition> capabilitiesArray = new ArrayList<CapabilityDefinition>();
229 CapabilityDefinition definition = new CapabilityDefinition();
230 definition.setOwnerId("id");
231 definition.setName("name");
232 definition.setParentName("parentName");
233 List<String> path = new ArrayList<>();
236 definition.setPath(path);
237 capabilitiesArray.add(definition);
238 capabilitiesMap.put("key", capabilitiesArray);
239 vfComponent.setCapabilities(capabilitiesMap);
240 List<ComponentInstance> componentInstances = new ArrayList<>();
241 ComponentInstance instance = new ComponentInstance();
242 instance.setUniqueId("id");
243 componentInstances.add(instance);
245 vfComponent.setComponentInstances(componentInstances);
247 Deencapsulation.invoke(testSubject, "buildAddSubstitutionMappingsCapabilities", componentsCache, vfComponent,
252 public void testConvertProxyCapabilities() {
253 Map<String, Component> componentsCache = new HashMap<>();
254 Map<String, DataTypeDefinition> dataTypes = new HashMap<>();
256 List<ComponentInstance> componentInstances = new ArrayList<>();
257 ComponentInstance instance = new ComponentInstance();
258 instance.setUniqueId("id");
259 componentInstances.add(instance);
261 vfComponent.setComponentInstances(componentInstances);
263 testSubject.convertProxyCapabilities(componentsCache, instance, dataTypes);
267 public void testConvertProxyRequirementsNoRequirements() {
268 Map<String, Component> componentsCache = new HashMap<>();
270 List<ComponentInstance> componentInstances = new ArrayList<>();
271 ComponentInstance instance = new ComponentInstance();
272 instance.setUniqueId("id");
273 instance.setComponentUid("componentUid");
274 componentInstances.add(instance);
276 vfComponent.setComponentInstances(componentInstances);
278 Mockito.when(toscaOperationFacade.getToscaElement(Mockito.any(String.class),
279 Mockito.any(ComponentParametersView.class)))
280 .thenReturn(Either.right(StorageOperationStatus.BAD_REQUEST));
282 List<Map<String, ToscaRequirement>> proxyRequirements =
283 testSubject.convertProxyRequirements(componentsCache, instance);
284 Assert.assertEquals(0, proxyRequirements.size());
288 public void testConvertProxyRequirementsNotSubstitutedName() {
289 Map<String, Component> componentsCache = new HashMap<>();
290 RequirementDefinition r = new RequirementDefinition();
291 r.setName("port0.dependency");
292 r.setPreviousName("dependency");
293 r.setCapability("tosca.capabilities.Node");
294 r.setNode("tosca.nodes.Root");
295 r.setRelationship("tosca.relationships.DependsOn");
296 r.setMinOccurrences(RequirementDataDefinition.MIN_OCCURRENCES);
297 r.setMaxOccurrences(RequirementDataDefinition.MAX_OCCURRENCES);
299 r.setParentName("parentName");
301 Map<String, List<RequirementDefinition>> requirements = new HashMap<>();
302 List<RequirementDefinition> requirementDefinitions = new ArrayList<>();
303 requirementDefinitions.add(r);
304 requirements.put("dependency", requirementDefinitions);
306 List<ComponentInstance> componentInstances = new ArrayList<>();
307 ComponentInstance instance = new ComponentInstance();
308 instance.setUniqueId("id");
309 instance.setComponentUid("componentUid");
310 instance.setRequirements(requirements);
311 instance.setNormalizedName("port0");
312 componentInstances.add(instance);
314 vfComponent.setComponentInstances(componentInstances);
316 Mockito.when(toscaOperationFacade.getToscaElement(Mockito.any(String.class),
317 Mockito.any(ComponentParametersView.class)))
318 .thenReturn(Either.right(StorageOperationStatus.BAD_REQUEST));
320 List<Map<String, ToscaRequirement>> proxyRequirements =
321 testSubject.convertProxyRequirements(componentsCache, instance);
322 Map<String, ToscaRequirement> proxyRequirement = proxyRequirements.get(0);
323 Assert.assertEquals("dependency", proxyRequirement.keySet().iterator().next());
327 public void testConvertProxyRequirementsSubstitutedName() {
328 Map<String, Component> componentsCache = new HashMap<>();
329 RequirementDefinition r = new RequirementDefinition();
330 r.setName("dependency");
331 r.setPreviousName("dependency");
332 r.setCapability("tosca.capabilities.Node");
333 r.setNode("tosca.nodes.Root");
334 r.setRelationship("tosca.relationships.DependsOn");
335 r.setMinOccurrences(RequirementDataDefinition.MIN_OCCURRENCES);
336 r.setMaxOccurrences(RequirementDataDefinition.MAX_OCCURRENCES);
338 r.setParentName("parentName");
340 Map<String, List<RequirementDefinition>> requirements = new HashMap<>();
341 List<RequirementDefinition> requirementDefinitions = new ArrayList<>();
342 requirementDefinitions.add(r);
343 requirements.put("dependency", requirementDefinitions);
345 List<ComponentInstance> componentInstances = new ArrayList<>();
346 ComponentInstance instance = new ComponentInstance();
347 instance.setUniqueId("id");
348 instance.setComponentUid("componentUid");
349 instance.setRequirements(requirements);
350 instance.setNormalizedName("port0");
351 componentInstances.add(instance);
353 vfComponent.setComponentInstances(componentInstances);
355 Mockito.when(toscaOperationFacade.getToscaElement(Mockito.any(String.class),
356 Mockito.any(ComponentParametersView.class)))
357 .thenReturn(Either.right(StorageOperationStatus.BAD_REQUEST));
359 testSubject.convertProxyRequirements(componentsCache, instance);
363 public void testConvertProxyCapabilitiesWhenCapabilitiesNotNull() {
364 Map<String, Component> componentsCache = new HashMap<>();
365 Map<String, DataTypeDefinition> dataTypes = new HashMap<>();
367 List<ComponentInstance> componentInstances = new ArrayList<>();
368 ComponentInstance instance = new ComponentInstance();
369 instance.setUniqueId("id");
370 componentInstances.add(instance);
372 vfComponent.setComponentInstances(componentInstances);
374 Map<String, List<CapabilityDefinition>> capabilitiesMap = new HashMap<String, List<CapabilityDefinition>>();
375 List<CapabilityDefinition> capabilitiesArray = new ArrayList<CapabilityDefinition>();
376 CapabilityDefinition definition = new CapabilityDefinition();
377 definition.setOwnerId("id");
378 capabilitiesArray.add(definition);
379 capabilitiesMap.put("key", capabilitiesArray);
380 vfComponent.setUniqueId("id");
382 instance.setCapabilities(capabilitiesMap);
383 instance.setComponentUid("uid");
385 Mockito.when(toscaOperationFacade.getToscaElement(Mockito.any(String.class),
386 Mockito.any(ComponentParametersView.class)))
387 .thenReturn(Either.right(StorageOperationStatus.BAD_REQUEST));
389 testSubject.convertProxyCapabilities(componentsCache, instance, dataTypes);
393 public void testConvertSubstitutionMappingCapabilities() {
394 Map<String, Component> componentsCache = new HashMap<>();
396 testSubject.convertSubstitutionMappingCapabilities(componentsCache, vfComponent);
398 Map<String, List<CapabilityDefinition>> capabilitiesMap = new HashMap<String, List<CapabilityDefinition>>();
399 List<CapabilityDefinition> capabilitiesArray = new ArrayList<CapabilityDefinition>();
400 CapabilityDefinition definition = new CapabilityDefinition();
401 definition.setOwnerId("id");
402 definition.setName("name");
403 definition.setParentName("parentName");
404 List<String> path = new ArrayList<>();
407 definition.setPath(path);
408 capabilitiesArray.add(definition);
409 capabilitiesMap.put("key", capabilitiesArray);
410 vfComponent.setCapabilities(capabilitiesMap);
412 List<ComponentInstance> instances = new ArrayList<>();
413 ComponentInstance instance = new ComponentInstance();
414 instance.setUniqueId("uid");
415 instances.add(instance);
416 vfComponent.setComponentInstances(instances);
418 testSubject.convertSubstitutionMappingCapabilities(componentsCache, vfComponent);
423 public void testAppendNameRecursively() {
424 Map<String, Component> componentsCache = new HashMap<>();
425 StringBuilder builder = new StringBuilder();
426 List<String> path = new ArrayList<>();
429 Iterator<String> iter = path.iterator();
430 List<ComponentInstance> resourceInstances = new ArrayList<>();
431 ComponentInstance instance = new ComponentInstance();
432 instance.setUniqueId("id");
433 instance.setComponentUid("uid");
434 resourceInstances.add(instance);
435 vfComponent.setComponentInstances(resourceInstances);
437 Mockito.when(toscaOperationFacade.getToscaElement(Mockito.any(String.class),
438 Mockito.any(ComponentParametersView.class)))
439 .thenReturn(Either.right(StorageOperationStatus.BAD_REQUEST));
441 Deencapsulation.invoke(testSubject, "appendNameRecursively", componentsCache, vfComponent, iter, builder);
446 public void testGetFilter() {
447 ComponentInstance instance = new ComponentInstance();
448 instance.setIsProxy(true);
450 Deencapsulation.invoke(testSubject, "getFilter", instance);
454 public void testGetReducedPathByOwner() throws Exception {
455 List<String> pathList = new ArrayList<>();
456 String uniqueId = "41d3a665-1313-4b5e-9bf0-e901ecf4b806.a77df84e-83eb-4edc-9823-d1f9f6549693.lb_2";
458 String exerpt = "41d3a665-1313-4b5e-9bf0-e901ecf4b806.a77df84e-83eb-4edc-9823-d1f9f6549693.lb_1";
459 String duplicate = "a77df84e-83eb-4edc-9823-d1f9f6549693.c79e9a4a-b172-4323-a2e2-1c48d6603241.lb_swu_direct_4_rvmi";
460 pathList.add(exerpt);
461 pathList.add(duplicate);
462 pathList.add(duplicate);
463 pathList.add(uniqueId);
465 pathList.add("5f172af9-1588-443e-8897-1432b19aad8c.2cb7514a-1e50-4280-8457-baacb97b50bf.vepdgtp4837vf0");
466 pathList.add("86ae128e-3d0a-41f7-a957-db1df9fe598c.9cc8f8ac-6869-4dd6-a6e1-74ecb9570dc4.vepdgtp4837svc_proxy0");
468 List<String> reducedMap = new CapabilityRequirementConverter().getReducedPathByOwner( pathList , uniqueId );
470 assertThat(reducedMap).isNotNull().doesNotContain(exerpt).containsOnlyOnce(duplicate).hasSize(4);
472 List<String> path = new ArrayList<String>();
474 capabiltyRequirementConvertor.getReducedPathByOwner(path, uniqueId);
477 capabiltyRequirementConvertor.getReducedPathByOwner(path, uniqueId);
478 capabiltyRequirementConvertor.getReducedPathByOwner(path, "");
481 // generate stub capability
482 private Map<String, List<CapabilityDefinition>> newCapabilities(String capabilityName) {
483 Map<String, List<CapabilityDefinition>> capabilities = new HashMap<>();
484 List<CapabilityDefinition> list = new ArrayList<>();
485 CapabilityDefinition capabilityDefinition = new CapabilityDefinition();
486 capabilityDefinition.setName(capabilityName);
487 capabilityDefinition.setType("att.Node");
488 List<ComponentInstanceProperty> properties = new ArrayList<>();
489 ComponentInstanceProperty prop = new ComponentInstanceProperty();
490 prop.setValue("value");
491 properties.add(prop);
492 capabilityDefinition.setProperties(properties);
493 List<String> pathList = new ArrayList<>();
495 capabilityDefinition.setOwnerId("41d3a665-1313-4b5e-9bf0-e901ecf4b806.a77df84e-83eb-4edc-9823-d1f9f6549693");
496 pathList.add("41d3a665-1313-4b5e-9bf0-e901ecf4b806.a77df84e-83eb-4edc-9823-d1f9f6549693.lb_1");
497 // pathList.add("a77df84e-83eb-4edc-9823-d1f9f6549693.c79e9a4a-b172-4323-a2e2-1c48d6603241.lb_swu_direct_4_rvmi");
498 pathList.add("5f172af9-1588-443e-8897-1432b19aad8c.2cb7514a-1e50-4280-8457-baacb97b50bf.vepdgtp4837vf0");
499 pathList.add("86ae128e-3d0a-41f7-a957-db1df9fe598c.9cc8f8ac-6869-4dd6-a6e1-74ecb9570dc4.vepdgtp4837svc_proxy0");
501 capabilityDefinition.setPath(pathList);
502 list.add(capabilityDefinition);
503 capabilities.put(capabilityDefinition.getType(), list);
509 public void testBuildName() {
510 doReturn("1").when(instanceProxy).getActualComponentUid();
511 doReturn("2").when(vfInstance).getActualComponentUid();
512 doReturn("3").when(vfcInstance).getActualComponentUid();
514 Component proxyOrigin = new Resource();
516 proxyOrigin.setName("vepdgtp4837svc_proxy0");
517 proxyOrigin.setComponentType(ComponentTypeEnum.RESOURCE);
518 proxyOrigin.setComponentInstances(asList(vfInstance));
522 vfInstance.setName("vepdgtp4837vf0");
523 vfInstance.setNormalizedName("vepdgtp4837vf0");
524 vfInstance.setUniqueId(
525 "5f172af9-1588-443e-8897-1432b19aad8c.2cb7514a-1e50-4280-8457-baacb97b50bf.vepdgtp4837vf0");
526 vfComponent.setName("vepdgtp4837vf0"); // origin
527 vfComponent.setComponentInstances(Arrays.asList(vfcInstance));
528 vfcInstance.setUniqueId("41d3a665-1313-4b5e-9bf0-e901ecf4b806.a77df84e-83eb-4edc-9823-d1f9f6549693.lb_1");
529 vfcInstance.setName("lb_1");
530 vfcInstance.setNormalizedName("lb_1");
531 vfcInstance.setName("41d3a665-1313-4b5e-9bf0-e901ecf4b806.a77df84e-83eb-4edc-9823-d1f9f6549693.lb_1");
532 vfcComponent.setName("lb_1");
534 Map<String, List<CapabilityDefinition>> capabilities = newCapabilities("port");
535 vfcComponent.setCapabilities(capabilities);
536 Map<Component, ComponentInstance> map = Collections
537 .unmodifiableMap(new HashMap<Component, ComponentInstance>() {
539 put(proxyOrigin, null);
540 put(vfComponent, vfInstance);
541 put(vfcComponent, vfcInstance);
544 Map<String, Component> cache = Collections.unmodifiableMap(new HashMap<String, Component>() {
546 put("1", proxyOrigin);
547 put("2", vfComponent);
548 put("3", vfcComponent);
551 instanceProxy.setCapabilities(capabilities);
552 proxyOrigin.setCapabilities(capabilities);
553 List<CapabilityDefinition> flatList = capabilities.values().stream().flatMap(List::stream)
554 .collect(Collectors.toList());
555 flatList.stream().forEach((CapabilityDefinition capabilityDefinition) -> {
556 String name = capabiltyRequirementConvertor.buildCapabilityNameForComponentInstance(cache, instanceProxy,
557 capabilityDefinition);
558 System.out.println("built name -> " + name);
559 assertThat(name).isEqualTo("vepdgtp4837vf0.lb_1." + capabilityDefinition.getName());