Improve testing stability
[sdc.git] / openecomp-be / backend / openecomp-sdc-vendor-software-product-manager / src / test / java / org / openecomp / sdc / vendorsoftwareproduct / services / impl / composition / CompositionDataExtractorImplTest.java
1 /*
2  * Copyright © 2018 European Support Limited
3  * Modifications © 2020 AT&T
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *      http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17
18 package org.openecomp.sdc.vendorsoftwareproduct.services.impl.composition;
19
20 import static org.junit.jupiter.api.Assertions.assertEquals;
21 import static org.junit.jupiter.api.Assertions.assertFalse;
22 import static org.junit.jupiter.api.Assertions.assertNull;
23 import static org.junit.jupiter.api.Assertions.assertTrue;
24
25 import java.io.File;
26 import java.io.FileInputStream;
27 import java.io.IOException;
28 import java.io.InputStream;
29 import java.net.URL;
30 import java.nio.file.NotDirectoryException;
31 import java.util.Collection;
32 import java.util.HashMap;
33 import java.util.Map;
34 import org.apache.commons.io.FileUtils;
35 import org.junit.jupiter.api.BeforeEach;
36 import org.junit.jupiter.api.Test;
37 import org.mockito.InjectMocks;
38 import org.mockito.MockitoAnnotations;
39 import org.onap.sdc.tosca.datatypes.model.ServiceTemplate;
40 import org.onap.sdc.tosca.services.ToscaExtensionYamlUtil;
41 import org.openecomp.sdc.tosca.datatypes.ToscaServiceModel;
42 import org.openecomp.sdc.tosca.services.ToscaUtil;
43 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.Component;
44 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.CompositionData;
45 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.Network;
46 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.Nic;
47
48 public class CompositionDataExtractorImplTest {
49
50     @InjectMocks
51     private static CompositionDataExtractorImpl compositionDataExtractor;
52
53     private ToscaServiceModel loadToscaServiceModel(String serviceTemplatesPath,
54                                                     String globalServiceTemplatesPath,
55                                                     String entryDefinitionServiceTemplate)
56         throws IOException {
57         ToscaExtensionYamlUtil toscaExtensionYamlUtil = new ToscaExtensionYamlUtil();
58         Map<String, ServiceTemplate> serviceTemplates = new HashMap<>();
59         if (entryDefinitionServiceTemplate == null) {
60             entryDefinitionServiceTemplate = "MainServiceTemplate.yaml";
61         }
62
63         loadServiceTemplates(serviceTemplatesPath, toscaExtensionYamlUtil, serviceTemplates);
64         if (globalServiceTemplatesPath != null) {
65             loadServiceTemplates(globalServiceTemplatesPath, toscaExtensionYamlUtil, serviceTemplates);
66         }
67
68         return new ToscaServiceModel(null, serviceTemplates, entryDefinitionServiceTemplate);
69     }
70
71     private void loadServiceTemplates(String serviceTemplatesPath,
72                                       ToscaExtensionYamlUtil toscaExtensionYamlUtil,
73                                       Map<String, ServiceTemplate> serviceTemplates)
74         throws IOException {
75         URL urlFile = CompositionDataExtractorImplTest.class.getResource(serviceTemplatesPath);
76         if (urlFile != null) {
77             File pathFile = new File(urlFile.getFile());
78             Collection<File> files = FileUtils.listFiles(pathFile, null, true);
79             if (files != null) {
80                 addServiceTemplateFiles(serviceTemplates, files, toscaExtensionYamlUtil);
81             } else {
82                 throw new NotDirectoryException(serviceTemplatesPath);
83             }
84         } else {
85             throw new NotDirectoryException(serviceTemplatesPath);
86         }
87     }
88
89     private void addServiceTemplateFiles(Map<String, ServiceTemplate> serviceTemplates,
90                                          Collection<File> files,
91                                          ToscaExtensionYamlUtil toscaExtensionYamlUtil)
92         throws IOException {
93         for (File file : files) {
94             try (InputStream yamlFile = new FileInputStream(file)) {
95                 ServiceTemplate serviceTemplateFromYaml =
96                     toscaExtensionYamlUtil.yamlToObject(yamlFile, ServiceTemplate.class);
97                 serviceTemplates.put(ToscaUtil.getServiceTemplateFileName(serviceTemplateFromYaml),
98                     serviceTemplateFromYaml);
99             }
100         }
101     }
102
103     @BeforeEach
104     public void setUp() throws Exception {
105         MockitoAnnotations.openMocks(this);
106     }
107
108     @Test
109     public void testExtractNetworks() throws Exception {
110         ToscaServiceModel toscaServiceModel =
111             loadToscaServiceModel("/extractServiceComposition/networks/",
112                 "/extractServiceComposition/toscaGlobalServiceTemplates/", null);
113         CompositionData compositionData =
114             compositionDataExtractor.extractServiceCompositionData(toscaServiceModel);
115         assertEquals(0, compositionData.getComponents().size());
116         assertEquals(7, compositionData.getNetworks().size());
117
118         for (Network network : compositionData.getNetworks()) {
119             boolean dhcp = network.isDhcp();
120             switch (network.getName()) {
121                 case "contail-net-default-true-dhcp":
122                     assertTrue(dhcp);
123                     break;
124                 case "contail-net-dhcp-false-param":
125                     assertFalse(dhcp);
126                     break;
127                 case "contail-net-dhcp-false":
128                     assertFalse(dhcp);
129                     break;
130                 case "contail-net-dhcp-true-param":
131                     assertTrue(dhcp);
132                     break;
133                 case "contail-net-dhcp-true":
134                     assertTrue(dhcp);
135                     break;
136                 case "contail-net-dhcp-default-true-param":
137                     assertTrue(dhcp);
138                     break;
139                 case "neutron-net-default-dhcp":
140                     assertTrue(dhcp);
141                     break;
142                 default:
143                     throw new Exception("Unexpected Network Name " + network.getName());
144             }
145         }
146     }
147
148     @Test
149     public void testExtractOnlyComponents() throws Exception {
150         ToscaServiceModel toscaServiceModel =
151             loadToscaServiceModel("/extractServiceComposition/onlyComponents/",
152                 "/extractServiceComposition/toscaGlobalServiceTemplates/", null);
153         CompositionData compositionData =
154             compositionDataExtractor.extractServiceCompositionData(toscaServiceModel);
155         assertEquals(3, compositionData.getComponents().size());
156         assertEquals(0, compositionData.getNetworks().size());
157
158         for (Component component : compositionData.getComponents()) {
159             switch (component.getData().getName()) {
160                 case "org.openecomp.resource.vfc.nodes.heat.pcrf_psm":
161                     assertNull(component.getNics());
162                     assertEquals("pcrf_psm", component.getData().getDisplayName());
163                     break;
164                 case "org.openecomp.resource.vfc.nodes.heat.nova.Server":
165                     assertNull(component.getNics());
166                     assertEquals("Server", component.getData().getDisplayName());
167                     break;
168                 case "org.openecomp.resource.vfc.nodes.heat.pcm":
169                     assertNull(component.getNics());
170                     assertEquals("pcm", component.getData().getDisplayName());
171                     break;
172                 default:
173                     throw new Exception("Unexpected ComponentData Name " + component.getData().getName());
174             }
175         }
176     }
177
178     @Test
179     public void testExtractComponentsWithPorts() throws Exception {
180
181         ToscaServiceModel toscaServiceModel =
182             loadToscaServiceModel("/extractServiceComposition/componentsWithPort/",
183                 "/extractServiceComposition/toscaGlobalServiceTemplates/", null);
184         CompositionData compositionData =
185             compositionDataExtractor.extractServiceCompositionData(toscaServiceModel);
186
187         assertEquals(3, compositionData.getComponents().size());
188         assertEquals(0, compositionData.getNetworks().size());
189
190         for (Component component : compositionData.getComponents()) {
191             switch (component.getData().getName()) {
192                 case "org.openecomp.resource.vfc.nodes.heat.pcrf_psm":
193                     assertEquals(1, component.getNics().size());
194                     assertEquals("psm01_port_0", component.getNics().get(0).getName());
195                     assertNull(component.getNics().get(0).getNetworkName());
196                     assertEquals("pcrf_psm", component.getData().getDisplayName());
197                     break;
198                 case "org.openecomp.resource.vfc.nodes.heat.nova.Server":
199                     assertEquals(2, component.getNics().size());
200                     assertEquals("template_VMInt_OAM_lb_2", component.getNics().get(0).getName());
201                     assertNull(component.getNics().get(0).getNetworkName());
202                     assertEquals("FSB1_Internal2", component.getNics().get(1).getName());
203                     assertNull(component.getNics().get(1).getNetworkName());
204                     assertEquals("Server", component.getData().getDisplayName());
205                     break;
206                 case "org.openecomp.resource.vfc.nodes.heat.pcm":
207                     assertEquals(2, component.getNics().size());
208                     assertEquals("pcm", component.getData().getDisplayName());
209                     break;
210                 default:
211                     throw new Exception("Unexpected ComponentData Name " + component.getData().getName());
212             }
213         }
214     }
215
216     @Test
217     public void testExtractFullComposition() throws Exception {
218
219         ToscaServiceModel toscaServiceModel =
220             loadToscaServiceModel("/extractServiceComposition/fullComposition/",
221                 "/extractServiceComposition/toscaGlobalServiceTemplates/", null);
222         CompositionData compositionData =
223             compositionDataExtractor.extractServiceCompositionData(toscaServiceModel);
224         assertEquals(3, compositionData.getComponents().size());
225         assertEquals(4, compositionData.getNetworks().size());
226
227         for (Component component : compositionData.getComponents()) {
228             switch (component.getData().getName()) {
229                 case "org.openecomp.resource.vfc.nodes.heat.pcrf_psm":
230                     assertEquals(1, component.getNics().size());
231                     assertEquals("psm01_port_0", component.getNics().get(0).getName());
232                     assertNull(component.getNics().get(0).getNetworkName());
233                     assertEquals("pcrf_psm", component.getData().getDisplayName());
234                     break;
235                 case "org.openecomp.resource.vfc.nodes.heat.nova.Server":
236                     assertEquals(4, component.getNics().size());
237                     assertEquals("Server", component.getData().getDisplayName());
238                     for (Nic port : component.getNics()) {
239                         switch (port.getName()) {
240                             case "FSB1_Internal2_port":
241                                 assertEquals("Internal2-net", port.getNetworkName());
242                                 break;
243                             case "FSB1_OAM_Port":
244                                 assertNull(port.getNetworkName());
245                                 break;
246                             case "FSB1_Internal1_port":
247                                 assertEquals("Internal1-net", port.getNetworkName());
248                                 break;
249                             case "template_VMInt_OAM_lb_2":
250                                 assertEquals("jsa_net1", port.getNetworkName());
251                                 break;
252                             default:
253                                 throw new Exception("Unexpected Nic " + port.getName());
254                         }
255                     }
256                     break;
257                 case "org.openecomp.resource.vfc.nodes.heat.pcm":
258                     assertEquals(2, component.getNics().size());
259                     assertEquals("pcm", component.getData().getDisplayName());
260                     break;
261                 default:
262                     throw new Exception("Unexpected ComponentData Name " + component.getData().getName());
263             }
264         }
265     }
266
267     @Test
268     public void testExtractSubstitutionComposition() throws Exception {
269
270         ToscaServiceModel toscaServiceModel =
271             loadToscaServiceModel("/extractServiceComposition/substitution/",
272                 "/extractServiceComposition/toscaGlobalServiceTemplates/", null);
273         CompositionData compositionData =
274             compositionDataExtractor.extractServiceCompositionData(toscaServiceModel);
275         assertEquals(2, compositionData.getComponents().size());
276         assertEquals(4, compositionData.getNetworks().size());
277
278         for (Component component : compositionData.getComponents()) {
279             switch (component.getData().getName()) {
280                 case "org.openecomp.resource.vfc.nodes.heat.cmaui_image":
281                     assertEquals(1, component.getNics().size());
282                     assertEquals("cmaui_port_1", component.getNics().get(0).getName());
283                     assertEquals("test_net1", component.getNics().get(0).getNetworkName());
284                     assertEquals("cmaui_image", component.getData().getDisplayName());
285                     break;
286                 case "org.openecomp.resource.vfc.nodes.heat.abc_image":
287                     assertEquals(1, component.getNics().size());
288                     assertEquals("abc_port_1", component.getNics().get(0).getName());
289                     assertEquals("test_net2", component.getNics().get(0).getNetworkName());
290                     assertEquals("abc_image", component.getData().getDisplayName());
291                     break;
292                 default:
293                     throw new Exception("Unexpected ComponentData Name " + component.getData().getName());
294             }
295         }
296         for (Network network : compositionData.getNetworks()) {
297             boolean dhcp = network.isDhcp();
298             switch (network.getName()) {
299                 case "test_net2":
300                     assertTrue(dhcp);
301                     break;
302                 case "test_net1":
303                     assertTrue(dhcp);
304                     break;
305                 case "Internal1-net": // same network display twice since define in 2 nested files with the same key
306                     assertTrue(dhcp);
307                     break;
308                 default:
309                     throw new Exception("Unexpected Network Name " + network.getName());
310             }
311
312         }
313     }
314 }