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
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.
16 * SPDX-License-Identifier: Apache-2.0
17 * ============LICENSE_END=========================================================
20 package org.onap.sdc.frontend.ci.tests.execute.sanity;
22 import static org.junit.jupiter.api.Assertions.assertEquals;
23 import static org.junit.jupiter.api.Assertions.assertTrue;
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;
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;
62 public class ModelToscaTypeImportTest extends SetupCDTest {
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";
73 private WebDriver webDriver;
77 webDriver = DriverFactory.getDriver();
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()));
87 @Test(dependsOnMethods = "importTypesForModel")
88 public void addNodeType() throws Exception {
89 assertTrue(postNodeType(NODE_TYPE_TO_ADD));
92 @Test(dependsOnMethods = "addNodeType")
93 public void verifyToscaTypesIncludedInCsar() throws Exception {
94 final var home = new HomePage(webDriver);
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());
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();
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);
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();
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);
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());
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());
153 final Config config = Utils.getConfig();
154 postEntity(String.format(NODE_TYPE_URL, config.getCatalogBeHost(), config.getCatalogBePort()), "jh0003", builder.build());
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();
166 builder.addTextBody("toscaTypeMetadata", getJsonString(yamlDirectory));
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());
173 final Config config = Utils.getConfig();
174 postEntity(String.format(TYPE_URL, config.getCatalogBeHost(), config.getCatalogBePort(), urlSuffix), "cs0008", builder.build());
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);
186 try (final var client = HttpClients.createDefault()) {
187 final var response = client.execute(httpPost);
188 assertEquals(201, response.getStatusLine().getStatusCode());
192 private File getImportZipFile(final File yamlDirectory) throws Exception {
193 final var fileToZip = yamlDirectory.listFiles((dir, filename) -> filename.toLowerCase().endsWith(".yml"))[0];
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];
202 while ((length = fis.read(bytes)) >= 0) {
203 zipOut.write(bytes, 0, length);
206 return new File(zipName);
209 private String getJsonString(final File yamlDirectory) throws Exception {
211 Files.readAllBytes(Paths.get(yamlDirectory.listFiles((dir, filename) -> filename.toLowerCase().endsWith(".json"))[0].getAbsolutePath())));