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.hamcrest.MatcherAssert.assertThat;
23 import static org.hamcrest.Matchers.anEmptyMap;
24 import static org.hamcrest.Matchers.empty;
25 import static org.hamcrest.Matchers.emptyString;
26 import static org.hamcrest.Matchers.hasSize;
27 import static org.hamcrest.Matchers.is;
28 import static org.hamcrest.Matchers.not;
29 import static org.hamcrest.Matchers.notNullValue;
30 import static org.junit.jupiter.api.Assertions.assertEquals;
31 import static org.junit.jupiter.api.Assertions.assertNotNull;
32 import static org.junit.jupiter.api.Assertions.assertTrue;
33 import static org.junit.jupiter.api.Assertions.fail;
35 import com.aventstack.extentreports.Status;
36 import java.io.IOException;
37 import java.util.ArrayList;
38 import java.util.Arrays;
39 import java.util.HashMap;
40 import java.util.List;
42 import java.util.Map.Entry;
43 import java.util.Optional;
44 import java.util.stream.Collectors;
45 import org.onap.sdc.backend.ci.tests.data.providers.OnboardingDataProviders;
46 import org.onap.sdc.backend.ci.tests.datatypes.enums.ComponentType;
47 import org.onap.sdc.backend.ci.tests.datatypes.enums.ResourceCategoryEnum;
48 import org.onap.sdc.backend.ci.tests.utils.general.ElementFactory;
49 import org.onap.sdc.frontend.ci.tests.datatypes.ComponentData;
50 import org.onap.sdc.frontend.ci.tests.datatypes.ResourceCreateData;
51 import org.onap.sdc.frontend.ci.tests.datatypes.composition.RelationshipInformation;
52 import org.onap.sdc.frontend.ci.tests.exception.UnzipException;
53 import org.onap.sdc.frontend.ci.tests.execute.setup.DriverFactory;
54 import org.onap.sdc.frontend.ci.tests.execute.setup.ExtentTestActions;
55 import org.onap.sdc.frontend.ci.tests.execute.setup.SetupCDTest;
56 import org.onap.sdc.frontend.ci.tests.flow.AddComponentPropertyFlow;
57 import org.onap.sdc.frontend.ci.tests.flow.AddNodeToCompositionFlow;
58 import org.onap.sdc.frontend.ci.tests.flow.CreateVfFlow;
59 import org.onap.sdc.frontend.ci.tests.flow.CreateVfcFlow;
60 import org.onap.sdc.frontend.ci.tests.flow.DownloadCsarArtifactFlow;
61 import org.onap.sdc.frontend.ci.tests.flow.EditComponentPropertiesFlow;
62 import org.onap.sdc.frontend.ci.tests.flow.composition.CreateRelationshipFlow;
63 import org.onap.sdc.frontend.ci.tests.flow.exception.UiTestFlowRuntimeException;
64 import org.onap.sdc.frontend.ci.tests.pages.AttributesOutputsPage;
65 import org.onap.sdc.frontend.ci.tests.pages.ComponentPage;
66 import org.onap.sdc.frontend.ci.tests.pages.ResourceCreatePage;
67 import org.onap.sdc.frontend.ci.tests.pages.TopNavComponent;
68 import org.onap.sdc.frontend.ci.tests.pages.component.workspace.CompositionPage;
69 import org.onap.sdc.frontend.ci.tests.pages.component.workspace.ToscaArtifactsPage;
70 import org.onap.sdc.frontend.ci.tests.pages.home.HomePage;
71 import org.onap.sdc.frontend.ci.tests.utilities.FileHandling;
72 import org.openecomp.sdc.be.model.ComponentInstance;
73 import org.openqa.selenium.WebDriver;
74 import org.slf4j.Logger;
75 import org.slf4j.LoggerFactory;
76 import org.testng.annotations.BeforeMethod;
77 import org.testng.annotations.Test;
78 import org.yaml.snakeyaml.Yaml;
80 public class ServiceTemplateDesignUiTests extends SetupCDTest {
82 private static final Logger LOGGER = LoggerFactory.getLogger(ServiceTemplateDesignUiTests.class);
84 private WebDriver webDriver;
85 private TopNavComponent topNavComponent;
86 private HomePage homePage;
87 private List<ResourceCreateData> vfcs = new ArrayList<>();
88 private ResourceCreateData vfResourceCreateData;
89 private ComponentInstance networkFunctionInstance;
90 private ComponentInstance networkServiceInstance;
91 private AddNodeToCompositionFlow addNodeToCompositionFlow;
92 private ComponentPage componentPage;
93 private Map<String, String> propertiesToBeAddedMap;
97 webDriver = DriverFactory.getDriver();
98 topNavComponent = new TopNavComponent(webDriver);
99 homePage = new HomePage(webDriver);
102 @Test(dataProviderClass = OnboardingDataProviders.class, dataProvider = "vfcList")
103 public void importAndCertifyVfc(final String rootFolder, final String vfcFilename) {
105 final String resourceName = ElementFactory.addRandomSuffixToName(ElementFactory.getResourcePrefix());
106 final CreateVfcFlow createVfcFlow = createVFC(rootFolder + vfcFilename, resourceName);
107 vfcs.stream().filter(vfc -> vfc.getName().startsWith(resourceName)).findFirst().orElseThrow(
108 () -> new UiTestFlowRuntimeException(String.format("VFCs List should contain a VFC with the expected name %s", resourceName)));
109 final ResourceCreatePage vfcResourceCreatePage = createVfcFlow.getLandedPage()
110 .orElseThrow(() -> new UiTestFlowRuntimeException("Missing expected ResourceCreatePage"));
111 vfcResourceCreatePage.isLoaded();
112 vfcResourceCreatePage.certifyComponent();
113 ExtentTestActions.takeScreenshot(Status.INFO, "vfc-certified",
114 String.format("VFC '%s' was certified", resourceName));
117 @Test(dependsOnMethods = "importAndCertifyVfc")
118 public void createBaseService() throws UnzipException {
119 final CreateVfFlow createVfFlow = createVF();
120 addNodeToCompositionFlow = addNodeToCompositionAndCreateRelationship(createVfFlow);
121 final CompositionPage compositionPage = addNodeToCompositionFlow.getLandedPage()
122 .orElseThrow(() -> new UiTestFlowRuntimeException("Missing expected return CompositionPage"));
123 compositionPage.isLoaded();
124 componentPage = compositionPage.goToGeneral();
125 componentPage.isLoaded();
126 downloadAndVerifyCsarPackageAfterBaseServiceCreation(componentPage);
129 @Test(dependsOnMethods = "createBaseService")
130 public void addComponentProperty() throws UnzipException {
131 propertiesToBeAddedMap = loadPropertiesToAdd();
132 addProperty(propertiesToBeAddedMap);
133 componentPage = addValueToProperty(loadPropertiesToEdit());
134 componentPage.isLoaded();
135 downloadAndVerifyCsarPackageAfterAddProperty(componentPage);
138 @Test(dependsOnMethods = "createBaseService")
139 public void addOutputsToVF_test() throws UnzipException, IOException {
141 final ComponentPage resourceCreatePage = (ComponentPage) homePage.clickOnComponent(vfResourceCreateData.getName());
142 resourceCreatePage.isLoaded();
144 final AttributesOutputsPage attributesOutputsPage = resourceCreatePage.goToAttributesOutputs();
145 attributesOutputsPage.isLoaded();
147 final ComponentInstance createdComponentInstance = addNodeToCompositionFlow.getCreatedComponentInstance()
148 .orElseThrow(() -> new UiTestFlowRuntimeException("Expecting a ComponentInstance"));
150 attributesOutputsPage.clickOnAttributeNavigation(createdComponentInstance.getName());
151 assertTrue(attributesOutputsPage.isAttributePresent("attr_1"));
152 attributesOutputsPage.declareOutput("attr_1");
153 attributesOutputsPage.clickOnOutputsTab();
154 assertTrue(attributesOutputsPage.isOutputPresent("attr_1"));
156 attributesOutputsPage.clickOnAttributesTab();
157 assertTrue(attributesOutputsPage.isAttributePresent("attr_2"));
158 attributesOutputsPage.declareOutput("attr_2");
159 attributesOutputsPage.clickOnOutputsTab();
160 assertTrue(attributesOutputsPage.isOutputPresent("attr_2"));
162 attributesOutputsPage.clickOnAttributesTab();
163 assertTrue(attributesOutputsPage.isAttributePresent("attr_3"));
164 attributesOutputsPage.declareOutput("attr_3");
165 attributesOutputsPage.clickOnOutputsTab();
166 assertTrue(attributesOutputsPage.isOutputPresent("attr_3"));
168 attributesOutputsPage.deleteOutput(createdComponentInstance.getName() + "_attr_2");
169 attributesOutputsPage.clickOnAttributesTab();
170 assertTrue(attributesOutputsPage.isAttributePresent("attr_2"));
171 attributesOutputsPage.clickOnOutputsTab();
172 assertTrue(attributesOutputsPage.isOutputDeleted("attr_2"));
174 attributesOutputsPage.clickOnAttributesTab();
175 ExtentTestActions.addScreenshot(Status.INFO, "AttributesTab", "The Attribute's list : ");
177 attributesOutputsPage.clickOnOutputsTab();
178 ExtentTestActions.addScreenshot(Status.INFO, "OutputsTab", "The Output's list : ");
180 attributesOutputsPage.certifyComponent();
181 attributesOutputsPage.isLoaded();
183 Map<String, Object> yamlObject = downloadToscaArtifact(attributesOutputsPage);
184 checkMetadata(yamlObject, vfResourceCreateData);
185 checkTopologyTemplate(yamlObject);
189 private void checkMetadata(final Map<String, Object> map, final ResourceCreateData createdData) {
190 final Map<String, Object> metadata = getMapEntry(map, "metadata");
192 assertEquals(createdData.getName(), metadata.get("name"));
193 assertEquals(createdData.getDescription(), metadata.get("description"));
194 assertEquals("Generic", metadata.get("category"));
195 assertThat((String) metadata.get("type"), not(emptyString()));
196 assertEquals(createdData.getCategory(), metadata.get("subcategory"));
197 assertEquals(createdData.getVendorName(), metadata.get("resourceVendor"));
198 assertEquals(createdData.getVendorRelease(), metadata.get("resourceVendorRelease"));
199 assertEquals(createdData.getVendorModelNumber(), metadata.get("reourceVendorModelNumber"));
202 private void checkTopologyTemplate(final Map<String, Object> map) {
203 final Map<String, Object> mapEntry = getMapEntry(map, "topology_template");
204 assertNotNull(mapEntry);
206 final Map<String, Object> inputs = getMapEntry(mapEntry, "inputs");
207 assertThat(inputs, not(anEmptyMap()));
209 final Map<String, Object> outputs = getMapEntry(mapEntry, "outputs");
210 assertThat(outputs, not(anEmptyMap()));
211 assertEquals(2, outputs.keySet().stream().filter(s -> (s.contains("_attr_1") || s.contains("_attr_3")) && !s.contains("_attr_2")).count());
213 final Map<String, Object> nodeTemplates = getMapEntry(mapEntry, "node_templates");
214 assertThat(nodeTemplates, not(anEmptyMap()));
216 final Map<String, Object> substitutionMappings = getMapEntry(mapEntry, "substitution_mappings");
217 assertThat(substitutionMappings, not(anEmptyMap()));
219 final Map<String, Object> attributes = getMapEntry(substitutionMappings, "attributes");
220 assertThat(attributes, not(anEmptyMap()));
221 assertEquals(2, attributes.keySet().stream().filter(s -> (s.contains("_attr_1") || s.contains("_attr_3")) && !s.contains("_attr_2")).count());
225 private Map<String, Object> downloadToscaArtifact(final ComponentPage resourceCreatePage) throws UnzipException {
226 final DownloadCsarArtifactFlow downloadCsarArtifactFlow = downloadToscaCsar(resourceCreatePage);
227 final ToscaArtifactsPage toscaArtifactsPage = downloadCsarArtifactFlow.getLandedPage()
228 .orElseThrow(() -> new UiTestFlowRuntimeException("Missing expected ToscaArtifactsPage"));
230 assertThat("No artifact download was found", toscaArtifactsPage.getDownloadedArtifactList(), not(empty()));
231 final String downloadedCsarName = toscaArtifactsPage.getDownloadedArtifactList().get(0);
232 final String downloadFolderPath = getConfig().getDownloadAutomationFolder();
233 final Map<String, byte[]> filesFromZip = FileHandling.getFilesFromZip(downloadFolderPath, downloadedCsarName);
234 final Optional<String> resourceEntryOpt = filesFromZip.keySet().stream()
235 .filter(s -> s.equals("Definitions/" + downloadedCsarName.replace("-csar.csar", "-template.yml")))
237 if (resourceEntryOpt.isEmpty()) {
238 fail("Could not find the resource package in Definitions");
240 return loadYamlObject(filesFromZip.get(resourceEntryOpt.get()));
243 private CreateVfFlow createVF() {
244 final ResourceCreateData vfCreateData = createVfFormData();
245 final CreateVfFlow createVfFlow = new CreateVfFlow(webDriver, vfCreateData);
246 createVfFlow.run(homePage);
250 private ResourceCreateData createVfFormData() {
251 vfResourceCreateData = new ResourceCreateData();
252 vfResourceCreateData.setRandomName(ElementFactory.getResourcePrefix() + "-VF");
253 vfResourceCreateData.setCategory(ResourceCategoryEnum.GENERIC_ABSTRACT.getSubCategory());
254 vfResourceCreateData.setTagList(Arrays.asList(vfResourceCreateData.getName(), "createVF"));
255 vfResourceCreateData.setDescription("aDescription");
256 vfResourceCreateData.setVendorName("EST");
257 vfResourceCreateData.setVendorRelease("4.1.1");
258 vfResourceCreateData.setVendorModelNumber("0001");
259 return vfResourceCreateData;
262 private CreateVfcFlow createVFC(final String vfcFullFilename, final String resourceName) {
263 final ResourceCreateData vfcCreateData = createVfcFormData(resourceName);
264 final CreateVfcFlow createVfcFlow = new CreateVfcFlow(webDriver, vfcCreateData, vfcFullFilename);
265 createVfcFlow.run(homePage);
266 ExtentTestActions.takeScreenshot(Status.INFO, "vfc-created", String.format("VFC '%s' was created", resourceName));
267 assertThat(vfcs, notNullValue());
268 vfcs.add(vfcCreateData);
269 return createVfcFlow;
272 private ResourceCreateData createVfcFormData(final String resourceName) {
273 final ResourceCreateData vfcCreateData = new ResourceCreateData();
274 vfcCreateData.setRandomName(resourceName);
275 vfcCreateData.setCategory(ResourceCategoryEnum.GENERIC_NETWORK_ELEMENTS.getSubCategory());
276 vfcCreateData.setTagList(Arrays.asList(vfcCreateData.getName(), "importVFC"));
277 vfcCreateData.setDescription("aDescription");
278 vfcCreateData.setVendorName("EST");
279 vfcCreateData.setVendorRelease("4.1.1");
280 vfcCreateData.setVendorModelNumber("0001");
281 return vfcCreateData;
284 private AddNodeToCompositionFlow addNodeToCompositionAndCreateRelationship(final CreateVfFlow createVfFlow) {
285 final ResourceCreatePage resourceCreatePage = createVfFlow.getLandedPage()
286 .orElseThrow(() -> new UiTestFlowRuntimeException("Expecting a ResourceCreatePage"));
287 resourceCreatePage.isLoaded();
288 assertThat(vfcs, hasSize(2));
289 final ComponentData parentComponent = new ComponentData();
290 parentComponent.setName(vfResourceCreateData.getName());
291 parentComponent.setVersion("0.1");
292 parentComponent.setComponentType(ComponentType.RESOURCE);
294 // Adds networkFunction to VF composition
295 final ComponentData networkFunction = new ComponentData();
296 networkFunction.setName(vfcs.get(0).getName());
297 networkFunction.setVersion("1.0");
298 networkFunction.setComponentType(ComponentType.RESOURCE);
299 CompositionPage compositionPage = resourceCreatePage.goToComposition();
300 compositionPage.isLoaded();
301 AddNodeToCompositionFlow addNodeToCompositionFlow = addNodeToComposition(parentComponent, networkFunction, compositionPage);
302 networkFunctionInstance = addNodeToCompositionFlow.getCreatedComponentInstance()
303 .orElseThrow(() -> new UiTestFlowRuntimeException("Could not get the created component instance"));
305 // Adds networkService to VF composition
306 final ComponentData networkService = new ComponentData();
307 networkService.setName(vfcs.get(1).getName());
308 networkService.setVersion("1.0");
309 networkService.setComponentType(ComponentType.RESOURCE);
310 addNodeToCompositionFlow = addNodeToComposition(parentComponent, networkService, compositionPage);
311 networkServiceInstance = addNodeToCompositionFlow.getCreatedComponentInstance()
312 .orElseThrow(() -> new UiTestFlowRuntimeException("Could not get the created component instance"));
314 // Creates a dependsOn relationship from networkServiceInstance to networkFunctionInstance
315 createRelationship(compositionPage, networkFunctionInstance.getName(), "tosca.capabilities.Node",
316 networkServiceInstance.getName(), "tosca.capabilities.Node");
318 return addNodeToCompositionFlow;
321 public AddNodeToCompositionFlow addNodeToComposition(final ComponentData parentComponent,
322 final ComponentData resourceToAdd,
323 CompositionPage compositionPage) {
324 final AddNodeToCompositionFlow addNodeToCompositionFlow = new AddNodeToCompositionFlow(webDriver, parentComponent, resourceToAdd);
325 compositionPage = (CompositionPage) addNodeToCompositionFlow.run(compositionPage)
326 .orElseThrow(() -> new UiTestFlowRuntimeException("Missing expected CompositionPage"));
327 compositionPage.isLoaded();
328 ExtentTestActions.takeScreenshot(Status.INFO, "node-added-to-composition",
329 String.format("Resource '%s' was added to composition", resourceToAdd.getName()));
330 return addNodeToCompositionFlow;
334 * Creates a DependsOn relationship between the imported VFCs
335 * @param compositionPage Composition Page
336 * @param fromComponentInstanceName VFC - Network Function
337 * @param fromCapability Node Capability
338 * @param toComponentInstanceName VFC - Network Service
339 * @param toRequirement Node Requirement
341 private void createRelationship(final CompositionPage compositionPage, final String fromComponentInstanceName,
342 final String fromCapability, final String toComponentInstanceName, final String toRequirement) {
343 final RelationshipInformation relationshipInformation =
344 new RelationshipInformation(fromComponentInstanceName, fromCapability, toComponentInstanceName, toRequirement);
345 CreateRelationshipFlow createRelationshipFlow = new CreateRelationshipFlow(webDriver, relationshipInformation);
346 createRelationshipFlow.run(compositionPage).orElseThrow(() -> new UiTestFlowRuntimeException("Expecting a CompositionPage instance"));
347 ExtentTestActions.takeScreenshot(Status.INFO, "relationship",
348 String.format("Relationship from networkFunctionInstance '%s' to networkServiceInstanceResource '%s' was created",
349 fromComponentInstanceName, toComponentInstanceName));
353 * Adds a property to the base service
354 * @param propertyMap map of properties to be added
356 private void addProperty(final Map<String, String> propertyMap) {
357 componentPage = (ComponentPage) homePage.clickOnComponent(vfResourceCreateData.getName());
358 componentPage.isLoaded();
359 final AddComponentPropertyFlow addComponentPropertyFlow = new AddComponentPropertyFlow(webDriver, propertyMap);
360 addComponentPropertyFlow.run(componentPage.goToPropertiesAssignment());
364 * Edits a property to add a value
365 * @param propertyMap map of properties to be edited
367 private ComponentPage addValueToProperty(final Map<String, Object> propertyMap) {
368 final EditComponentPropertiesFlow editComponentPropertiesFlow = new EditComponentPropertiesFlow(webDriver, propertyMap);
369 return editComponentPropertiesFlow.run().orElseThrow(() -> new UiTestFlowRuntimeException("Missing expected return ComponentPage"));
373 * Downloads and verifies the generated tosca templates.
374 * @param componentPage the component page
375 * @throws UnzipException
377 private void downloadAndVerifyCsarPackageAfterBaseServiceCreation(final ComponentPage componentPage) throws UnzipException {
378 checkCsarPackage(downloadCsarPackage(componentPage));
382 * Downloads and verifies if the generated Tosca template contains the expected properties.
383 * @throws UnzipException
384 * @param componentPage
386 private void downloadAndVerifyCsarPackageAfterAddProperty(final ComponentPage componentPage) throws UnzipException {
387 verifyPropertiesOnGeneratedTemplate(downloadCsarPackage(componentPage));
390 private String downloadCsarPackage(final ComponentPage componentPage) {
391 final DownloadCsarArtifactFlow downloadCsarArtifactFlow = downloadToscaCsar(componentPage);
392 final ToscaArtifactsPage toscaArtifactsPage = downloadCsarArtifactFlow.getLandedPage()
393 .orElseThrow(() -> new UiTestFlowRuntimeException("Missing expected ToscaArtifactsPage"));
394 assertThat("No artifact download was found", toscaArtifactsPage.getDownloadedArtifactList(), not(empty()));
395 return toscaArtifactsPage.getDownloadedArtifactList().get(0);
399 * Downloads the generated CSAR package.
400 * @param componentPage the component page
401 * @return the Downloaded Tosca CSAR file
403 private DownloadCsarArtifactFlow downloadToscaCsar(final ComponentPage componentPage) {
404 final DownloadCsarArtifactFlow downloadCsarArtifactFlow = new DownloadCsarArtifactFlow(webDriver);
405 downloadCsarArtifactFlow.setWaitBeforeGetTheFile(5L);
406 downloadCsarArtifactFlow.run(componentPage);
407 return downloadCsarArtifactFlow;
411 * Verifies if the generated Tosca template contains the expected properties.
412 * @param downloadedCsarName the downloaded csar file name
413 * @throws UnzipException
415 private void verifyPropertiesOnGeneratedTemplate(final String downloadedCsarName) throws UnzipException {
416 final Map<String, byte[]> filesFromZip = extractFilesFromCsar(downloadedCsarName);
417 final String virtualFunctionName = vfResourceCreateData.getName().replace("-", "").toLowerCase();
418 final String vfResourceTemplateFile = "Definitions/resource-" + virtualFunctionName + "-template-interface.yml";
419 final String interfaceTemplateFile = filesFromZip.keySet().stream()
420 .filter(filename -> filename.equalsIgnoreCase(vfResourceTemplateFile)).findFirst()
421 .orElseThrow(() -> new UiTestFlowRuntimeException(String.format("Resource template file not found %s", vfResourceTemplateFile)));
422 final byte[] toscaInterfaceTemplateGenerated = filesFromZip.get(interfaceTemplateFile);
423 assertThat("The Generated Tosca template should not be null", toscaInterfaceTemplateGenerated, is(notNullValue()));
424 final Map<String, Object> interfaceTemplateYamlMap = loadYamlObject(toscaInterfaceTemplateGenerated);
425 final Map<String, Object> nodeTypesYamlMap = getMapEntry(interfaceTemplateYamlMap, "node_types");
426 assertThat(String.format("'%s' should contain a node_types entry", interfaceTemplateYamlMap), nodeTypesYamlMap, is(notNullValue()));
427 final Map<String, Object> properties = (Map) nodeTypesYamlMap.values().stream().filter(stringObjectEntry -> stringObjectEntry != null)
428 .collect(Collectors.toList()).get(0);
429 final Map<String, Object> propertiesFoundMap = (Map<String, Object>) properties.get("properties");
430 assertThat(String.format("The generated template file %s should contain all added properties", vfResourceTemplateFile),
431 propertiesFoundMap.keySet().containsAll(propertiesToBeAddedMap.keySet()), is(true));
435 * Checks if the downloaded Tosca csar includes the node templates for the added VFCs,
436 * the generated service template declared “tosca_simple_yaml_1_3” as its Tosca version,
437 * the generated csar contains the node type definitions for the added VFCs in the Definitions directory,
438 * the interface template contains the relationship declaration
439 * @param downloadedCsarName download Tosca CSAR filename
440 * @throws UnzipException
442 private void checkCsarPackage(final String downloadedCsarName) throws UnzipException {
443 final Map<String, byte[]> filesFromZip = extractFilesFromCsar(downloadedCsarName);
444 final String virtualFunctionName = vfResourceCreateData.getName().replace("-", "").toLowerCase();
445 final List<String> expectedDefinitionFolderFileList = getExpectedDefinitionFolderFileList(virtualFunctionName);
446 final Map<String, byte[]> expectedFilesFromZipMap = filesFromZip.entrySet().parallelStream()
447 .filter(key -> expectedDefinitionFolderFileList.stream()
448 .anyMatch(filename -> filename.equalsIgnoreCase(key.getKey()))).collect(Collectors.toMap(Entry::getKey, Entry::getValue));
449 final String vfResourceTemplateFile = "Definitions/resource-" + virtualFunctionName + "-template.yml";
450 final String generatedTemplateFile = expectedFilesFromZipMap.keySet().stream()
451 .filter(filename -> filename.equalsIgnoreCase(vfResourceTemplateFile)).findFirst()
452 .orElseThrow(() -> new UiTestFlowRuntimeException(String.format("Resource template file not found %s", vfResourceTemplateFile)));
453 final byte[] toscaTemplateGenerated = filesFromZip.get(generatedTemplateFile);
454 assertThat(toscaTemplateGenerated, is(notNullValue()));
455 verifyGeneratedTemplate(toscaTemplateGenerated, generatedTemplateFile);
456 verifyNodesRelationship(expectedFilesFromZipMap, virtualFunctionName, filesFromZip);
459 private Map<String, byte[]> extractFilesFromCsar(final String downloadedCsarName) throws UnzipException {
460 final String downloadFolderPath = getConfig().getDownloadAutomationFolder();
461 final Map<String, byte[]> filesFromCsar = FileHandling.getFilesFromZip(downloadFolderPath, downloadedCsarName);
462 return filesFromCsar;
465 private void verifyGeneratedTemplate(final byte[] generatedTemplateData, final String generatedTemplateFile) {
466 final Map<String, Object> templateYamlMap = loadYamlObject(generatedTemplateData);
467 final boolean hasToscaDefinitionVersionEntry = templateYamlMap.containsKey("tosca_definitions_version");
468 assertThat(String.format("'%s' should contain tosca_definitions_version entry", generatedTemplateFile), hasToscaDefinitionVersionEntry,
470 final String toscaVersion = (String) templateYamlMap.get("tosca_definitions_version");
471 assertThat(String.format("'%s' tosca_definitions_version entry should have tosca_simple_yaml_1_3 value", generatedTemplateFile),
472 toscaVersion.equalsIgnoreCase("tosca_simple_yaml_1_3"));
473 final Map<String, Object> topologyTemplateTosca = getMapEntry(templateYamlMap, "topology_template");
474 assertThat(String.format("'%s' should contain a topology_template entry", generatedTemplateFile), topologyTemplateTosca, is(notNullValue()));
475 final Map<String, Object> nodeTemplatesTosca = getMapEntry(topologyTemplateTosca, "node_templates");
476 assertThat(String.format("'%s' should contain a node_templates entry", generatedTemplateFile), nodeTemplatesTosca, is(notNullValue()));
477 final List<String> nodeTemplateFound = nodeTemplatesTosca.keySet().parallelStream().filter(s -> vfcs.stream()
478 .anyMatch(vfc -> s.startsWith(vfc.getName()))).collect(Collectors.toList());
479 assertThat(String.format("'%s' should contain the node type definitions for the added VFCs '%s'", nodeTemplatesTosca, vfcs),
480 nodeTemplateFound, hasSize(vfcs.size()));
483 private void verifyNodesRelationship(final Map<String, byte[]> expectedFilesFromZipMap, final String virtualFunctionName,
484 final Map<String, byte[]> filesFromZip) {
485 final String vfResourceTemplateFile = "Definitions/resource-" + virtualFunctionName + "-template-interface.yml";
486 final String interfaceTemplateFile = expectedFilesFromZipMap.keySet().stream()
487 .filter(filename -> filename.equalsIgnoreCase(vfResourceTemplateFile)).findFirst()
488 .orElseThrow(() -> new UiTestFlowRuntimeException(String.format("Resource template file not found %s", vfResourceTemplateFile)));
489 final byte[] toscaInterfaceTemplateGenerated = filesFromZip.get(interfaceTemplateFile);
490 assertThat(toscaInterfaceTemplateGenerated, is(notNullValue()));
491 final Map<String, Object> interfaceTemplateYamlMap = loadYamlObject(toscaInterfaceTemplateGenerated);
492 final Map<String, Object> nodeTypesYamlMap = getMapEntry(interfaceTemplateYamlMap, "node_types");
493 assertThat(String.format("'%s' should contain a node_types entry", interfaceTemplateYamlMap), nodeTypesYamlMap, is(notNullValue()));
494 final String result = Arrays.asList(nodeTypesYamlMap.values()).toString();
495 assertThat(String.format("'%s' should contain a capabilities entry", nodeTypesYamlMap), result.contains("capabilities"), is(true));
496 assertThat(String.format("'%s' should contain a requirements entry", nodeTypesYamlMap), result.contains("requirements"), is(true));
497 assertThat(String.format("'%s' should contain a relationship entry", nodeTypesYamlMap), result.contains("relationship"), is(true));
498 assertThat(String.format("'%s' should contain a DependsOn relationship value", nodeTypesYamlMap),
499 result.contains("tosca.relationships.DependsOn"), is(true));
502 private List<String> getExpectedDefinitionFolderFileList(final String vfResourceName) {
503 final List<String> expectedDefinitionFolderFileList = new ArrayList<>();
504 vfcs.forEach(vfc -> expectedDefinitionFolderFileList.add("Definitions/resource-" + vfc.getName() + "-template.yml"));
505 expectedDefinitionFolderFileList.add("Definitions/resource-" + vfResourceName + "-template.yml");
506 expectedDefinitionFolderFileList.add("Definitions/resource-" + vfResourceName + "-template-interface.yml");
507 return expectedDefinitionFolderFileList;
510 private Map<String, Object> getMapEntry(final Map<String, Object> yamlObj, final String entryName) {
512 return (Map<String, Object>) yamlObj.get(entryName);
513 } catch (final Exception e) {
514 final String errorMsg = String.format("Could not get the '%s' entry.", entryName);
515 LOGGER.error(errorMsg, e);
516 fail(errorMsg + "Error message: " + e.getMessage());
521 private Map<String, Object> loadYamlObject(final byte[] definitionYamlFile) {
522 return new Yaml().load(new String(definitionYamlFile));
525 private Map<String, String> loadPropertiesToAdd() {
526 final Map<String, String> propertyMap = new HashMap<>();
527 propertyMap.put("property1", "string");
528 propertyMap.put("property2", "integer");
529 propertyMap.put("property3", "boolean");
530 propertyMap.put("property4", "list");
531 propertyMap.put("property5", "map");
532 propertyMap.put("property6", "scalar-unit.size");
536 private Map<String, Object> loadPropertiesToEdit() {
537 final Map<String, Object> propertyMap = new HashMap<>();
538 propertyMap.put("property1", "Integration Test");
539 propertyMap.put("property2", 100);
540 propertyMap.put("property3", Boolean.TRUE);
541 propertyMap.put("property4", Arrays.asList("PropListV1", "PropListV2", "PropListV3"));
542 final Map<String, String> stringMap = new HashMap<>();
543 stringMap.put("PropMapKey1", "PropMapValue1");
544 stringMap.put("PropMapKey2", "PropMapValue2");
545 stringMap.put("PropMapKey3", "PropMapValue3");
546 propertyMap.put("property5", stringMap);
547 propertyMap.put("property6", 500);