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;
31 import java.util.HashMap;
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;
66 public class ModelToscaTypeImportTest extends SetupCDTest {
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";
79 private WebDriver webDriver;
80 private HomePage homePage;
84 webDriver = DriverFactory.getDriver();
85 homePage = new HomePage(webDriver);
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));
96 @Test(dependsOnMethods = "importTypesForModel")
97 public void addNodeType() throws Exception {
98 assertTrue(postNodeType(NODE_TYPE_TO_ADD));
101 @Test(dependsOnMethods = "addNodeType")
102 public void verifyToscaTypesIncludedInCsar() throws Exception {
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());
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();
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);
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();
136 final Map<String, String> propertyMap = new HashMap<>();
137 propertyMap.put("AdditionalServiceData", ADDITIONAL_SERVICE_DATA);
138 resourceCreatePage = addProperty(serviceComponentPage, propertyMap);
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);
148 final var downloadFolderPath = getConfig().getDownloadAutomationFolder();
149 final Map<String, byte[]> csarFiles = FileHandling.getFilesFromZip(downloadFolderPath, toscaArtifactsPage.getDownloadedArtifactList().get(0));
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());
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);
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());
176 final Config config = Utils.getConfig();
177 postEntity(String.format(NODE_TYPE_URL, config.getCatalogBeHost(), config.getCatalogBePort()), "jh0003", builder.build());
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();
189 builder.addTextBody("toscaTypeMetadata", getJsonString(yamlDirectory));
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());
196 final Config config = Utils.getConfig();
197 postEntity(String.format(TYPE_URL, config.getCatalogBeHost(), config.getCatalogBePort(), urlSuffix), "cs0008", builder.build());
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);
209 try (final var client = HttpClients.createDefault()) {
210 final var response = client.execute(httpPost);
211 assertEquals(201, response.getStatusLine().getStatusCode());
215 private File getImportZipFile(final File yamlDirectory) throws Exception {
216 final var fileToZip = yamlDirectory.listFiles((dir, filename) -> filename.toLowerCase().endsWith(".yml"))[0];
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];
225 while ((length = fis.read(bytes)) >= 0) {
226 zipOut.write(bytes, 0, length);
229 return new File(zipName);
232 private String getJsonString(final File yamlDirectory) throws Exception {
234 Files.readAllBytes(Paths.get(yamlDirectory.listFiles((dir, filename) -> filename.toLowerCase().endsWith(".json"))[0].getAbsolutePath())));