1 package org.openecomp.sdc.tosca.services.impl;
3 import org.openecomp.sdc.common.errors.CoreException;
4 import org.openecomp.sdc.tosca.TestUtil;
5 import org.openecomp.sdc.tosca.datatypes.ToscaNodeType;
6 import org.openecomp.sdc.tosca.datatypes.ToscaServiceModel;
7 import org.openecomp.sdc.tosca.services.ToscaAnalyzerService;
8 import org.openecomp.sdc.tosca.services.ToscaConstants;
9 import org.openecomp.sdc.tosca.services.yamlutil.ToscaExtensionYamlUtil;
10 import org.junit.Before;
11 import org.junit.BeforeClass;
12 import org.junit.Rule;
13 import org.junit.Test;
14 import org.junit.rules.ExpectedException;
15 import org.junit.runner.RunWith;
16 import org.mockito.Mock;
17 import org.mockito.MockitoAnnotations;
18 import org.mockito.runners.MockitoJUnitRunner;
19 import org.openecomp.sdc.tosca.datatypes.model.Import;
20 import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate;
21 import org.openecomp.sdc.tosca.datatypes.model.NodeType;
22 import org.openecomp.sdc.tosca.datatypes.model.RequirementAssignment;
23 import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate;
24 import org.openecomp.sdc.tosca.datatypes.model.SubstitutionMapping;
25 import org.openecomp.sdc.tosca.datatypes.model.TopologyTemplate;
27 import java.io.IOException;
28 import java.io.InputStream;
29 import java.util.HashMap;
30 import java.util.List;
32 import java.util.Optional;
34 import static org.junit.Assert.*;
35 import static org.mockito.Mockito.when;
37 @RunWith(MockitoJUnitRunner.class)
38 public class ToscaAnalyzerServiceImplTest {
41 SrvTmp: ServiceTemplate
46 private static ToscaAnalyzerService toscaAnalyzerService;
47 private static ToscaServiceModel toscaServiceModel;
49 public ExpectedException thrown = ExpectedException.none();
52 NodeTemplate nodeTemplateMock;
54 ToscaServiceModel toscaServiceModelMock;
57 public static void onlyOnceSetUp() throws IOException {
58 toscaAnalyzerService = new ToscaAnalyzerServiceImpl();
59 toscaServiceModel = TestUtil.loadToscaServiceModel("/mock/analyzerService/toscasubstitution/",
60 "/mock/globalServiceTemplates/", null);
64 public void init() throws IOException {
65 MockitoAnnotations.initMocks(this);
69 public void testGetRequirements() throws Exception {
70 ToscaExtensionYamlUtil toscaExtensionYamlUtil = new ToscaExtensionYamlUtil();
71 InputStream yamlFile = toscaExtensionYamlUtil
72 .loadYamlFileIs("/mock/analyzerService/NestedServiceTemplateReqTest.yaml");
73 ServiceTemplate serviceTemplateFromYaml =
74 toscaExtensionYamlUtil.yamlToObject(yamlFile, ServiceTemplate.class);
77 serviceTemplateFromYaml.getTopology_template().getNode_templates().get("cmaui_port_0");
78 List<RequirementAssignment> reqList =
79 toscaAnalyzerService.getRequirements(port_0, ToscaConstants.BINDING_REQUIREMENT_ID);
80 assertEquals(1, reqList.size());
84 serviceTemplateFromYaml.getTopology_template().getNode_templates().get("cmaui1_port_1");
85 reqList = toscaAnalyzerService.getRequirements(port_1, ToscaConstants.LINK_REQUIREMENT_ID);
86 assertEquals(2, reqList.size());
89 reqList = toscaAnalyzerService.getRequirements(port_0, ToscaConstants.LINK_REQUIREMENT_ID);
90 assertEquals(0, reqList.size());
94 public void testGetNodeTemplateById() throws Exception {
95 ServiceTemplate emptyServiceTemplate = new ServiceTemplate();
96 Optional<NodeTemplate> nodeTemplate =
97 toscaAnalyzerService.getNodeTemplateById(emptyServiceTemplate, "test_net222");
98 assertEquals(false, nodeTemplate.isPresent());
100 ServiceTemplate mainServiceTemplate = toscaServiceModel.getServiceTemplates()
101 .get(toscaServiceModel.getEntryDefinitionServiceTemplate());
102 nodeTemplate = toscaAnalyzerService.getNodeTemplateById(mainServiceTemplate, "test_net");
103 assertEquals(true, nodeTemplate.isPresent());
105 nodeTemplate = toscaAnalyzerService.getNodeTemplateById(mainServiceTemplate, "test_net222");
106 assertEquals(false, nodeTemplate.isPresent());
110 public void testGetSubstituteServiceTemplateName() throws Exception {
111 thrown.expect(CoreException.class);
112 thrown.expectMessage(
113 "Invalid Substitute Node Template invalid2, mandatory map property service_template_filter with mandatory key substitute_service_template must be defined.");
115 ServiceTemplate mainServiceTemplate = toscaServiceModel.getServiceTemplates()
116 .get(toscaServiceModel.getEntryDefinitionServiceTemplate());
117 Optional<NodeTemplate> notSubstitutableNodeTemplate =
118 toscaAnalyzerService.getNodeTemplateById(mainServiceTemplate, "test_net");
119 Optional<String> substituteServiceTemplateName = toscaAnalyzerService
120 .getSubstituteServiceTemplateName("test_net", notSubstitutableNodeTemplate.get());
121 assertEquals(false, substituteServiceTemplateName.isPresent());
123 Optional<NodeTemplate> substitutableNodeTemplate =
124 toscaAnalyzerService.getNodeTemplateById(mainServiceTemplate, "test_nested");
125 substituteServiceTemplateName = toscaAnalyzerService
126 .getSubstituteServiceTemplateName("test_nested", substitutableNodeTemplate.get());
127 assertEquals(true, substituteServiceTemplateName.isPresent());
128 assertEquals("nestedServiceTemplate.yaml", substituteServiceTemplateName.get());
130 NodeTemplate invalidSubstitutableNodeTemplate1 = new NodeTemplate();
131 substituteServiceTemplateName = toscaAnalyzerService
132 .getSubstituteServiceTemplateName("invalid1", invalidSubstitutableNodeTemplate1);
133 assertEquals(false, substituteServiceTemplateName.isPresent());
136 NodeTemplate invalidSubstitutableNodeTemplate2 = substitutableNodeTemplate.get();
137 Object serviceTemplateFilter = invalidSubstitutableNodeTemplate2.getProperties()
138 .get(ToscaConstants.SERVICE_TEMPLATE_FILTER_PROPERTY_NAME);
139 ((Map) serviceTemplateFilter).clear();
141 .getSubstituteServiceTemplateName("invalid2", invalidSubstitutableNodeTemplate2);
148 public void testGetSubstitutableNodeTemplates() throws Exception {
149 ToscaExtensionYamlUtil toscaExtensionYamlUtil = new ToscaExtensionYamlUtil();
150 InputStream yamlFile = toscaExtensionYamlUtil
151 .loadYamlFileIs("/mock/analyzerService/ServiceTemplateSubstituteTest.yaml");
152 ServiceTemplate serviceTemplateFromYaml =
153 toscaExtensionYamlUtil.yamlToObject(yamlFile, ServiceTemplate.class);
155 Map<String, NodeTemplate> substitutableNodeTemplates =
156 toscaAnalyzerService.getSubstitutableNodeTemplates(serviceTemplateFromYaml);
157 assertEquals(2, substitutableNodeTemplates.size());
158 assertNotNull(substitutableNodeTemplates.get("test_nested1"));
159 assertNotNull(substitutableNodeTemplates.get("test_nested2"));
161 ServiceTemplate emptyServiceTemplate = new ServiceTemplate();
162 emptyServiceTemplate.setTopology_template(new TopologyTemplate());
163 substitutableNodeTemplates =
164 toscaAnalyzerService.getSubstitutableNodeTemplates(emptyServiceTemplate);
165 assertEquals(0, substitutableNodeTemplates.size());
167 yamlFile = toscaExtensionYamlUtil
168 .loadYamlFileIs("/mock/analyzerService/NestedServiceTemplateReqTest.yaml");
169 serviceTemplateFromYaml = toscaExtensionYamlUtil.yamlToObject(yamlFile, ServiceTemplate.class);
170 substitutableNodeTemplates =
171 toscaAnalyzerService.getSubstitutableNodeTemplates(serviceTemplateFromYaml);
172 assertEquals(0, substitutableNodeTemplates.size());
176 public void testGetSubstitutionMappedNodeTemplateByExposedReq() throws Exception {
177 thrown.expect(CoreException.class);
178 thrown.expectMessage(
179 "Invalid Tosca model data, missing 'Node Template' entry for 'Node Template' id cmaui_port_9");
180 ToscaExtensionYamlUtil toscaExtensionYamlUtil = new ToscaExtensionYamlUtil();
181 InputStream yamlFile = toscaExtensionYamlUtil
182 .loadYamlFileIs("/mock/analyzerService/NestedServiceTemplateReqTest.yaml");
183 ServiceTemplate nestedServiceTemplateFromYaml =
184 toscaExtensionYamlUtil.yamlToObject(yamlFile, ServiceTemplate.class);
186 Optional<Map.Entry<String, NodeTemplate>> mappedNodeTemplate = toscaAnalyzerService
187 .getSubstitutionMappedNodeTemplateByExposedReq("NestedServiceTemplateSubstituteTest.yaml",
188 nestedServiceTemplateFromYaml, "local_storage_server_cmaui");
189 assertEquals("server_cmaui", mappedNodeTemplate.get().getKey());
190 assertNotNull(mappedNodeTemplate.get().getValue());
192 mappedNodeTemplate = toscaAnalyzerService
193 .getSubstitutionMappedNodeTemplateByExposedReq("NestedServiceTemplateSubstituteTest.yaml",
194 nestedServiceTemplateFromYaml, "link_cmaui_port_invalid");
195 assertEquals("server_cmaui", mappedNodeTemplate.get().getKey());
196 assertNotNull(mappedNodeTemplate.get().getValue());
198 ServiceTemplate mainServiceTemplate = toscaServiceModel.getServiceTemplates()
199 .get(toscaServiceModel.getEntryDefinitionServiceTemplate());
200 mappedNodeTemplate = toscaAnalyzerService.getSubstitutionMappedNodeTemplateByExposedReq(
201 toscaServiceModel.getEntryDefinitionServiceTemplate(), mainServiceTemplate,
202 "local_storage_server_cmaui");
203 assertEquals(false, mappedNodeTemplate.isPresent());
207 public void invalidSubstitutableMapping() throws Exception {
208 thrown.expect(CoreException.class);
209 thrown.expectMessage(
210 "Invalid Substitution Service Template invalidMappingServiceTemplate.yaml, missing mandatory file 'Node type' in substitution mapping.");
211 ServiceTemplate invalidMappingServiceTemplate = new ServiceTemplate();
212 invalidMappingServiceTemplate.setTopology_template(new TopologyTemplate());
213 invalidMappingServiceTemplate.getTopology_template()
214 .setSubstitution_mappings(new SubstitutionMapping());
216 .getSubstitutionMappedNodeTemplateByExposedReq("invalidMappingServiceTemplate.yaml",
217 invalidMappingServiceTemplate, "local_storage_server_cmaui");
221 public void substitutableMappingWithNoReqMap() throws Exception {
222 ServiceTemplate mainServiceTemplate = toscaServiceModel.getServiceTemplates()
223 .get(toscaServiceModel.getEntryDefinitionServiceTemplate());
224 ServiceTemplate emptyReqMapping = new ServiceTemplate();
225 emptyReqMapping.setTopology_template(new TopologyTemplate());
226 emptyReqMapping.getTopology_template().setSubstitution_mappings(new SubstitutionMapping());
227 emptyReqMapping.getTopology_template().getSubstitution_mappings().setNode_type("temp");
228 Optional<Map.Entry<String, NodeTemplate>> mappedNodeTemplate = toscaAnalyzerService
229 .getSubstitutionMappedNodeTemplateByExposedReq(
230 toscaServiceModel.getEntryDefinitionServiceTemplate(), mainServiceTemplate,
231 "local_storage_server_cmaui");
232 assertEquals(false, mappedNodeTemplate.isPresent());
236 public void testGetSubstitutionMappedNodeTemplateByExposedReqInvalid() throws Exception {
237 thrown.expect(CoreException.class);
238 thrown.expectMessage(
239 "Invalid Tosca model data, missing 'Node Template' entry for 'Node Template' id cmaui_port_9");
240 ToscaExtensionYamlUtil toscaExtensionYamlUtil = new ToscaExtensionYamlUtil();
241 InputStream yamlFile = toscaExtensionYamlUtil
242 .loadYamlFileIs("/mock/analyzerService/NestedServiceTemplateReqTest.yaml");
243 ServiceTemplate nestedServiceTemplateFromYaml =
244 toscaExtensionYamlUtil.yamlToObject(yamlFile, ServiceTemplate.class);
247 .getSubstitutionMappedNodeTemplateByExposedReq("NestedServiceTemplateSubstituteTest.yaml",
248 nestedServiceTemplateFromYaml, "link_cmaui_port_invalid");
252 public void testIsDesiredRequirementAssignmentMatch() throws Exception {
254 RequirementAssignment requirementAssignment = new RequirementAssignment();
255 String capability = "Test.Capability";
256 String node = "Test.node";
257 String relationship = "Test.relationship";
258 requirementAssignment.setCapability(capability);
259 requirementAssignment.setNode(node);
260 requirementAssignment.setRelationship(relationship);
262 assertEquals(true, toscaAnalyzerService
263 .isDesiredRequirementAssignment(requirementAssignment, capability, node, relationship));
264 assertEquals(true, toscaAnalyzerService
265 .isDesiredRequirementAssignment(requirementAssignment, null, node, relationship));
266 assertEquals(true, toscaAnalyzerService
267 .isDesiredRequirementAssignment(requirementAssignment, capability, null, relationship));
268 assertEquals(true, toscaAnalyzerService
269 .isDesiredRequirementAssignment(requirementAssignment, capability, node, null));
270 assertEquals(true, toscaAnalyzerService
271 .isDesiredRequirementAssignment(requirementAssignment, null, null, relationship));
272 assertEquals(true, toscaAnalyzerService
273 .isDesiredRequirementAssignment(requirementAssignment, capability, null, null));
274 assertEquals(true, toscaAnalyzerService
275 .isDesiredRequirementAssignment(requirementAssignment, null, node, null));
280 public void testIsDesiredRequirementAssignmentNoMatch() throws Exception {
282 RequirementAssignment requirementAssignment = new RequirementAssignment();
283 String capability = "Test.Capability";
284 String node = "Test.node";
285 String relationship = "Test.relationship";
286 requirementAssignment.setCapability(capability);
287 requirementAssignment.setNode(node);
288 requirementAssignment.setRelationship(relationship);
290 assertEquals(false, toscaAnalyzerService
291 .isDesiredRequirementAssignment(requirementAssignment, "no", node, relationship));
292 assertEquals(false, toscaAnalyzerService
293 .isDesiredRequirementAssignment(requirementAssignment, "no", "no", relationship));
294 assertEquals(false, toscaAnalyzerService
295 .isDesiredRequirementAssignment(requirementAssignment, "no", "no", "no"));
296 assertEquals(false, toscaAnalyzerService
297 .isDesiredRequirementAssignment(requirementAssignment, capability, "no", relationship));
298 assertEquals(false, toscaAnalyzerService
299 .isDesiredRequirementAssignment(requirementAssignment, capability, node, "no"));
300 assertEquals(false, toscaAnalyzerService
301 .isDesiredRequirementAssignment(requirementAssignment, capability, "no", "no"));
302 assertEquals(false, toscaAnalyzerService
303 .isDesiredRequirementAssignment(requirementAssignment, "no", null, null));
304 assertEquals(false, toscaAnalyzerService
305 .isDesiredRequirementAssignment(requirementAssignment, null, null, null));
311 public void shouldReturnFalseIfNdTmpIsNull() {
312 assertFalse(toscaAnalyzerService
313 .isTypeOf(null, ToscaNodeType.NETWORK.getDisplayName(), new ServiceTemplate(),
314 toscaServiceModelMock));
318 public void shouldReturnTrueIfNdTmpTypeIsOfRequestedType() {
319 NodeTemplate nodeTemplate = new NodeTemplate();
320 ToscaNodeType nodeTypeToSearch = ToscaNodeType.BLOCK_STORAGE;
321 nodeTemplate.setType(nodeTypeToSearch.getDisplayName());
322 assertTrue(toscaAnalyzerService
323 .isTypeOf(nodeTemplate, nodeTypeToSearch.getDisplayName(), new ServiceTemplate(),
324 toscaServiceModelMock));
328 public void shouldReturnTrueIfNdTmpTypeIsFoundInSrvTmpNdTyAndNdTyDerivedFromRequestedType() {
329 String typeToMatch = ToscaNodeType.CINDER_VOLUME.getDisplayName();
330 when(nodeTemplateMock.getType()).thenReturn(typeToMatch);
331 Map<String, NodeType> stNodeTypes = new HashMap<>();
332 addNodeType(stNodeTypes, ToscaNodeType.COMPUTE.getDisplayName(), new NodeType());
333 NodeType nodeType = createNodeType(ToscaNodeType.BLOCK_STORAGE.getDisplayName());
334 addNodeType(stNodeTypes, typeToMatch, nodeType);
335 ServiceTemplate serviceTemplate = new ServiceTemplate();
336 serviceTemplate.setNode_types(stNodeTypes);
337 assertTrue(toscaAnalyzerService
338 .isTypeOf(nodeTemplateMock, ToscaNodeType.BLOCK_STORAGE.getDisplayName(), serviceTemplate,
339 toscaServiceModelMock));
344 public void shouldThrowCoreExceptionForInvalidNodeType() {
345 thrown.expect(CoreException.class);
346 thrown.expectMessage(
347 "NodeType 'AAA' or one of its derivedFrom node type hierarchy, is not defined in tosca service model");
348 when(nodeTemplateMock.getType()).thenReturn("AAA");
349 Map<String, NodeType> stNodeTypes = new HashMap<>();
350 addNodeType(stNodeTypes, "notImportant", new NodeType());
351 ServiceTemplate serviceTemplate = new ServiceTemplate();
352 serviceTemplate.setNode_types(stNodeTypes);
354 .isTypeOf(nodeTemplateMock, ToscaNodeType.COMPUTE.getDisplayName(), serviceTemplate,
355 toscaServiceModelMock);
359 public void shouldThrowCoreExceptionForInvalidNodeType2Level() {
360 thrown.expect(CoreException.class);
361 thrown.expectMessage(
362 "NodeType 'A' or one of its derivedFrom node type hierarchy, is not defined in tosca service model");
363 String typeToMatch = "A";
364 when(nodeTemplateMock.getType()).thenReturn(typeToMatch);
365 Map<String, NodeType> stNodeTypes = new HashMap<>();
366 addNodeType(stNodeTypes, "notImportant", new NodeType());
367 addNodeType(stNodeTypes, "A", createNodeType("ADerivedFromB"));
368 addNodeType(stNodeTypes, "ADerivedFromB'", createNodeType("BDerivedFromC"));
369 ServiceTemplate serviceTemplate = new ServiceTemplate();
370 serviceTemplate.setNode_types(stNodeTypes);
371 assertTrue(toscaAnalyzerService
372 .isTypeOf(nodeTemplateMock, "BDerivedFromC", serviceTemplate, toscaServiceModelMock));
376 public void shouldReturnTrueIfNdTmpTypeIsFoundInSrvTmpNdTyAndNotDerivedFromRequestedTypeBut2ndLevelDerivedFromMatch() {
377 String typeToMatch = "A";
378 when(nodeTemplateMock.getType()).thenReturn(typeToMatch);
379 Map<String, NodeType> stNodeTypes = new HashMap<>();
380 addNodeType(stNodeTypes, "notImportant", new NodeType());
381 addNodeType(stNodeTypes, "A", createNodeType("ADerivedFromB"));
382 addNodeType(stNodeTypes, "ADerivedFromB", createNodeType("BDerivedFromC"));
383 ServiceTemplate serviceTemplate = new ServiceTemplate();
384 serviceTemplate.setNode_types(stNodeTypes);
385 assertTrue(toscaAnalyzerService
386 .isTypeOf(nodeTemplateMock, "BDerivedFromC", serviceTemplate, toscaServiceModelMock));
389 private NodeType createNodeType(String derivedFrom) {
390 NodeType nodeType = new NodeType();
391 nodeType.setDerived_from(derivedFrom);
395 private void addNodeType(Map<String, NodeType> stNodeTypes, String key, NodeType nodeType) {
396 stNodeTypes.put(key, nodeType);
400 public void shouldReturnTrueIfNdTmpTypeIsFoundInSrvTmpNdTyButRequestedTypeNotMatchButFoundIn1stLevelImports() {
401 String typeToMatch = ToscaNodeType.CINDER_VOLUME.getDisplayName();
402 when(nodeTemplateMock.getType()).thenReturn(typeToMatch);
403 ServiceTemplate mainST = new ServiceTemplate();
404 Map<String, Import> imports = new HashMap<>();
405 Import anImport = new Import();
406 anImport.setFile("mainImport");
407 imports.put("bla bla", anImport);
408 mainST.setImports(imports);
410 //create searchable service template
411 Map<String, NodeType> stNodeTypes = new HashMap<>();
412 addNodeType(stNodeTypes, ToscaNodeType.COMPUTE.getDisplayName(), new NodeType());
413 NodeType nodeType = createNodeType(ToscaNodeType.BLOCK_STORAGE.getDisplayName());
414 addNodeType(stNodeTypes, typeToMatch, nodeType);
415 ServiceTemplate serviceTemplate = new ServiceTemplate();
416 serviceTemplate.setNode_types(stNodeTypes);
418 // add service templates to tosca service model
419 Map<String, ServiceTemplate> serviceTemplates = toscaServiceModelMock.getServiceTemplates();
420 serviceTemplates.put("testMainServiceTemplate", mainST);
421 serviceTemplates.put("mainImport", serviceTemplate);
422 when(toscaServiceModelMock.getServiceTemplates()).thenReturn(serviceTemplates);
424 assertTrue(toscaAnalyzerService
425 .isTypeOf(nodeTemplateMock, ToscaNodeType.BLOCK_STORAGE.getDisplayName(), mainST,
426 toscaServiceModelMock));
430 public void shouldReturnTrueIfNdTmpTypeIsFoundInSrvTmpNdTyButRequestedTypeNotMatchButFoundIn2ndLevelImports() {
431 String typeToMatch = ToscaNodeType.CINDER_VOLUME.getDisplayName();
432 when(nodeTemplateMock.getType()).thenReturn(typeToMatch);
433 ServiceTemplate mainST = new ServiceTemplate();
434 Map<String, Import> imports = new HashMap<>();
435 Import anImport = new Import();
436 anImport.setFile("refToMainImport");
437 imports.put("bla bla", anImport);
438 mainST.setImports(imports);
440 //create searchable service template
441 Map<String, NodeType> stNodeTypes = new HashMap<>();
442 addNodeType(stNodeTypes, ToscaNodeType.COMPUTE.getDisplayName(), new NodeType());
443 NodeType nodeType = createNodeType(ToscaNodeType.BLOCK_STORAGE.getDisplayName());
444 addNodeType(stNodeTypes, typeToMatch, nodeType);
445 ServiceTemplate serviceTemplate = new ServiceTemplate();
446 serviceTemplate.setNode_types(stNodeTypes);
448 // create 1st level service template with import only
449 ServiceTemplate firstLevelST = new ServiceTemplate();
450 Map<String, Import> firstLevelImports = new HashMap<>();
451 Import firstLevelImport = new Import();
452 firstLevelImport.setFile("mainImport");
453 firstLevelImports.put("bla bla 2", firstLevelImport);
455 firstLevelST.setImports(firstLevelImports);
457 // add service templates to tosca service model
458 Map<String, ServiceTemplate> serviceTemplates = toscaServiceModelMock.getServiceTemplates();
459 serviceTemplates.put("testMainServiceTemplate", mainST);
460 serviceTemplates.put("refToMainImport", firstLevelST);
461 serviceTemplates.put("mainImport", serviceTemplate);
462 when(toscaServiceModelMock.getServiceTemplates()).thenReturn(serviceTemplates);
464 assertTrue(toscaAnalyzerService
465 .isTypeOf(nodeTemplateMock, ToscaNodeType.BLOCK_STORAGE.getDisplayName(), mainST,
466 toscaServiceModelMock));
469 // not found at all should throw core exception