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=========================================================
19 package org.onap.sdc.frontend.ci.tests.execute.sanity;
21 import static org.hamcrest.MatcherAssert.assertThat;
22 import static org.hamcrest.Matchers.anEmptyMap;
23 import static org.hamcrest.Matchers.empty;
24 import static org.hamcrest.Matchers.emptyString;
25 import static org.hamcrest.Matchers.not;
26 import static org.junit.jupiter.api.Assertions.assertEquals;
27 import static org.junit.jupiter.api.Assertions.assertNotNull;
28 import static org.junit.jupiter.api.Assertions.fail;
30 import java.util.Arrays;
32 import java.util.Optional;
33 import org.onap.sdc.backend.ci.tests.datatypes.enums.ComponentType;
34 import org.onap.sdc.backend.ci.tests.datatypes.enums.ResourceCategoryEnum;
35 import org.onap.sdc.backend.ci.tests.utils.general.ElementFactory;
36 import org.onap.sdc.frontend.ci.tests.datatypes.ComponentData;
37 import org.onap.sdc.frontend.ci.tests.datatypes.ResourceCreateData;
38 import org.onap.sdc.frontend.ci.tests.exception.UnzipException;
39 import org.onap.sdc.frontend.ci.tests.execute.setup.DriverFactory;
40 import org.onap.sdc.frontend.ci.tests.execute.setup.SetupCDTest;
41 import org.onap.sdc.frontend.ci.tests.flow.AddNodeToCompositionFlow;
42 import org.onap.sdc.frontend.ci.tests.flow.CreateVfFlow;
43 import org.onap.sdc.frontend.ci.tests.flow.CreateVfcFlow;
44 import org.onap.sdc.frontend.ci.tests.flow.DownloadCsarArtifactFlow;
45 import org.onap.sdc.frontend.ci.tests.flow.exception.UiTestFlowRuntimeException;
46 import org.onap.sdc.frontend.ci.tests.pages.ComponentPage;
47 import org.onap.sdc.frontend.ci.tests.pages.component.workspace.CompositionPage;
48 import org.onap.sdc.frontend.ci.tests.pages.component.workspace.ToscaArtifactsPage;
49 import org.onap.sdc.frontend.ci.tests.pages.home.HomePage;
50 import org.onap.sdc.frontend.ci.tests.utilities.FileHandling;
51 import org.openqa.selenium.WebDriver;
52 import org.testng.annotations.BeforeClass;
53 import org.testng.annotations.Test;
54 import org.yaml.snakeyaml.Yaml;
56 public class ImportVfcUiTest extends SetupCDTest {
58 private String filePath;
59 private WebDriver webDriver;
60 private HomePage homePage;
61 private ResourceCreateData vfcCreateData;
62 private ResourceCreateData vfCreateData;
65 public void beforeClass() {
66 filePath = FileHandling.getFilePath("VFCs/");
70 public void importVFC_createVF_addVFC2VF_test() throws UnzipException {
71 webDriver = DriverFactory.getDriver();
72 homePage = new HomePage(webDriver);
73 // TC - Import VFC with root namespace
74 String fileName = "org.openecomp.resource.VFC-root.yml";
75 CreateVfcFlow createVfcFlow = createVFC(fileName);
77 ComponentPage componentPage = createVfcFlow.getLandedPage()
78 .orElseThrow(() -> new UiTestFlowRuntimeException("Missing expected return ResourceCreatePage"));
79 componentPage.isLoaded();
80 componentPage.certifyComponent();
81 componentPage.isLoaded();
83 Map<String, Object> yamlObject = downloadToscaArtifact(componentPage);
84 checkMetadata(yamlObject, vfcCreateData);
85 checkNodeTypes(yamlObject);
86 homePage.getTopNavComponent().clickOnHome();
88 // TC - Import hierarchy of VFCs
89 fileName = "org.openecomp.resource.VFC-child.yml";
90 createVfcFlow = createVFC(fileName);
91 componentPage = createVfcFlow.getLandedPage().orElseThrow();
92 componentPage.certifyComponent();
93 componentPage.isLoaded();
95 yamlObject = downloadToscaArtifact(createVfcFlow.getLandedPage().get());
96 checkMetadata(yamlObject, vfcCreateData);
97 checkNodeTypes(yamlObject);
98 homePage.getTopNavComponent().clickOnHome();
100 // TC - Import VFC with interface inputs
101 // TC - Import VFC with attributes
102 final CreateVfFlow createVfFlow = createVF();
103 componentPage = createVfFlow.getLandedPage()
104 .orElseThrow(() -> new UiTestFlowRuntimeException("Missing expected return ResourceCreatePage"));
105 componentPage.isLoaded();
107 final AddNodeToCompositionFlow addNodeToCompositionFlow = addNodeToCompositionFlow(componentPage);
109 final CompositionPage compositionPage = addNodeToCompositionFlow.getLandedPage()
110 .orElseThrow(() -> new UiTestFlowRuntimeException("Missing expected return CompositionPage"));
111 componentPage = compositionPage.goToGeneral();
112 componentPage.isLoaded();
113 componentPage.certifyComponent();
114 componentPage.isLoaded();
115 yamlObject = downloadToscaArtifact(componentPage);
116 checkMetadata(yamlObject, vfCreateData);
117 checkTopologyTemplate(yamlObject);
121 private AddNodeToCompositionFlow addNodeToCompositionFlow(final ComponentPage componentPage) {
122 componentPage.isLoaded();
123 final ComponentData parentComponent = new ComponentData();
124 parentComponent.setName(vfCreateData.getName());
125 parentComponent.setVersion("0.1");
126 parentComponent.setComponentType(ComponentType.RESOURCE);
127 final ComponentData componentToAdd = new ComponentData();
128 componentToAdd.setName(vfcCreateData.getName());
129 componentToAdd.setVersion("1.0");
130 componentToAdd.setComponentType(ComponentType.RESOURCE);
131 final AddNodeToCompositionFlow addNodeToCompositionFlow = new AddNodeToCompositionFlow(webDriver, parentComponent, componentToAdd);
132 addNodeToCompositionFlow.run(componentPage.goToComposition());
133 return addNodeToCompositionFlow;
136 private Map<String, Object> downloadToscaArtifact(final ComponentPage componentPage) throws UnzipException {
137 final DownloadCsarArtifactFlow downloadCsarArtifactFlow = downloadCsarArtifact(componentPage);
138 final ToscaArtifactsPage toscaArtifactsPage = downloadCsarArtifactFlow.getLandedPage()
139 .orElseThrow(() -> new UiTestFlowRuntimeException("Missing expected ToscaArtifactsPage"));
141 assertThat("No artifact download was found", toscaArtifactsPage.getDownloadedArtifactList(), not(empty()));
142 final String downloadedCsarName = toscaArtifactsPage.getDownloadedArtifactList().get(0);
143 final String downloadFolderPath = getConfig().getDownloadAutomationFolder();
144 final Map<String, byte[]> filesFromZip = FileHandling.getFilesFromZip(downloadFolderPath, downloadedCsarName);
145 final Optional<String> resourceEntryOpt = filesFromZip.keySet().stream()
146 .filter(s -> s.equals("Definitions/" + downloadedCsarName.replace("-csar.csar", "-template.yml")))
148 if (resourceEntryOpt.isEmpty()) {
149 fail("Could not find the resource package in Definitions");
151 return loadYamlObject(filesFromZip.get(resourceEntryOpt.get()));
154 private Map<String, Object> getMapEntry(final Map<String, Object> yamlObj, final String entryName) {
156 return (Map<String, Object>) yamlObj.get(entryName);
157 } catch (final Exception e) {
158 final String errorMsg = String.format("Could not get the '%s' entry.", entryName);
159 fail(errorMsg + "Error message: " + e.getMessage());
164 private Map<String, Object> loadYamlObject(final byte[] mainDefinitionFileBytes) {
165 return new Yaml().load(new String(mainDefinitionFileBytes));
168 private DownloadCsarArtifactFlow downloadCsarArtifact(final ComponentPage componentPage) {
169 final DownloadCsarArtifactFlow downloadCsarArtifactFlow = new DownloadCsarArtifactFlow(webDriver);
170 downloadCsarArtifactFlow.setWaitBeforeGetTheFile(5L);
171 downloadCsarArtifactFlow.run(componentPage);
172 return downloadCsarArtifactFlow;
175 private CreateVfcFlow createVFC(final String fileName) {
176 vfcCreateData = createVfcFormData();
177 final CreateVfcFlow createVfcFlow = new CreateVfcFlow(webDriver, vfcCreateData, filePath + fileName);
178 createVfcFlow.run(homePage);
179 return createVfcFlow;
182 private CreateVfFlow createVF() {
183 vfCreateData = createVfFormData();
184 final CreateVfFlow createVfFlow = new CreateVfFlow(webDriver, vfCreateData);
185 createVfFlow.run(homePage);
189 private ResourceCreateData createVfcFormData() {
190 final ResourceCreateData vfcCreateData = new ResourceCreateData();
191 vfcCreateData.setRandomName(ElementFactory.getResourcePrefix() + "-VFC");
192 vfcCreateData.setCategory(ResourceCategoryEnum.NETWORK_L4.getSubCategory());
193 vfcCreateData.setTagList(Arrays.asList(vfcCreateData.getName(), "importVFC"));
194 vfcCreateData.setDescription("aDescription");
195 vfcCreateData.setVendorName("Ericsson");
196 vfcCreateData.setVendorRelease("1.2.3");
197 vfcCreateData.setVendorModelNumber("4.5.6");
198 return vfcCreateData;
201 private ResourceCreateData createVfFormData() {
202 final ResourceCreateData vfCreateData = new ResourceCreateData();
203 vfCreateData.setRandomName(ElementFactory.getResourcePrefix() + "-VF");
204 vfCreateData.setCategory(ResourceCategoryEnum.NETWORK_L4.getSubCategory());
205 vfCreateData.setTagList(Arrays.asList(vfCreateData.getName(), "createVF"));
206 vfCreateData.setDescription("aDescription");
207 vfCreateData.setVendorName("Ericsson");
208 vfCreateData.setVendorRelease("6.5.4");
209 vfCreateData.setVendorModelNumber("3.2.1");
213 private void checkMetadata(final Map<String, Object> map, final ResourceCreateData createdData) {
214 final Map<String, Object> metadata = getMapEntry(map, "metadata");
216 assertEquals(createdData.getName(), metadata.get("name"));
217 assertEquals(createdData.getDescription(), metadata.get("description"));
218 assertEquals("Network L4+", metadata.get("category"));
219 assertThat((String) metadata.get("type"), not(emptyString()));
220 assertEquals(createdData.getCategory(), metadata.get("subcategory"));
221 assertEquals(createdData.getVendorName(), metadata.get("resourceVendor"));
222 assertEquals(createdData.getVendorRelease(), metadata.get("resourceVendorRelease"));
223 assertEquals(createdData.getVendorModelNumber(), metadata.get("reourceVendorModelNumber"));
226 private void checkNodeTypes(final Map<String, Object> map) {
227 final Map<String, Object> mapEntry = getMapEntry(map, "node_types");
228 final Map<String, Object> nodeTypes = getMapEntry(mapEntry, mapEntry.keySet().iterator().next());
230 assertNotNull(nodeTypes);
231 assertEquals("aDescription", nodeTypes.get("description"));
233 final Map<String, Object> properties = getMapEntry(nodeTypes, "properties");
234 assertThat(properties, not(anEmptyMap()));
236 final Map<String, Object> attributes = getMapEntry(nodeTypes, "attributes");
237 assertThat(attributes, not(anEmptyMap()));
239 final Map<String, Object> interfaces = getMapEntry(nodeTypes, "interfaces");
240 assertThat(interfaces, not(anEmptyMap()));
244 private void checkTopologyTemplate(final Map<String, Object> map) {
245 final Map<String, Object> mapEntry = getMapEntry(map, "topology_template");
246 assertNotNull(mapEntry);
248 final Map<String, Object> properties = getMapEntry(mapEntry, "inputs");
249 assertThat(properties, not(anEmptyMap()));
251 final Map<String, Object> attributes = getMapEntry(mapEntry, "node_templates");
252 assertThat(attributes, not(anEmptyMap()));
254 final Map<String, Object> interfaces = getMapEntry(mapEntry, "substitution_mappings");
255 assertThat(interfaces, not(anEmptyMap()));