2 * Copyright © 2018 European Support Limited
3 * Modifications © 2020 AT&T
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
9 * http://www.apache.org/licenses/LICENSE-2.0
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.
18 package org.openecomp.sdc.vendorsoftwareproduct.services.impl.composition;
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;
26 import java.io.FileInputStream;
27 import java.io.IOException;
28 import java.io.InputStream;
30 import java.nio.file.NotDirectoryException;
31 import java.util.Collection;
32 import java.util.HashMap;
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;
48 public class CompositionDataExtractorImplTest {
51 private static CompositionDataExtractorImpl compositionDataExtractor;
53 private ToscaServiceModel loadToscaServiceModel(String serviceTemplatesPath,
54 String globalServiceTemplatesPath,
55 String entryDefinitionServiceTemplate)
57 ToscaExtensionYamlUtil toscaExtensionYamlUtil = new ToscaExtensionYamlUtil();
58 Map<String, ServiceTemplate> serviceTemplates = new HashMap<>();
59 if (entryDefinitionServiceTemplate == null) {
60 entryDefinitionServiceTemplate = "MainServiceTemplate.yaml";
63 loadServiceTemplates(serviceTemplatesPath, toscaExtensionYamlUtil, serviceTemplates);
64 if (globalServiceTemplatesPath != null) {
65 loadServiceTemplates(globalServiceTemplatesPath, toscaExtensionYamlUtil, serviceTemplates);
68 return new ToscaServiceModel(null, serviceTemplates, entryDefinitionServiceTemplate);
71 private void loadServiceTemplates(String serviceTemplatesPath,
72 ToscaExtensionYamlUtil toscaExtensionYamlUtil,
73 Map<String, ServiceTemplate> serviceTemplates)
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);
80 addServiceTemplateFiles(serviceTemplates, files, toscaExtensionYamlUtil);
82 throw new NotDirectoryException(serviceTemplatesPath);
85 throw new NotDirectoryException(serviceTemplatesPath);
89 private void addServiceTemplateFiles(Map<String, ServiceTemplate> serviceTemplates,
90 Collection<File> files,
91 ToscaExtensionYamlUtil toscaExtensionYamlUtil)
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);
104 public void setUp() throws Exception {
105 MockitoAnnotations.openMocks(this);
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());
118 for (Network network : compositionData.getNetworks()) {
119 boolean dhcp = network.isDhcp();
120 switch (network.getName()) {
121 case "contail-net-default-true-dhcp":
124 case "contail-net-dhcp-false-param":
127 case "contail-net-dhcp-false":
130 case "contail-net-dhcp-true-param":
133 case "contail-net-dhcp-true":
136 case "contail-net-dhcp-default-true-param":
139 case "neutron-net-default-dhcp":
143 throw new Exception("Unexpected Network Name " + network.getName());
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());
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());
164 case "org.openecomp.resource.vfc.nodes.heat.nova.Server":
165 assertNull(component.getNics());
166 assertEquals("Server", component.getData().getDisplayName());
168 case "org.openecomp.resource.vfc.nodes.heat.pcm":
169 assertNull(component.getNics());
170 assertEquals("pcm", component.getData().getDisplayName());
173 throw new Exception("Unexpected ComponentData Name " + component.getData().getName());
179 public void testExtractComponentsWithPorts() throws Exception {
181 ToscaServiceModel toscaServiceModel =
182 loadToscaServiceModel("/extractServiceComposition/componentsWithPort/",
183 "/extractServiceComposition/toscaGlobalServiceTemplates/", null);
184 CompositionData compositionData =
185 compositionDataExtractor.extractServiceCompositionData(toscaServiceModel);
187 assertEquals(3, compositionData.getComponents().size());
188 assertEquals(0, compositionData.getNetworks().size());
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());
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());
206 case "org.openecomp.resource.vfc.nodes.heat.pcm":
207 assertEquals(2, component.getNics().size());
208 assertEquals("pcm", component.getData().getDisplayName());
211 throw new Exception("Unexpected ComponentData Name " + component.getData().getName());
217 public void testExtractFullComposition() throws Exception {
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());
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());
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());
243 case "FSB1_OAM_Port":
244 assertNull(port.getNetworkName());
246 case "FSB1_Internal1_port":
247 assertEquals("Internal1-net", port.getNetworkName());
249 case "template_VMInt_OAM_lb_2":
250 assertEquals("jsa_net1", port.getNetworkName());
253 throw new Exception("Unexpected Nic " + port.getName());
257 case "org.openecomp.resource.vfc.nodes.heat.pcm":
258 assertEquals(2, component.getNics().size());
259 assertEquals("pcm", component.getData().getDisplayName());
262 throw new Exception("Unexpected ComponentData Name " + component.getData().getName());
268 public void testExtractSubstitutionComposition() throws Exception {
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());
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());
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());
293 throw new Exception("Unexpected ComponentData Name " + component.getData().getName());
296 for (Network network : compositionData.getNetworks()) {
297 boolean dhcp = network.isDhcp();
298 switch (network.getName()) {
305 case "Internal1-net": // same network display twice since define in 2 nested files with the same key
309 throw new Exception("Unexpected Network Name " + network.getName());