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