Add support comparable type constraints for scalar values
[sdc.git] / integration-tests / src / test / java / org / onap / sdc / frontend / ci / tests / execute / sanity / ModelToscaTypeImportTest.java
1 /*
2  * ============LICENSE_START=======================================================
3  *  Copyright (C) 2021 Nordix Foundation
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  *  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.
15  *
16  *  SPDX-License-Identifier: Apache-2.0
17  *  ============LICENSE_END=========================================================
18  */
19
20 package org.onap.sdc.frontend.ci.tests.execute.sanity;
21
22 import static org.junit.jupiter.api.Assertions.assertEquals;
23 import static org.junit.jupiter.api.Assertions.assertTrue;
24
25 import java.io.File;
26 import java.io.FileInputStream;
27 import java.io.FileOutputStream;
28 import java.nio.file.Files;
29 import java.nio.file.Paths;
30 import java.util.Arrays;
31 import java.util.HashMap;
32 import java.util.Map;
33 import java.util.UUID;
34 import java.util.zip.ZipEntry;
35 import java.util.zip.ZipOutputStream;
36 import org.apache.http.HttpEntity;
37 import org.apache.http.client.methods.HttpPost;
38 import org.apache.http.entity.ContentType;
39 import org.apache.http.entity.mime.MultipartEntityBuilder;
40 import org.apache.http.impl.client.HttpClients;
41 import org.onap.sdc.backend.ci.tests.config.Config;
42 import org.onap.sdc.backend.ci.tests.datatypes.enums.ComponentType;
43 import org.onap.sdc.backend.ci.tests.datatypes.enums.ResourceCategoryEnum;
44 import org.onap.sdc.backend.ci.tests.datatypes.http.HttpHeaderEnum;
45 import org.onap.sdc.backend.ci.tests.utils.Utils;
46 import org.onap.sdc.backend.ci.tests.utils.general.ElementFactory;
47 import org.onap.sdc.frontend.ci.tests.datatypes.ComponentData;
48 import org.onap.sdc.frontend.ci.tests.datatypes.ModelName;
49 import org.onap.sdc.frontend.ci.tests.datatypes.ResourceCreateData;
50 import org.onap.sdc.frontend.ci.tests.datatypes.ToscaTypeUploadEnum;
51 import org.onap.sdc.frontend.ci.tests.execute.setup.DriverFactory;
52 import org.onap.sdc.frontend.ci.tests.execute.setup.SetupCDTest;
53 import org.onap.sdc.frontend.ci.tests.flow.AddComponentPropertyFlow;
54 import org.onap.sdc.frontend.ci.tests.flow.AddNodeToCompositionFlow;
55 import org.onap.sdc.frontend.ci.tests.flow.CreateVfFlow;
56 import org.onap.sdc.frontend.ci.tests.flow.DownloadCsarArtifactFlow;
57 import org.onap.sdc.frontend.ci.tests.flow.exception.UiTestFlowRuntimeException;
58 import org.onap.sdc.frontend.ci.tests.pages.ComponentPage;
59 import org.onap.sdc.frontend.ci.tests.pages.ResourceCreatePage;
60 import org.onap.sdc.frontend.ci.tests.pages.home.HomePage;
61 import org.onap.sdc.frontend.ci.tests.utilities.FileHandling;
62 import org.openqa.selenium.WebDriver;
63 import org.testng.annotations.BeforeMethod;
64 import org.testng.annotations.Test;
65
66 public class ModelToscaTypeImportTest extends SetupCDTest {
67
68     private static final String NODE_TYPE_TO_ADD = "Network";
69     private static final String MODEL_VNFD_TYPES = "vnfd_types";
70     private static final String MODEL_NSD_TYPES = "nsd_types";
71     private static final String TYPE_URL = "http://%s:%s/sdc2/rest/v1/catalog/uploadType/%s";
72     private static final String NODE_TYPE_URL = "http://%s:%s/sdc2/rest/v1/catalog/upload/multipart";
73     private static final String IMPORT_PATH = System.getProperty("user.dir").concat("/src/test/resources/Files/imports/tosca");
74     private static final String NODE_TYPE_DIRECTORY = IMPORT_PATH.concat(File.separator).concat("node-types");
75     private static final String TOSCA_CAPABILITIES_NETWORK_LINK = "tosca.capabilities.network.Linkable";
76     private static final String ADDITIONAL_TYPE_DEFINITIONS = "additional_type_definitions";
77     private static final String ADDITIONAL_SERVICE_DATA = "tosca.datatypes.nfv.AdditionalServiceData";
78
79     private WebDriver webDriver;
80     private HomePage homePage;
81
82     @BeforeMethod
83     public void init() {
84         webDriver = DriverFactory.getDriver();
85         homePage = new HomePage(webDriver);
86     }
87
88     @Test
89     public void importTypesForModel() throws Exception {
90         for (final var type : ToscaTypeUploadEnum.values()) {
91             assertTrue(postType(type.getUrlSuffix(), type.getDirectory(), type.getZipParam(), type.isMetadata()),
92                 String.format("Import of '%s' should return true", type));
93         }
94     }
95
96     @Test(dependsOnMethods = "importTypesForModel")
97     public void addNodeType() throws Exception {
98         assertTrue(postNodeType(NODE_TYPE_TO_ADD));
99     }
100
101     @Test(dependsOnMethods = "addNodeType")
102     public void verifyToscaTypesIncludedInCsar() throws Exception {
103
104         final var vf = new ResourceCreateData();
105         vf.setRandomName(ElementFactory.getResourcePrefix() + "-VF");
106         vf.setCategory(ResourceCategoryEnum.GENERIC_ABSTRACT.getSubCategory());
107         vf.setTagList(Arrays.asList(vf.getName()));
108         vf.setDescription("Test");
109         vf.setVendorName("EST");
110         vf.setVendorRelease("2.5.1");
111         vf.setVendorModelNumber("0001");
112         vf.setModel(ModelName.ETSI_SOL001_v2_5_1.getName());
113
114         final var createVfFlow = new CreateVfFlow(webDriver, vf);
115         createVfFlow.run(homePage);
116         ComponentPage resourceCreatePage = createVfFlow.getLandedPage()
117             .orElseThrow(() -> new UiTestFlowRuntimeException("Missing expected ResourceCreatePage"));
118         resourceCreatePage.isLoaded();
119
120         final var parentComponent = new ComponentData();
121         parentComponent.setName(vf.getName());
122         parentComponent.setVersion("0.1");
123         parentComponent.setComponentType(ComponentType.RESOURCE);
124         final var addComponent = new ComponentData();
125         addComponent.setName("Network");
126         addComponent.setVersion("1.0");
127         addComponent.setComponentType(ComponentType.RESOURCE);
128
129         final var compositionPage = resourceCreatePage.goToComposition();
130         compositionPage.isLoaded();
131         final var addNodeToCompositionFlow = new AddNodeToCompositionFlow(webDriver, parentComponent, addComponent);
132         addNodeToCompositionFlow.run(compositionPage);
133         compositionPage.isLoaded();
134         final var serviceComponentPage = compositionPage.goToServiceGeneral();
135
136         final Map<String, String> propertyMap = new HashMap<>();
137         propertyMap.put("AdditionalServiceData", ADDITIONAL_SERVICE_DATA);
138         resourceCreatePage = addProperty(serviceComponentPage, propertyMap);
139
140         final var downloadCsarArtifactFlow = new DownloadCsarArtifactFlow(webDriver);
141         downloadCsarArtifactFlow.setWaitBeforeGetTheFile(5L);
142         downloadCsarArtifactFlow.run(resourceCreatePage);
143         final var toscaArtifactsPage = downloadCsarArtifactFlow.getLandedPage()
144             .orElseThrow(() -> new UiTestFlowRuntimeException("Missing expected ToscaArtifactsPage"));
145         assertTrue(toscaArtifactsPage.getDownloadedArtifactList().size() > 0, "No artifact download was found");
146         toscaArtifactsPage.getDownloadedArtifactList().get(0);
147
148         final var downloadFolderPath = getConfig().getDownloadAutomationFolder();
149         final Map<String, byte[]> csarFiles = FileHandling.getFilesFromZip(downloadFolderPath, toscaArtifactsPage.getDownloadedArtifactList().get(0));
150
151         assertEquals(8, csarFiles.size());
152         assertTrue(csarFiles.keySet().stream().filter(filename -> filename.contains(NODE_TYPE_TO_ADD.concat("-template.yml"))).findAny().isPresent());
153         assertTrue(csarFiles.keySet().stream().filter(filename -> filename.contains(MODEL_VNFD_TYPES.concat(".yaml"))).findAny().isPresent());
154         assertTrue(csarFiles.keySet().stream().filter(filename -> filename.contains(MODEL_NSD_TYPES.concat(".yaml"))).findAny().isPresent());
155         assertTrue(csarFiles.keySet().stream().filter(filename -> filename.contains("-template-interface".concat(".yml"))).findAny().isPresent());
156         assertTrue(csarFiles.keySet().stream().filter(filename -> filename.contains(ADDITIONAL_TYPE_DEFINITIONS.concat(".yaml"))).findAny().isPresent());
157         assertTrue(csarFiles.values().stream().filter(bytes -> new String(bytes).contains(TOSCA_CAPABILITIES_NETWORK_LINK)).findAny().isPresent());
158         assertTrue(csarFiles.values().stream().filter(bytes -> new String(bytes).contains(ADDITIONAL_SERVICE_DATA)).findAny().isPresent());
159     }
160
161     private ComponentPage addProperty(ComponentPage serviceComponentPage, final Map<String, String> propertyMap) {
162         final AddComponentPropertyFlow addComponentPropertyFlow = new AddComponentPropertyFlow(webDriver, propertyMap);
163         serviceComponentPage.isLoaded();
164         final ComponentPage resourcePropertiesAssignmentPage = serviceComponentPage.goToPropertiesAssignment();
165         addComponentPropertyFlow.run(resourcePropertiesAssignmentPage);
166         return resourcePropertiesAssignmentPage.clickOnGeneralMenuItem(ResourceCreatePage.class);
167     }
168
169     private boolean postNodeType(final String directory) throws Exception {
170         final var yamlDirectory = new File(NODE_TYPE_DIRECTORY.concat(File.separator).concat(directory));
171         final var builder = MultipartEntityBuilder.create();
172         builder.addTextBody("resourceMetadata", getJsonString(yamlDirectory));
173         final var zipFile = getImportZipFile(yamlDirectory);
174         builder.addBinaryBody("resourceZip", zipFile, ContentType.APPLICATION_OCTET_STREAM, zipFile.getName());
175         try {
176             final Config config = Utils.getConfig();
177             postEntity(String.format(NODE_TYPE_URL, config.getCatalogBeHost(), config.getCatalogBePort()), "jh0003", builder.build());
178         } finally {
179             zipFile.delete();
180         }
181         return true;
182     }
183
184     private boolean postType(final String urlSuffix, final String directory, final String zipParam,
185                              final boolean metadata) throws Exception {
186         final var yamlDirectory = new File(IMPORT_PATH.concat(File.separator).concat(directory));
187         final var builder = MultipartEntityBuilder.create();
188         if (metadata) {
189             builder.addTextBody("toscaTypeMetadata", getJsonString(yamlDirectory));
190         }
191         builder.addTextBody("model", ModelName.ETSI_SOL001_v2_5_1.getName());
192         final var zipFile = getImportZipFile(yamlDirectory);
193         builder.addBinaryBody(zipParam, zipFile, ContentType.APPLICATION_OCTET_STREAM, zipFile.getName());
194
195         try {
196             final Config config = Utils.getConfig();
197             postEntity(String.format(TYPE_URL, config.getCatalogBeHost(), config.getCatalogBePort(), urlSuffix), "cs0008", builder.build());
198         } finally {
199             zipFile.delete();
200         }
201         return true;
202     }
203
204     private void postEntity(final String url, final String user, final HttpEntity entity) throws Exception {
205         final var httpPost = new HttpPost(String.format(url));
206         httpPost.setHeader(HttpHeaderEnum.USER_ID.getValue(), user);
207         httpPost.setEntity(entity);
208
209         try (final var client = HttpClients.createDefault()) {
210             final var response = client.execute(httpPost);
211             assertEquals(201, response.getStatusLine().getStatusCode());
212         }
213     }
214
215     private File getImportZipFile(final File yamlDirectory) throws Exception {
216         final var fileToZip = yamlDirectory.listFiles((dir, filename) -> filename.toLowerCase().endsWith(".yml"))[0];
217         final var zipName =
218             yamlDirectory.getAbsolutePath().concat(File.separator).concat(fileToZip.getName()).concat(UUID.randomUUID().toString()).concat(".zip");
219         try (final var zipOut = new ZipOutputStream(new FileOutputStream(zipName));
220             final var fis = new FileInputStream(fileToZip)) {
221             final var zipEntry = new ZipEntry(fileToZip.getName());
222             zipOut.putNextEntry(zipEntry);
223             final var bytes = new byte[1024];
224             int length;
225             while ((length = fis.read(bytes)) >= 0) {
226                 zipOut.write(bytes, 0, length);
227             }
228         }
229         return new File(zipName);
230     }
231
232     private String getJsonString(final File yamlDirectory) throws Exception {
233         return new String(
234             Files.readAllBytes(Paths.get(yamlDirectory.listFiles((dir, filename) -> filename.toLowerCase().endsWith(".json"))[0].getAbsolutePath())));
235     }
236 }