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