Initial OpenECOMP SDC commit
Change-Id: I0924d5a6ae9cdc161ae17c68d3689a30d10f407b
Signed-off-by: Michael Lando <ml636r@att.com>
diff --git a/ui-ci-dev/.gitignore b/ui-ci-dev/.gitignore
new file mode 100644
index 0000000..6405eb7
--- /dev/null
+++ b/ui-ci-dev/.gitignore
@@ -0,0 +1,2 @@
+/bin/
+test-output/
\ No newline at end of file
diff --git a/ui-ci-dev/pom.xml b/ui-ci-dev/pom.xml
new file mode 100644
index 0000000..b84322c
--- /dev/null
+++ b/ui-ci-dev/pom.xml
@@ -0,0 +1,255 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.openecomp.sdc</groupId>
+ <artifactId>sdc-main</artifactId>
+ <!-- <version>${asdc.version}</version> -->
+ <version>1610.2.1</version>
+ </parent>
+
+ <artifactId>ui-ci-dev</artifactId>
+ <description>Selenium tests for the SDnC Application</description>
+
+
+
+ <dependencies>
+ <dependency>
+ <groupId>org.seleniumhq.selenium</groupId>
+ <artifactId>selenium-java</artifactId>
+ <version>3.0.1</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.seleniumhq.selenium</groupId>
+ <artifactId>selenium-server</artifactId>
+ <version>2.48.2</version>
+ <scope>runtime</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.openecomp.sdc</groupId>
+ <artifactId>asdc-tests</artifactId>
+ <version>${asdc-tests.version}</version>
+ </dependency>
+
+ <!-- <dependency>
+ <groupId>org.openecomp.sdc</groupId>
+ <artifactId>catalog-be</artifactId>
+ <version>${asdc-tests.version}</version>
+ </dependency> -->
+
+ <dependency>
+ <groupId>org.yaml</groupId>
+ <artifactId>snakeyaml</artifactId>
+ <version>1.14</version>
+ <scope>compile</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>com.google.code.gson</groupId>
+ <artifactId>gson</artifactId>
+ <version>2.3.1</version>
+ <scope>compile</scope>
+ </dependency>
+
+ <!-- http client -->
+ <dependency>
+ <groupId>org.apache.httpcomponents</groupId>
+ <artifactId>httpclient</artifactId>
+ <scope>compile</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.httpcomponents</groupId>
+ <artifactId>httpmime</artifactId>
+ <scope>compile</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>commons-io</groupId>
+ <artifactId>commons-io</artifactId>
+ <version>1.3.2</version>
+ <scope>compile</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>commons-logging</groupId>
+ <artifactId>commons-logging</artifactId>
+ <scope>compile</scope>
+ </dependency>
+
+ <!-- http core -->
+ <dependency>
+ <groupId>org.apache.httpcomponents</groupId>
+ <artifactId>httpcore</artifactId>
+ <scope>compile</scope>
+ </dependency>
+
+ <!-- TITAN -->
+ <dependency>
+ <groupId>com.thinkaurelius.titan</groupId>
+ <artifactId>titan-core</artifactId>
+ <version>${titan.version}</version>
+ <scope>compile</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>com.thinkaurelius.titan</groupId>
+ <artifactId>titan-cassandra</artifactId>
+ <version>${titan.version}</version>
+ <scope>compile</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.codehaus.jackson</groupId>
+ <artifactId>jackson-mapper-asl</artifactId>
+ <version>1.9.2</version>
+ <scope>compile</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>com.fasterxml.jackson.core</groupId>
+ <artifactId>jackson-databind</artifactId>
+ <version>2.3.1</version>
+ <scope>compile</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>com.fasterxml.jackson.core</groupId>
+ <artifactId>jackson-core</artifactId>
+ <version>2.3.1</version>
+ <scope>compile</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.openecomp.sdc</groupId>
+ <artifactId>sdc-distribution-client</artifactId>
+ <version>1.1.2</version>
+ </dependency>
+
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <scope>compile</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.testng</groupId>
+ <artifactId>testng</artifactId>
+ <version>6.9.10</version>
+ <scope>compile</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>xml-apis</groupId>
+ <artifactId>xml-apis</artifactId>
+ <version>1.4.01</version>
+ <scope>compile</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>com.googlecode.json-simple</groupId>
+ <artifactId>json-simple</artifactId>
+ <version>1.1</version>
+ <scope>compile</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>com.relevantcodes</groupId>
+ <artifactId>extentreports</artifactId>
+ <version>2.41.1</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.commons</groupId>
+ <artifactId>commons-jci-core</artifactId>
+ <scope>compile</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.sikuli</groupId>
+ <artifactId>sikuli-api</artifactId>
+ <version>1.2.0</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.sikuli</groupId>
+ <artifactId>sikuli-core</artifactId>
+ <version>1.2.2</version>
+ </dependency>
+
+
+
+ <dependency>
+ <groupId>commons-codec</groupId>
+ <artifactId>commons-codec</artifactId>
+ <scope>compile</scope>
+ </dependency>
+ </dependencies>
+
+
+
+ <build>
+ <plugins>
+
+
+
+ <!-- ============================================= -->
+ <!-- Create the JAR file with its dependencies -->
+ <!-- ============================================= -->
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-assembly-plugin</artifactId>
+ <version>2.5.5</version>
+ <executions>
+ <execution>
+ <id>create.jar.with.dependencies</id>
+ <phase>package</phase>
+ <goals>
+ <goal>single</goal>
+ </goals>
+ <configuration>
+ <archive>
+ <manifest>
+ <mainClass>org.openecomp.sdc.ci.tests.execute.setup.SetupCDTest</mainClass>
+ </manifest>
+ </archive>
+ <descriptorRefs>
+ <descriptorRef>jar-with-dependencies</descriptorRef>
+ </descriptorRefs>
+ </configuration>
+ </execution>
+
+
+ <execution>
+ <id>tarball</id>
+ <phase>package</phase>
+ <goals>
+ <goal>single</goal>
+ </goals>
+ <configuration>
+ <finalName>${project.artifactId}-${full.release.version}${build.type}</finalName>
+ <appendAssemblyId>false</appendAssemblyId>
+ <descriptor>${project.basedir}/tarball.xml</descriptor>
+ <attach>false</attach>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+
+
+ <!-- =========================== -->
+ <!-- HP Fortifay scanner -->
+ <!-- =========================== -->
+ <plugin>
+ <groupId>com.fortify.ps.maven.plugin</groupId>
+ <artifactId>sca-maven-plugin</artifactId>
+ <version>4.30</version>
+ <configuration>
+ <scanEnabled>false</scanEnabled>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+</project>
diff --git a/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/scripts/CreateVfsFromOnboarding.java b/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/scripts/CreateVfsFromOnboarding.java
new file mode 100644
index 0000000..b11f8d1
--- /dev/null
+++ b/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/scripts/CreateVfsFromOnboarding.java
@@ -0,0 +1,67 @@
+package org.openecomp.sdc.uici.scripts;
+
+import java.io.File;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import org.openecomp.sdc.uici.tests.datatypes.CleanTypeEnum;
+import org.openecomp.sdc.uici.tests.execute.base.SetupCDTest;
+import org.openecomp.sdc.uici.tests.utilities.GeneralUIUtils;
+import org.openecomp.sdc.uici.tests.utilities.OnboardUtility;
+
+import org.openecomp.sdc.ci.tests.datatypes.enums.UserRoleEnum;
+import org.openecomp.sdc.common.datastructure.FunctionalInterfaces;
+import com.google.gson.GsonBuilder;
+
+/**
+ * This Class functions to load mass zip files to vfs through onboarding.<br>
+ * It uses both BE & UI APIs
+ *
+ * @author mshitrit
+ *
+ */
+public class CreateVfsFromOnboarding extends SetupCDTest {
+ public static void main(String[] args) {
+ CreateVfsFromOnboarding manager = new CreateVfsFromOnboarding();
+
+ FunctionalInterfaces.swallowException(() -> manager.setEnvParameters(CleanTypeEnum.NONE.name()));
+ // String folderPath = args[0];
+ String folderPath = "C:\\onboardingTest\\onBoardingZips";
+ File folder = new File(folderPath);
+ File[] listOfFiles = folder.listFiles();
+ List<String> zipFileNames = Arrays.asList(listOfFiles).stream().map(file -> file.getName())
+ .filter(fileName -> fileName.endsWith(".zip")).collect(Collectors.toList());
+ Map<String, String> filesSuccessMap = new HashMap<>();
+ for (String fileName : zipFileNames) {
+ try {
+ // Before
+ manager.beforeState(null);
+ manager.setBrowserBeforeTest();
+ createSingleVfFromOnboarding(folderPath, fileName);
+ filesSuccessMap.put(fileName, "SUCCESS");
+
+ } catch (Exception e) {
+ filesSuccessMap.put(fileName, "FAIL");
+ } finally {
+ FunctionalInterfaces.swallowException(() -> manager.afterState(null));
+ manager.quitAfterTest();
+ }
+ }
+ Path file = Paths.get("RunResults.txt");
+ String stringDataModel = new GsonBuilder().setPrettyPrinting().create().toJson(filesSuccessMap);
+ FunctionalInterfaces.swallowException(() -> Files.write(file, stringDataModel.getBytes()));
+ }
+
+ private static void createSingleVfFromOnboarding(String filePath, String zipFileName) {
+ String userId = UserRoleEnum.DESIGNER.getUserId();
+ OnboardUtility.createVfFromOnboarding(userId, zipFileName, filePath);
+ GeneralUIUtils.submitForTestingElement("Vf From Onboarding");
+
+ }
+}
diff --git a/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/datatypes/CanvasElement.java b/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/datatypes/CanvasElement.java
new file mode 100644
index 0000000..c23d05a
--- /dev/null
+++ b/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/datatypes/CanvasElement.java
@@ -0,0 +1,33 @@
+package org.openecomp.sdc.uici.tests.datatypes;
+
+import org.apache.commons.lang3.tuple.ImmutablePair;
+
+public final class CanvasElement {
+ private final String uniqueId;
+ private ImmutablePair<Integer, Integer> location;
+ private String elementName;
+
+ public String getElementName() {
+ return elementName;
+ }
+
+ public CanvasElement(String uniqueId, String elementName, ImmutablePair<Integer, Integer> location) {
+ super();
+ this.uniqueId = uniqueId;
+ this.location = location;
+ this.elementName = elementName;
+ }
+
+ public String getUniqueId() {
+ return uniqueId;
+ }
+
+ public ImmutablePair<Integer, Integer> getLocation() {
+ return location;
+ }
+
+ public void setLocation(ImmutablePair<Integer, Integer> location) {
+ this.location = location;
+ }
+
+}
diff --git a/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/datatypes/CanvasManager.java b/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/datatypes/CanvasManager.java
new file mode 100644
index 0000000..5ef8c7a
--- /dev/null
+++ b/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/datatypes/CanvasManager.java
@@ -0,0 +1,206 @@
+package org.openecomp.sdc.uici.tests.datatypes;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Random;
+import java.util.UUID;
+import java.util.stream.Collectors;
+
+import org.apache.commons.lang3.tuple.ImmutablePair;
+import org.openecomp.sdc.uici.tests.datatypes.DataTestIdEnum.LeftPanelCanvasItems;
+import org.openecomp.sdc.uici.tests.utilities.GeneralUIUtils;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.interactions.Actions;
+
+public final class CanvasManager {
+ private Map<String, CanvasElement> canvasElements;
+ private Actions actions;
+ private WebElement canvas;
+ private int reduceCanvasWidthFactor;
+ // Offsets Are used to find upper right corner of canvas element in order to
+ // connect links
+ private static final int CANVAS_ELEMENT_Y_OFFSET = 40;
+ private static final int CANVAS_ELEMENT_X_OFFSET = 21; // 14 - 27
+
+ private CanvasManager() {
+ canvasElements = new HashMap<>();
+ actions = new Actions(GeneralUIUtils.getDriver());
+ canvas = GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.GeneralCanvasItems.CANVAS.getValue());
+ try {
+ WebElement webElement = GeneralUIUtils
+ .getWebElementWaitForVisible(DataTestIdEnum.GeneralCanvasItems.CANVAS_RIGHT_PANEL.getValue());
+ reduceCanvasWidthFactor = webElement.getSize().width;
+ } catch (Exception e) {
+ reduceCanvasWidthFactor = 0;
+ }
+ }
+
+ public static CanvasManager getCanvasManager() {
+ return new CanvasManager();
+ }
+
+ public List<CanvasElement> getCanvasElements() {
+ return canvasElements.values().stream().collect(Collectors.toList());
+ }
+
+ private void addCanvasElement(CanvasElement element) {
+ canvasElements.put(element.getUniqueId(), element);
+ }
+
+ private void moveElementOnCanvas(CanvasElement canvasElement, ImmutablePair<Integer, Integer> newLocation) {
+ GeneralUIUtils.waitForLoader();
+ GeneralUIUtils.sleep(500);
+ actions.moveToElement(canvas, canvasElement.getLocation().left, canvasElement.getLocation().right);
+ actions.clickAndHold();
+ actions.moveToElement(canvas, newLocation.left, newLocation.right);
+ actions.release();
+ actions.perform();
+ canvasElement.setLocation(newLocation);
+ GeneralUIUtils.waitForLoader();
+
+ }
+
+ public void moveElementOnCanvas(CanvasElement canvasElement) {
+ moveElementOnCanvas(canvasElement, getFreePosition());
+ }
+
+ public void deleteElementFromCanvas(CanvasElement canvasElement) {
+ GeneralUIUtils.waitForLoader();
+ actions.moveToElement(canvas, canvasElement.getLocation().left, canvasElement.getLocation().right);
+ actions.click();
+ actions.perform();
+ GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.GeneralCanvasItems.DELETE_INSTANCE_BUTTON.getValue())
+ .click();
+ GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.ModalItems.OK.getValue()).click();
+ canvasElements.remove(canvasElement.getUniqueId());
+ GeneralUIUtils.waitForLoader();
+ }
+
+ public void selectElementFromCanvas(CanvasElement canvasElement) {
+ GeneralUIUtils.waitForLoader();
+ actions.moveToElement(canvas, canvasElement.getLocation().left, canvasElement.getLocation().right);
+ actions.click();
+ actions.perform();
+ GeneralUIUtils.waitForLoader();
+ }
+
+ public CanvasElement createElementOnCanvas(LeftPanelCanvasItems canvasItem) {
+ return createElementOnCanvas(canvasItem.getValue(), false);
+ }
+
+ /**
+ * Creates Element on the Canvas - use the element name.
+ *
+ * @param elementName
+ * @return
+ */
+ public CanvasElement createElementOnCanvas(String elementName) {
+ return createElementOnCanvas(elementName, true);
+ }
+
+ private CanvasElement createElementOnCanvas(String elementName, boolean addPrefix) {
+ if (addPrefix) {
+ elementName = DataTestIdEnum.LEFT_PANEL_PREFIX + elementName;
+ }
+ GeneralUIUtils.waitForLoader();
+ WebElement element = GeneralUIUtils.getWebElementWaitForVisible(elementName);
+ ImmutablePair<Integer, Integer> freePosition = getFreePosition();
+ actions.moveToElement(element, 0, 0);
+ actions.clickAndHold();
+ actions.moveToElement(canvas, freePosition.left, freePosition.right);
+ actions.release();
+ actions.perform();
+
+ String uniqueId = elementName + "_" + UUID.randomUUID().toString();
+ CanvasElement canvasElement = new CanvasElement(uniqueId, elementName, freePosition);
+ addCanvasElement(canvasElement);
+ GeneralUIUtils.waitForLoader();
+ return canvasElement;
+ }
+
+ public CanvasElement createUniqueVFOnCanvas(LeftPanelCanvasItems canvasItem) {
+ GeneralUIUtils.waitForLoader();
+ WebElement element = GeneralUIUtils.getWebElementWaitForVisible(canvasItem.getValue());
+ ImmutablePair<Integer, Integer> freePosition = getFreePosition();
+ actions.moveToElement(element, 0, 0);
+ actions.clickAndHold();
+ actions.moveToElement(canvas, freePosition.left, freePosition.right);
+ actions.release();
+ actions.perform();
+
+ String uniqueId = canvasItem.name() + "_" + UUID.randomUUID().toString();
+ CanvasElement canvasElement = new CanvasElement(uniqueId, canvasItem.getValue(), freePosition);
+ addCanvasElement(canvasElement);
+ GeneralUIUtils.waitForLoader();
+ return canvasElement;
+ }
+
+ private ImmutablePair<Integer, Integer> getFreePosition() {
+ // TODO ui-ci use better method
+ ImmutablePair<Integer, Integer> randomPosition = null;
+ boolean freePosition = false;
+ int minSpace = 150;
+ while (!freePosition) {
+ ImmutablePair<Integer, Integer> tempRandomPosition = getRandomPosition();
+ freePosition = !canvasElements.values().stream().map(e -> e.getLocation())
+ .filter(e -> Math.abs(e.left - tempRandomPosition.left) < minSpace
+ && Math.abs(e.right - tempRandomPosition.right) < minSpace)
+ .findAny().isPresent();
+ randomPosition = tempRandomPosition;
+ }
+ return randomPosition;
+ }
+
+ private ImmutablePair<Integer, Integer> getRandomPosition() {
+ int edgeBuffer = 50;
+ Random random = new Random();
+ int xElement = random.nextInt(canvas.getSize().width - 2 * edgeBuffer - reduceCanvasWidthFactor) + edgeBuffer;
+ int yElement = random.nextInt(canvas.getSize().height - 2 * edgeBuffer) + edgeBuffer;
+ return new ImmutablePair<Integer, Integer>(xElement, yElement);
+ }
+
+ /**
+ * Links two elements on canvas.<br>
+ * Currently Supports Only elements in the default size.<br>
+ * Will not work for container type or smaller elements (cp, vl etc...)<br>
+ *
+ * @param firstElement
+ * @param secondElement
+ */
+ public void linkElements(CanvasElement firstElement, CanvasElement secondElement) {
+ GeneralUIUtils.waitForLoader();
+ drawSimpleLink(firstElement, secondElement);
+ selectReqAndCapAndConnect();
+
+ GeneralUIUtils.waitForLoader();
+
+ }
+
+ private void selectReqAndCapAndConnect() {
+ // Select First Cap
+ GeneralUIUtils.getWebElementsListWaitForVisible(DataTestIdEnum.LinkMenuItems.LINK_ITEM_CAP.getValue()).get(0)
+ .click();
+ // Select First Req
+ GeneralUIUtils.getWebElementsListWaitForVisible(DataTestIdEnum.LinkMenuItems.LINK_ITEM_REQ.getValue()).get(0)
+ .click();
+ // Connect
+ GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.LinkMenuItems.CONNECT_BUTTON.getValue()).click();
+
+ }
+
+ private void drawSimpleLink(CanvasElement firstElement, CanvasElement secondElement) {
+
+ int yOffset = CANVAS_ELEMENT_Y_OFFSET;
+ int xOffset = CANVAS_ELEMENT_X_OFFSET;
+ actions.moveToElement(canvas, firstElement.getLocation().left + xOffset,
+ firstElement.getLocation().right - yOffset);
+
+ actions.clickAndHold();
+ actions.moveToElement(canvas, secondElement.getLocation().left + xOffset,
+ secondElement.getLocation().right - yOffset);
+ actions.release();
+ actions.perform();
+ GeneralUIUtils.waitForLoader();
+ }
+}
diff --git a/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/datatypes/CleanTypeEnum.java b/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/datatypes/CleanTypeEnum.java
new file mode 100644
index 0000000..f0691b8
--- /dev/null
+++ b/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/datatypes/CleanTypeEnum.java
@@ -0,0 +1,28 @@
+package org.openecomp.sdc.uici.tests.datatypes;
+
+import java.util.Arrays;
+import java.util.Optional;
+
+/**
+ * enum that represents possible methods to clean DB before and after tests.
+ *
+ * @author mshitrit
+ *
+ */
+public enum CleanTypeEnum {
+ FULL,
+ /** Unreliable should be only used in dev **/
+ PARTIAL, NONE;
+
+ /**
+ * Returns CleanType enum by it name
+ *
+ * @param cleanType
+ * @return
+ */
+ public static CleanTypeEnum findByName(String cleanType) {
+ final Optional<CleanTypeEnum> findAny = Arrays.asList(CleanTypeEnum.values()).stream()
+ .filter(e -> e.name().equals(cleanType)).findAny();
+ return findAny.get();
+ }
+}
diff --git a/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/datatypes/CreateAndImportButtonsEnum.java b/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/datatypes/CreateAndImportButtonsEnum.java
new file mode 100644
index 0000000..382584a
--- /dev/null
+++ b/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/datatypes/CreateAndImportButtonsEnum.java
@@ -0,0 +1,7 @@
+package org.openecomp.sdc.uici.tests.datatypes;
+
+public enum CreateAndImportButtonsEnum {
+
+ IMPORT_VF, IMPORT_VFC, IMPORT_CP, IMPORT_VL, CREATE_VF, CREATE_SERVICE, CREATE_PRODUCT;
+
+}
diff --git a/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/datatypes/CreateAndUpdateStepsEnum.java b/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/datatypes/CreateAndUpdateStepsEnum.java
new file mode 100644
index 0000000..ad0281d
--- /dev/null
+++ b/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/datatypes/CreateAndUpdateStepsEnum.java
@@ -0,0 +1,25 @@
+package org.openecomp.sdc.uici.tests.datatypes;
+
+public enum CreateAndUpdateStepsEnum {
+ GENERAL("Generalstep"),
+ ICON("Iconstep"),
+ DEPLOYMENT_ARTIFACT("Deployment Artifactstep"),
+ INFORMATION_ARTIFACT("Information Artifactstep"),
+ PROPERTIES("Propertiesstep"),
+ ATTRIBUTES("Attributesstep"),
+ COMPOSITION("Compositionstep"),
+ DEPLOYMENT("Deploymentstep"),
+ REQUIREMENTS_AND_CAPABILITIES("Req. & Capabilitiesstep"),
+ INPUTS("Inputsstep");
+
+ private String value;
+
+ public String getValue() {
+ return value;
+ }
+
+ private CreateAndUpdateStepsEnum(String value) {
+ this.value = value;
+ }
+
+}
diff --git a/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/datatypes/DataTestIdEnum.java b/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/datatypes/DataTestIdEnum.java
new file mode 100644
index 0000000..64db12a
--- /dev/null
+++ b/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/datatypes/DataTestIdEnum.java
@@ -0,0 +1,428 @@
+package org.openecomp.sdc.uici.tests.datatypes;
+
+public final class DataTestIdEnum {
+ private DataTestIdEnum() {
+ };
+
+ public enum Dashboard {
+ IMPORT_AREA("importButtonsArea"),
+ BUTTON_ADD_VF("createResourceButton"),
+ BUTTON_ADD_SERVICE("createServiceButton"),
+ IMPORT_VFC("importVFCbutton"),
+ IMPORT_VF("importVFbutton"),
+ IMPORT_VFC_FILE("file-importVFCbutton"),
+ IMPORT_VF_FILE("file-importVFbutton");
+
+ private String value;
+
+ public String getValue() {
+ return value;
+ }
+
+ private Dashboard(String value) {
+ this.value = value;
+ }
+ }
+
+ public enum LifeCyleChangeButtons {
+ CREATE("create/save"),
+ CHECK_IN("check_in"),
+ SUBMIT_FOR_TESTING("submit_for_testing"),
+ START_TESTING("start_testing"),
+ ACCEPT("accept"),
+ APPROVE("approve"),
+ DISTRIBUTE("distribute");
+
+ private String value;
+
+ public String getValue() {
+ return value;
+ }
+
+ private LifeCyleChangeButtons(String value) {
+ this.value = value;
+ }
+ }
+
+ /**
+ * Artifacts Related Elements
+ *
+ * @author mshitrit
+ *
+ */
+ public enum Artifatcs {
+ ADD_DEPLOYMENT_ARTIFACT("add-deployment-artifact-button"),
+ SELECT_ARTIFACT_DROPDOWN("selectArtifact"),
+ ARTIFACT_TYPE_DROPDOWN("artifacttype"),
+ ARTIFACT_DESCRIPTION("description"),
+ ARTIFACT_LABEL("artifactLabel"),
+ BROWSE_BUTTON("browseButton"),
+ ADD_BUTTON("Add");
+
+ private String value;
+
+ public String getValue() {
+ return value;
+ }
+
+ private Artifatcs(String value) {
+ this.value = value;
+ }
+
+ }
+
+ public enum InformationalArtifatcs {
+ CLOUD_QUESTIONNAIRE("Cloud Questionnaire (completed)"),
+ FEATURES("Features"),
+ VENDOR_TEST_RESULT("Vendor Test Result"),
+ TEST_SCRIPTS("Test Scripts"),
+ HEAT_TEMPLATE_FROM_VENDOR("HEAT Template from Vendor"),
+ CAPACITY("Capacity");
+
+ private String value;
+
+ public String getValue() {
+ return value;
+ }
+
+ private InformationalArtifatcs(String value) {
+ this.value = value;
+ }
+
+ }
+
+ public enum ArtifactModal {
+ LABEL("artifact-label"), TYPE("artifacttype"),;
+
+ private String value;
+
+ public String getValue() {
+ return value;
+ }
+
+ private ArtifactModal(String value) {
+ this.value = value;
+ }
+ }
+
+ public enum ModalItems {
+ BROWSE_BUTTON("browseButton"),
+ ADD("Add"),
+ DESCRIPTION("description"),
+ SUMBIT_FOR_TESTING_MESSAGE("changeLifeCycleMessage"),
+ OK("OK"),
+ CANCEL("Cancel"),
+ ACCEP_TESTING_MESSAGE("checkindialog"),
+ MESSAGE_TEXT("message"),
+ DONE("Done");
+
+ private String value;
+
+ public String getValue() {
+ return value;
+ }
+
+ private ModalItems(String value) {
+ this.value = value;
+ }
+ }
+
+ public static final String LEFT_PANEL_PREFIX = "leftbar-section-content-item-";
+
+ public enum LeftPanelCanvasItems {
+ BLOCK_STORAGE(LEFT_PANEL_PREFIX + "BlockStorage"),
+ CINDER_VOLUME(LEFT_PANEL_PREFIX + "CinderVolume"),
+ COMPUTE(LEFT_PANEL_PREFIX + "Compute"),
+ LOAD_BALANCER(LEFT_PANEL_PREFIX + "LoadBalancer"),
+ NOVA_SERVER(LEFT_PANEL_PREFIX + "NovaServer"),
+ OBJECT_STORAGE(LEFT_PANEL_PREFIX + "ObjectStorage"),
+ // NEUTRON_PORT(LEFT_PANEL_PREFIX + "-NeutronPort"),
+ // PORT(LEFT_PANEL_PREFIX + "-Port"),
+ DATABASE(LEFT_PANEL_PREFIX + "-Database"),
+ VMMC(LEFT_PANEL_PREFIX + "vmmc_work");
+
+ private String value;
+
+ public String getValue() {
+ return value;
+ }
+
+ private LeftPanelCanvasItems(String value) {
+ this.value = value;
+ }
+ }
+
+ public enum RightBar {
+ PROPERTIES_AND_ATTRIBUTES("properties-and-attributes-tab"),
+ DEPLOYMENT_ARTIFACTS("deployment-artifact-tab"),
+ ARTIFACT_NAME("artifactName"),
+ ADD_ARTIFACT_BUTTON("add_Artifact_Button"),
+ DELETE_ARTIFACT_BUTTON("delete"),
+ MYATTR_ATTR_FROM_LIST("my_attr-attr"),
+ MYATTR_ATTR_VALUE_FROM_LIST("value-of-my_attr"),;
+
+ private String value;
+
+ public String getValue() {
+ return value;
+ }
+
+ private RightBar(String value) {
+ this.value = value;
+ }
+ }
+
+ // for now we use index to work with the breadcrumbs
+ // any change in the breadcrumbs position will require an update here also
+ public enum BreadcrumbsButtonsEnum {
+ HOME("breadcrumbs-button-0"),
+ COMPONENT("breadcrumbs-button-1");
+
+ private String value;
+
+ public String getValue() {
+ return value;
+ }
+
+ private BreadcrumbsButtonsEnum(String value) {
+ this.value = value;
+ }
+ }
+
+ public enum InputsEnum {
+ VF_INSTANCE("inputs-vf-instance-0"),
+ FIRST_INPUT_CHECKBOX("inputs-checkbox-0"),
+ SECOND_INPUT_CHECKBOX("inputs-checkbox-1"),
+ ADD_INPUTS_BUTTON("add-inputs-to-service-button"),
+ SERVICE_INPUT("service-input-0"),
+ DELETE_INPUT("delete-input-0");
+
+ private String value;
+
+ public String getValue() {
+ return value;
+ }
+
+ private InputsEnum(String value) {
+ this.value = value;
+ }
+
+ }
+
+ public enum TabsBar {
+ HIERARCHY_TAB("hierarchy-tab"),
+ SELECTED_TAB("selected-tab"),
+ TAB_HEADER("tab-header"),
+ TAB_SUB_HEADER("tab-sub-header"),
+ HIERARCHY_MODULE("hierarchy-module-0"),
+ HIERARCHY_MODULE_TITLE("hierarchy-module-0-title"),
+ HIERARCHY_SELECTED_MODULE_DATA("selected-module-data"),
+ HIERARCHY_SELECTED_MODULE_NAME("selected-module-name"),
+ HIERARCHY_SELECTED_MODULE_UUID("selected-module-group-uuid"),
+ HIERARCHY_SELECTED_MODULE_VERSION("selected-module-version"),
+ HIERARCHY_SELECTED_MODULE_IS_BASE("selected-module-is-base"),
+ HIERARCHY_SELECTED_MODULE_ARTIFACT_NAME("selected-module-artifact-name"),
+ HIERARCHY_SELECTED_MODULE_ARTIFACT_UUID("selected-module-artifact-uuid"),
+ HIERARCHY_SELECTED_MODULE_ARTIFACT_VERSION("selected-module-artifact-version");
+
+ private String value;
+
+ public String getValue() {
+ return value;
+ }
+
+ private TabsBar(String value) {
+ this.value = value;
+ }
+ }
+
+ public enum UpdateNamePopover {
+ OPEN_POPOVER_ICON("edit-name-popover-icon"),
+ POPOVER_FORM("popover-form"),
+ POPOVER_SAVE_BUTTON("popover-save-button"),
+ POPOVER_INSTANCE_NAME("popover-vfinstance-name"),
+ POPOVER_HEAT_NAME("popover-heat-name"),
+ POPOVER_MODULE_NAME("popover-module-name"),
+ POPOVER_CLOSE_BUTTON("popover-close-button"),
+ POPOVER_X_BUTTON("popover-x-button");
+
+ private String value;
+
+ public String getValue() {
+ return value;
+ }
+
+ private UpdateNamePopover(String value) {
+ this.value = value;
+ }
+ }
+
+ public enum LinkMenuItems {
+ CANCEL_BUTTON("link-menu-button-cancel"),
+ CONNECT_BUTTON("link-menu-button-connect"),
+ LINK_ITEM_CAP("link-item-capabilities"),
+ LINK_ITEM_REQ("link-item-requirements"),
+ LINK_MENU("link-menu-open");
+
+ private String value;
+
+ public String getValue() {
+ return value;
+ }
+
+ private LinkMenuItems(String value) {
+ this.value = value;
+ }
+ }
+
+ public enum GeneralCanvasItems {
+ CANVAS("canvas"),
+ CANVAS_RIGHT_PANEL("w-sdc-designer-sidebar-head"),
+ DELETE_INSTANCE_BUTTON("e-sdc-small-icon-delete");
+
+ private String value;
+
+ public String getValue() {
+ return value;
+ }
+
+ private GeneralCanvasItems(String value) {
+ this.value = value;
+ }
+ }
+
+ public enum AttributesSection {
+ TABLE_ROWS("attributes-table-row"),
+ EDIT_BUTTON_FOR_NETWORK_ATTR("edit_networks"),
+ DELETE_BUTTON_FOR_NETWORK_ATTR("delete_networks"),
+ ADD_BUTTON("add-attribute-button");
+
+ private String value;
+
+ public String getValue() {
+ return value;
+ }
+
+ private AttributesSection(String value) {
+ this.value = value;
+ }
+ }
+
+ public enum AttributeForm {
+ NAME_FIELD("attributeName"),
+ DESCRIPTION_FIELD("description"),
+ TYPE_FIELD("type-field"),
+ DEFAULT_VAL_FIELD("defaultvalue"),
+ BOOL_DEFAULT_VAL_FIELD("booleantype"),
+ SCHEMA_FIELD("schema"),
+ BOOL_VALUE_FIELD("boolean-type-value"),
+ HIDDEN_FIELD("hidden"),
+ UPDATE_BUTTON("Update"),
+ DONE_BUTTON("Done"),
+ ADD_BUTTON("Add");
+
+ private String value;
+
+ public String getValue() {
+ return value;
+ }
+
+ private AttributeForm(String value) {
+ this.value = value;
+ }
+ }
+
+ public enum PropertiesSection {
+ ADD_BUTTON("addGrey"),;
+
+ private String value;
+
+ public String getValue() {
+ return value;
+ }
+
+ private PropertiesSection(String value) {
+ this.value = value;
+ }
+ }
+
+ public enum PropertyForm {
+ FORM_CONTAINER("sdc-edit-property-container"),
+ NAME_FIELD("propertyName"),
+ DESCRIPTION_FIELD("description"),
+ TYPE_FIELD("propertyType"),
+ SCHEMA_FIELD("schema-type"),
+ SIMPLE_TYPE_DEFAULT_VAL_FIELD("defaultvalue"),
+ SIMPLE_TYPE_BOOL_DEFAULT_VAL_FIELD("booleantype"),
+ LIST_TYPE_DEFAULT_VAL_FIELD("listNewItem-1"),
+ MAP_TYPE_DEFAULT_VAL_KEY_FIELD_FOR_FIRST_ITEM("mapKey-10"),
+ MAP_TYPE_DEFAULT_VAL_VALUE_FIELD_FOR_FIRST_ITEM("mapValue-10"),
+ MAP_TYPE_DEFAULT_VAL_KEY_FIELD_FOR_SECOND_ITEM("mapKey-11"),
+ MAP_TYPE_DEFAULT_VAL_VALUE_FIELD_FOR_SECOND_ITEM("mapValue-11"),
+ ADD_ITEM_TO_LIST_BUTTON("add-list-item-1"),
+ ADD_ITEM_TO_MAP_BUTTON("add-map-item"),
+ DELETE_FIRST_ITEM_FROM_MAP_BUTTON("delete-map-item-10"),
+ START_PORT_FIELD_FOR_PORT_PAIRS_DT("-1start_port"),
+ SAVE_BUTTON("Save");
+
+ private String value;
+
+ public String getValue() {
+ return value;
+ }
+
+ private PropertyForm(String value) {
+ this.value = value;
+ }
+ }
+
+ public enum GeneralSection {
+ BROWSE_BUTTON("browseButton"), FILE_NAME("filename"), NAME("name"), LOADER("tlv-loader");
+
+ private String value;
+
+ public String getValue() {
+ return value;
+ }
+
+ private GeneralSection(String value) {
+ this.value = value;
+ }
+ }
+
+ public enum ReqAndCapabilitiesSection {
+ SEARCH_BOX("search-box"), CAP_TAB("cap-tab"), REQ_TAB("req-tab");
+
+ private String value;
+
+ public String getValue() {
+ return value;
+ }
+
+ private ReqAndCapabilitiesSection(String value) {
+ this.value = value;
+ }
+ }
+
+ public enum OnBoardingTable {
+ OPEN_MODAL_BUTTON("repository-icon"),
+ VENDOR_HEADER_COL("Vendor"),
+ NAME_HEADER_COL("Name"),
+ CATEGORY_HEADER_COL("Category"),
+ VERSION_HEADER_COL("Version"),
+ IMPORT_ICON("import-csar"),
+ UPDATE_ICON("update-csar"),
+ CSAR_ROW("csar-row"),
+ ONBOARDING_SEARCH("onboarding-search");
+
+ private String value;
+
+ public String getValue() {
+ return value;
+ }
+
+ private OnBoardingTable(String value) {
+ this.value = value;
+ }
+ }
+}
diff --git a/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/datatypes/MenuOptionsEnum.java b/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/datatypes/MenuOptionsEnum.java
new file mode 100644
index 0000000..4c45858
--- /dev/null
+++ b/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/datatypes/MenuOptionsEnum.java
@@ -0,0 +1,17 @@
+package org.openecomp.sdc.uici.tests.datatypes;
+
+public enum MenuOptionsEnum {
+
+ EDIT("Edit"), CHECK_IN("Check in"), CHECK_OUT("Check out"), VIEW("View"), SUBMIT_FOR_TEST("Submit For Test"), ACCEPT("Accept"), REJECT("Reject"), START_TEST("Start test"), DISTREBUTE("Distribute");
+
+ private String value;
+
+ public String getValue() {
+ return value;
+ }
+
+ private MenuOptionsEnum(String value) {
+ this.value = value;
+ }
+
+}
diff --git a/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/datatypes/UserCredentials.java b/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/datatypes/UserCredentials.java
new file mode 100644
index 0000000..0d94529
--- /dev/null
+++ b/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/datatypes/UserCredentials.java
@@ -0,0 +1,29 @@
+package org.openecomp.sdc.uici.tests.datatypes;
+
+import org.openecomp.sdc.be.model.User;
+
+public class UserCredentials extends User {
+
+ private String password;
+
+ public UserCredentials(String userId, String password, String firstname, String lastname) {
+ super();
+ setUserId(userId);
+ this.password = password;
+ setFirstName(firstname);
+ setLastName(lastname);
+ }
+
+ public UserCredentials() {
+ super();
+ }
+
+ public String getPassword() {
+ return password;
+ }
+
+ public void setPassword(String password) {
+ this.password = password;
+ }
+
+}
diff --git a/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/execute/base/SetupCDTest.java b/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/execute/base/SetupCDTest.java
new file mode 100644
index 0000000..42e9f13
--- /dev/null
+++ b/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/execute/base/SetupCDTest.java
@@ -0,0 +1,408 @@
+package org.openecomp.sdc.uici.tests.execute.base;
+
+import java.io.FileNotFoundException;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import org.apache.commons.lang.NotImplementedException;
+import org.apache.log4j.Logger;
+import org.apache.tinkerpop.gremlin.structure.Edge;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.rules.TestName;
+import org.openecomp.sdc.uici.tests.datatypes.CleanTypeEnum;
+import org.openecomp.sdc.uici.tests.datatypes.UserCredentials;
+import org.openecomp.sdc.uici.tests.utilities.FileHandling;
+import org.openecomp.sdc.uici.tests.utilities.GeneralUIUtils;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.testng.AssertJUnit;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.BeforeSuite;
+import org.testng.annotations.Optional;
+import org.testng.annotations.Parameters;
+
+import org.openecomp.sdc.be.model.User;
+import org.openecomp.sdc.ci.tests.api.ComponentBaseTest;
+import org.openecomp.sdc.ci.tests.config.Config;
+import org.openecomp.sdc.ci.tests.datatypes.enums.UserRoleEnum;
+import org.openecomp.sdc.ci.tests.run.StartTest;
+import org.openecomp.sdc.ci.tests.utils.Utils;
+import org.openecomp.sdc.common.datastructure.FunctionalInterfaces;
+import com.google.common.collect.Lists;
+import com.thinkaurelius.titan.core.TitanGraph;
+
+public abstract class SetupCDTest extends ComponentBaseTest {
+
+ private TitanSnapshot snapshot;
+ private static CleanTypeEnum cleanType;
+
+ public SetupCDTest() {
+ super(new TestName(), SetupCDTest.class.getName());
+ }
+
+ public SetupCDTest(TestName name, String className) {
+ super(name, className);
+ }
+
+ public static Logger logger = Logger.getLogger(SetupCDTest.class.getName());
+
+ /**************** CONSTANTS ****************/
+ private static final String CREDENTIALS_FILE = "src/main/resources/ci/conf/credentials.yaml";
+ public static final String SELENIUM_NODE_URL = "http://%s:%s/wd/hub";
+
+ /**************** PRIVATES ****************/
+ public static Config config;
+ private Map<?, ?> credentialsYamlFileMap;
+
+ private static String devUrl, cdUrl;
+
+ /****************
+ * BEFORE
+ *
+ * @throws FileNotFoundException
+ ****************/
+
+ @BeforeSuite(alwaysRun = true)
+ @Parameters({ "clean-type" })
+ public void setEnvParameters(@Optional("PARTIAL") String cleanType) throws FileNotFoundException {
+ this.cleanType = CleanTypeEnum.findByName(cleanType);
+ System.out.println("setup before class");
+ config = Utils.getConfig();
+ loadCredentialsFile();
+ setUrl();
+ }
+
+ @BeforeMethod(alwaysRun = true)
+ public void setBrowserBeforeTest() {
+ setBrowserBeforeTest(getRole());
+ }
+
+ /**************** AFTER ****************/
+ @AfterMethod(alwaysRun = true)
+ public void quitAfterTest() {
+ System.out.println("closing browser");
+ GeneralUIUtils.getDriver().quit();
+ }
+
+ @BeforeMethod(alwaysRun = true)
+ public void beforeState() throws Exception {
+ CleanTypeEnum cleanType = getCleanMode();
+ switch (cleanType) {
+ case FULL: {
+ super.beforeState(null);
+ break;
+ }
+ case PARTIAL: {
+ takeTitanSnapshot();
+ break;
+ }
+ case NONE: {
+ // No Clean Up
+ break;
+ }
+ default: {
+ throw new NotImplementedException("Enum Value:" + cleanType.name() + " Is not handled");
+ }
+ }
+
+ }
+
+ @AfterMethod(alwaysRun = true)
+ public void afterState() throws Exception {
+ CleanTypeEnum cleanType = getCleanMode();
+ switch (cleanType) {
+ case FULL: {
+ super.afterState(null);
+ break;
+ }
+ case PARTIAL: {
+ resetToOriginalSnapshot();
+ break;
+ }
+ case NONE: {
+ // No Clean Up
+ break;
+ }
+ default: {
+ throw new NotImplementedException("Enum Value:" + cleanType.name() + " Is not handled");
+ }
+ }
+
+ }
+
+ private void takeTitanSnapshot() {
+ List<Edge> edgeList = Lists.newArrayList(getTitanGraph().edges(null));
+ List<Vertex> verList = Lists.newArrayList(getTitanGraph().vertices(null));
+ setSnapshot(new TitanSnapshot(edgeList, verList));
+
+ }
+
+ private static class TitanSnapshot {
+ List<Edge> edges;
+ List<Vertex> vertices;
+
+ public List<Edge> getEdges() {
+ return edges;
+ }
+
+ public List<Vertex> getVertices() {
+ return vertices;
+ }
+
+ private TitanSnapshot(List<Edge> edges, List<Vertex> vertices) {
+ super();
+ this.edges = edges;
+ this.vertices = vertices;
+ }
+ }
+
+ private void resetToOriginalSnapshot() {
+
+ List<Edge> joinedEdges = new ArrayList<>();
+ List<Vertex> joinedVertices = new ArrayList<>();
+ TitanSnapshot original = getSnapshot();
+ takeTitanSnapshot();
+ TitanSnapshot current = getSnapshot();
+
+ original.getEdges().stream().forEach(e -> addIfIdInList(e, current.getEdges(), joinedEdges, e2 -> e2.id()));
+ original.getVertices().stream()
+ .forEach(e -> addIfIdInList(e, current.getVertices(), joinedVertices, e2 -> e2.id()));
+
+ List<Edge> edgesToRemove = removeFromList(current.getEdges(), joinedEdges, e2 -> e2.id());
+ List<Vertex> verticesToRemove = removeFromList(current.getVertices(), joinedVertices, e2 -> e2.id());
+
+ List<Edge> edgesToAdd = removeFromList(original.getEdges(), joinedEdges, e2 -> e2.id());
+ List<Vertex> verticesToAdd = removeFromList(original.getVertices(), joinedVertices, e2 -> e2.id());
+
+ if (edgesToAdd.isEmpty() && verticesToAdd.isEmpty()) {
+ edgesToRemove.stream().forEach(e -> e.remove());
+ verticesToRemove.stream().forEach(v -> v.remove());
+ }
+
+ }
+
+ private <Element, ID> List<Element> removeFromList(List<Element> listToRemoveFrom, List<Element> elementsToRemove,
+ Function<Element, ID> idGetter) {
+ Set<ID> idSet = new HashSet<>();
+ // Fill The Set
+ elementsToRemove.stream().map(e -> idGetter.apply(e)).forEach(e2 -> idSet.add(e2));
+ return listToRemoveFrom.stream().filter(p -> !idSet.contains(idGetter.apply(p))).collect(Collectors.toList());
+
+ }
+
+ private <Element, ID> void addIfIdInList(Element e, List<Element> listToCheck, List<Element> listToAddTo,
+ Function<Element, ID> idGetter) {
+ Stream<Element> matchingElements = listToCheck.stream()
+ .filter(p -> idGetter.apply(e).equals(idGetter.apply(p)));
+ listToAddTo.addAll(matchingElements.collect(Collectors.toList()));
+ }
+
+ /**************** MAIN ****************/
+ public static void main(String[] args) {
+ System.out.println("---------------------");
+ System.out.println("running test from CLI");
+ System.out.println("---------------------");
+ args = new String[] { "ui-ci.xml" };
+ StartTest.main(args);
+ }
+
+ /***********************************************************************************/
+
+ protected void setBrowserBeforeTest(UserRoleEnum role) {
+ System.out.println("setup before test");
+ GeneralUIUtils.initDriver();
+ setDevUrl(role);
+ loginWithUser(role);
+ }
+
+ protected void setUrl() {
+ cdUrl = config.getUrl();
+ setDevUrl(getRole());
+ }
+
+ private Map<String, String> loadCredentialsFile() {
+ final String credintialsFile = (System.getProperty("credentials.file") != null)
+ ? System.getProperty("credentials.file") : CREDENTIALS_FILE;
+ System.out.println("credentials file is : " + credintialsFile);
+ FunctionalInterfaces.swallowException(
+ () -> credentialsYamlFileMap = (Map<String, String>) FileHandling.parseYamlFile(credintialsFile));
+ System.out.println(credentialsYamlFileMap.toString());
+ return (Map<String, String>) credentialsYamlFileMap;
+ }
+
+ protected UserCredentials getUserCredentialsFromFile(String userRole) throws Exception {
+ Map<String, String> credentialsMap = (Map<String, String>) credentialsYamlFileMap.get(userRole);
+ String user = (String) credentialsMap.get("username");
+ String password = (String) credentialsMap.get("password");
+ String firstname = (String) credentialsMap.get("firstname");
+ String lastname = (String) credentialsMap.get("lastname");
+
+ return new UserCredentials(user, password, firstname, lastname);
+ }
+
+ public void navigateToUrl(String url) throws InterruptedException {
+ WebDriver driver = GeneralUIUtils.getDriver();
+ System.out.println("navigating to URL :" + url);
+ driver.navigate().to(url);
+ driver.manage().window().maximize();
+ driver.manage().deleteAllCookies();
+ }
+
+ protected void loginToSystem(UserCredentials credentials) throws Exception {
+
+ sendUserAndPasswordKeys(credentials);
+ WebElement submitButton = GeneralUIUtils.getDriver().findElement(By.name("btnSubmit"));
+ submitButton.click();
+ WebElement buttonOK = GeneralUIUtils.getDriver().findElement(By.name("successOK"));
+ AssertJUnit.assertTrue(buttonOK.isDisplayed());
+ buttonOK.click();
+ System.out.println("Entering to design studio");
+ Thread.sleep(2000);
+ WebElement enterToUserWorkspaceButton = GeneralUIUtils.getDriver()
+ .findElement(By.xpath("//button[@data-tests-id='Design Studio']"));
+ enterToUserWorkspaceButton.click();
+ }
+
+ private void sendUserAndPasswordKeys(UserCredentials userId) {
+ System.out.println("Login to system with user : " + userId.getUserId());
+ WebElement userNameTextbox = GeneralUIUtils.getDriver().findElement(By.name("userid"));
+ userNameTextbox.sendKeys(userId.getUserId());
+ WebElement passwordTextbox = GeneralUIUtils.getDriver().findElement(By.name("password"));
+ passwordTextbox.sendKeys(userId.getPassword());
+ }
+
+ public String getUrl() {
+ String url;
+ final CleanTypeEnum workMode = getCleanMode();
+ switch (workMode) {
+ case FULL: {
+ url = devUrl;
+ break;
+ }
+ case PARTIAL: {
+ url = devUrl;
+ break;
+ }
+ case NONE: {
+ url = cdUrl;
+ break;
+ }
+ default: {
+ throw new NotImplementedException(workMode.name());
+ }
+
+ }
+ return url;
+ }
+
+ public static void setDevUrl(UserRoleEnum role) {
+ String url = SetupCDTest.devUrl;
+ switch (role) {
+ case ADMIN: {
+ url = "http://localhost:8181/sdc1/proxy-admin1#/dashboard";
+ break;
+ }
+ case DESIGNER: {
+ url = "http://localhost:8181/sdc1/proxy-designer1#/dashboard";
+ // url = "http://localhost:9000/#/dashboard";
+ break;
+ }
+ case GOVERNOR: {
+ url = "http://localhost:8181/sdc1/proxy-governor1#/dashboard";
+ break;
+ }
+ case OPS: {
+ url = "http://localhost:8181/sdc1/proxy-ops1#/dashboard";
+ break;
+ }
+ case TESTER: {
+ url = "http://localhost:8181/sdc1/proxy-tester1#/dashboard";
+ break;
+ }
+ default: {
+ break;
+ }
+ }
+ SetupCDTest.devUrl = url;
+ }
+
+ public static Config getConfig() {
+ return config;
+ }
+
+ private User user;
+
+ public void loginWithUser(UserRoleEnum role) {
+
+ setUser(role);
+ String url = getUrl();
+ System.out.println("URL is : " + url);
+ try {
+ navigateToUrl(url);
+ if (url.contains("https://www.e-access")) {
+ System.out.println("going to update designer user to mechIDs form...");
+ UserCredentials credentials = getUserCredentialsFromFile(role.name().toLowerCase());
+ loginToSystem(credentials);
+ }
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ private void setUser(UserRoleEnum role) {
+ user = new User();
+ user.setUserId(role.getUserId());
+ user.setFirstName(role.getFirstName());
+ user.setRole(role.name());
+ }
+
+ /**
+ * Current User Role
+ *
+ * @return
+ */
+ public UserRoleEnum getRole() {
+ return UserRoleEnum.DESIGNER;
+ }
+
+ /**
+ * To change clean type update configuration.<br>
+ * Do not override this method.
+ *
+ * @return
+ */
+ protected final CleanTypeEnum getCleanMode() {
+ return cleanType;
+ }
+
+ public User getUser() {
+ return user;
+ }
+
+ protected void quitAndReLogin(UserRoleEnum role) {
+ quitAfterTest();
+ setBrowserBeforeTest(role);
+ GeneralUIUtils.waitForLoader(30);
+ }
+
+ public TitanSnapshot getSnapshot() {
+ return snapshot;
+ }
+
+ public void setSnapshot(TitanSnapshot snapshot) {
+ this.snapshot = snapshot;
+ }
+
+ public static TitanGraph getTitanGraph() {
+ return titanGraph;
+ }
+
+}
diff --git a/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/execute/service/ServiceBasicTests.java b/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/execute/service/ServiceBasicTests.java
new file mode 100644
index 0000000..e42de86
--- /dev/null
+++ b/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/execute/service/ServiceBasicTests.java
@@ -0,0 +1,147 @@
+package org.openecomp.sdc.uici.tests.execute.service;
+
+import static org.testng.AssertJUnit.assertTrue;
+
+import java.util.Arrays;
+
+import org.apache.http.HttpStatus;
+import org.openecomp.sdc.uici.tests.datatypes.CanvasElement;
+import org.openecomp.sdc.uici.tests.datatypes.CanvasManager;
+import org.openecomp.sdc.uici.tests.datatypes.CreateAndUpdateStepsEnum;
+import org.openecomp.sdc.uici.tests.datatypes.DataTestIdEnum;
+import org.openecomp.sdc.uici.tests.datatypes.DataTestIdEnum.LeftPanelCanvasItems;
+import org.openecomp.sdc.uici.tests.execute.base.SetupCDTest;
+import org.openecomp.sdc.uici.tests.utilities.ArtifactUIUtils;
+import org.openecomp.sdc.uici.tests.utilities.FileHandling;
+import org.openecomp.sdc.uici.tests.utilities.GeneralUIUtils;
+import org.openecomp.sdc.uici.tests.utilities.ResourceUIUtils;
+import org.openecomp.sdc.uici.tests.utilities.RestCDUtils;
+import org.openecomp.sdc.uici.tests.utilities.ServiceUIUtils;
+import org.openecomp.sdc.uici.tests.verificator.ServiceVerificator;
+import org.openecomp.sdc.uici.tests.verificator.VfVerificator;
+import org.openqa.selenium.WebElement;
+import org.testng.annotations.Test;
+
+import org.openecomp.sdc.ci.tests.datatypes.ResourceReqDetails;
+import org.openecomp.sdc.ci.tests.datatypes.ServiceReqDetails;
+import org.openecomp.sdc.ci.tests.datatypes.enums.UserRoleEnum;
+import org.openecomp.sdc.common.api.ArtifactTypeEnum;
+
+public class ServiceBasicTests extends SetupCDTest {
+
+ @Test
+ public void testCreateService() {
+ ServiceReqDetails createServiceInUI = ServiceUIUtils.createServiceInUI(getUser());
+ ServiceVerificator.verifyServiceCreated(createServiceInUI, getUser());
+ }
+
+ @Test
+ public void testLinkTwoRI() {
+
+ // create 1st VF
+ ResourceReqDetails resourceOne = ResourceUIUtils.createResourceInUI(getUser());
+ assertTrue(RestCDUtils.getResource(resourceOne).getErrorCode() == HttpStatus.SC_OK);
+ // add LoadBalancer to resource
+ GeneralUIUtils.moveToStep(CreateAndUpdateStepsEnum.COMPOSITION);
+ CanvasManager canvasManager = CanvasManager.getCanvasManager();
+ canvasManager.createElementOnCanvas(LeftPanelCanvasItems.OBJECT_STORAGE);
+ GeneralUIUtils.checkIn();
+
+ // create 2nd VF
+ ResourceReqDetails resourceTwo = ResourceUIUtils.createResourceInUI(getUser());
+ assertTrue(RestCDUtils.getResource(resourceTwo).getErrorCode() == HttpStatus.SC_OK);
+ // add ObjectStorage to resource
+ GeneralUIUtils.moveToStep(CreateAndUpdateStepsEnum.COMPOSITION);
+ canvasManager = CanvasManager.getCanvasManager();
+ canvasManager.createElementOnCanvas(LeftPanelCanvasItems.LOAD_BALANCER);
+ GeneralUIUtils.checkIn();
+
+ // create service
+ ServiceReqDetails createServiceInUI = ServiceUIUtils.createServiceInUI(getUser());
+ // Verify Service is Created
+ ServiceVerificator.verifyServiceCreated(createServiceInUI, getUser());
+
+ GeneralUIUtils.moveToStep(CreateAndUpdateStepsEnum.COMPOSITION);
+ canvasManager = CanvasManager.getCanvasManager();
+
+ // adding two resource instances
+ CanvasElement vfOne = canvasManager.createElementOnCanvas(resourceOne.getName());
+
+ CanvasElement vfTwo = canvasManager.createElementOnCanvas(resourceTwo.getName());
+ // link elements
+ canvasManager.linkElements(vfOne, vfTwo);
+
+ // check results
+ ServiceVerificator.verifyServiceCreated(createServiceInUI, getUser());
+ ServiceVerificator.verifyLinkCreated(createServiceInUI, getUser());
+
+ }
+
+ /**
+ * This method tests the following: <br>
+ * 1. Import of VF <br>
+ * 2. Certification Of Vf <br>
+ * 3. Adding deployment artifact to VF <br>
+ * 4. Creation of Service <br>
+ * 5. Adding Vf instance to Service <br>
+ * 6. Service Certification <br>
+ * 7. Approving Service to distribution by Governor <br>
+ * 8. Making sure service is ready to distribute by ops <br>
+ */
+ @Test
+ public void testBuildServiceForDistribution() {
+ ResourceReqDetails importedVf = ResourceUIUtils.importVfInUI(getUser(), FileHandling.getResourcesFilesPath(),
+ "valid_vf.csar");
+ GeneralUIUtils.waitForLoader(20);
+ // Verify Import
+ VfVerificator.verifyResourceIsCreated(importedVf);
+
+ // Create Deployment Artifact
+ ArtifactUIUtils.createDeploymentArtifactOnVf(FileHandling.getResourcesFilesPath() + "myYang.xml",
+ ArtifactTypeEnum.YANG_XML);
+ VfVerificator.verifyResourceContainsDeploymentArtifacts(importedVf,
+ Arrays.asList(new ArtifactTypeEnum[] { ArtifactTypeEnum.YANG_XML }));
+
+ // Submit For Testing Process VF
+ GeneralUIUtils.submitForTestingElement(importedVf.getName());
+
+ // Certify The VF
+ quitAndReLogin(UserRoleEnum.TESTER);
+ ResourceUIUtils.testAndAcceptElement(importedVf);
+
+ // Verify Certification
+ GeneralUIUtils.waitForLoader();
+ VfVerificator.verifyResourceIsCertified(importedVf);
+
+ // Create Service
+ quitAndReLogin(UserRoleEnum.DESIGNER);
+ ServiceReqDetails createServiceInUI = ServiceUIUtils.createServiceInUI(getUser());
+ ServiceVerificator.verifyServiceCreated(createServiceInUI, getUser());
+
+ // Drag the VF To the Service
+ GeneralUIUtils.moveToStep(CreateAndUpdateStepsEnum.COMPOSITION);
+ CanvasManager canvasManager = CanvasManager.getCanvasManager();
+ canvasManager.createElementOnCanvas(importedVf.getName());
+
+ // Submit For Testing Process Service
+ GeneralUIUtils.submitForTestingElement(null);
+
+ // Certify The Service
+ quitAndReLogin(UserRoleEnum.TESTER);
+ ResourceUIUtils.testAndAcceptElement(createServiceInUI);
+ ServiceVerificator.verifyServiceCertified(createServiceInUI, getUser());
+
+ // Approve with governor
+ quitAndReLogin(UserRoleEnum.GOVERNOR);
+ ServiceUIUtils.approveServiceForDistribution(createServiceInUI);
+
+ // Log in with Ops and verify that can distribute
+ quitAndReLogin(UserRoleEnum.OPS);
+ GeneralUIUtils.getWebElementWaitForVisible(createServiceInUI.getName()).click();
+ WebElement distributeWebElement = GeneralUIUtils
+ .getWebElementWaitForVisible(DataTestIdEnum.LifeCyleChangeButtons.DISTRIBUTE.getValue());
+ assertTrue(distributeWebElement != null);
+
+ }
+
+}
diff --git a/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/execute/service/ServiceInputsTests.java b/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/execute/service/ServiceInputsTests.java
new file mode 100644
index 0000000..b3e8e02
--- /dev/null
+++ b/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/execute/service/ServiceInputsTests.java
@@ -0,0 +1,124 @@
+package org.openecomp.sdc.uici.tests.execute.service;
+
+import static org.testng.AssertJUnit.assertTrue;
+import static org.testng.AssertJUnit.assertFalse;
+
+import org.openecomp.sdc.ci.tests.datatypes.ResourceReqDetails;
+import org.openecomp.sdc.ci.tests.datatypes.ServiceReqDetails;
+import org.openecomp.sdc.uici.tests.datatypes.CanvasElement;
+import org.openecomp.sdc.uici.tests.datatypes.CanvasManager;
+import org.openecomp.sdc.uici.tests.datatypes.CreateAndUpdateStepsEnum;
+import org.openecomp.sdc.uici.tests.datatypes.DataTestIdEnum.BreadcrumbsButtonsEnum;
+import org.openecomp.sdc.uici.tests.datatypes.DataTestIdEnum.InputsEnum;
+import org.openecomp.sdc.uici.tests.datatypes.DataTestIdEnum.ModalItems;
+import org.openecomp.sdc.uici.tests.execute.base.SetupCDTest;
+import org.openecomp.sdc.uici.tests.utilities.FileHandling;
+import org.openecomp.sdc.uici.tests.utilities.GeneralUIUtils;
+import org.openecomp.sdc.uici.tests.utilities.ResourceUIUtils;
+import org.openecomp.sdc.uici.tests.utilities.ServiceUIUtils;
+import org.openecomp.sdc.uici.tests.verificator.ServiceVerificator;
+import org.testng.annotations.Test;
+
+public class ServiceInputsTests extends SetupCDTest {
+
+ public String serviceName = "";
+
+ @Test
+ private void testSelectingInputAndAddingItToTheService() {
+ ServiceInputsTestsSetUp();
+
+ assertTrue(GeneralUIUtils.getWebElementWaitForVisible(InputsEnum.FIRST_INPUT_CHECKBOX.getValue()).getAttribute("class").contains("disabled"));
+ assertTrue(GeneralUIUtils.isElementPresent(InputsEnum.SERVICE_INPUT.getValue()));
+ }
+
+ @Test
+ private void testDeletingAnInputFromTheService() {
+ ServiceInputsTestsSetUp();
+
+ // clicking on the delete input button and accepting the delete
+ GeneralUIUtils.getWebElementWaitForClickable(InputsEnum.DELETE_INPUT.getValue()).click();
+ GeneralUIUtils.getWebElementWaitForClickable(ModalItems.OK.getValue()).click();
+
+ assertFalse(GeneralUIUtils.getWebElementWaitForVisible(InputsEnum.FIRST_INPUT_CHECKBOX.getValue()).getAttribute("class").contains("disabled"));
+ assertFalse(GeneralUIUtils.isElementPresent(InputsEnum.SERVICE_INPUT.getValue()));
+ }
+
+ @Test
+ private void testCheckingInTheServiceAndButtonsAreDisabled() throws Exception {
+ ServiceInputsTestsSetUp();
+
+ // Checking in the service and accessing it again in the home
+ GeneralUIUtils.checkIn();
+ GeneralUIUtils.closeNotificatin();
+ GeneralUIUtils.findComponentAndClick(serviceName);
+ GeneralUIUtils.moveToStep(CreateAndUpdateStepsEnum.INPUTS);
+ GeneralUIUtils.getWebElementWaitForClickable(InputsEnum.VF_INSTANCE.getValue()).click();
+
+ assertTrue(GeneralUIUtils.getWebElementWaitForVisible(InputsEnum.FIRST_INPUT_CHECKBOX.getValue()).getAttribute("class").contains("disabled"));
+ assertTrue(GeneralUIUtils.getWebElementWaitForVisible(InputsEnum.SECOND_INPUT_CHECKBOX.getValue()).getAttribute("class").contains("disabled"));
+ assertTrue(GeneralUIUtils.getWebElementWaitForVisible(InputsEnum.DELETE_INPUT.getValue()).getAttribute("class").contains("disabled"));
+ }
+
+ @Test
+ private void testInputsSanity() throws Exception {
+ ServiceInputsTestsSetUp();
+
+ assertTrue(GeneralUIUtils.getWebElementWaitForVisible(InputsEnum.FIRST_INPUT_CHECKBOX.getValue()).getAttribute("class").contains("disabled"));
+ assertTrue(GeneralUIUtils.isElementPresent(InputsEnum.SERVICE_INPUT.getValue()));
+
+ // clicking on the delete input button and accepting the delete
+ GeneralUIUtils.getWebElementWaitForClickable(InputsEnum.DELETE_INPUT.getValue()).click();
+ GeneralUIUtils.getWebElementWaitForClickable(ModalItems.OK.getValue()).click();
+
+ assertFalse(GeneralUIUtils.getWebElementWaitForVisible(InputsEnum.FIRST_INPUT_CHECKBOX.getValue()).getAttribute("class").contains("disabled"));
+ assertFalse(GeneralUIUtils.isElementPresent(InputsEnum.SERVICE_INPUT.getValue()));
+
+ // adding the input to the service again
+ GeneralUIUtils.getWebElementWaitForClickable(InputsEnum.FIRST_INPUT_CHECKBOX.getValue()).click();
+ GeneralUIUtils.getWebElementWaitForClickable(InputsEnum.ADD_INPUTS_BUTTON.getValue()).click();
+
+ // Checking in the service and accessing it again in the home
+ GeneralUIUtils.checkIn();
+ GeneralUIUtils.closeNotificatin();
+ GeneralUIUtils.findComponentAndClick(serviceName);
+ GeneralUIUtils.moveToStep(CreateAndUpdateStepsEnum.INPUTS);
+ GeneralUIUtils.getWebElementWaitForClickable(InputsEnum.VF_INSTANCE.getValue()).click();
+
+ assertTrue(GeneralUIUtils.getWebElementWaitForVisible(InputsEnum.FIRST_INPUT_CHECKBOX.getValue()).getAttribute("class").contains("disabled"));
+ assertTrue(GeneralUIUtils.getWebElementWaitForVisible(InputsEnum.SECOND_INPUT_CHECKBOX.getValue()).getAttribute("class").contains("disabled"));
+ }
+
+ private void ServiceInputsTestsSetUp() {
+ // create vf
+ String filePath = FileHandling.getResourcesFilesPath();
+ String fileName = "service_with_inputs.csar";
+ ResourceReqDetails importVfREsourceInUI = ResourceUIUtils.importVfInUIWithoutCheckin(getUser(), filePath, fileName);
+ GeneralUIUtils.waitForLoader();
+ GeneralUIUtils.closeNotificatin();
+ GeneralUIUtils.checkIn();
+ GeneralUIUtils.closeNotificatin();
+
+ // create service
+ ServiceReqDetails createServiceInUI = ServiceUIUtils.createServiceInUI(getUser());
+ ServiceVerificator.verifyServiceCreated(createServiceInUI, getUser());
+ serviceName = createServiceInUI.getName();
+
+ // go to composition
+ GeneralUIUtils.moveToStep(CreateAndUpdateStepsEnum.COMPOSITION);
+
+ // drag vf into canvas
+ CanvasManager canvasManager = CanvasManager.getCanvasManager();
+ CanvasElement canvasElement = canvasManager.createElementOnCanvas(importVfREsourceInUI.getName());
+ canvasManager.selectElementFromCanvas(canvasElement);
+ GeneralUIUtils.waitForLoader();
+
+ // moving to inputs view
+ GeneralUIUtils.getWebElementWaitForClickable(BreadcrumbsButtonsEnum.COMPONENT.getValue()).click();
+ GeneralUIUtils.moveToStep(CreateAndUpdateStepsEnum.INPUTS);
+
+ // adding the input to the service
+ GeneralUIUtils.getWebElementWaitForClickable(InputsEnum.VF_INSTANCE.getValue()).click();
+ GeneralUIUtils.getWebElementWaitForClickable(InputsEnum.FIRST_INPUT_CHECKBOX.getValue()).click();
+ GeneralUIUtils.getWebElementWaitForClickable(InputsEnum.ADD_INPUTS_BUTTON.getValue()).click();
+ }
+}
diff --git a/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/execute/vf/VfBasicTests.java b/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/execute/vf/VfBasicTests.java
new file mode 100644
index 0000000..918ac93
--- /dev/null
+++ b/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/execute/vf/VfBasicTests.java
@@ -0,0 +1,234 @@
+package org.openecomp.sdc.uici.tests.execute.vf;
+
+import static org.openecomp.sdc.common.datastructure.FunctionalInterfaces.retryMethodOnException;
+import static org.testng.AssertJUnit.assertEquals;
+import static org.testng.AssertJUnit.assertTrue;
+
+import java.io.IOException;
+import java.util.Map;
+
+import org.apache.http.HttpStatus;
+import org.openecomp.sdc.uici.tests.datatypes.CanvasElement;
+import org.openecomp.sdc.uici.tests.datatypes.CanvasManager;
+import org.openecomp.sdc.uici.tests.datatypes.CreateAndUpdateStepsEnum;
+import org.openecomp.sdc.uici.tests.datatypes.DataTestIdEnum;
+import org.openecomp.sdc.uici.tests.datatypes.DataTestIdEnum.LeftPanelCanvasItems;
+import org.openecomp.sdc.uici.tests.execute.base.SetupCDTest;
+import org.openecomp.sdc.uici.tests.utilities.ArtifactUIUtils;
+import org.openecomp.sdc.uici.tests.utilities.FileHandling;
+import org.openecomp.sdc.uici.tests.utilities.GeneralUIUtils;
+import org.openecomp.sdc.uici.tests.utilities.ResourceUIUtils;
+import org.openecomp.sdc.uici.tests.utilities.RestCDUtils;
+import org.openecomp.sdc.uici.tests.verificator.VfVerificator;
+import org.testng.annotations.Test;
+
+import org.openecomp.sdc.be.model.LifecycleStateEnum;
+import org.openecomp.sdc.be.model.User;
+import org.openecomp.sdc.ci.tests.datatypes.ArtifactReqDetails;
+import org.openecomp.sdc.ci.tests.datatypes.ResourceReqDetails;
+import org.openecomp.sdc.ci.tests.datatypes.ResourceRespJavaObject;
+import org.openecomp.sdc.ci.tests.datatypes.enums.UserRoleEnum;
+import org.openecomp.sdc.ci.tests.datatypes.http.RestResponse;
+import org.openecomp.sdc.ci.tests.utils.general.Convertor;
+import org.openecomp.sdc.ci.tests.utils.general.ElementFactory;
+import org.openecomp.sdc.ci.tests.utils.rest.ResponseParser;
+
+public class VfBasicTests extends SetupCDTest {
+
+ @Test
+ public void testImportVfTableColumns() {
+ GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.OnBoardingTable.OPEN_MODAL_BUTTON.getValue()).click();
+
+ assertTrue(GeneralUIUtils
+ .getWebElementWaitForVisible(DataTestIdEnum.OnBoardingTable.VENDOR_HEADER_COL.getValue()) != null);
+ assertTrue(GeneralUIUtils
+ .getWebElementWaitForVisible(DataTestIdEnum.OnBoardingTable.NAME_HEADER_COL.getValue()) != null);
+ assertTrue(GeneralUIUtils
+ .getWebElementWaitForVisible(DataTestIdEnum.OnBoardingTable.CATEGORY_HEADER_COL.getValue()) != null);
+
+ assertTrue(GeneralUIUtils
+ .getWebElementWaitForVisible(DataTestIdEnum.OnBoardingTable.VERSION_HEADER_COL.getValue()) != null);
+ }
+
+ @Test
+ public void testUpdateVfCreatedFromCsar() throws Exception {
+ // create vf
+ String filePath = FileHandling.getResourcesFilesPath();
+ String fileName = "Sample_CSAR.csar";
+ ResourceReqDetails importVfResourceInUI = ResourceUIUtils.importVfInUIWithoutCheckin(getUser(), filePath,
+ fileName);
+ // update csar
+ fileName = "Sample_CSAR2.csar";
+ ResourceUIUtils.updateVfCsar(filePath, fileName);
+ VfVerificator.verifyNumOfComponentInstances(importVfResourceInUI, 4);
+ }
+
+ @Test
+ public void testImportVf() {
+ String filePath = FileHandling.getResourcesFilesPath();
+ String fileName = "Sample_CSAR.csar";
+ ResourceReqDetails importVfResourceInUI = ResourceUIUtils.importVfInUI(getUser(), filePath, fileName);
+ GeneralUIUtils.waitForLoader();
+ assertTrue(RestCDUtils.getResource(importVfResourceInUI).getErrorCode() == HttpStatus.SC_OK);
+ }
+
+ @Test
+ public void testCreateVf() {
+ ResourceReqDetails createResourceInUI = ResourceUIUtils.createResourceInUI(getUser());
+ assertTrue(RestCDUtils.getResource(createResourceInUI).getErrorCode() == HttpStatus.SC_OK);
+ }
+
+ @Test
+ public void testDeleteInstanceFromCanvas() {
+ ResourceReqDetails createResourceInUI = ResourceUIUtils.createResourceInUI(getUser());
+ GeneralUIUtils.moveToStep(CreateAndUpdateStepsEnum.COMPOSITION);
+
+ CanvasManager canvasManager = CanvasManager.getCanvasManager();
+
+ canvasManager.createElementOnCanvas(LeftPanelCanvasItems.BLOCK_STORAGE);
+ CanvasElement computeElement = canvasManager.createElementOnCanvas(LeftPanelCanvasItems.COMPUTE);
+ VfVerificator.verifyNumOfComponentInstances(createResourceInUI, 2);
+ canvasManager.deleteElementFromCanvas(computeElement);
+ VfVerificator.verifyNumOfComponentInstances(createResourceInUI, 1);
+
+ }
+
+ @Test
+ public void testUpdateInstanceAttributeValue() {
+ // creare vfc with attrs
+ String filePath = FileHandling.getResourcesFilesPath();
+ String fileName = "VFCWithAttributes.yml";
+ ResourceReqDetails importVfcResourceInUI = ResourceUIUtils.importVfcInUI(getUser(), filePath, fileName);
+ GeneralUIUtils.checkIn();
+ // create vf
+ ResourceReqDetails createResourceInUI = ResourceUIUtils.createResourceInUI(getUser());
+ GeneralUIUtils.moveToStep(CreateAndUpdateStepsEnum.COMPOSITION);
+ // add vfc to canvas
+ CanvasManager canvasManager = CanvasManager.getCanvasManager();
+ CanvasElement canvasElement = canvasManager.createElementOnCanvas(importVfcResourceInUI.getName());
+ canvasManager.selectElementFromCanvas(canvasElement);
+ // edit value of vfc attr
+ GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.RightBar.PROPERTIES_AND_ATTRIBUTES.getValue())
+ .click();
+ GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.RightBar.MYATTR_ATTR_FROM_LIST.getValue()).click();
+
+ GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.AttributeForm.DEFAULT_VAL_FIELD.getValue())
+ .sendKeys("2");
+ GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.AttributeForm.DONE_BUTTON.getValue()).click();
+ String newValue = GeneralUIUtils
+ .getWebElementWaitForVisible(DataTestIdEnum.RightBar.MYATTR_ATTR_VALUE_FROM_LIST.getValue()).getText();
+ assertEquals("2", newValue);
+ }
+
+ @Test(enabled = false)
+ public void testAddInfomratinalArtifact() throws Exception {
+ ResourceReqDetails createResourceInUI = ResourceUIUtils.createResourceInUI(getUser());
+
+ GeneralUIUtils.moveToStep(CreateAndUpdateStepsEnum.INFORMATION_ARTIFACT);
+
+ ArtifactReqDetails informationalArtifact = ElementFactory.getDefaultArtifact();
+ final String FILE_PATH = System.getProperty("user.dir") + "\\src\\main\\resources\\Files\\";
+ final String FILE_NAME = "Valid_tosca_Mycompute.yml";
+
+ ArtifactUIUtils.addInformationArtifact(informationalArtifact, FILE_PATH + FILE_NAME,
+ DataTestIdEnum.InformationalArtifatcs.FEATURES);
+ ArtifactUIUtils.addInformationArtifact(informationalArtifact, FILE_PATH + FILE_NAME,
+ DataTestIdEnum.InformationalArtifatcs.CAPACITY);
+
+ RestResponse getResourceResponse = RestCDUtils.getResource(createResourceInUI);
+ assertEquals("Did not succeed to get resource after create", HttpStatus.SC_OK,
+ getResourceResponse.getErrorCode().intValue());
+
+ Map<String, Map<String, Object>> artifactsListFromResponse = ArtifactUIUtils
+ .getArtifactsListFromResponse(getResourceResponse.getResponse(), "artifacts");
+ Map<String, Object> map = artifactsListFromResponse.get("Features");
+
+ assertTrue(artifactsListFromResponse.size() >= 2);
+
+ }
+
+ @Test
+ public void testVfCertification() throws IOException {
+ // Create VF
+ ResourceReqDetails createResourceInUI = ResourceUIUtils.createResourceInUI(getUser());
+ assertTrue(RestCDUtils.getResource(createResourceInUI).getErrorCode() == HttpStatus.SC_OK);
+
+ // Submit For Testing Process
+ GeneralUIUtils.submitForTestingElement(createResourceInUI.getName());
+
+ // Tester
+ quitAndReLogin(UserRoleEnum.TESTER);
+ ResourceUIUtils.testAndAcceptElement(createResourceInUI);
+
+ // Verification
+ GeneralUIUtils.waitForLoader();
+ VfVerificator.verifyResourceIsCertified(createResourceInUI);
+
+ }
+
+ @Test
+ public void testDeploymentArtifactForVFi() {
+ User user = getUser();
+ // create vf
+ ResourceReqDetails createResourceInUI = ResourceUIUtils.createResourceInUI(user);
+ GeneralUIUtils.checkIn();
+ GeneralUIUtils.waitForLoader();
+ // create service
+ GeneralUIUtils.clickOnCreateEntityFromDashboard(DataTestIdEnum.Dashboard.BUTTON_ADD_SERVICE.getValue());
+ ResourceUIUtils.defineResourceName("serv");
+ GeneralUIUtils.defineDescription("description");
+ GeneralUIUtils.waitForLoader();
+ ResourceUIUtils.defineResourceCategory("Mobility", "selectGeneralCategory");
+ ResourceUIUtils.defineProjectCode("012345");
+ GeneralUIUtils.clickSaveButton();
+ GeneralUIUtils.waitForLoader();
+ GeneralUIUtils.moveToStep(CreateAndUpdateStepsEnum.COMPOSITION);
+ GeneralUIUtils.waitForLoader();
+ // add vf to canvas
+ CanvasManager canvasManager = CanvasManager.getCanvasManager();
+ CanvasElement canvasElement = canvasManager.createElementOnCanvas(createResourceInUI.getName());
+ canvasManager.selectElementFromCanvas(canvasElement);
+ GeneralUIUtils.waitForLoader();
+ // add artifact
+ GeneralUIUtils.getWebElementWaitForClickable(DataTestIdEnum.RightBar.DEPLOYMENT_ARTIFACTS.getValue()).click();
+ GeneralUIUtils.getWebElementWaitForClickable(DataTestIdEnum.RightBar.ADD_ARTIFACT_BUTTON.getValue()).click();
+ String newArtifactLabel = "newArtifact";
+ ArtifactReqDetails details = new ArtifactReqDetails("new_atifact", "DCAE_INVENTORY_EVENT", "desc", "",
+ newArtifactLabel);
+ ResourceUIUtils.fillinDeploymentArtifactFormAndClickDone(details,
+ FileHandling.getResourcesFilesPath() + "yamlSample.yml");
+ assertTrue(GeneralUIUtils.isElementPresent("artifact_Display_Name-" + newArtifactLabel));
+ // edit artifact
+ GeneralUIUtils.getWebElementWaitForClickable("artifact_Display_Name-" + newArtifactLabel).click();
+ String newFileName = "yamlSample2.yml";
+ retryMethodOnException(
+ () -> GeneralUIUtils.getWebElementByDataTestId(DataTestIdEnum.GeneralSection.BROWSE_BUTTON.getValue())
+ .sendKeys(FileHandling.getResourcesFilesPath() + newFileName));
+ GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.ModalItems.DONE.getValue()).click();
+ GeneralUIUtils.waitForLoader();
+ assertEquals(newFileName,
+ GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.RightBar.ARTIFACT_NAME.getValue()).getText());
+ // delete artifact
+ GeneralUIUtils.moveToHTMLElementByDataTestId("artifact_Display_Name-" + newArtifactLabel);
+ GeneralUIUtils.getWebElementWaitForClickable(DataTestIdEnum.RightBar.DELETE_ARTIFACT_BUTTON.getValue()).click();
+ GeneralUIUtils.getWebElementWaitForClickable(DataTestIdEnum.ModalItems.OK.getValue()).click();
+ GeneralUIUtils.waitForLoader();
+ assertTrue(!GeneralUIUtils.isElementPresent("artifact_Display_Name-" + newArtifactLabel));
+ }
+
+ protected ArtifactReqDetails defineInformationalArtifact() throws IOException, Exception {
+ return ElementFactory.getDefaultArtifact();
+ }
+
+ protected ResourceRespJavaObject buildResourceJavaObject(ResourceReqDetails resource, RestResponse restResponse,
+ User user) {
+ ResourceRespJavaObject resourceObject = new ResourceRespJavaObject();
+ resourceObject = Convertor.constructFieldsForRespValidation(resource, resource.getVersion(), user);
+ resourceObject.setLifecycleState((LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT).toString());
+ resourceObject.setAbstractt("false");
+ resourceObject.setIcon(resource.getIcon().replace(" ", ""));
+ resourceObject.setUniqueId(ResponseParser.getUniqueIdFromResponse(restResponse));
+ return resourceObject;
+ }
+
+}
diff --git a/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/execute/vf/VfCanvasTests.java b/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/execute/vf/VfCanvasTests.java
new file mode 100644
index 0000000..73b0966
--- /dev/null
+++ b/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/execute/vf/VfCanvasTests.java
@@ -0,0 +1,80 @@
+package org.openecomp.sdc.uici.tests.execute.vf;
+
+import org.apache.commons.lang3.tuple.ImmutablePair;
+import org.openecomp.sdc.uici.tests.datatypes.CanvasElement;
+import org.openecomp.sdc.uici.tests.datatypes.CanvasManager;
+import org.openecomp.sdc.uici.tests.datatypes.CreateAndUpdateStepsEnum;
+import org.openecomp.sdc.uici.tests.datatypes.DataTestIdEnum.LeftPanelCanvasItems;
+import org.openecomp.sdc.uici.tests.execute.base.SetupCDTest;
+import org.openecomp.sdc.uici.tests.utilities.GeneralUIUtils;
+import org.openecomp.sdc.uici.tests.utilities.ResourceUIUtils;
+import org.openecomp.sdc.uici.tests.verificator.VfVerificator;
+import org.testng.annotations.Test;
+
+import org.openecomp.sdc.ci.tests.datatypes.ResourceReqDetails;
+
+public class VfCanvasTests extends SetupCDTest {
+
+ @Test
+ public void testCanvasDrag() {
+ ResourceReqDetails createResourceInUI = ResourceUIUtils.createResourceInUI(getUser());
+ GeneralUIUtils.moveToStep(CreateAndUpdateStepsEnum.COMPOSITION);
+
+ CanvasManager canvasManager = CanvasManager.getCanvasManager();
+ CanvasElement createElementOnCanvas = canvasManager.createElementOnCanvas(LeftPanelCanvasItems.BLOCK_STORAGE);
+
+ ImmutablePair<String, String> preMovePos = ResourceUIUtils.getRIPosition(createResourceInUI, getUser());
+
+ canvasManager.moveElementOnCanvas(createElementOnCanvas);
+
+ VfVerificator.verifyRILocationChanged(createResourceInUI, preMovePos, getUser());
+
+ }
+
+ @Test
+ public void testCanvasConnectComponents() {
+ ResourceReqDetails createResourceInUI = ResourceUIUtils.createResourceInUI(getUser());
+ GeneralUIUtils.moveToStep(CreateAndUpdateStepsEnum.COMPOSITION);
+
+ CanvasManager canvasManager = CanvasManager.getCanvasManager();
+ CanvasElement bsElement = canvasManager.createElementOnCanvas(LeftPanelCanvasItems.BLOCK_STORAGE);
+ CanvasElement computeElement = canvasManager.createElementOnCanvas(LeftPanelCanvasItems.COMPUTE);
+
+ canvasManager.linkElements(bsElement, computeElement);
+
+ VfVerificator.verifyLinkCreated(createResourceInUI);
+
+ }
+
+ @Test
+ public void testCanvasVFSanity() {
+ ResourceReqDetails createResourceInUI = ResourceUIUtils.createResourceInUI(getUser());
+ GeneralUIUtils.moveToStep(CreateAndUpdateStepsEnum.COMPOSITION);
+ CanvasManager canvasManager = CanvasManager.getCanvasManager();
+
+ CanvasElement bsElement = canvasManager.createElementOnCanvas(LeftPanelCanvasItems.BLOCK_STORAGE);
+ CanvasElement compElement = canvasManager.createElementOnCanvas(LeftPanelCanvasItems.COMPUTE);
+
+ ImmutablePair<String, String> preMovePos = ResourceUIUtils.getRIPosition(createResourceInUI, getUser());
+ canvasManager.moveElementOnCanvas(bsElement);
+ canvasManager.moveElementOnCanvas(compElement);
+
+ VfVerificator.verifyRILocationChanged(createResourceInUI, preMovePos, getUser());
+
+ CanvasElement bsElement2 = canvasManager.createElementOnCanvas(LeftPanelCanvasItems.BLOCK_STORAGE);
+
+ canvasManager.linkElements(bsElement2, compElement);
+
+ VfVerificator.verifyLinkCreated(createResourceInUI);
+
+ VfVerificator.verifyNumOfComponentInstances(createResourceInUI, 3);
+
+ canvasManager.moveElementOnCanvas(compElement);
+
+ canvasManager.deleteElementFromCanvas(bsElement);
+
+ VfVerificator.verifyNumOfComponentInstances(createResourceInUI, 2);
+
+ }
+
+}
diff --git a/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/execute/vf/VfDeploymentTests.java b/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/execute/vf/VfDeploymentTests.java
new file mode 100644
index 0000000..47344b7
--- /dev/null
+++ b/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/execute/vf/VfDeploymentTests.java
@@ -0,0 +1,340 @@
+package org.openecomp.sdc.uici.tests.execute.vf;
+
+import static org.testng.AssertJUnit.assertEquals;
+import static org.testng.AssertJUnit.assertFalse;
+import static org.testng.AssertJUnit.assertTrue;
+
+import java.io.IOException;
+import java.util.regex.Pattern;
+
+import org.openecomp.sdc.uici.tests.datatypes.CreateAndUpdateStepsEnum;
+import org.openecomp.sdc.uici.tests.datatypes.DataTestIdEnum;
+import org.openecomp.sdc.uici.tests.execute.base.SetupCDTest;
+import org.openecomp.sdc.uici.tests.utilities.FileHandling;
+import org.openecomp.sdc.uici.tests.utilities.GeneralUIUtils;
+import org.openecomp.sdc.uici.tests.utilities.ResourceUIUtils;
+import org.openecomp.sdc.uici.tests.utilities.RestCDUtils;
+import org.openqa.selenium.WebElement;
+import org.testng.annotations.Test;
+
+import org.openecomp.sdc.ci.tests.datatypes.ResourceReqDetails;
+
+public class VfDeploymentTests extends SetupCDTest {
+
+ // *****************************EditNamePopoverTests*****************************//
+ @Test
+ public void ClickingOnEditNamePopoverIconShouldOpenTheEditNamePopoverForm() {
+ EditNamePopoverTestsSetUp();
+
+ assertTrue(GeneralUIUtils.isElementPresent(DataTestIdEnum.UpdateNamePopover.POPOVER_FORM.getValue()));
+ }
+
+ @Test
+ public void ModuleDataShouldBeDisplayedInTheEditNameForm() {
+ EditNamePopoverTestsSetUp();
+
+ WebElement instanceName = GeneralUIUtils
+ .getWebElementWaitForVisible(DataTestIdEnum.UpdateNamePopover.POPOVER_INSTANCE_NAME.getValue());
+ WebElement heatName = GeneralUIUtils
+ .getWebElementWaitForVisible(DataTestIdEnum.UpdateNamePopover.POPOVER_HEAT_NAME.getValue());
+ WebElement moduleName = GeneralUIUtils
+ .getWebElementWaitForVisible(DataTestIdEnum.UpdateNamePopover.POPOVER_MODULE_NAME.getValue());
+
+ String moduleNameToDivide = GeneralUIUtils
+ .getWebElementWaitForVisible(DataTestIdEnum.TabsBar.HIERARCHY_MODULE.getValue()).getText();
+
+ String[] dividedModuleName = moduleNameToDivide.split(Pattern.quote(".."));
+
+ assertEquals(dividedModuleName[0], instanceName.getText());
+ assertEquals(dividedModuleName[1], heatName.getAttribute("value"));
+ assertEquals(dividedModuleName[2], moduleName.getText());
+
+ }
+
+ @Test
+ public void CloseButtonShouldCloseThePopover() {
+ EditNamePopoverTestsSetUp();
+
+ GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.UpdateNamePopover.POPOVER_CLOSE_BUTTON.getValue())
+ .click();
+
+ assertFalse(GeneralUIUtils.isElementPresent(DataTestIdEnum.UpdateNamePopover.POPOVER_FORM.getValue()));
+ }
+
+ @Test
+ public void XButtonShouldCloseThePopover() {
+ EditNamePopoverTestsSetUp();
+
+ GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.UpdateNamePopover.POPOVER_X_BUTTON.getValue())
+ .click();
+
+ assertFalse(GeneralUIUtils.isElementPresent(DataTestIdEnum.UpdateNamePopover.POPOVER_FORM.getValue()));
+ }
+
+ @Test
+ public void SaveButtonShouldBeDisabledWhileTheNameHasNotBeenChanged() {
+ EditNamePopoverTestsSetUp();
+
+ WebElement popoverSaveButton = GeneralUIUtils
+ .getWebElementWaitForVisible(DataTestIdEnum.UpdateNamePopover.POPOVER_SAVE_BUTTON.getValue());
+
+ assertTrue(popoverSaveButton.getAttribute("class").contains("disabled"));
+ }
+
+ @Test
+ public void ClickingOnTheSaveButtonShouldUpdateTheModuleName() {
+ EditNamePopoverTestsSetUp();
+
+ String newName = "testName";
+
+ GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.UpdateNamePopover.POPOVER_HEAT_NAME.getValue())
+ .clear();
+ GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.UpdateNamePopover.POPOVER_HEAT_NAME.getValue())
+ .sendKeys(newName);
+ GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.UpdateNamePopover.POPOVER_SAVE_BUTTON.getValue())
+ .click();
+
+ GeneralUIUtils.waitForLoader();
+
+ String moduleName = GeneralUIUtils
+ .getWebElementWaitForVisible(DataTestIdEnum.TabsBar.HIERARCHY_MODULE.getValue()).getText();
+
+ String[] dividedModuleName = moduleName.split(Pattern.quote(".."));
+
+ assertEquals(dividedModuleName[1], newName);
+ }
+
+ @Test
+ public void testUpdateModuleNameSanity() {
+ EditNamePopoverTestsSetUp();
+
+ String newName = "testName";
+
+ WebElement instanceName = GeneralUIUtils
+ .getWebElementWaitForVisible(DataTestIdEnum.UpdateNamePopover.POPOVER_INSTANCE_NAME.getValue());
+ WebElement heatName = GeneralUIUtils
+ .getWebElementWaitForVisible(DataTestIdEnum.UpdateNamePopover.POPOVER_HEAT_NAME.getValue());
+ WebElement moduleName = GeneralUIUtils
+ .getWebElementWaitForVisible(DataTestIdEnum.UpdateNamePopover.POPOVER_MODULE_NAME.getValue());
+
+ String moduleNameToDivide = GeneralUIUtils
+ .getWebElementWaitForVisible(DataTestIdEnum.TabsBar.HIERARCHY_MODULE.getValue()).getText();
+
+ String[] dividedModuleName = moduleNameToDivide.split(Pattern.quote(".."));
+
+ assertEquals(dividedModuleName[0], instanceName.getText());
+ assertEquals(dividedModuleName[1], heatName.getAttribute("value"));
+ assertEquals(dividedModuleName[2], moduleName.getText());
+
+ WebElement popoverSaveButton = GeneralUIUtils
+ .getWebElementWaitForVisible(DataTestIdEnum.UpdateNamePopover.POPOVER_SAVE_BUTTON.getValue());
+
+ assertTrue(popoverSaveButton.getAttribute("class").contains("disabled"));
+
+ heatName.clear();
+ heatName.sendKeys(newName);
+
+ popoverSaveButton.click();
+
+ GeneralUIUtils.waitForLoader();
+
+ moduleNameToDivide = GeneralUIUtils
+ .getWebElementWaitForVisible(DataTestIdEnum.TabsBar.HIERARCHY_MODULE.getValue()).getText();
+ dividedModuleName = moduleNameToDivide.split(Pattern.quote(".."));
+
+ assertEquals(dividedModuleName[1], newName);
+ }
+
+ // *****************************DeploymentTabsTests*****************************//
+
+ @Test
+ public void testTabIsBeingDisplayedAtDeploymentView() {
+ DeploymentTestsSetUp();
+
+ assertTrue(GeneralUIUtils.isElementPresent(DataTestIdEnum.TabsBar.HIERARCHY_TAB.getValue()));
+ }
+
+ @Test
+ public void testClickingOnTabSetsItAsSelected() {
+ DeploymentTestsSetUp();
+
+ WebElement hierarchyTab = GeneralUIUtils
+ .getWebElementWaitForVisible(DataTestIdEnum.TabsBar.HIERARCHY_TAB.getValue());
+ hierarchyTab.click();
+
+ assertTrue(hierarchyTab.getAttribute("class").contains("selected"));
+ }
+
+ @Test
+ public void testTabNameIsBeingDisplayedInTheSelectedTabHeader() {
+ DeploymentTestsSetUp();
+
+ // select the hierarchy tab and check the header
+ GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.TabsBar.HIERARCHY_TAB.getValue()).click();
+ WebElement tabHeader = GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.TabsBar.TAB_HEADER.getValue());
+
+ assertEquals(tabHeader.getText(), "HIERARCHY");
+ }
+
+ @Test
+ public void testSelectingModuleNameInTheHierarchyTabShouldSelectIt() {
+ DeploymentTestsSetUp();
+
+ GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.TabsBar.HIERARCHY_TAB.getValue()).click();
+ WebElement hierarchyModule = GeneralUIUtils
+ .getWebElementWaitForVisible(DataTestIdEnum.TabsBar.HIERARCHY_MODULE_TITLE.getValue());
+
+ hierarchyModule.click();
+
+ assertTrue(hierarchyModule.getAttribute("class").contains("selected"));
+ }
+
+ @Test
+ public void testSelectingModuleNameInTheHierarchyTabShouldExpandIt() {
+ DeploymentTestsSetUp();
+
+ // select hierarchy tab
+ GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.TabsBar.HIERARCHY_TAB.getValue()).click();
+ WebElement hierarchyModule = GeneralUIUtils
+ .getWebElementWaitForVisible(DataTestIdEnum.TabsBar.HIERARCHY_MODULE.getValue());
+
+ hierarchyModule.click();
+
+ assertTrue(hierarchyModule.getAttribute("class").contains("expanded"));
+ }
+
+ @Test
+ public void testSelectingModuleNameInTheHierarchyTabShouldDisplayItsData() {
+ DeploymentTestsSetUp();
+
+ // select hierarchy tab
+ GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.TabsBar.HIERARCHY_TAB.getValue()).click();
+ GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.TabsBar.HIERARCHY_MODULE.getValue()).click();
+
+ assertTrue(GeneralUIUtils.isElementPresent(DataTestIdEnum.TabsBar.HIERARCHY_SELECTED_MODULE_DATA.getValue()));
+ }
+
+ @Test(enabled = false)
+ public void testResourceNameIsBeingDisplayedInTheSelectedTabSubHeader() {
+ DeploymentTestsSetUp();
+
+ // select the hierarchy tab and check the header
+ // WebElement tabSubHeader =
+ // getWebElement(DataTestIdEnum.TabsBar.TAB_SUB_HEADER.getValue());
+
+ // assertEquals(tabSubHeader.getText(), vmmcCsar.getName());
+ }
+
+ @Test(enabled = false)
+ public void testSelectingModuleNameInTheHierarchyTabShouldDisplayItsInformation() throws IOException {
+ DeploymentTestsSetUp();
+
+ GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.TabsBar.HIERARCHY_TAB.getValue()).click();
+ WebElement hierarchyModule = GeneralUIUtils
+ .getWebElementWaitForVisible(DataTestIdEnum.TabsBar.HIERARCHY_MODULE.getValue());
+
+ // get the module
+ // String component = RestCDUtils.getResource(vmmcCsar).getResponse();
+ // TODO idana fix test
+ /*
+ * GroupDefinitionInfo module = getModuleById(component,
+ * hierarchyModule.getText());
+ *
+ * hierarchyModule.click();
+ *
+ * assertModuleDetails(module, hierarchyModule);
+ */
+
+ }
+
+ @Test(enabled = false)
+ public void testSelectingModuleNameInTheHierarchyTabShouldDisplayItsArtifacts() throws IOException {
+ DeploymentTestsSetUp();
+
+ GeneralUIUtils.getWebElementWaitForClickable(DataTestIdEnum.TabsBar.HIERARCHY_TAB.getValue()).click();
+ WebElement hierarchyModule = GeneralUIUtils
+ .getWebElementWaitForVisible(DataTestIdEnum.TabsBar.HIERARCHY_MODULE.getValue());
+
+ // TODO idana fix test
+ // Get the artifact from the module
+ /*
+ * String component = RestCDUtils.getResource(vmmcCsar,
+ * getUser()).getResponse(); GroupDefinitionInfo module =
+ * getModuleById(component, hierarchyModule.getText());
+ * ArtifactDefinitionInfo artifact = module.getArtifacts().get(0);
+ *
+ * hierarchyModule.click();
+ *
+ * assertModuleArtifactDetails(artifact);
+ */
+ }
+
+ @Test
+ public void testTabsViewSanity() throws IOException {
+ DeploymentTestsSetUp();
+
+ WebElement hierarchyTab = GeneralUIUtils
+ .getWebElementWaitForVisible(DataTestIdEnum.TabsBar.HIERARCHY_TAB.getValue());
+
+ assertTrue(hierarchyTab != null);
+
+ hierarchyTab.click();
+
+ assertTrue(hierarchyTab.getAttribute("class").contains("selected"));
+
+ WebElement tabHeader = GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.TabsBar.TAB_HEADER.getValue());
+ WebElement tabSubHeader = GeneralUIUtils
+ .getWebElementWaitForVisible(DataTestIdEnum.TabsBar.TAB_SUB_HEADER.getValue());
+
+ assertEquals(tabHeader.getText(), "HIERARCHY");
+ // assertEquals(tabSubHeader.getText(), vmmcCsar.getName());
+
+ WebElement hierarchyModule = GeneralUIUtils
+ .getWebElementWaitForVisible(DataTestIdEnum.TabsBar.HIERARCHY_MODULE.getValue());
+ WebElement hierarchyModuleTitle = GeneralUIUtils
+ .getWebElementWaitForVisible(DataTestIdEnum.TabsBar.HIERARCHY_MODULE_TITLE.getValue());
+ hierarchyModule.click();
+ WebElement selectedModuleData = GeneralUIUtils
+ .getWebElementWaitForVisible(DataTestIdEnum.TabsBar.HIERARCHY_SELECTED_MODULE_DATA.getValue());
+
+ assertTrue(hierarchyModuleTitle.getAttribute("class").contains("selected"));
+ assertTrue(hierarchyModule.getAttribute("class").contains("expanded"));
+ assertTrue(selectedModuleData.getAttribute("ng-if") != null);
+ // TODO idana fix test
+ /*
+ * String component = RestCDUtils.getResource(vmmcCsar,
+ * getUser()).getResponse(); GroupDefinitionInfo module =
+ * getModuleById(component, hierarchyModule.getText());
+ * ArtifactDefinitionInfo artifact = module.getArtifacts().get(0);
+ *
+ * assertModuleDetails(module, hierarchyModule);
+ *
+ * assertModuleArtifactDetails(artifact);
+ */
+
+ }
+
+ // ************************DeploymentTestsSetUpFunction************************//
+
+ private void EditNamePopoverTestsSetUp() {
+ DeploymentTestsSetUp();
+
+ // clicking on a module and opening the edit name popover
+ GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.TabsBar.HIERARCHY_TAB.getValue()).click();
+ GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.TabsBar.HIERARCHY_MODULE.getValue()).click();
+ GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.UpdateNamePopover.OPEN_POPOVER_ICON.getValue())
+ .click();
+ }
+
+ private void DeploymentTestsSetUp() {
+ // import csar
+ String filePath = FileHandling.getResourcesFilesPath();
+ String fileName = "vf_with_groups.csar";
+ ResourceUIUtils.importVfInUI(getUser(), filePath, fileName);
+
+ GeneralUIUtils.waitForLoader(20);
+
+ // moving to deployment view
+ GeneralUIUtils.moveToStep(CreateAndUpdateStepsEnum.DEPLOYMENT);
+ }
+}
diff --git a/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/execute/vf/VfOnboardingTests.java b/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/execute/vf/VfOnboardingTests.java
new file mode 100644
index 0000000..a81d854
--- /dev/null
+++ b/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/execute/vf/VfOnboardingTests.java
@@ -0,0 +1,63 @@
+package org.openecomp.sdc.uici.tests.execute.vf;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import org.openecomp.sdc.uici.tests.execute.base.SetupCDTest;
+import org.openecomp.sdc.uici.tests.utilities.GeneralUIUtils;
+import org.openecomp.sdc.uici.tests.utilities.OnboardUtility;
+import org.openecomp.sdc.uici.tests.utilities.ResourceUIUtils;
+import org.testng.annotations.Test;
+
+import org.openecomp.sdc.ci.tests.datatypes.ResourceReqDetails;
+import org.openecomp.sdc.ci.tests.datatypes.enums.UserRoleEnum;
+import com.google.gson.GsonBuilder;
+
+public class VfOnboardingTests extends SetupCDTest {
+
+ @Test
+ public void testUpdateVfCreatedOnBoarding() {
+ // create vf
+ ResourceReqDetails importVfResourceInUI = ResourceUIUtils.importVfFromOnBoardingModalWithoutCheckin(getUser(),
+ "mock_vf");
+ // update vf
+ ResourceUIUtils.updateVfCsarFromOnBoarding();
+ }
+
+ @Test
+ public void createVfsFromOnboarding() throws IOException {
+ String folderPath = "C:\\onboardingTest\\onBoardingZips";
+ File folder = new File(folderPath);
+ File[] listOfFiles = folder.listFiles();
+ List<String> zipFileNames = Arrays.asList(listOfFiles).stream().map(file -> file.getName())
+ .filter(fileName -> fileName.endsWith(".zip")).collect(Collectors.toList());
+ Map<String, String> filesSuccessMap = new HashMap<>();
+ for (String fileName : zipFileNames) {
+ try {
+ createSingleVfFromOnboarding(folderPath, fileName);
+ filesSuccessMap.put(fileName, "SUCCESS");
+ } catch (Exception e) {
+ filesSuccessMap.put(fileName, "FAIL");
+ }
+ }
+ Path file = Paths.get("RunResults.txt");
+ String stringDataModel = new GsonBuilder().setPrettyPrinting().create().toJson(filesSuccessMap);
+ Files.write(file, stringDataModel.getBytes());
+ }
+
+ private static void createSingleVfFromOnboarding(String filePath, String zipFileName) {
+ String userId = UserRoleEnum.DESIGNER.getUserId();
+ OnboardUtility.createVfFromOnboarding(userId, zipFileName, filePath);
+ GeneralUIUtils.submitForTestingElement("Vf From Onboarding");
+
+ }
+
+}
diff --git a/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/execute/vfc/VfcBasicTests.java b/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/execute/vfc/VfcBasicTests.java
new file mode 100644
index 0000000..ef21e40
--- /dev/null
+++ b/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/execute/vfc/VfcBasicTests.java
@@ -0,0 +1,219 @@
+package org.openecomp.sdc.uici.tests.execute.vfc;
+
+import static org.testng.AssertJUnit.assertTrue;
+
+import java.util.List;
+import java.util.function.Function;
+import java.util.function.Supplier;
+
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.http.HttpStatus;
+import org.openecomp.sdc.uici.tests.datatypes.CreateAndUpdateStepsEnum;
+import org.openecomp.sdc.uici.tests.datatypes.DataTestIdEnum;
+import org.openecomp.sdc.uici.tests.execute.base.SetupCDTest;
+import org.openecomp.sdc.uici.tests.utilities.FileHandling;
+import org.openecomp.sdc.uici.tests.utilities.GeneralUIUtils;
+import org.openecomp.sdc.uici.tests.utilities.ResourceUIUtils;
+import org.openecomp.sdc.uici.tests.utilities.RestCDUtils;
+import org.openecomp.sdc.uici.tests.verificator.VfVerificator;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.support.ui.Select;
+import org.testng.annotations.Test;
+
+import org.openecomp.sdc.ci.tests.datatypes.ResourceReqDetails;
+import org.openecomp.sdc.common.datastructure.FunctionalInterfaces;
+
+public class VfcBasicTests extends SetupCDTest {
+
+ @Test
+ public void testRequirementsAndCapabilitiesSectionOfVfc() {
+ String filePath = FileHandling.getResourcesFilesPath();
+ String fileName = "mycompute.yml";
+ ResourceUIUtils.importVfcInUI(getUser(), filePath, fileName);
+ GeneralUIUtils.moveToStep(CreateAndUpdateStepsEnum.REQUIREMENTS_AND_CAPABILITIES);
+ // all expected requirements
+ assertTrue("Not all expected requirements are displayed.", GeneralUIUtils.isElementPresent("dependency") && GeneralUIUtils.isElementPresent("local_storage"));
+ // filter requirements
+ GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.ReqAndCapabilitiesSection.SEARCH_BOX.getValue()).sendKeys("root");
+ Supplier<Boolean> supplier = () -> !GeneralUIUtils.isElementPresent("local_storage");
+ Function<Boolean, Boolean> resultVerifier = isNotPresent -> isNotPresent;
+ Boolean isFilteredRowNotPresent = FunctionalInterfaces.retryMethodOnResult(supplier, resultVerifier);
+ assertTrue("The new property was not inserted to the properties table.", isFilteredRowNotPresent);
+ assertTrue("Filter problem.", GeneralUIUtils.isElementPresent("dependency") && isFilteredRowNotPresent);
+ // move to cap tab
+ GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.ReqAndCapabilitiesSection.CAP_TAB.getValue()).click();
+ GeneralUIUtils.getWebElementWaitForVisible("endpoint").click();
+ GeneralUIUtils.getWebElementWaitForVisible("initiator").click();
+ supplier = () -> GeneralUIUtils.isElementPresent(DataTestIdEnum.PropertyForm.FORM_CONTAINER.getValue());
+ resultVerifier = isPresent -> isPresent;
+ Boolean isPopupOpen = FunctionalInterfaces.retryMethodOnResult(supplier, resultVerifier);
+ assertTrue("The update property popup was not opened.", isPopupOpen);
+ }
+
+ @Test
+ public void testCreatePropertyTypeListForVfc() {
+ String filePath = FileHandling.getResourcesFilesPath();
+ String fileName = "VFCWithAttributes.yml";
+ ResourceUIUtils.importVfcInUI(getUser(), filePath, fileName);
+ GeneralUIUtils.moveToStep(CreateAndUpdateStepsEnum.PROPERTIES);
+ GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.PropertiesSection.ADD_BUTTON.getValue()).click();
+ // fill in fields
+ String newPropName = "listProperty";
+ GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.PropertyForm.NAME_FIELD.getValue()).sendKeys(newPropName);
+ GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.PropertyForm.DESCRIPTION_FIELD.getValue()).sendKeys("desc");
+ Select typeField = new Select(GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.PropertyForm.TYPE_FIELD.getValue()));
+ typeField.selectByVisibleText("list");
+ Select schemaTypeField = new Select(GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.PropertyForm.SCHEMA_FIELD.getValue()));
+ schemaTypeField.selectByVisibleText("string");
+ GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.PropertyForm.LIST_TYPE_DEFAULT_VAL_FIELD.getValue()).sendKeys("first");
+ GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.PropertyForm.ADD_ITEM_TO_LIST_BUTTON.getValue()).click();
+ GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.PropertyForm.LIST_TYPE_DEFAULT_VAL_FIELD.getValue()).sendKeys("second");
+ GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.PropertyForm.ADD_ITEM_TO_LIST_BUTTON.getValue()).click();
+ // save
+ GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.PropertyForm.SAVE_BUTTON.getValue()).click();
+ Supplier<Boolean> supplier = () -> GeneralUIUtils.isElementPresent(newPropName);
+ Function<Boolean, Boolean> resultVerifier = isPresent -> isPresent;
+ Boolean isPresent = FunctionalInterfaces.retryMethodOnResult(supplier, resultVerifier);
+ assertTrue("The new property was not inserted to the properties table.", isPresent);
+ }
+
+ @Test
+ public void testCreatePropertyTypeMapForVfc() {
+ String filePath = FileHandling.getResourcesFilesPath();
+ String fileName = "VFCWithAttributes.yml";
+ ResourceUIUtils.importVfcInUI(getUser(), filePath, fileName);
+ GeneralUIUtils.moveToStep(CreateAndUpdateStepsEnum.PROPERTIES);
+ GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.PropertiesSection.ADD_BUTTON.getValue()).click();
+ // fill in fields
+ String newPropName = "mapProperty";
+ GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.PropertyForm.NAME_FIELD.getValue()).sendKeys(newPropName);
+ GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.PropertyForm.DESCRIPTION_FIELD.getValue()).sendKeys("desc");
+ Select typeField = new Select(GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.PropertyForm.TYPE_FIELD.getValue()));
+ typeField.selectByVisibleText("map");
+ Select schemaTypeField = new Select(GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.PropertyForm.SCHEMA_FIELD.getValue()));
+ schemaTypeField.selectByVisibleText("string");
+ // insert item to map
+ GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.PropertyForm.MAP_TYPE_DEFAULT_VAL_KEY_FIELD_FOR_FIRST_ITEM.getValue()).sendKeys("key1");
+ GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.PropertyForm.MAP_TYPE_DEFAULT_VAL_VALUE_FIELD_FOR_FIRST_ITEM.getValue()).sendKeys("val1");
+ // insert item to map
+ GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.PropertyForm.ADD_ITEM_TO_MAP_BUTTON.getValue()).click();
+ GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.PropertyForm.MAP_TYPE_DEFAULT_VAL_KEY_FIELD_FOR_SECOND_ITEM.getValue()).sendKeys("key2");
+ GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.PropertyForm.MAP_TYPE_DEFAULT_VAL_VALUE_FIELD_FOR_SECOND_ITEM.getValue()).sendKeys("val2");
+ // delete item from map
+ GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.PropertyForm.DELETE_FIRST_ITEM_FROM_MAP_BUTTON.getValue()).click();
+ // save
+ GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.PropertyForm.SAVE_BUTTON.getValue()).click();
+ Supplier<Boolean> supplier = () -> GeneralUIUtils.isElementPresent(newPropName);
+ Function<Boolean, Boolean> resultVerifier = isPresent -> isPresent;
+ Boolean isPresent = FunctionalInterfaces.retryMethodOnResult(supplier, resultVerifier);
+ assertTrue("The new property was not inserted to the properties table.", isPresent);
+ }
+
+ @Test
+ public void testCreatePropertyTypeDTForVfc() {
+ String filePath = FileHandling.getResourcesFilesPath();
+ String fileName = "VFCWithAttributes.yml";
+ ResourceUIUtils.importVfcInUI(getUser(), filePath, fileName);
+ GeneralUIUtils.moveToStep(CreateAndUpdateStepsEnum.PROPERTIES);
+ GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.PropertiesSection.ADD_BUTTON.getValue()).click();
+ // fill in fields
+ String newPropName = "dt";
+ GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.PropertyForm.NAME_FIELD.getValue()).sendKeys(newPropName);
+ GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.PropertyForm.DESCRIPTION_FIELD.getValue()).sendKeys("desc");
+ Select typeField = new Select(GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.PropertyForm.TYPE_FIELD.getValue()));
+ typeField.selectByValue("org.openecomp.datatypes.heat.contrail.network.rule.PortPairs");
+ GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.PropertyForm.START_PORT_FIELD_FOR_PORT_PAIRS_DT.getValue()).sendKeys("first");
+ // save
+ GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.PropertyForm.SAVE_BUTTON.getValue()).click();
+ Supplier<Boolean> supplier = () -> GeneralUIUtils.isElementPresent(newPropName);
+ Function<Boolean, Boolean> resultVerifier = isPresent -> isPresent;
+ Boolean isPresent = FunctionalInterfaces.retryMethodOnResult(supplier, resultVerifier);
+ assertTrue("The new property was not inserted to the properties table.", isPresent);
+ }
+
+ @Test
+ public void testViewAttributesTabForVfc() {
+ String filePath = FileHandling.getResourcesFilesPath();
+ String fileName = "VFCWithAttributes.yml";
+ ResourceReqDetails importVfcResourceInUI = ResourceUIUtils.importVfcInUI(getUser(), filePath, fileName);
+ GeneralUIUtils.moveToStep(CreateAndUpdateStepsEnum.ATTRIBUTES);
+
+ List<WebElement> attributesRows = GeneralUIUtils.getWebElementsListWaitForVisible(DataTestIdEnum.AttributesSection.TABLE_ROWS.getValue());
+ assertTrue("There is not any row in the table.", !CollectionUtils.isEmpty(attributesRows));
+ // display editable buttons
+ assertTrue("The Add button is not dispaly.", GeneralUIUtils.isElementPresent(DataTestIdEnum.AttributesSection.ADD_BUTTON.getValue()));
+ assertTrue("The Edit button is not dispaly for 'network' attribute.", GeneralUIUtils.isElementPresent(DataTestIdEnum.AttributesSection.EDIT_BUTTON_FOR_NETWORK_ATTR.getValue()));
+ assertTrue("The Remove button is not dispaly for 'network' attribute.", GeneralUIUtils.isElementPresent(DataTestIdEnum.AttributesSection.DELETE_BUTTON_FOR_NETWORK_ATTR.getValue()));
+ // click checkin
+ GeneralUIUtils.checkIn();
+ // enter again
+ GeneralUIUtils.getWebElementWaitForVisible(importVfcResourceInUI.getName()).click();
+ GeneralUIUtils.moveToStep(CreateAndUpdateStepsEnum.ATTRIBUTES);
+ // the editable buttons disappear
+ assertTrue("The Add button is not dispaly.", !GeneralUIUtils.isElementPresent(DataTestIdEnum.AttributesSection.ADD_BUTTON.getValue()));
+ assertTrue("The Edit button is not dispaly for 'network' attribute.", !GeneralUIUtils.isElementPresent(DataTestIdEnum.AttributesSection.EDIT_BUTTON_FOR_NETWORK_ATTR.getValue()));
+ assertTrue("The Remove button is not dispaly for 'network' attribute.", !GeneralUIUtils.isElementPresent(DataTestIdEnum.AttributesSection.DELETE_BUTTON_FOR_NETWORK_ATTR.getValue()));
+ }
+
+ @Test
+ public void testCreateAttributeForVfc() {
+ String filePath = FileHandling.getResourcesFilesPath();
+ String fileName = "VFCWithAttributes.yml";
+ ResourceReqDetails importVfcResourceInUI = ResourceUIUtils.importVfcInUI(getUser(), filePath, fileName);
+ GeneralUIUtils.moveToStep(CreateAndUpdateStepsEnum.ATTRIBUTES);
+ GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.AttributesSection.ADD_BUTTON.getValue()).click();
+ // fill in fields
+ String newAttrName = "attr";
+ GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.AttributeForm.NAME_FIELD.getValue()).sendKeys(newAttrName);
+ GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.AttributeForm.DESCRIPTION_FIELD.getValue()).sendKeys("desc");
+ Select typeField = new Select(GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.AttributeForm.TYPE_FIELD.getValue()));
+ typeField.selectByVisibleText("integer");
+ GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.AttributeForm.DEFAULT_VAL_FIELD.getValue()).sendKeys("2");
+ // click ok
+ GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.AttributeForm.DONE_BUTTON.getValue()).click();
+ Supplier<Boolean> supplier = () -> GeneralUIUtils.isElementPresent(newAttrName);
+ Function<Boolean, Boolean> resultVerifier = isPresent -> isPresent;
+ Boolean isPresent = FunctionalInterfaces.retryMethodOnResult(supplier, resultVerifier);
+ assertTrue("The new attribute was not inserted to the attributes table.", isPresent);
+ }
+
+ @Test
+ public void testUpdateTypeForAttributeOfVfc() {
+ String filePath = FileHandling.getResourcesFilesPath();
+ String fileName = "VFCWithAttributes.yml";
+ ResourceReqDetails importVfcResourceInUI = ResourceUIUtils.importVfcInUI(getUser(), filePath, fileName);
+ VfVerificator.verifyResourceIsCreated(importVfcResourceInUI);
+ GeneralUIUtils.moveToStep(CreateAndUpdateStepsEnum.ATTRIBUTES);
+ GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.AttributesSection.EDIT_BUTTON_FOR_NETWORK_ATTR.getValue()).click();
+ // fill in fields
+ Select typeField = new Select(GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.AttributeForm.TYPE_FIELD.getValue()));
+ typeField.selectByVisibleText("float");
+ // click ok
+ GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.AttributeForm.DONE_BUTTON.getValue()).click();
+ Supplier<Boolean> supplier = () -> GeneralUIUtils.isElementPresent("float");
+ Function<Boolean, Boolean> resultVerifier = isPresent -> isPresent;
+ Boolean isPresent = FunctionalInterfaces.retryMethodOnResult(supplier, resultVerifier);
+ assertTrue("The attribute type was not updated.", isPresent);
+ }
+
+ @Test
+ public void testDeleteAttributeForVfc() {
+ String filePath = FileHandling.getResourcesFilesPath();
+ String fileName = "VFCWithAttributes.yml";
+ ResourceReqDetails importVfcResourceInUI = ResourceUIUtils.importVfcInUI(getUser(), filePath, fileName);
+ GeneralUIUtils.moveToStep(CreateAndUpdateStepsEnum.ATTRIBUTES);
+ GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.AttributesSection.DELETE_BUTTON_FOR_NETWORK_ATTR.getValue()).click();
+ GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.ModalItems.OK.getValue()).click();
+ GeneralUIUtils.waitForLoader();
+ Boolean retryResult = FunctionalInterfaces.retryMethodOnResult(() -> !GeneralUIUtils.isElementPresent("networks"), boolResult -> boolResult);
+ assertTrue("The attribute is shown in the attributes table.", retryResult);
+ }
+
+ @Test
+ public void testImportVfc() {
+ String filePath = FileHandling.getResourcesFilesPath();
+ String fileName = "CP.yml";
+ ResourceReqDetails importVfcResourceInUI = ResourceUIUtils.importVfcInUI(getUser(), filePath, fileName);
+ assertTrue(RestCDUtils.getResource(importVfcResourceInUI).getErrorCode() == HttpStatus.SC_OK);
+ }
+}
diff --git a/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/run/StartTest.java b/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/run/StartTest.java
new file mode 100644
index 0000000..8232738
--- /dev/null
+++ b/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/run/StartTest.java
@@ -0,0 +1,394 @@
+package org.openecomp.sdc.uici.tests.run;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Method;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
+
+import org.apache.log4j.Logger;
+import org.apache.log4j.PropertyConfigurator;
+import org.testng.TestNG;
+
+import org.openecomp.sdc.ci.tests.config.Config;
+import org.openecomp.sdc.ci.tests.utils.Utils;
+
+public class StartTest {
+
+ public static long timeOfTest = 0;
+
+ public static boolean debug = false;
+
+ public static AtomicBoolean loggerInitialized = new AtomicBoolean(false);
+
+ protected static Logger logger = null;
+
+ public static void main(String[] args) {
+ // TODO ui-ci add jar building
+ String debugEnabled = System.getProperty("debug");
+ if (debugEnabled != null && debugEnabled.equalsIgnoreCase("true")) {
+ debug = true;
+ }
+ System.out.println("Debug mode is " + (debug ? "enabled" : "disabled"));
+
+ enableLogger();
+
+ Config config = null;
+ try {
+ config = Utils.getConfig();
+ } catch (FileNotFoundException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+
+ if (config == null) {
+ logger.error("Failed to configuration file of ci tests.");
+ System.exit(1);
+ }
+
+ TestNG testng = new TestNG();
+
+ List<String> suites = new ArrayList<String>();
+ suites.add("testSuites/" + args[0]);
+ testng.setTestSuites(suites);
+ // testng.setUseDefaultListeners(true);
+ testng.setOutputDirectory("target/");
+
+ testng.run();
+
+ }
+
+ public StartTest() {
+ logger = Logger.getLogger(StartTest.class.getName());
+ }
+
+ public static void enableLogger() {
+
+ if (false == loggerInitialized.get()) {
+
+ loggerInitialized.set(true);
+
+ String log4jPropsFile = System.getProperty("log4j.configuration");
+ if (System.getProperty("os.name").contains("Windows")) {
+ String logProps = "src/main/resources/ci/conf/log4j.properties";
+ if (log4jPropsFile == null) {
+ System.setProperty("targetlog", "target/");
+ log4jPropsFile = logProps;
+ }
+
+ }
+ PropertyConfigurator.configureAndWatch(log4jPropsFile);
+
+ }
+ }
+
+ // public void start(List<String> packages, boolean exitOnFailure) {
+ //
+ // boolean success = true;
+ // StringBuilder results = new StringBuilder();
+ //// Result result;
+ //
+ // if (packages == null) {
+ // return;
+ // }
+ //
+ //// for (String packageName : packages) {
+ //// //List<Class> classesForPackage =
+ // getClassesForPackage("org.openecomp.sdc.ci.tests.execute");
+ //// List<Class> classesForPackage = getClassesForPackage(packageName);
+ //// if (classesForPackage != null && false == classesForPackage.isEmpty())
+ // {
+ //// for (Class testUnit : classesForPackage) {
+ //// testClasses.add(testUnit);
+ //// }
+ //// }
+ //// }
+ ////
+ //// System.out.println(testClasses);
+ //
+ // // tsetClasses.add(LogValidatorTest.class);
+ // // tsetClasses.add(AttNorthboundTest.class);
+ //
+ //// results.append("<Html><head><style>th{background-color: gray;color:
+ // white;height: 30px;}td {color: black;height: 30px;}.fail
+ // {background-color: #FF5555;width: 100px;text-align: center;}.success
+ // {background-color: #00FF00;width: 100px;text-align: center;}.name {width:
+ // 200px;background-color: #F0F0F0;}.message {width: 300px;background-color:
+ // #F0F0F0;}</style></head><body>");
+ //
+ // Calendar calendar = Calendar.getInstance();
+ // timeOfTest = calendar.getTimeInMillis();
+ // SimpleDateFormat date_format = new SimpleDateFormat(
+ // "MMM dd yyyy HH:mm:ss");
+ // results.append("<br/><h2> This report generated on "
+ // + date_format.format(calendar.getTime()) + "</h2><br/>");
+ //
+ // results.append("<table>");
+ // addTableHead(results);
+ //
+ //// int size = testClasses.size();
+ // int index = 0;
+ //
+ // int totalRunTests = 0;
+ // int totalFailureTests = 0;
+ // int totalIgnoreTests = 0;
+ // int numOfFailureClasses = 0;
+ // for (Class<? extends AttSdcTest> testClass : testClasses) {
+ //
+ // index ++;
+ //
+ // StringBuilder builder = new StringBuilder();
+ // String str =
+ // "***************************************************************************";
+ // builder.append(str + "\n");
+ // String current = "class " + index + "/" + size + " failure("
+ // + numOfFailureClasses + ") + RUNS(" + totalRunTests + ")"
+ // + " FAILURES(" + totalFailureTests + ") IGNORED("
+ // + totalIgnoreTests + ")";
+ // int interval = ((str.length() - current.length() - 2)/ 2);
+ // String substring = str.substring(0, interval);
+ // builder.append(substring + " " + current + " " + substring + "\n");
+ // builder.append(str + "\n");
+ //
+ // System.out.println(builder.toString());
+ //
+ // logger.debug(builder.toString());
+ // logger.debug("Going to run test class " + testClass.getName());
+ //
+ // result = JUnitCore.runClasses(testClass);
+ // if (result.wasSuccessful() == false) {
+ // numOfFailureClasses++;
+ // }
+ // logger.debug("Test class " + testClass.getName() + " finished " +
+ // (result.wasSuccessful() ? "OK." : " WITH ERROR."));
+ // List<Failure> failures = result.getFailures();
+ // if (failures != null) {
+ // for (Failure failure : failures) {
+ // logger.error("Test class " + testClass.getName() + " failure test " +
+ // failure.getTestHeader() + "-" + failure.getTrace());
+ // }
+ // }
+ // int runsPerClass = result.getRunCount();
+ // int failuresPerClass = result.getFailureCount();
+ // int ignoredPerClass = result.getIgnoreCount();
+ //
+ // totalRunTests += runsPerClass;
+ // totalFailureTests += failuresPerClass;
+ // totalIgnoreTests += ignoredPerClass;
+ //
+ // logger.debug("class " + testClass.getName() + " Failed tests " +
+ // (failuresPerClass * 1.0) / runsPerClass * 100 + " %");
+ // logger.debug("class " + testClass.getName() + " Ignored tests " +
+ // (ignoredPerClass * 1.0) / runsPerClass * 100 + " %");
+ //
+ //
+ //// List<Failure> failures = result.getFailures();
+ //// if (failures != null) {
+ //// for (Failure failure : failures) {
+ //// System.err.println("9999999999" + failure.getTestHeader());
+ //// }
+ //// }
+ //
+ // addUnitTestResult(results, testClass, result);
+ // success &= result.wasSuccessful();
+ //
+ // if (numOfFailureClasses > 0) {
+ // //if (exitOnFailure) {
+ // if (exitOnFailure) {
+ // break;
+ // }
+ // }
+ // }
+ //
+ // results.append("</table>");
+ // results.append("<br/><h2> Tests Summary: </h2><br/>");
+ // results.append("Total Runs : " + totalRunTests + "<br/>");
+ // results.append("Total Failure : " + totalFailureTests + "<br/>");
+ // results.append("Total: " + totalFailureTests + "/" + totalRunTests +
+ // "<br/>");
+ // results.append("</html>");
+ //
+ // FileUtils.writeToFile(Config.instance().getOutputFolder()
+ // + File.separator + Config.instance().getReportName(),
+ // results.toString());
+ //
+ // if (!success) {
+ // System.out.println("FAILURE");
+ // logger.error("Failure tests : " + ((totalFailureTests + totalIgnoreTests)
+ // * 1.0)/ (totalRunTests + totalIgnoreTests) + " %");
+ // logger.error("Ignored tests : " + (totalIgnoreTests * 1.0)/
+ // (totalRunTests + totalIgnoreTests) + " %");
+ // System.exit(1);
+ // }
+ //
+ // System.out.println("SUCCESS");
+ // }
+
+ private List<Class> getClassesForPackage(String pkgname) {
+
+ List<Class> classes = new ArrayList<Class>();
+
+ // Get a File object for the package
+ File directory = null;
+ String fullPath;
+ String relPath = pkgname.replace('.', '/');
+
+ // System.out.println("ClassDiscovery: Package: " + pkgname +
+ // " becomes Path:" + relPath);
+
+ URL resource = ClassLoader.getSystemClassLoader().getResource(relPath);
+
+ // System.out.println("ClassDiscovery: Resource = " + resource);
+ if (resource == null) {
+ throw new RuntimeException("No resource for " + relPath);
+ }
+ fullPath = resource.getFile();
+ // System.out.println("ClassDiscovery: FullPath = " + resource);
+
+ if (debug) {
+ System.out.println("fullPath is " + fullPath);
+ }
+
+ try {
+ directory = new File(resource.toURI());
+ } catch (URISyntaxException e) {
+ throw new RuntimeException(
+ pkgname + " (" + resource
+ + ") does not appear to be a valid URL / URI. Strange, since we got it from the system...",
+ e);
+ } catch (IllegalArgumentException e) {
+ directory = null;
+ }
+ // System.out.println("ClassDiscovery: Directory = " + directory);
+
+ if (directory != null && directory.exists()) {
+
+ // Get the list of the files contained in the package
+ String[] files = directory.list();
+ for (int i = 0; i < files.length; i++) {
+
+ // we are only interested in .class files
+ if (files[i].endsWith(".class") && false == files[i].contains("$")) {
+
+ // removes the .class extension
+ String className = pkgname + '.' + files[i].substring(0, files[i].length() - 6);
+
+ // System.out.println("ClassDiscovery: className = " +
+ // className);
+
+ if (debug) {
+ System.out.println("ClassDiscovery: className = " + className);
+ }
+
+ try {
+ Class clas = Class.forName(className);
+ boolean isAddToRun = false;
+ Method[] methods = clas.getMethods();
+ for (Method method : methods) {
+ Annotation[] anns = method.getAnnotations();
+ for (Annotation an : anns) {
+ if (an.annotationType().getSimpleName().equalsIgnoreCase("Test")) {
+ isAddToRun = true;
+ break;
+ }
+ }
+ }
+ if (isAddToRun)
+ classes.add(clas);
+ } catch (ClassNotFoundException e) {
+ throw new RuntimeException("ClassNotFoundException loading " + className);
+ }
+ }
+ }
+ } else {
+ try {
+ String jarPath = fullPath.replaceFirst("[.]jar[!].*", ".jar").replaceFirst("file:", "");
+
+ if (debug) {
+ System.out.println("jarPath is " + jarPath);
+ }
+
+ JarFile jarFile = new JarFile(jarPath);
+ Enumeration<JarEntry> entries = jarFile.entries();
+ while (entries.hasMoreElements()) {
+ JarEntry entry = entries.nextElement();
+ String entryName = entry.getName();
+ if (entryName.startsWith(relPath) && entryName.length() > (relPath.length() + "/".length())) {
+
+ // System.out.println("ClassDiscovery: JarEntry: " +
+ // entryName);
+ String className = entryName.replace('/', '.').replace('\\', '.').replace(".class", "");
+
+ // System.out.println("ClassDiscovery: className = " +
+ // className);
+
+ if (false == className.contains("$")) {
+
+ if (debug) {
+ System.out.println("ClassDiscovery: className = " + className);
+ }
+
+ try {
+ Class clas = Class.forName(className);
+ boolean isAddToRun = false;
+ Method[] methods = clas.getMethods();
+ for (Method method : methods) {
+ Annotation[] anns = method.getAnnotations();
+ for (Annotation an : anns) {
+ if (an.annotationType().getSimpleName().equalsIgnoreCase("Test")) {
+ isAddToRun = true;
+ break;
+ }
+ }
+ }
+ if (isAddToRun)
+ classes.add(clas);
+ } catch (ClassNotFoundException e) {
+ throw new RuntimeException("ClassNotFoundException loading " + className);
+ }
+ }
+ }
+ }
+ jarFile.close();
+
+ } catch (IOException e) {
+ throw new RuntimeException(pkgname + " (" + directory + ") does not appear to be a valid package", e);
+ }
+ }
+ return classes;
+ }
+
+ private void addTableHead(StringBuilder results) {
+ results.append("<tr>");
+ results.append("<th>").append("Unit Test").append("</th>");
+ results.append("<th>").append("Result").append("</th>");
+ results.append("</tr>");
+ }
+
+ // private void addUnitTestResult(StringBuilder results,
+ // Class<? extends AttSdcTest> testClass, Result unitTestResult) {
+ //
+ // boolean isSuccess = unitTestResult.wasSuccessful();
+ //
+ // String result = (isSuccess) ? "success" : "fail";
+ // String fileName = FileUtils.getFileName(testClass.getName());
+ // results.append("<tr>");
+ // //
+ // results.append("<td>").append(FileUtils.getFileName(testClass.getName())).append("</td>");
+ // results.append("<td class=\"name\">")
+ // .append("<a href=\"" + fileName + timeOfTest + ".html\">"
+ // + fileName + "</a>").append("</td>");
+ // results.append("<td class=\"" + result + "\">").append(result)
+ // .append("</td>");
+ // results.append("</tr>");
+ // }
+
+}
diff --git a/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/utilities/ArtifactUIUtils.java b/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/utilities/ArtifactUIUtils.java
new file mode 100644
index 0000000..91c9c07
--- /dev/null
+++ b/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/utilities/ArtifactUIUtils.java
@@ -0,0 +1,70 @@
+package org.openecomp.sdc.uici.tests.utilities;
+
+import static org.openecomp.sdc.common.datastructure.FunctionalInterfaces.retryMethodOnException;
+
+import java.util.Map;
+
+import org.json.simple.JSONObject;
+import org.json.simple.JSONValue;
+import org.openecomp.sdc.uici.tests.datatypes.CreateAndUpdateStepsEnum;
+import org.openecomp.sdc.uici.tests.datatypes.DataTestIdEnum;
+import org.openecomp.sdc.uici.tests.datatypes.DataTestIdEnum.Artifatcs;
+import org.openecomp.sdc.uici.tests.datatypes.DataTestIdEnum.InformationalArtifatcs;
+import org.openqa.selenium.WebElement;
+
+import org.openecomp.sdc.ci.tests.datatypes.ArtifactReqDetails;
+import org.openecomp.sdc.common.api.ArtifactTypeEnum;
+import org.openecomp.sdc.common.datastructure.FunctionalInterfaces;
+
+public final class ArtifactUIUtils {
+
+ private ArtifactUIUtils() {
+ throw new UnsupportedOperationException();
+ }
+
+ public static void addInformationArtifact(ArtifactReqDetails artifact, String filePath,
+ final InformationalArtifatcs dataTestEnum) {
+ GeneralUIUtils.waitForLoader();
+ GeneralUIUtils.sleep(2000);
+ GeneralUIUtils.getWebElementWaitForVisible(dataTestEnum.getValue()).click();
+
+ final WebElement browseWebElement = FunctionalInterfaces.retryMethodOnException(
+ () -> GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.ModalItems.BROWSE_BUTTON.getValue()));
+ browseWebElement.sendKeys(filePath);
+
+ GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.ModalItems.DESCRIPTION.getValue())
+ .sendKeys(artifact.getDescription());
+ GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.ModalItems.DONE.getValue()).click();
+
+ }
+
+ public static Map<String, Map<String, Object>> getArtifactsListFromResponse(String jsonResponse,
+ String fieldOfArtifactList) {
+ JSONObject object = (JSONObject) JSONValue.parse(jsonResponse);
+ Map<String, Map<String, Object>> map = (Map<String, Map<String, Object>>) object.get(fieldOfArtifactList);
+ return map;
+ }
+
+ /**
+ * Creates a deployment artifact on the vf. <br>
+ * Moves automatically to DeploymentArtifact Section
+ *
+ * @param artifactPayloadPath
+ * @param artifactType
+ */
+ public static void createDeploymentArtifactOnVf(final String artifactPayloadPath,
+ final ArtifactTypeEnum artifactType) {
+ GeneralUIUtils.moveToStep(CreateAndUpdateStepsEnum.DEPLOYMENT_ARTIFACT);
+ GeneralUIUtils.getWebElementWaitForClickable(Artifatcs.ADD_DEPLOYMENT_ARTIFACT.getValue()).click();
+ GeneralUIUtils.getSelectList("Create New Artifact", Artifatcs.SELECT_ARTIFACT_DROPDOWN.getValue());
+ GeneralUIUtils.getSelectList(artifactType.getType(), Artifatcs.ARTIFACT_TYPE_DROPDOWN.getValue());
+ GeneralUIUtils.getWebElementWaitForVisible(Artifatcs.ARTIFACT_DESCRIPTION.getValue())
+ .sendKeys("Artifact Description");
+ GeneralUIUtils.getWebElementWaitForVisible(Artifatcs.ARTIFACT_LABEL.getValue()).sendKeys("MyArtifactLabel");
+ retryMethodOnException(() -> GeneralUIUtils.getWebElementByDataTestId(Artifatcs.BROWSE_BUTTON.getValue())
+ .sendKeys(artifactPayloadPath));
+ GeneralUIUtils.getWebElementWaitForVisible(Artifatcs.ADD_BUTTON.getValue()).click();
+ GeneralUIUtils.waitForLoader();
+ }
+
+}
diff --git a/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/utilities/FileHandling.java b/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/utilities/FileHandling.java
new file mode 100644
index 0000000..b154974
--- /dev/null
+++ b/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/utilities/FileHandling.java
@@ -0,0 +1,30 @@
+package org.openecomp.sdc.uici.tests.utilities;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.InputStream;
+import java.util.Map;
+
+import org.yaml.snakeyaml.Yaml;
+
+public class FileHandling {
+
+ public static Map<?, ?> parseYamlFile(String filePath) throws FileNotFoundException {
+ Yaml yaml = new Yaml();
+ File file = new File(filePath);
+ InputStream inputStream = new FileInputStream(file);
+ Map<?, ?> map = (Map<?, ?>) yaml.load(inputStream);
+ return map;
+ }
+
+ public static String getBasePath() {
+ return System.getProperty("user.dir");
+ }
+
+ public static String getResourcesFilesPath() {
+ return getBasePath() + File.separator + "src" + File.separator + "main" + File.separator + "resources"
+ + File.separator + "Files" + File.separator;
+ }
+
+}
diff --git a/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/utilities/GeneralUIUtils.java b/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/utilities/GeneralUIUtils.java
new file mode 100644
index 0000000..4414499
--- /dev/null
+++ b/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/utilities/GeneralUIUtils.java
@@ -0,0 +1,346 @@
+package org.openecomp.sdc.uici.tests.utilities;
+
+import static org.openecomp.sdc.common.datastructure.FunctionalInterfaces.retryMethodOnException;
+import static org.openecomp.sdc.common.datastructure.FunctionalInterfaces.retryMethodOnResult;
+import static org.openecomp.sdc.common.datastructure.FunctionalInterfaces.swallowException;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.List;
+import java.util.function.Function;
+import java.util.function.Supplier;
+
+import org.openecomp.sdc.uici.tests.datatypes.CreateAndUpdateStepsEnum;
+import org.openecomp.sdc.uici.tests.datatypes.DataTestIdEnum;
+import org.openecomp.sdc.uici.tests.datatypes.DataTestIdEnum.Dashboard;
+import org.openecomp.sdc.uici.tests.execute.base.SetupCDTest;
+import org.openqa.selenium.By;
+import org.openqa.selenium.Platform;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.firefox.FirefoxDriver;
+import org.openqa.selenium.interactions.Actions;
+import org.openqa.selenium.remote.DesiredCapabilities;
+import org.openqa.selenium.remote.RemoteWebDriver;
+import org.openqa.selenium.support.ui.ExpectedCondition;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+import org.openqa.selenium.support.ui.Select;
+import org.openqa.selenium.support.ui.WebDriverWait;
+import org.testng.Assert;
+
+import org.openecomp.sdc.common.datastructure.FunctionalInterfaces;
+
+public final class GeneralUIUtils {
+
+ private static final int DEFAULT_WAIT_TIME_IN_SECONDS = 10;
+ /**************** DRIVERS ****************/
+ private static WebDriver driver;
+
+ private GeneralUIUtils() {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * Finding a component in the home screen by name and clicks on it
+ * Uses the search
+ *
+ * @param componentName
+ * @throws Exception
+ */
+ public static void findComponentAndClick(String componentName) throws Exception {
+ getWebElementWaitForVisible("main-menu-input-search").sendKeys(componentName);
+ try {
+ getWebElementWaitForClickable(componentName).click();
+ GeneralUIUtils.waitForLoader();
+ getWebElementWaitForVisible("formlifecyclestate");
+ } catch (Exception e) {
+ String msg = String.format("DID NOT FIND A COMPONENT NAMED %s", componentName);
+ System.out.println(msg);
+ Assert.fail(msg);
+ }
+ }
+
+ public static WebElement getWebElementWaitForVisible(String dataTestId) {
+ return getWebElementWaitForVisible(dataTestId, DEFAULT_WAIT_TIME_IN_SECONDS);
+ }
+
+ public static WebElement getWebElementWaitForVisible(String dataTestId, int time) {
+ WebDriverWait wait = new WebDriverWait(getDriver(), time);
+ ExpectedCondition<WebElement> visibilityOfElementLocated = ExpectedConditions
+ .visibilityOfElementLocated(builDataTestIdLocator(dataTestId));
+ WebElement webElement = wait.until(visibilityOfElementLocated);
+ return webElement;
+ }
+
+ public static WebElement getWebElementWaitForClickable(String dataTestId) {
+ WebDriverWait wait = new WebDriverWait(getDriver(), DEFAULT_WAIT_TIME_IN_SECONDS);
+ ExpectedCondition<WebElement> condition = ExpectedConditions
+ .elementToBeClickable(builDataTestIdLocator(dataTestId));
+ WebElement webElement = wait.until(condition);
+ return webElement;
+ }
+
+ private static By builDataTestIdLocator(String dataTestId) {
+ return By.xpath("//*[@data-tests-id='" + dataTestId + "']");
+
+ }
+
+ /**
+ * Returns A list of Web Elements When they are all visible
+ *
+ * @param dataTestId
+ * @return
+ */
+ public static List<WebElement> getWebElementsListWaitForVisible(String dataTestId) {
+ WebDriverWait wait = new WebDriverWait(getDriver(), DEFAULT_WAIT_TIME_IN_SECONDS);
+ ExpectedCondition<List<WebElement>> visibilityOfAllElementsLocatedBy = ExpectedConditions
+ .visibilityOfAllElementsLocatedBy(builDataTestIdLocator(dataTestId));
+ return wait.until(visibilityOfAllElementsLocatedBy);
+ }
+
+ /**
+ * @deprecated Do not use. use {@link #getWebElementWaitForVisible(String)}
+ * @param dataTestId
+ * @return
+ */
+ public static WebElement getWebElementByDataTestId(String dataTestId) {
+ return driver.findElement(builDataTestIdLocator(dataTestId));
+ }
+
+ /**
+ * Checks if element is present with given dataTestsId
+ *
+ * @param dataTestId
+ * @return
+ */
+ public static boolean isElementPresent(String dataTestId) {
+ final boolean isPresent = !driver.findElements(builDataTestIdLocator(dataTestId)).isEmpty();
+ return isPresent;
+ }
+
+ public static void clickOnCreateEntityFromDashboard(String buttonId) {
+ Supplier<WebElement> addVfButtonSipplier = () -> {
+ // TODO ui-ci replace with data-test-id
+ GeneralUIUtils.moveToHTMLElementByClassName("w-sdc-dashboard-card-new");
+ return GeneralUIUtils.getWebElementByDataTestId(buttonId);
+ };
+ WebElement addVfButton = FunctionalInterfaces.retryMethodOnException(addVfButtonSipplier);
+ addVfButton.click();
+ }
+
+ // this function located select list by the data-test-id value and the item
+ // to be selected..
+ public static Select getSelectList(String item, String dataTestId) {
+ Select selectlist = new Select(driver.findElement(builDataTestIdLocator(dataTestId)));
+ if (item != null) {
+ selectlist.selectByVisibleText(item);
+ }
+ return selectlist;
+ }
+
+ // Define description area .
+ public static String defineDescription(String descriptionText) {
+
+ WebElement resourceDescriptionTextbox = GeneralUIUtils.getWebElementWaitForVisible("description");
+ resourceDescriptionTextbox.clear();
+ resourceDescriptionTextbox.sendKeys(descriptionText);
+
+ return descriptionText;
+ }
+
+ /**
+ * Clicks on the create button waits for the create to finish and the check
+ * in button to appear
+ */
+ public static void clickCreateButton() {
+ GeneralUIUtils.waitForLoader();
+ getWebElementWaitForClickable(DataTestIdEnum.LifeCyleChangeButtons.CREATE.getValue()).click();
+ GeneralUIUtils.waitForLoader();
+ WebElement successNotification = driver.findElement(By.className("ui-notification"));
+ if (successNotification != null) {
+ successNotification.click();
+ }
+ getWebElementWaitForVisible(DataTestIdEnum.LifeCyleChangeButtons.CHECK_IN.getValue());
+ }
+
+ public static void clickSaveButton() {
+ WebElement createButton = getWebElementWaitForClickable(DataTestIdEnum.LifeCyleChangeButtons.CREATE.getValue());
+ createButton.click();
+ }
+
+ public static void closeNotificatin() {
+ WebElement notification = driver.findElement(By.className("ui-notification"));
+ if (notification != null) {
+ notification.click();
+ }
+ }
+ public static void checkIn() {
+ waitForLoader();
+ getWebElementWaitForVisible(DataTestIdEnum.LifeCyleChangeButtons.CHECK_IN.getValue()).click();
+ getWebElementWaitForVisible(DataTestIdEnum.ModalItems.ACCEP_TESTING_MESSAGE.getValue()).sendKeys("Check in !");
+ getWebElementWaitForVisible(DataTestIdEnum.ModalItems.OK.getValue()).click();
+ waitForLoader();
+ }
+
+ public static void moveToStep(CreateAndUpdateStepsEnum Stepname) {
+ waitForLoader();
+ getWebElementWaitForClickable(Stepname.getValue()).click();
+ waitForLoader();
+ }
+
+ public static void sleep(int duration) {
+ swallowException(() -> Thread.sleep(duration));
+ }
+
+ public static WebDriver getDriver() {
+ return driver;
+ }
+
+ public static void initDriver() {
+ try {
+ System.out.println("opening browser");
+ WebDriver webDriver;
+ boolean remoteTesting = SetupCDTest.config.isRemoteTesting();
+ if (!remoteTesting) {
+ webDriver = new FirefoxDriver();
+ } else {
+ String remoteEnvIP = SetupCDTest.config.getRemoteTestingMachineIP();
+ String remoteEnvPort = SetupCDTest.config.getRemoteTestingMachinePort();
+ DesiredCapabilities cap = new DesiredCapabilities();
+ cap = DesiredCapabilities.firefox();
+ cap.setPlatform(Platform.WINDOWS);
+ cap.setBrowserName("firefox");
+
+ String remoteNodeUrl = String.format(SetupCDTest.SELENIUM_NODE_URL, remoteEnvIP, remoteEnvPort);
+ webDriver = new RemoteWebDriver(new URL(remoteNodeUrl), cap);
+
+ }
+ driver = webDriver;
+
+ } catch (MalformedURLException e) {
+ throw new RuntimeException(e);
+ }
+
+ }
+
+ /**
+ * waits until either loader finishes or 10 seconds has passed.<br>
+ * If 10 seconds has passed and loader didn't finish throws
+ * LoaderStuckException.<br>
+ */
+ public static void waitForLoader() {
+ waitForLoader(10);
+ }
+
+ /**
+ * waits until either loader finishes or maxWaitTimeInSeconds has
+ * passed.<br>
+ * If maxWaitTimeInSeconds has passed and loader didn't finish throws
+ * LoaderStuckException.<br>
+ *
+ * @param maxWaitTimeInSeconds
+ */
+ public static void waitForLoader(int maxWaitTimeInSeconds) {
+ long maxWaitTimeMS = maxWaitTimeInSeconds * 1000L;
+ Boolean loaderIsRunning = retryMethodOnResult(
+ () -> isElementPresent(DataTestIdEnum.GeneralSection.LOADER.getValue()),
+ isLoaderPresent -> !isLoaderPresent, maxWaitTimeMS, 50);
+ if (loaderIsRunning) {
+ throw new LoaderStuckException(
+ "UI Loader is stuck, max wait time of " + maxWaitTimeInSeconds + " seconds has passed.");
+ }
+
+ }
+
+ private static class LoaderStuckException extends RuntimeException {
+ private static final long serialVersionUID = 1L;
+
+ private LoaderStuckException(String message) {
+ super(message);
+ }
+ }
+
+ /**
+ * Move to HTML element by class name. When moving to the HTML element, it
+ * will raise hover event.
+ *
+ * @param className
+ */
+ public static void moveToHTMLElementByClassName(String className) {
+ Actions actions = new Actions(getDriver());
+ final WebElement createButtonsArea = getDriver().findElement(By.className(className));
+ actions.moveToElement(createButtonsArea).perform();
+ }
+
+ /**
+ * Move to HTML element by element id. When moving to the HTML element, it
+ * will raise hover event.
+ *
+ * @param className
+ */
+ public static void moveToHTMLElementByDataTestId(String dataTestId) {
+ Actions actions = new Actions(getDriver());
+ final WebElement createButtonsArea = getWebElementByDataTestId(dataTestId);
+ actions.moveToElement(createButtonsArea).perform();
+ }
+
+ public static void defineVendorName(String resourceVendorName) {
+ // TODO ui-ci replace with Enum
+ WebElement resourceVendorNameTextbox = getWebElementWaitForVisible("vendorName");
+ resourceVendorNameTextbox.clear();
+ resourceVendorNameTextbox.sendKeys(resourceVendorName);
+ }
+
+ public static String defineUserId(String userId) {
+ // TODO ui-ci replace with Enum
+ WebElement resourceTagsTextbox = getWebElementWaitForVisible("userId");
+ resourceTagsTextbox.clear();
+ resourceTagsTextbox.sendKeys(userId);
+ return userId;
+ }
+
+ public static void clickAddComponent(Dashboard componentType) {
+ Runnable clickAddTask = () -> {
+ // TODO ui-ci replace with data-test-id
+ moveToHTMLElementByClassName("w-sdc-dashboard-card-new");
+ WebElement addVfButton = getWebElementByDataTestId(componentType.getValue());
+ addVfButton.click();
+ };
+ retryMethodOnException(clickAddTask);
+ }
+
+ /**
+ * This method perform submit for testing process for existing service or
+ * resource.<br>
+ * It assumes it is activated when in the resource screen and the Submit For
+ * Testing button is available.
+ *
+ * @param componentNameForMessage
+ * TODO
+ */
+ public static void submitForTestingElement(String componentNameForMessage) {
+ waitForLoader();
+ getWebElementWaitForVisible(DataTestIdEnum.LifeCyleChangeButtons.SUBMIT_FOR_TESTING.getValue()).click();
+ waitForLoader();
+ getWebElementWaitForVisible(DataTestIdEnum.ModalItems.SUMBIT_FOR_TESTING_MESSAGE.getValue())
+ .sendKeys("Submit for testing for " + componentNameForMessage);
+ waitForLoader();
+ getWebElementWaitForClickable(DataTestIdEnum.ModalItems.OK.getValue()).click();
+ waitForLoader();
+ waitForElementToDisappear(DataTestIdEnum.ModalItems.OK.getValue());
+
+ }
+
+ /**
+ * Waits Until elements disappears or until 10 seconds pass
+ *
+ * @param dataTestId
+ */
+ public static void waitForElementToDisappear(String dataTestId) {
+ Supplier<Boolean> elementPresenseChecker = () -> GeneralUIUtils.isElementPresent(dataTestId);
+ Function<Boolean, Boolean> verifier = isElementPresent -> !isElementPresent;
+ FunctionalInterfaces.retryMethodOnResult(elementPresenseChecker, verifier);
+
+ }
+
+}
\ No newline at end of file
diff --git a/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/utilities/MethodManipulationUtils.java b/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/utilities/MethodManipulationUtils.java
new file mode 100644
index 0000000..28b39e8
--- /dev/null
+++ b/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/utilities/MethodManipulationUtils.java
@@ -0,0 +1,15 @@
+package org.openecomp.sdc.uici.tests.utilities;
+
+/**
+ * Class For manipulations on method
+ *
+ * @author mshitrit
+ *
+ */
+public final class MethodManipulationUtils {
+
+ private MethodManipulationUtils() {
+ throw new IllegalAccessError();
+ }
+
+}
diff --git a/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/utilities/OnboardUtility.java b/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/utilities/OnboardUtility.java
new file mode 100644
index 0000000..3d21539
--- /dev/null
+++ b/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/utilities/OnboardUtility.java
@@ -0,0 +1,477 @@
+package org.openecomp.sdc.uici.tests.utilities;
+
+import static org.testng.AssertJUnit.assertTrue;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.StringWriter;
+import java.nio.file.FileSystems;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.UUID;
+
+import javax.validation.constraints.AssertTrue;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpStatus;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.mime.MultipartEntityBuilder;
+import org.apache.http.entity.mime.content.FileBody;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.json.JSONObject;
+import org.junit.Test;
+import org.openecomp.sdc.uici.tests.datatypes.DataTestIdEnum;
+
+import org.openecomp.sdc.ci.tests.config.Config;
+import org.openecomp.sdc.ci.tests.datatypes.http.HttpHeaderEnum;
+import org.openecomp.sdc.ci.tests.datatypes.http.HttpRequest;
+import org.openecomp.sdc.ci.tests.datatypes.http.RestResponse;
+import org.openecomp.sdc.ci.tests.utils.Utils;
+import org.openecomp.sdc.ci.tests.utils.rest.ResponseParser;
+import org.openecomp.sdc.common.datastructure.FunctionalInterfaces;
+
+/**
+ * Utility Class For Onboarding
+ *
+ * @author mshitrit
+ *
+ */
+public final class OnboardUtility {
+
+ private OnboardUtility() {
+ throw new UnsupportedOperationException();
+ }
+
+ private static final class Constants {
+ private static final String VENDOR_SOFTWARE_PRODUCTS = "vendor-software-products";
+ private static final String VENDOR_LICENSE_MODELS = "vendor-license-models";
+
+ private static final String VSP_ID = "vspId";
+ private static final String VALUE = "value";
+
+ enum Actions {
+ CHECK_IN("Checkin"), SUBMIT("Submit"), CREATE_PACKAGE("Create_Package");
+
+ private String value;
+
+ private Actions(String value) {
+ this.value = value;
+ }
+
+ public String getValue() {
+ return value;
+ }
+ };
+ }
+
+ /**
+ * @param heatFileName
+ * @param filepath
+ * @param userId
+ * @param vld
+ * @return
+ * @throws Exception
+ */
+ public static void createVendorSoftwareProduct(String heatFileName, String filepath, String userId,
+ VendorLicenseDetails vld) {
+ RestResponse createNewVendorSoftwareProduct = FunctionalInterfaces
+ .swallowException(() -> createNewVendorSoftwareProduct(vld, userId));
+ assertTrue(createNewVendorSoftwareProduct.getErrorCode() == HttpStatus.SC_OK);
+ String vspid = ResponseParser.getValueFromJsonResponse(createNewVendorSoftwareProduct.getResponse(),
+ Constants.VSP_ID);
+
+ RestResponse response = FunctionalInterfaces
+ .swallowException(() -> uploadHeatPackage(filepath, heatFileName, vspid, userId));
+ assertTrue(response.getErrorCode() == HttpStatus.SC_OK);
+
+ response = actionOnComponent(vspid, Constants.Actions.CHECK_IN.getValue(), Constants.VENDOR_SOFTWARE_PRODUCTS,
+ userId);
+ assertTrue(response.getErrorCode() == HttpStatus.SC_OK);
+
+ response = actionOnComponent(vspid, Constants.Actions.SUBMIT.getValue(), Constants.VENDOR_SOFTWARE_PRODUCTS,
+ userId);
+ assertTrue(response.getErrorCode() == HttpStatus.SC_OK);
+
+ response = actionOnComponent(vspid, Constants.Actions.CREATE_PACKAGE.getValue(),
+ Constants.VENDOR_SOFTWARE_PRODUCTS, userId);
+ assertTrue(response.getErrorCode() == HttpStatus.SC_OK);
+
+ }
+
+ /**
+ * Contains Details Relevant to Vendor License
+ *
+ * @author mshitrit
+ *
+ */
+ public static final class VendorLicenseDetails {
+ private final String vendorId;
+ private final String vendorLicenseName;
+ private final String vendorLicenseAgreementId;
+ private final String featureGroupId;
+ private final String vendorSoftwareProduct;
+
+ private VendorLicenseDetails(String vendorId, String vendorLicenseName, String vendorLicenseAgreementId,
+ String featureGroupId) {
+ super();
+ this.vendorId = vendorId;
+ this.vendorLicenseName = vendorLicenseName;
+ this.vendorLicenseAgreementId = vendorLicenseAgreementId;
+ this.featureGroupId = featureGroupId;
+ vendorSoftwareProduct = UUID.randomUUID().toString().split("-")[0];
+ }
+
+ public String getVendorId() {
+ return vendorId;
+ }
+
+ public String getVendorLicenseName() {
+ return vendorLicenseName;
+ }
+
+ public String getVendorLicenseAgreementId() {
+ return vendorLicenseAgreementId;
+ }
+
+ public String getFeatureGroupId() {
+ return featureGroupId;
+ }
+
+ public String getVendorSoftwareProduct() {
+ return vendorSoftwareProduct;
+ }
+
+ }
+
+ /**
+ * Creates Vendor License
+ *
+ * @param userId
+ * @return
+ * @throws Exception
+ */
+ public static VendorLicenseDetails createVendorLicense(String userId) {
+ final String fieldNameValue = Constants.VALUE;
+ String vendorLicenseName = UUID.randomUUID().toString().split("-")[0];
+ RestResponse vendorLicenseResponse = FunctionalInterfaces
+ .swallowException(() -> createVendorLicenseModels(vendorLicenseName, userId));
+ assertTrue(vendorLicenseResponse.getErrorCode() == HttpStatus.SC_OK);
+
+ String vendorId = ResponseParser.getValueFromJsonResponse(vendorLicenseResponse.getResponse(), fieldNameValue);
+
+ RestResponse vendorKeyGroupsResponse = FunctionalInterfaces
+ .swallowException(() -> createVendorKeyGroups(vendorId, userId));
+ assertTrue(vendorKeyGroupsResponse.getErrorCode() == HttpStatus.SC_OK);
+ String keyGroupId = ResponseParser.getValueFromJsonResponse(vendorKeyGroupsResponse.getResponse(),
+ fieldNameValue);
+
+ RestResponse vendorEntitlementPool = FunctionalInterfaces
+ .swallowException(() -> createVendorEntitlementPool(vendorId, userId));
+ assertTrue(vendorEntitlementPool.getErrorCode() == HttpStatus.SC_OK);
+ String entitlementPoolId = ResponseParser.getValueFromJsonResponse(vendorEntitlementPool.getResponse(),
+ fieldNameValue);
+
+ RestResponse vendorLicenseFeatureGroups = FunctionalInterfaces.swallowException(
+ () -> createVendorLicenseFeatureGroups(vendorId, keyGroupId, entitlementPoolId, userId));
+ assertTrue(vendorLicenseFeatureGroups.getErrorCode() == HttpStatus.SC_OK);
+ String featureGroupId = ResponseParser.getValueFromJsonResponse(vendorLicenseFeatureGroups.getResponse(),
+ fieldNameValue);
+
+ RestResponse vendorLicenseAgreement = FunctionalInterfaces
+ .swallowException(() -> createVendorLicenseAgreement(vendorId, featureGroupId, userId));
+ assertTrue(vendorLicenseAgreement.getErrorCode() == HttpStatus.SC_OK);
+ String vendorLicenseAgreementId = ResponseParser.getValueFromJsonResponse(vendorLicenseAgreement.getResponse(),
+ fieldNameValue);
+
+ RestResponse actionOnComponent = actionOnComponent(vendorId, Constants.Actions.CHECK_IN.getValue(),
+ Constants.VENDOR_LICENSE_MODELS, userId);
+ assertTrue(actionOnComponent.getErrorCode() == HttpStatus.SC_OK);
+
+ actionOnComponent = actionOnComponent(vendorId, Constants.Actions.SUBMIT.getValue(),
+ Constants.VENDOR_LICENSE_MODELS, userId);
+ assertTrue(actionOnComponent.getErrorCode() == HttpStatus.SC_OK);
+
+ return new VendorLicenseDetails(vendorId, vendorLicenseName, vendorLicenseAgreementId, featureGroupId);
+ }
+
+ private static RestResponse actionOnComponent(String vspid, String action, String onboardComponent, String userId) {
+ Config config = FunctionalInterfaces.swallowException(() -> Utils.getConfig());
+ String url = String.format("http://%s:%s/onboarding-api/v1.0/%s/%s/actions", config.getCatalogBeHost(),
+ config.getCatalogBePort(), onboardComponent, vspid);
+
+ JSONObject jObject = new JSONObject();
+ FunctionalInterfaces.swallowException(() -> jObject.put("action", action));
+
+ Map<String, String> headersMap = prepareHeadersMap(userId);
+
+ HttpRequest http = new HttpRequest();
+ RestResponse response = FunctionalInterfaces
+ .swallowException(() -> http.httpSendPut(url, jObject.toString(), headersMap));
+ return response;
+ }
+
+ private static RestResponse createVendorLicenseModels(String name, String userId) throws Exception {
+ Config config = Utils.getConfig();
+ String url = String.format("http://%s:%s/onboarding-api/v1.0/vendor-license-models", config.getCatalogBeHost(),
+ config.getCatalogBePort());
+
+ JSONObject jObject = new JSONObject();
+ jObject.put("vendorName", name);
+ jObject.put("description", "new vendor license model");
+ jObject.put("iconRef", "icon");
+
+ Map<String, String> headersMap = prepareHeadersMap(userId);
+
+ HttpRequest http = new HttpRequest();
+ RestResponse response = http.httpSendPost(url, jObject.toString(), headersMap);
+ return response;
+
+ }
+
+ private static RestResponse createVendorLicenseAgreement(String vspid, String featureGroupId, String userId)
+ throws Exception {
+ Config config = Utils.getConfig();
+ String url = String.format("http://%s:%s/onboarding-api/v1.0/vendor-license-models/%s/license-agreements",
+ config.getCatalogBeHost(), config.getCatalogBePort(), vspid);
+
+ JSONObject licenseTermpObject = new JSONObject();
+ licenseTermpObject.put("choice", "Fixed_Term");
+ licenseTermpObject.put("other", "");
+
+ JSONObject jObjectBody = new JSONObject();
+ jObjectBody.put("name", "abc");
+ jObjectBody.put("description", "new vendor license agreement");
+ jObjectBody.put("requirementsAndConstrains", "abc");
+ jObjectBody.put("licenseTerm", licenseTermpObject);
+ jObjectBody.put("addedFeatureGroupsIds", Arrays.asList(featureGroupId).toArray());
+
+ Map<String, String> headersMap = prepareHeadersMap(userId);
+
+ HttpRequest http = new HttpRequest();
+ RestResponse response = http.httpSendPost(url, jObjectBody.toString(), headersMap);
+ return response;
+ }
+
+ private static RestResponse createVendorLicenseFeatureGroups(String vspid, String licenseKeyGroupId,
+ String entitlementPoolId, String userId) throws Exception {
+ Config config = Utils.getConfig();
+ String url = String.format("http://%s:%s/onboarding-api/v1.0/vendor-license-models/%s/feature-groups",
+ config.getCatalogBeHost(), config.getCatalogBePort(), vspid);
+
+ JSONObject jObject = new JSONObject();
+ jObject.put("name", "xyz");
+ jObject.put("description", "new vendor license feature groups");
+ jObject.put("partNumber", "123abc456");
+ jObject.put("addedLicenseKeyGroupsIds", Arrays.asList(licenseKeyGroupId).toArray());
+ jObject.put("addedEntitlementPoolsIds", Arrays.asList(entitlementPoolId).toArray());
+
+ Map<String, String> headersMap = prepareHeadersMap(userId);
+
+ HttpRequest http = new HttpRequest();
+ RestResponse response = http.httpSendPost(url, jObject.toString(), headersMap);
+ return response;
+
+ }
+
+ private static RestResponse createVendorEntitlementPool(String vspid, String userId) throws Exception {
+ Config config = Utils.getConfig();
+ String url = String.format("http://%s:%s/onboarding-api/v1.0/vendor-license-models/%s/entitlement-pools",
+ config.getCatalogBeHost(), config.getCatalogBePort(), vspid);
+
+ JSONObject jEntitlementMetricObject = new JSONObject();
+ jEntitlementMetricObject.put("choice", "CPU");
+ jEntitlementMetricObject.put("other", "");
+
+ JSONObject jAggregationFunctionObject = new JSONObject();
+ jAggregationFunctionObject.put("choice", "Peak");
+ jAggregationFunctionObject.put("other", "");
+
+ JSONObject jOperationalScope = new JSONObject();
+ jOperationalScope.put("choices", Arrays.asList("Availability_Zone").toArray());
+ jOperationalScope.put("other", "");
+
+ JSONObject jTimeObject = new JSONObject();
+ jTimeObject.put("choice", "Hour");
+ jTimeObject.put("other", "");
+
+ JSONObject jObjectBody = new JSONObject();
+ jObjectBody.put("name", "def");
+ jObjectBody.put("description", "new vendor license entitlement pool");
+ jObjectBody.put("thresholdValue", "23");
+ jObjectBody.put("thresholdUnits", "Absolute");
+ jObjectBody.put("entitlementMetric", jEntitlementMetricObject);
+ jObjectBody.put("increments", "abcd");
+ jObjectBody.put("aggregationFunction", jAggregationFunctionObject);
+ jObjectBody.put("operationalScope", jOperationalScope);
+ jObjectBody.put("time", jTimeObject);
+ jObjectBody.put("manufacturerReferenceNumber", "123aaa");
+
+ Map<String, String> headersMap = prepareHeadersMap(userId);
+
+ HttpRequest http = new HttpRequest();
+ RestResponse response = http.httpSendPost(url, jObjectBody.toString(), headersMap);
+ return response;
+ }
+
+ private static RestResponse createVendorKeyGroups(String vspid, String userId) throws Exception {
+ Config config = Utils.getConfig();
+ String url = String.format("http://%s:%s/onboarding-api/v1.0/vendor-license-models/%s/license-key-groups",
+ config.getCatalogBeHost(), config.getCatalogBePort(), vspid);
+
+ JSONObject jOperationalScope = new JSONObject();
+ jOperationalScope.put("choices", Arrays.asList("Tenant").toArray());
+ jOperationalScope.put("other", "");
+
+ JSONObject jObjectBody = new JSONObject();
+ jObjectBody.put("name", "keyGroup");
+ jObjectBody.put("description", "new vendor license key group");
+ jObjectBody.put("operationalScope", jOperationalScope);
+ jObjectBody.put("type", "Universal");
+
+ Map<String, String> headersMap = prepareHeadersMap(userId);
+
+ HttpRequest http = new HttpRequest();
+ RestResponse response = http.httpSendPost(url, jObjectBody.toString(), headersMap);
+ return response;
+ }
+
+ private static RestResponse createNewVendorSoftwareProduct(VendorLicenseDetails vld, String userId)
+ throws Exception {
+ Config config = Utils.getConfig();
+ String url = String.format("http://%s:%s/onboarding-api/v1.0/vendor-software-products",
+ config.getCatalogBeHost(), config.getCatalogBePort());
+
+ JSONObject jlicensingDataObj = new JSONObject();
+ jlicensingDataObj.put("licenseAgreement", vld.getVendorLicenseAgreementId());
+ jlicensingDataObj.put("featureGroups", Arrays.asList(vld.getFeatureGroupId()).toArray());
+
+ JSONObject jObject = new JSONObject();
+ jObject.put("name", vld.getVendorSoftwareProduct());
+ jObject.put("description", "new VSP description");
+ jObject.put("category", "resourceNewCategory.generic");
+ jObject.put("subCategory", "resourceNewCategory.generic.database");
+ jObject.put("licensingVersion", "1.0");
+ jObject.put("vendorName", vld.getVendorLicenseName());
+ jObject.put("vendorId", vld.getVendorId());
+ jObject.put("icon", "icon");
+ jObject.put("licensingData", jlicensingDataObj);
+
+ Map<String, String> headersMap = prepareHeadersMap(userId);
+ HttpRequest http = new HttpRequest();
+
+ RestResponse response = http.httpSendPost(url, jObject.toString(), headersMap);
+
+ return response;
+ }
+
+ private static RestResponse uploadHeatPackage(String filepath, String filename, String vspid, String userId)
+ throws Exception {
+ Config config = Utils.getConfig();
+ CloseableHttpResponse response = null;
+
+ MultipartEntityBuilder mpBuilder = MultipartEntityBuilder.create();
+ mpBuilder.addPart("resourceZip", new FileBody(getTestZipFile(filepath, filename)));
+
+ String url = String.format("http://%s:%s/onboarding-api/v1.0/vendor-software-products/%s/upload",
+ config.getCatalogBeHost(), config.getCatalogBePort(), vspid);
+
+ Map<String, String> headersMap = prepareHeadersMap(userId);
+ headersMap.put(HttpHeaderEnum.CONTENT_TYPE.getValue(), "multipart/form-data");
+
+ CloseableHttpClient client = HttpClients.createDefault();
+ try {
+ HttpPost httpPost = new HttpPost(url);
+ RestResponse restResponse = new RestResponse();
+
+ Iterator<String> iterator = headersMap.keySet().iterator();
+ while (iterator.hasNext()) {
+ String key = iterator.next();
+ String value = headersMap.get(key);
+ httpPost.addHeader(key, value);
+ }
+ httpPost.setEntity(mpBuilder.build());
+ response = client.execute(httpPost);
+ HttpEntity entity = response.getEntity();
+ String responseBody = null;
+ if (entity != null) {
+ InputStream instream = entity.getContent();
+ StringWriter writer = new StringWriter();
+ IOUtils.copy(instream, writer);
+ responseBody = writer.toString();
+ try {
+
+ } finally {
+ instream.close();
+ }
+ }
+
+ restResponse.setErrorCode(response.getStatusLine().getStatusCode());
+ restResponse.setResponse(responseBody);
+
+ return restResponse;
+
+ } finally {
+ closeResponse(response);
+ closeHttpClient(client);
+
+ }
+ }
+
+ private static void closeResponse(CloseableHttpResponse response) {
+ try {
+ if (response != null) {
+ response.close();
+ }
+ } catch (IOException e) {
+ System.out.println(String.format("failed to close client or response: %s", e.getMessage()));
+ }
+ }
+
+ private static void closeHttpClient(CloseableHttpClient client) {
+ try {
+ if (client != null) {
+ client.close();
+ }
+ } catch (IOException e) {
+ System.out.println(String.format("failed to close client or response: %s", e.getMessage()));
+ }
+ }
+
+ private static File getTestZipFile(String filepath, String filename) throws IOException {
+ Config config = Utils.getConfig();
+ String sourceDir = config.getImportResourceTestsConfigDir();
+ java.nio.file.Path filePath = FileSystems.getDefault().getPath(filepath + File.separator + filename);
+ return filePath.toFile();
+ }
+
+ protected static Map<String, String> prepareHeadersMap(String userId) {
+ Map<String, String> headersMap = new HashMap<String, String>();
+ headersMap.put(HttpHeaderEnum.CONTENT_TYPE.getValue(), "application/json");
+ headersMap.put(HttpHeaderEnum.ACCEPT.getValue(), "application/json");
+ headersMap.put(HttpHeaderEnum.USER_ID.getValue(), userId);
+ return headersMap;
+ }
+
+ public static void createVfFromOnboarding(String userID, String zipFile, String filepath) {
+ VendorLicenseDetails vld = createVendorLicense(userID);
+ createVendorSoftwareProduct(zipFile, filepath, userID, vld);
+
+ GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.OnBoardingTable.OPEN_MODAL_BUTTON.getValue()).click();
+ GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.OnBoardingTable.ONBOARDING_SEARCH.getValue())
+ .sendKeys(vld.getVendorSoftwareProduct());
+
+ GeneralUIUtils.waitForLoader();
+ GeneralUIUtils.sleep(1000);
+ GeneralUIUtils.getWebElementWaitForClickable(vld.getVendorSoftwareProduct()).click();
+ GeneralUIUtils.waitForLoader();
+ GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.OnBoardingTable.IMPORT_ICON.getValue()).click();
+ GeneralUIUtils.getWebElementWaitForClickable(DataTestIdEnum.LifeCyleChangeButtons.CREATE.getValue()).click();
+ GeneralUIUtils.waitForLoader(300);
+ }
+
+}
diff --git a/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/utilities/ResourceUIUtils.java b/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/utilities/ResourceUIUtils.java
new file mode 100644
index 0000000..477cc0c
--- /dev/null
+++ b/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/utilities/ResourceUIUtils.java
@@ -0,0 +1,299 @@
+package org.openecomp.sdc.uici.tests.utilities;
+
+import static org.openecomp.sdc.common.datastructure.FunctionalInterfaces.retryMethodOnException;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+import java.util.function.Function;
+import java.util.function.Supplier;
+
+import org.apache.commons.lang3.tuple.ImmutablePair;
+import org.json.simple.JSONArray;
+import org.json.simple.JSONObject;
+import org.json.simple.JSONValue;
+import org.openecomp.sdc.uici.tests.datatypes.DataTestIdEnum;
+import org.openecomp.sdc.uici.tests.datatypes.DataTestIdEnum.Dashboard;
+import org.openqa.selenium.By;
+import org.openqa.selenium.Keys;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+import org.openqa.selenium.support.ui.WebDriverWait;
+
+import org.openecomp.sdc.be.datatypes.enums.ResourceTypeEnum;
+import org.openecomp.sdc.be.model.LifecycleStateEnum;
+import org.openecomp.sdc.be.model.Resource;
+import org.openecomp.sdc.be.model.User;
+import org.openecomp.sdc.ci.tests.datatypes.ComponentReqDetails;
+import org.openecomp.sdc.ci.tests.datatypes.ResourceReqDetails;
+import org.openecomp.sdc.ci.tests.datatypes.enums.NormativeTypesEnum;
+import org.openecomp.sdc.ci.tests.datatypes.enums.ResourceCategoryEnum;
+import org.openecomp.sdc.ci.tests.utils.general.ElementFactory;
+import org.openecomp.sdc.ci.tests.utils.rest.ResponseParser;
+import org.openecomp.sdc.common.datastructure.FunctionalInterfaces;
+
+public final class ResourceUIUtils {
+ public static final String RESOURCE_NAME_PREFIX = "ResourceCDTest-";
+ protected static final boolean IS_BEFORE_TEST = true;
+ public static final String INITIAL_VERSION = "0.1";
+ public static final String ICON_RESOURCE_NAME = "call_controll";
+ protected static final String UPDATED_RESOURCE_ICON_NAME = "objectStorage";
+
+ private ResourceUIUtils() {
+ }
+
+ public static void defineResourceName(String resourceName) {
+
+ WebElement resourceNameTextbox = GeneralUIUtils.getDriver().findElement(By.name("componentName"));
+ resourceNameTextbox.clear();
+ resourceNameTextbox.sendKeys(resourceName);
+ }
+
+ public static void defineResourceCategory(String category, String datatestsid) {
+
+ GeneralUIUtils.getSelectList(category, datatestsid);
+ }
+
+ public static void importFileWithSendKeyBrowse(String FilePath, String FileName) throws Exception {
+ WebElement browsebutton = GeneralUIUtils.getWebElementWaitForVisible("browseButton");
+ browsebutton.sendKeys(FilePath + FileName);
+ }
+
+ public static void defineTagsList(ResourceReqDetails resource, String[] resourceTags) {
+ List<String> taglist = new ArrayList<String>();
+ ;
+ WebElement resourceTagsTextbox = GeneralUIUtils.getWebElementWaitForVisible("i-sdc-tag-input");
+ for (String tag : resourceTags) {
+ resourceTagsTextbox.clear();
+ resourceTagsTextbox.sendKeys(tag);
+ resourceTagsTextbox.sendKeys(Keys.ENTER);
+ taglist.add(tag);
+ }
+ resource.setTags(taglist);
+ }
+
+ public static void defineVendorRelease(String resourceVendorRelease) {
+
+ WebElement resourceVendorReleaseTextbox = GeneralUIUtils.getWebElementWaitForVisible("vendorRelease");
+ resourceVendorReleaseTextbox.clear();
+ resourceVendorReleaseTextbox.sendKeys(resourceVendorRelease);
+ }
+
+ public static void defineProjectCode(String projectCode) {
+
+ WebElement resourceNameTextbox = GeneralUIUtils.getDriver().findElement(By.name("projectCode"));
+ resourceNameTextbox.clear();
+ resourceNameTextbox.sendKeys(projectCode);
+ }
+
+ public static void clickButton(String selectButton) {
+
+ WebElement clickButton = GeneralUIUtils.getDriver()
+ .findElement(By.xpath("//*[@data-tests-id='" + selectButton + "']"));
+ clickButton.click();
+ }
+
+ public static WebElement Waitfunctionforbuttons(String element, int timeout) {
+ WebDriverWait wait = new WebDriverWait(GeneralUIUtils.getDriver(), timeout);
+ return wait.until(ExpectedConditions.elementToBeClickable(By.xpath(element)));
+ }
+
+ // coded by teddy
+ public static void fillGeneralInformationPage(ResourceReqDetails resource, User user) {
+ try {
+ resource.setContactId(user.getUserId());
+ resource.setCreatorUserId(user.getUserId());
+ resource.setCreatorFullName(user.getFullName());
+ defineResourceName(resource.getName());
+ defineResourceCategory(resource.getCategories().get(0).getSubcategories().get(0).getName(),
+ "selectGeneralCategory");
+ GeneralUIUtils.defineDescription(resource.getDescription());
+ GeneralUIUtils.defineVendorName(resource.getVendorName());
+ defineVendorRelease(resource.getVendorRelease());
+ defineTagsList(resource, new String[] { resource.getName() });
+ GeneralUIUtils.defineUserId(resource.getCreatorUserId());
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ public static ResourceReqDetails createResourceInUI(User user) {
+ ResourceReqDetails defineResourceDetails = defineResourceDetails();
+ GeneralUIUtils.clickAddComponent(DataTestIdEnum.Dashboard.BUTTON_ADD_VF);
+
+ GeneralUIUtils.waitForLoader();
+ fillGeneralInformationPage(defineResourceDetails, user);
+ GeneralUIUtils.clickCreateButton();
+ return defineResourceDetails;
+
+ }
+
+ @SuppressWarnings("deprecation")
+ private static void openImportWithFile(String filePath, String fileName, Dashboard elementType) {
+ Runnable openImportTask = () -> {
+ GeneralUIUtils.moveToHTMLElementByDataTestId(Dashboard.IMPORT_AREA.getValue());
+ WebElement imoprtVFButton = GeneralUIUtils.getWebElementByDataTestId(elementType.getValue());
+ imoprtVFButton.sendKeys(filePath + fileName);
+ };
+ retryMethodOnException(openImportTask);
+
+ }
+
+ public static ResourceReqDetails importVfcInUI(User user, String filePath, String fileName) {
+ ResourceReqDetails defineResourceDetails = defineResourceDetails();
+ openImportWithFile(filePath, fileName, DataTestIdEnum.Dashboard.IMPORT_VFC_FILE);
+ // Fill the general page fields.
+ GeneralUIUtils.waitForLoader();
+ fillGeneralInformationPage(defineResourceDetails, user);
+ GeneralUIUtils.clickCreateButton();
+ return defineResourceDetails;
+ }
+
+ /**
+ * Import VF
+ *
+ * @param user
+ * @param filePath
+ * @param fileName
+ * @return
+ */
+ public static ResourceReqDetails importVfInUI(User user, String filePath, String fileName) {
+ ResourceReqDetails defineResourceDetails = defineResourceDetails();
+ openImportWithFile(filePath, fileName, DataTestIdEnum.Dashboard.IMPORT_VF_FILE);
+ // Fill the general page fields.
+ GeneralUIUtils.waitForLoader();
+ fillGeneralInformationPage(defineResourceDetails, user);
+
+ GeneralUIUtils.clickSaveButton();
+
+ return defineResourceDetails;
+ }
+
+ public static ResourceReqDetails importVfInUIWithoutCheckin(User user, String filePath, String fileName) {
+ ResourceReqDetails defineResourceDetails = defineResourceDetails();
+ openImportWithFile(filePath, fileName, DataTestIdEnum.Dashboard.IMPORT_VF_FILE);
+ // Fill the general page fields.
+ GeneralUIUtils.waitForLoader();
+ fillGeneralInformationPage(defineResourceDetails, user);
+ GeneralUIUtils.clickSaveButton();
+ GeneralUIUtils.waitForLoader();
+ // String okButtonId=DataTestIdEnum.ModalItems.OK.getValue();
+ // ResourceUIUtils.clickButton(okButtonId);
+ // ResourceUIUtils.Waitfunctionforbuttons("//*[@data-tests-id='"+okButtonId+"']",10);
+ // ResourceUIUtils.clickButton(okButtonId);
+ return defineResourceDetails;
+ }
+
+ public static ResourceReqDetails importVfFromOnBoardingModalWithoutCheckin(User user, String fileName) {
+ ResourceReqDetails defineResourceDetails = defineResourceDetails();
+ GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.OnBoardingTable.OPEN_MODAL_BUTTON.getValue()).click();
+ GeneralUIUtils.getWebElementWaitForVisible(fileName).click();
+ GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.OnBoardingTable.IMPORT_ICON.getValue()).click();
+
+ // Fill the general page fields.
+ GeneralUIUtils.waitForLoader();
+ GeneralUIUtils.clickSaveButton();
+ GeneralUIUtils.waitForLoader();
+ return defineResourceDetails;
+ }
+
+ @SuppressWarnings("deprecation")
+ public static void updateVfCsar(String filePath, String fileName) {
+ retryMethodOnException(
+ () -> GeneralUIUtils.getWebElementByDataTestId(DataTestIdEnum.GeneralSection.BROWSE_BUTTON.getValue())
+ .sendKeys(filePath + fileName));
+ GeneralUIUtils.clickSaveButton();
+ GeneralUIUtils.waitForLoader();
+ }
+
+ public static void updateVfCsarFromOnBoarding() {
+ GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.GeneralSection.BROWSE_BUTTON.getValue()).click();
+ GeneralUIUtils.getWebElementsListWaitForVisible(DataTestIdEnum.OnBoardingTable.CSAR_ROW.getValue()).get(0)
+ .click();
+ GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.OnBoardingTable.UPDATE_ICON.getValue()).click();
+ GeneralUIUtils.clickSaveButton();
+ GeneralUIUtils.waitForLoader();
+ }
+
+ public static ResourceReqDetails defineResourceDetails() {
+ ResourceReqDetails resource = new ResourceReqDetails();
+ resource = ElementFactory.getDefaultResource(NormativeTypesEnum.ROOT,
+ ResourceCategoryEnum.GENERIC_NETWORK_ELEMENTS);
+ resource.setVersion(INITIAL_VERSION);
+ resource.setIcon(ICON_RESOURCE_NAME);
+ resource.setResourceType(ResourceTypeEnum.VF.toString());
+ resource.setName(getRandomComponentName(RESOURCE_NAME_PREFIX));
+
+ return resource;
+ }
+
+ protected static String getRandomComponentName(String prefix) {
+ return prefix + new Random().nextInt(10000);
+ }
+
+ public static ImmutablePair<String, String> getRIPosition(ResourceReqDetails createResourceInUI, User user) {
+ GeneralUIUtils.sleep(1000);
+ String responseAfterDrag = RestCDUtils.getResource(createResourceInUI).getResponse();
+ JSONObject jsonResource = (JSONObject) JSONValue.parse(responseAfterDrag);
+ String xPosPostDrag = (String) ((JSONObject) ((JSONArray) jsonResource.get("componentInstances")).get(0))
+ .get("posX");
+ String yPosPostDrag = (String) ((JSONObject) ((JSONArray) jsonResource.get("componentInstances")).get(0))
+ .get("posY");
+ return new ImmutablePair<String, String>(xPosPostDrag, yPosPostDrag);
+
+ }
+
+ public static void fillinDeploymentArtifactFormAndClickDone(
+ org.openecomp.sdc.ci.tests.datatypes.ArtifactReqDetails details, String filePath) {
+ GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.ArtifactModal.LABEL.getValue())
+ .sendKeys(details.getArtifactLabel());
+ GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.ModalItems.DESCRIPTION.getValue())
+ .sendKeys(details.getDescription());
+ GeneralUIUtils.getSelectList(details.getArtifactType(), DataTestIdEnum.ArtifactModal.TYPE.getValue());
+ retryMethodOnException(() -> GeneralUIUtils
+ .getWebElementByDataTestId(DataTestIdEnum.GeneralSection.BROWSE_BUTTON.getValue()).sendKeys(filePath));
+ GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.ModalItems.DONE.getValue()).click();
+ GeneralUIUtils.waitForLoader();
+ }
+
+ /**
+ * Tests and Accept resource or service
+ *
+ * @param createResourceInUI
+ */
+ public static void testAndAcceptElement(ComponentReqDetails createResourceInUI) {
+ GeneralUIUtils.waitForLoader();
+ GeneralUIUtils.getWebElementWaitForVisible(createResourceInUI.getName()).click();
+ GeneralUIUtils.waitForLoader();
+ GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.LifeCyleChangeButtons.START_TESTING.getValue())
+ .click();
+ GeneralUIUtils.waitForLoader();
+ GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.LifeCyleChangeButtons.ACCEPT.getValue()).click();
+ GeneralUIUtils.waitForLoader();
+ GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.ModalItems.ACCEP_TESTING_MESSAGE.getValue())
+ .sendKeys("resource " + createResourceInUI.getName() + " tested successfuly");
+ GeneralUIUtils.waitForLoader();
+ GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.ModalItems.OK.getValue()).click();
+ GeneralUIUtils.waitForLoader();
+ GeneralUIUtils.waitForElementToDisappear(DataTestIdEnum.ModalItems.OK.getValue());
+ }
+
+ /**
+ * Waits Until resource changed to requested lifeCycle State
+ *
+ * @param createResourceInUI
+ * @param requestedLifeCycleState
+ * @return
+ */
+ public static Resource waitForState(ResourceReqDetails createResourceInUI,
+ LifecycleStateEnum requestedLifeCycleState) {
+ Supplier<Resource> resourceGetter = () -> {
+ String resourceString = RestCDUtils.getResource(createResourceInUI).getResponse();
+ return ResponseParser.convertResourceResponseToJavaObject(resourceString);
+ };
+ Function<Resource, Boolean> verifier = res -> res.getLifecycleState() == requestedLifeCycleState;
+ return FunctionalInterfaces.retryMethodOnResult(resourceGetter, verifier);
+
+ }
+
+}
diff --git a/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/utilities/RestCDUtils.java b/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/utilities/RestCDUtils.java
new file mode 100644
index 0000000..8b602e3
--- /dev/null
+++ b/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/utilities/RestCDUtils.java
@@ -0,0 +1,167 @@
+package org.openecomp.sdc.uici.tests.utilities;
+
+import static org.openecomp.sdc.common.datastructure.FunctionalInterfaces.retryMethodOnResult;
+import static org.openecomp.sdc.common.datastructure.FunctionalInterfaces.swallowException;
+import static org.testng.AssertJUnit.assertTrue;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.function.Function;
+import java.util.function.Supplier;
+
+import org.apache.http.HttpStatus;
+import org.codehaus.jackson.map.ObjectMapper;
+import org.codehaus.jettison.json.JSONArray;
+import org.codehaus.jettison.json.JSONObject;
+
+import org.openecomp.sdc.be.model.User;
+import org.openecomp.sdc.ci.tests.datatypes.ComponentReqDetails;
+import org.openecomp.sdc.ci.tests.datatypes.ProductReqDetails;
+import org.openecomp.sdc.ci.tests.datatypes.ResourceReqDetails;
+import org.openecomp.sdc.ci.tests.datatypes.ServiceReqDetails;
+import org.openecomp.sdc.ci.tests.datatypes.enums.UserRoleEnum;
+import org.openecomp.sdc.ci.tests.datatypes.http.RestResponse;
+import org.openecomp.sdc.ci.tests.utils.rest.ProductRestUtils;
+import org.openecomp.sdc.ci.tests.utils.rest.ResourceRestUtils;
+import org.openecomp.sdc.ci.tests.utils.rest.ResponseParser;
+import org.openecomp.sdc.ci.tests.utils.rest.ServiceRestUtils;
+
+public class RestCDUtils {
+
+ private static void setResourceUniqueIdAndUUID(ComponentReqDetails element, RestResponse getResourceResponse) {
+ element.setUniqueId(ResponseParser.getUniqueIdFromResponse(getResourceResponse));
+ element.setUUID(ResponseParser.getUuidFromResponse(getResourceResponse));
+ }
+
+ public static RestResponse getResourceByNameAndVersionRetryOnFail(String userId, String resourceName,
+ String resourceVersion) {
+ Supplier<RestResponse> resourceGetter = () -> swallowException(
+ () -> ResourceRestUtils.getResourceByNameAndVersion(userId, resourceName, resourceVersion));
+ Function<RestResponse, Boolean> validator = restRes -> restRes.getErrorCode() == HttpStatus.SC_OK;
+ return retryMethodOnResult(resourceGetter, validator);
+ }
+
+ public static RestResponse getResource(ResourceReqDetails resource) {
+ try {
+ System.out.println("trying to get resource");
+ RestResponse getResourceResponse = null;
+ String reourceUniqueId = resource.getUniqueId();
+
+ if (reourceUniqueId != null) {
+ GeneralUIUtils.sleep(1000);
+ getResourceResponse = ResourceRestUtils.getResource(reourceUniqueId);
+ if (getResourceResponse.getErrorCode().intValue() == HttpStatus.SC_OK) {
+ System.out.println("succeeded to get resource");
+ }
+ return getResourceResponse;
+ }
+ JSONObject getResourceJSONObject = null;
+ getResourceResponse = getResourceByNameAndVersionRetryOnFail(UserRoleEnum.ADMIN.getUserId(),
+ resource.getName(), resource.getVersion());
+ if (getResourceResponse.getErrorCode().intValue() == HttpStatus.SC_OK) {
+ JSONArray jArray = new JSONArray(getResourceResponse.getResponse());
+ for (int i = 0; i < jArray.length(); i++) {
+ getResourceJSONObject = jArray.getJSONObject(i);
+ String resourceType = ResponseParser.getValueFromJsonResponse(getResourceJSONObject.toString(),
+ "resourceType");
+ if (resourceType.equals(resource.getResourceType())) {
+ getResourceResponse.setResponse(getResourceJSONObject.toString());
+ setResourceUniqueIdAndUUID(resource, getResourceResponse);
+ System.out.println("succeeded to get resource");
+ return getResourceResponse;
+ }
+ }
+ }
+
+ return getResourceResponse;
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ public static RestResponse getService(ServiceReqDetails service, User user) {
+ Supplier<RestResponse> serviceFetcher = () -> swallowException(
+ () -> ServiceRestUtils.getServiceByNameAndVersion(user, service.getName(), service.getVersion()));
+ Function<RestResponse, Boolean> verifier = restResponse -> restResponse.getErrorCode()
+ .intValue() == HttpStatus.SC_OK;
+ RestResponse getServiceResponse = retryMethodOnResult(serviceFetcher, verifier);
+
+ if (getServiceResponse.getErrorCode().intValue() == HttpStatus.SC_OK) {
+ setResourceUniqueIdAndUUID(service, getServiceResponse);
+ }
+ return getServiceResponse;
+ }
+
+ public static RestResponse getProduct(ProductReqDetails product, User user) throws Exception {
+ Thread.sleep(3500);
+ RestResponse getProductResponse = ProductRestUtils.getProductByNameAndVersion(product.getName(),
+ product.getVersion(), user.getUserId());
+ if (getProductResponse.getErrorCode().intValue() == 200) {
+ setResourceUniqueIdAndUUID(product, getProductResponse);
+ }
+ return getProductResponse;
+ }
+
+ public static Map<String, String> getAllElementVersionsFromResponse(RestResponse getResource) throws Exception {
+ Map<String, String> versionsMap = new HashMap<String, String>();
+ try {
+ ObjectMapper mapper = new ObjectMapper();
+
+ JSONObject object = new JSONObject(getResource.getResponse());
+ versionsMap = mapper.readValue(object.get("allVersions").toString(), Map.class);
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ return versionsMap;
+
+ }
+
+ return versionsMap;
+ }
+
+ public static void deleteElementVersions(Map<String, String> elementVersions, boolean isBeforeTest, Object clazz,
+ User user) throws Exception {
+ Iterator<String> iterator = elementVersions.keySet().iterator();
+ while (iterator.hasNext()) {
+ String singleVersion = iterator.next();
+ String uniqueId = elementVersions.get(singleVersion);
+ RestResponse deleteResponse = null;
+ if (clazz instanceof ServiceReqDetails) {
+ deleteResponse = ServiceRestUtils.deleteServiceById(uniqueId, user.getUserId());
+ } else if (clazz instanceof ResourceReqDetails) {
+ deleteResponse = ResourceRestUtils.deleteResource(uniqueId, user.getUserId());
+ } else if (clazz instanceof ProductReqDetails) {
+ deleteResponse = ProductRestUtils.deleteProduct(uniqueId, user.getUserId());
+ }
+
+ if (isBeforeTest) {
+ assertTrue(deleteResponse.getErrorCode().intValue() == 204
+ || deleteResponse.getErrorCode().intValue() == 404);
+ } else {
+ assertTrue(deleteResponse.getErrorCode().intValue() == 204);
+ }
+ }
+ }
+
+ public static void deleteAllResourceVersionsAfterTest(ComponentReqDetails componentDetails,
+ RestResponse getObjectResponse, User user) throws Exception {
+ deleteAllComponentVersion(false, componentDetails, getObjectResponse, user);
+ }
+
+ public static void deleteAllResourceVersionsBeforeTest(ComponentReqDetails componentDetails,
+ RestResponse getObjectResponse, User user) throws Exception {
+ deleteAllComponentVersion(true, componentDetails, getObjectResponse, user);
+ }
+
+ public static void deleteAllComponentVersion(boolean isBeforeTest, ComponentReqDetails componentDetails,
+ RestResponse getObjectResponse, User user) throws Exception {
+ if (getObjectResponse.getErrorCode().intValue() == 404)
+ return;
+ Map<String, String> componentVersionsMap = getAllElementVersionsFromResponse(getObjectResponse);
+ System.out.println("deleting...");
+ deleteElementVersions(componentVersionsMap, isBeforeTest, componentDetails, user);
+ componentDetails.setUniqueId(null);
+ }
+
+}
\ No newline at end of file
diff --git a/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/utilities/ServiceUIUtils.java b/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/utilities/ServiceUIUtils.java
new file mode 100644
index 0000000..abcc3b3
--- /dev/null
+++ b/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/utilities/ServiceUIUtils.java
@@ -0,0 +1,147 @@
+package org.openecomp.sdc.uici.tests.utilities;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+import java.util.function.Function;
+import java.util.function.Supplier;
+
+import org.openecomp.sdc.uici.tests.datatypes.DataTestIdEnum;
+import org.openecomp.sdc.uici.tests.datatypes.DataTestIdEnum.GeneralSection;
+import org.openqa.selenium.Keys;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.support.ui.Select;
+
+import org.openecomp.sdc.be.model.LifecycleStateEnum;
+import org.openecomp.sdc.be.model.Service;
+import org.openecomp.sdc.be.model.User;
+import org.openecomp.sdc.ci.tests.datatypes.ServiceReqDetails;
+import org.openecomp.sdc.ci.tests.datatypes.enums.ServiceCategoriesEnum;
+import org.openecomp.sdc.ci.tests.utils.general.ElementFactory;
+import org.openecomp.sdc.ci.tests.utils.rest.ResponseParser;
+import org.openecomp.sdc.common.datastructure.FunctionalInterfaces;
+
+public final class ServiceUIUtils {
+
+ public static final String SERVICE_NAME_PREFIX = "ServiceCDTest-";
+ public static final String INITIAL_VERSION = "0.1";
+ public static final String ICON_SERVICE_NAME = "mobility";
+
+ private ServiceUIUtils() {
+ throw new UnsupportedOperationException();
+ }
+
+ public static String defineServiceName(String serviceName) {
+ WebElement serviceNameElement = GeneralUIUtils.getWebElementWaitForVisible(GeneralSection.NAME.getValue());
+ serviceNameElement.clear();
+ serviceNameElement.sendKeys(serviceName);
+ return serviceName;
+ }
+
+ public static void defineTagsList(ServiceReqDetails service, String[] serviceTags) {
+ List<String> taglist = new ArrayList<String>();
+ ;
+ WebElement serviceTagsTextbox = GeneralUIUtils.getWebElementWaitForVisible("i-sdc-tag-input");
+ for (String tag : serviceTags) {
+ serviceTagsTextbox.clear();
+ serviceTagsTextbox.sendKeys(tag);
+ serviceTagsTextbox.sendKeys(Keys.ENTER);
+ taglist.add(tag);
+ }
+ taglist.add(0, service.getName());
+ service.setTags(taglist);
+ }
+
+ public static Select defineServiceCategory(String category) {
+
+ return GeneralUIUtils.getSelectList(category, "selectGeneralCategory");
+ }
+
+ private static void defineServiceProjectCode(String projectCode) {
+ WebElement projectCodeTextbox = GeneralUIUtils.getWebElementWaitForVisible("projectCode");
+ projectCodeTextbox.clear();
+ projectCodeTextbox.sendKeys(projectCode);
+ }
+
+ private static void fillServiceGeneralPage(ServiceReqDetails service, User user) {
+ service.setContactId(user.getUserId());
+ service.setCreatorUserId(user.getUserId());
+ service.setCreatorFullName(user.getFullName());
+ defineServiceName(service.getName());
+ defineServiceCategory(service.getCategories().get(0).getName());
+ GeneralUIUtils.defineDescription(service.getDescription());
+ defineTagsList(service,
+ new String[] { service.getName(), "This-is-tag", "another-tag", "Test-automation-tag" });
+ GeneralUIUtils.defineUserId(service.getCreatorUserId());
+ defineServiceProjectCode(service.getProjectCode());
+
+ }
+
+ public static ServiceReqDetails createServiceInUI(User user) {
+
+ ServiceReqDetails defineServiceetails = defineServiceDetails(user);
+ GeneralUIUtils.clickAddComponent(DataTestIdEnum.Dashboard.BUTTON_ADD_SERVICE);
+
+ GeneralUIUtils.waitForLoader();
+ fillServiceGeneralPage(defineServiceetails, user);
+
+ GeneralUIUtils.clickCreateButton();
+
+ return defineServiceetails;
+
+ }
+
+ public static ServiceReqDetails defineServiceDetails(User user) {
+ ServiceReqDetails service = new ServiceReqDetails();
+ service = ElementFactory.getDefaultService(ServiceCategoriesEnum.MOBILITY, user);
+ service.setVersion(INITIAL_VERSION);
+ service.setIcon(ICON_SERVICE_NAME);
+ service.setName(getRandomComponentName(SERVICE_NAME_PREFIX));
+
+ return service;
+ }
+
+ protected static String getRandomComponentName(String prefix) {
+ return prefix + new Random().nextInt(10000);
+ }
+
+ /**
+ * Waits Until service changed to requested lifeCycle State
+ *
+ * @param createServiceInUI
+ * @param requestedLifeCycleState
+ * @param user
+ * @return
+ */
+ public static Service waitForState(ServiceReqDetails createServiceInUI, LifecycleStateEnum requestedLifeCycleState,
+ User user) {
+ Supplier<Service> serviceGetter = () -> {
+ String resourceString = RestCDUtils.getService(createServiceInUI, user).getResponse();
+ return ResponseParser.convertServiceResponseToJavaObject(resourceString);
+ };
+ Function<Service, Boolean> verifier = res -> res.getLifecycleState() == requestedLifeCycleState;
+ return FunctionalInterfaces.retryMethodOnResult(serviceGetter, verifier);
+
+ }
+
+ /**
+ * This Method Approves service for distribution<br>
+ * It assumes governor role is already logged in
+ *
+ * @param createServiceInUI
+ */
+ public static void approveServiceForDistribution(ServiceReqDetails createServiceInUI) {
+ GeneralUIUtils.waitForLoader();
+ GeneralUIUtils.getWebElementWaitForVisible(createServiceInUI.getName()).click();
+ GeneralUIUtils.waitForLoader();
+ GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.LifeCyleChangeButtons.APPROVE.getValue()).click();
+ GeneralUIUtils.waitForLoader();
+ GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.ModalItems.ACCEP_TESTING_MESSAGE.getValue())
+ .sendKeys("Service " + createServiceInUI.getName() + " Approved For Distribution");
+ GeneralUIUtils.waitForLoader();
+ GeneralUIUtils.getWebElementWaitForVisible(DataTestIdEnum.ModalItems.OK.getValue()).click();
+ GeneralUIUtils.waitForLoader();
+ GeneralUIUtils.waitForElementToDisappear(DataTestIdEnum.ModalItems.OK.getValue());
+ }
+
+}
diff --git a/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/verificator/ServiceVerificator.java b/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/verificator/ServiceVerificator.java
new file mode 100644
index 0000000..0306df0
--- /dev/null
+++ b/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/verificator/ServiceVerificator.java
@@ -0,0 +1,55 @@
+package org.openecomp.sdc.uici.tests.verificator;
+
+import static org.testng.AssertJUnit.assertTrue;
+
+import java.util.function.Function;
+import java.util.function.Supplier;
+
+import org.apache.http.HttpStatus;
+import org.json.simple.JSONArray;
+import org.json.simple.JSONObject;
+import org.json.simple.JSONValue;
+import org.openecomp.sdc.uici.tests.utilities.RestCDUtils;
+
+import org.openecomp.sdc.be.model.User;
+import org.openecomp.sdc.ci.tests.datatypes.ServiceReqDetails;
+import org.openecomp.sdc.ci.tests.datatypes.http.RestResponse;
+import org.openecomp.sdc.ci.tests.utils.rest.ServiceRestUtils;
+import org.openecomp.sdc.common.datastructure.FunctionalInterfaces;
+
+public class ServiceVerificator {
+ public static void verifyNumOfComponentInstances(ServiceReqDetails createServiceInUI, int numOfVFC, User user) {
+ String responseAfterDrag = RestCDUtils.getService(createServiceInUI, user).getResponse();
+ JSONObject jsonResource = (JSONObject) JSONValue.parse(responseAfterDrag);
+ int size = ((JSONArray) jsonResource.get("componentInstances")).size();
+ assertTrue(size == numOfVFC);
+ }
+
+ public static void verifyLinkCreated(ServiceReqDetails createServiceInUI, User user) {
+ String responseAfterDrag = RestCDUtils.getService(createServiceInUI, user).getResponse();
+ JSONObject jsonService = (JSONObject) JSONValue.parse(responseAfterDrag);
+ assertTrue(((JSONArray) jsonService.get("componentInstancesRelations")).size() == 1);
+
+ }
+
+ public static void verifyServiceCreated(ServiceReqDetails createServiceInUI, User user) {
+ assertTrue(RestCDUtils.getService(createServiceInUI, user).getErrorCode() == HttpStatus.SC_OK);
+
+ }
+
+ /**
+ * Verifies service is certified with version 1.0
+ *
+ * @param createServiceInUI
+ * @param user
+ */
+ public static void verifyServiceCertified(ServiceReqDetails createServiceInUI, User user) {
+ Supplier<RestResponse> serviceGetter = () -> FunctionalInterfaces.swallowException(
+ () -> ServiceRestUtils.getServiceByNameAndVersion(user, createServiceInUI.getName(), "1.0"));
+ Function<RestResponse, Boolean> serviceVerificator = restResp -> restResp.getErrorCode() == HttpStatus.SC_OK;
+ RestResponse certifiedResourceResopnse = FunctionalInterfaces.retryMethodOnResult(serviceGetter,
+ serviceVerificator);
+ assertTrue(certifiedResourceResopnse.getErrorCode() == HttpStatus.SC_OK);
+
+ }
+}
diff --git a/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/verificator/VerificatorUtil.java b/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/verificator/VerificatorUtil.java
new file mode 100644
index 0000000..9e983b4
--- /dev/null
+++ b/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/verificator/VerificatorUtil.java
@@ -0,0 +1,27 @@
+package org.openecomp.sdc.uici.tests.verificator;
+
+import static org.testng.AssertJUnit.assertTrue;
+
+import java.util.function.Function;
+import java.util.function.Supplier;
+
+import org.openecomp.sdc.common.datastructure.FunctionalInterfaces;
+
+/**
+ * Util Class For Verificators
+ *
+ * @author mshitrit
+ *
+ */
+public final class VerificatorUtil {
+
+ private VerificatorUtil() {
+ throw new IllegalAccessError();
+ }
+
+ public static void verifyWithRetry(Supplier<Boolean> verificator) {
+ Function<Boolean, Boolean> retryVerificationLogic = isVerified -> isVerified;
+ Boolean isVerifiedAfterRetries = FunctionalInterfaces.retryMethodOnResult(verificator, retryVerificationLogic);
+ assertTrue(isVerifiedAfterRetries);
+ }
+}
diff --git a/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/verificator/VfVerificator.java b/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/verificator/VfVerificator.java
new file mode 100644
index 0000000..a1c7ca0
--- /dev/null
+++ b/ui-ci-dev/src/main/java/org/openecomp/sdc/uici/tests/verificator/VfVerificator.java
@@ -0,0 +1,143 @@
+package org.openecomp.sdc.uici.tests.verificator;
+
+import static org.testng.AssertJUnit.assertTrue;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.function.Function;
+import java.util.function.Supplier;
+import java.util.stream.Collectors;
+
+import org.apache.commons.lang3.tuple.ImmutablePair;
+import org.apache.http.HttpStatus;
+import org.json.simple.JSONArray;
+import org.json.simple.JSONObject;
+import org.json.simple.JSONValue;
+import org.openecomp.sdc.uici.tests.utilities.ResourceUIUtils;
+import org.openecomp.sdc.uici.tests.utilities.RestCDUtils;
+
+import org.openecomp.sdc.be.model.LifecycleStateEnum;
+import org.openecomp.sdc.be.model.Resource;
+import org.openecomp.sdc.be.model.User;
+import org.openecomp.sdc.ci.tests.datatypes.ResourceReqDetails;
+import org.openecomp.sdc.ci.tests.datatypes.enums.UserRoleEnum;
+import org.openecomp.sdc.ci.tests.datatypes.http.RestResponse;
+import org.openecomp.sdc.ci.tests.utils.rest.ResponseParser;
+import org.openecomp.sdc.common.api.ArtifactTypeEnum;
+import org.openecomp.sdc.common.datastructure.FunctionalInterfaces;
+
+/**
+ * Class to hold Test Verifications relevant for VF
+ *
+ * @author mshitrit
+ *
+ */
+public final class VfVerificator {
+ private VfVerificator() {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * Verifies that the resource contains a certain number of component
+ * instances
+ *
+ * @param createResourceInUI
+ * @param numOfVFC
+ */
+ public static void verifyNumOfComponentInstances(ResourceReqDetails createResourceInUI, int numOfVFC) {
+ Supplier<Boolean> verificator = () -> {
+ String responseAfterDrag = RestCDUtils.getResource(createResourceInUI).getResponse();
+ JSONObject jsonResource = (JSONObject) JSONValue.parse(responseAfterDrag);
+ int size = ((JSONArray) jsonResource.get("componentInstances")).size();
+ return size == numOfVFC;
+ };
+ VerificatorUtil.verifyWithRetry(verificator);
+ }
+
+ /**
+ * Verifies That the createResourceInUI is different that prevRIPos.
+ *
+ * @param createResourceInUI
+ * @param prevRIPos
+ * @param user
+ */
+ public static void verifyRILocationChanged(ResourceReqDetails createResourceInUI,
+ ImmutablePair<String, String> prevRIPos, User user) {
+ Supplier<Boolean> verificator = () -> {
+ ImmutablePair<String, String> currRIPos = ResourceUIUtils.getRIPosition(createResourceInUI, user);
+ final boolean isXLocationChanged = !prevRIPos.left.equals(currRIPos.left);
+ final boolean isYLocationChange = !prevRIPos.right.equals(currRIPos.right);
+ return isXLocationChanged || isYLocationChange;
+ };
+ VerificatorUtil.verifyWithRetry(verificator);
+ }
+
+ /**
+ * Verifies That resource contains two connected instances
+ *
+ * @param createResourceInUI
+ */
+ public static void verifyLinkCreated(ResourceReqDetails createResourceInUI) {
+ Supplier<Boolean> verificator = () -> {
+ String responseAfterDrag = RestCDUtils.getResource(createResourceInUI).getResponse();
+ JSONObject jsonResource = (JSONObject) JSONValue.parse(responseAfterDrag);
+ return ((JSONArray) jsonResource.get("componentInstancesRelations")).size() == 1;
+ };
+ VerificatorUtil.verifyWithRetry(verificator);
+
+ }
+
+ /**
+ * Verifies That the VF is certified to version 1.0
+ *
+ * @param vfToVerify
+ */
+ public static void verifyResourceIsCertified(ResourceReqDetails vfToVerify) {
+ RestResponse certifiedResourceResopnse = RestCDUtils
+ .getResourceByNameAndVersionRetryOnFail(UserRoleEnum.ADMIN.getUserId(), vfToVerify.getName(), "1.0");
+ assertTrue(certifiedResourceResopnse.getErrorCode().equals(HttpStatus.SC_OK));
+
+ }
+
+ /**
+ * Verifies That the VF exist
+ *
+ * @param vfToVerify
+ */
+ public static void verifyResourceIsCreated(ResourceReqDetails vfToVerify) {
+ assertTrue(RestCDUtils.getResource(vfToVerify).getErrorCode() == HttpStatus.SC_OK);
+ }
+
+ /**
+ * Verify the resource contains the deployment artifacts in the list
+ *
+ * @param vfToVerify
+ * @param artifactTypeEnums
+ */
+ public static void verifyResourceContainsDeploymentArtifacts(ResourceReqDetails vfToVerify,
+ List<ArtifactTypeEnum> artifactTypeEnums) {
+ String resourceString = RestCDUtils.getResource(vfToVerify).getResponse();
+ Resource resource = ResponseParser.convertResourceResponseToJavaObject(resourceString);
+ List<String> foundArtifacts = new ArrayList<>();
+ if (resource.getDeploymentArtifacts() != null) {
+ foundArtifacts = resource.getDeploymentArtifacts().values().stream()
+ .map(artifact -> artifact.getArtifactType()).collect(Collectors.toList());
+ }
+ List<String> excpectedArtifacts = artifactTypeEnums.stream().map(e -> e.getType()).collect(Collectors.toList());
+ assertTrue(foundArtifacts.containsAll(excpectedArtifacts));
+
+ }
+
+ /**
+ * Verifies The life cycle State of the resource
+ *
+ * @param createResourceInUI
+ * @param requestedLifeCycleState
+ */
+ public static void verifyState(ResourceReqDetails createResourceInUI, LifecycleStateEnum requestedLifeCycleState) {
+ Resource resource = ResourceUIUtils.waitForState(createResourceInUI, requestedLifeCycleState);
+ assertTrue(resource.getLifecycleState() == requestedLifeCycleState);
+
+ }
+
+}
diff --git a/ui-ci-dev/src/main/resources/Files/CP.yml b/ui-ci-dev/src/main/resources/Files/CP.yml
new file mode 100644
index 0000000..48b5922
--- /dev/null
+++ b/ui-ci-dev/src/main/resources/Files/CP.yml
@@ -0,0 +1,65 @@
+tosca_definitions_version: tosca_simple_yaml_1_0_0
+
+node_types:
+ org.openecomp.resource.cp.CP:
+ derived_from: tosca.nodes.Root
+ properties:
+ att-ucpe-part-number:
+ type: string
+ vendor-name:
+ type: string
+ required: true
+ vendor-model:
+ type: string
+ required: true
+ total-vcpu:
+ type: integer
+ description: number of vCPUs
+ total-memory:
+ type: integer
+ description: GB
+ total-disk:
+ type: integer
+ description: GB
+ base-system-image-file-name:
+ type: string
+ linux-host-vendor:
+ type: string
+ linux-host-os-version:
+ type: version
+ base-system-software:
+ type: string
+ jdm-vcpu:
+ type: integer
+ jdm-memory:
+ type: integer
+ description: GB
+ jdm-disk:
+ type: integer
+ description: GB
+ jdm-version:
+ type: string
+ jcp-vcpu:
+ type: integer
+ jcp-memory:
+ type: integer
+ description: GB
+ jcp-disk:
+ type: integer
+ description: GB
+ jcp-version:
+ type: version
+ capabilities:
+ vnf_hosting:
+ type: tosca.capabilities.Container
+ description: Provides hosting capability for VNFs
+ WAN_connectivity:
+ type: tosca.capabilities.network.Bindable
+ valid_source_types: [org.openecomp.cp.Wan]
+ description: external WAN1 n/w interface
+ occurrences: [1,2]
+ LAN_connectivity:
+ type: tosca.capabilities.network.Bindable
+ valid_source_types: [org.openecomp.cp.Lan]
+ description: external LAN n/w interface
+ occurrences: [1,8]
\ No newline at end of file
diff --git a/ui-ci-dev/src/main/resources/Files/CP_LAN - Copy.yml b/ui-ci-dev/src/main/resources/Files/CP_LAN - Copy.yml
new file mode 100644
index 0000000..224d61f2c
--- /dev/null
+++ b/ui-ci-dev/src/main/resources/Files/CP_LAN - Copy.yml
@@ -0,0 +1,13 @@
+tosca_definitions_version: tosca_simple_yaml_1_0_0
+
+node_types:
+ org.openecomp.resource.vfc.uCPE:
+ derived_from: tosca.nodes.Root
+ properties:
+ type:
+ type: string
+ required: false
+ requirements:
+ - virtualLink:
+ capability: tosca.capabilities.network.Linkable
+ relationship: tosca.relationships.network.LinksTo
diff --git a/ui-ci-dev/src/main/resources/Files/CP_LAN.yml b/ui-ci-dev/src/main/resources/Files/CP_LAN.yml
new file mode 100644
index 0000000..a96084b
--- /dev/null
+++ b/ui-ci-dev/src/main/resources/Files/CP_LAN.yml
@@ -0,0 +1,19 @@
+tosca_definitions_version: tosca_simple_yaml_1_0_0
+
+node_types:
+ org.openecomp.resource.cp.LAN:
+ derived_from: org.openecomp.resource.cp.CP
+ properties:
+ type:
+ type: string
+ required: false
+ requirements:
+ - virtualLink_in:
+ capability: tosca.capabilities.network.Linkable
+ relationship: tosca.relationships.network.LinksTo
+ - virtualLink_out:
+ capability: tosca.capabilities.network.Linkable
+ relationship: tosca.relationships.network.LinksTo
+ - virtualbinding:
+ capability: tosca.capabilities.network.Bindable
+ relationship: tosca.relationships.network.BindsTo
\ No newline at end of file
diff --git a/ui-ci-dev/src/main/resources/Files/CP_WAN.yml b/ui-ci-dev/src/main/resources/Files/CP_WAN.yml
new file mode 100644
index 0000000..1bce457
--- /dev/null
+++ b/ui-ci-dev/src/main/resources/Files/CP_WAN.yml
@@ -0,0 +1,19 @@
+tosca_definitions_version: tosca_simple_yaml_1_0_0
+
+node_types:
+ org.openecomp.resource.cp.WAN:
+ derived_from: org.openecomp.resource.cp.CP
+ properties:
+ type:
+ type: string
+ required: false
+ requirements:
+ - virtualLink_in:
+ capability: tosca.capabilities.network.Linkable
+ relationship: tosca.relationships.network.LinksTo
+ - virtualLink_out:
+ capability: tosca.capabilities.network.Linkable
+ relationship: tosca.relationships.network.LinksTo
+ - virtualbinding:
+ capability: tosca.capabilities.network.Bindable
+ relationship: tosca.relationships.network.BindsTo
\ No newline at end of file
diff --git a/ui-ci-dev/src/main/resources/Files/Heat-File 1.yaml b/ui-ci-dev/src/main/resources/Files/Heat-File 1.yaml
new file mode 100644
index 0000000..d332078
--- /dev/null
+++ b/ui-ci-dev/src/main/resources/Files/Heat-File 1.yaml
@@ -0,0 +1,791 @@
+heat_template_version: 2013-05-23
+#################################
+#
+# Changes in v0.2:
+# - Unique availability zone for each VM
+# - LAN8 and SLAN networks removed according to latest Prod/Type I diagram
+# - 2 DB VMs added
+# - Images corrected
+# - VM start-up order: SMP->DB->BE->FE (no error handling yet)
+# - Provisioning scripts placeholders
+#
+#################################
+
+description: ASC Template
+
+parameters:
+# availability_zone_smp0:
+# type: string
+# default: nova
+# availability_zone_smp1:
+# type: string
+# default: nova
+# availability_zone_fe0:
+# type: string
+# default: nova
+# availability_zone_fe1:
+# type: string
+# default: nova
+# availability_zone_db0:
+# type: string
+# default: nova
+# availability_zone_db1:
+# type: string
+# default: nova
+# availability_zone_be0:
+# type: string
+# default: nova
+# availability_zone_be1:
+# type: string
+# default: nova
+# availability_zone_be2:
+# type: string
+# default: nova
+# availability_zone_be3:
+# type: string
+# default: nova
+# availability_zone_be4:
+# type: string
+# default: nova
+
+ vnf_name:
+ type: string
+ description: Unique name for this VNF instance
+ default: This_is_the_SCP_name
+ vnf_id:
+ type: string
+ description: Unique ID for this VNF instance
+ default: This_is_ths_SCP_id
+
+ flavor_scp_be_id:
+ type: string
+ description: flavor type
+ default: a1.Small
+ flavor_scp_fe_id:
+ type: string
+ description: flavor type
+ default: a1.Small
+ flavor_smp_id:
+ type: string
+ description: flavor type
+ default: a1.Small
+ flavor_db_id:
+ type: string
+ description: flavor type
+ default: a1.Small
+ image_scp_be_id:
+ type: string
+ description: Image use to boot a server
+ default: asc_base_image_be
+ image_scp_fe_id:
+ type: string
+ description: Image use to boot a server
+ default: asc_base_image_fe
+ image_smp_id:
+ type: string
+ description: Image use to boot a server
+ default: asc_base_image_smp
+ image_db_id:
+ type: string
+ description: Image use to boot a server
+ default: asc_base_image_db
+
+ int_vscp_fe_cluster_net_id:
+ type: string
+ description: LAN2 FE Cluster/KA
+ int_vscp_fe_cluster_cidr:
+ type: string
+ description: Private Network2 Address (CIDR notation)
+ int_vscp_cluster_net_id:
+ type: string
+ description: LAN3 Cluster
+ int_vscp_cluster_cidr:
+ type: string
+ description: Private Network3 Address (CIDR notation)
+ int_vscp_db_network_net_id:
+ type: string
+ description: LAN4 DB
+ int_vscp_db_network_cidr:
+ type: string
+ description: Private Network4 Address (CIDR notation)
+ SIGNET_vrf_A1_direct_net_id:
+ type: string
+ description: Network name for SIGTRAN_A
+ SIGNET_vrf_B1_direct_net_id:
+ type: string
+ description: Network name for SIGTRAN_B
+ Cricket_OCS_protected_net_id:
+ type: string
+ description: Network name for CRICKET_OCS
+ OAM_direct_net_id:
+ type: string
+ description: Network name for OAM
+ be0_Cricket_OCS_protected_ips:
+ type: string
+ label: be0 port 5 OAM ip address
+ description: be0 port 5 OAM ip address
+ be1_Cricket_OCS_protected_ips:
+ type: string
+ label: be1 port 5 OAM ip address
+ description: be1 port 5 OAM ip address
+ be2_Cricket_OCS_protected_ips:
+ type: string
+ label: be2 port 5 OAM ip address
+ description: be2 port 5 OAM ip address
+ be3_Cricket_OCS_protected_ips:
+ type: string
+ label: be3 port 5 OAM ip address
+ description: be3 port 5 OAM ip address
+ be4_Cricket_OCS_protected_ips:
+ type: string
+ label: be4 port 5 OAM ip address
+ description: be4 port 5 OAM ip address
+ be0_OAM_direct_ips:
+ type: string
+ label: be0 port 7 OAM ip address
+ description: be0 port 7 OAM ip address
+ be1_OAM_direct_ips:
+ type: string
+ label: be1 port 7 OAM ip address
+ description: be1 port 7 OAM ip address
+ be2_OAM_direct_ips:
+ type: string
+ label: be2 port 7 OAM ip address
+ description: be2 port 7 OAM ip address
+ be3_OAM_direct_ips:
+ type: string
+ label: be3 port 7 OAM ip address
+ description: be3 port 7 OAM ip address
+ be4_OAM_direct_ips:
+ type: string
+ label: be4 port 7 OAM ip address
+ description: be4 port 7 OAM ip address
+ fe0_SIGNET_vrf_A1_direct_ips:
+ type: string
+ label: fe0 port 0 SIGTRAN ip address
+ description: fe0 port 0 SIGTRAN ip address
+ fe0_OAM_direct_ips:
+ type: string
+ label: fe0 port 7 OAM ip address
+ description: fe0 port 7 OAM ip address
+ fe1_SIGNET_vrf_B1_direct_ips:
+ type: string
+ label: fe1 port 1 SIGTRAN ip address
+ description: fe1 port 1 SIGTRAN ip address
+ fe1_OAM_direct_ips:
+ type: string
+ label: fe1 port 7 OAM ip address
+ description: fe1 port 7 OAM ip address
+ smp0_OAM_direct_ips:
+ type: string
+ label: smp0 port 7 OAM ip address
+ description: smp0 port 7 OAM ip address
+ smp1_OAM_direct_ips:
+ type: string
+ label: smp1 port 7 OAM ip address
+ description: smp1 port 7 OAM ip address
+ db0_OAM_direct_ips:
+ type: string
+ label: db0 port 7 OAM ip address
+ description: smp0 port 7 OAM ip address
+ db1_OAM_direct_ips:
+ type: string
+ label: smp1 port 7 OAM ip address
+ description: db1 port 7 OAM ip address
+ vm_scp_be0_name:
+ type: string
+ default: vSCP_BE0
+ description: name of VM
+ vm_scp_be1_name:
+ type: string
+ default: vSCP_BE1
+ description: name of VM
+ vm_scp_be2_name:
+ type: string
+ default: vSCP_BE2
+ description: name of VM
+ vm_scp_be3_name:
+ type: string
+ default: vSCP_BE3
+ description: name of VM
+ vm_scp_be4_name:
+ type: string
+ default: vSCP_BE4
+ description: name of VM
+ vm_scp_fe0_name:
+ type: string
+ default: vSCP_FE0
+ description: name of VM
+ vm_scp_fe1_name:
+ type: string
+ default: vSCP_FE1
+ description: name of VM
+ vm_smp0_name:
+ type: string
+ default: vSMP0
+ description: name of VM
+ vm_smp1_name:
+ type: string
+ default: vSMP1
+ description: name of VM
+ vm_db0_name:
+ type: string
+ default: vDB0
+ description: name of VM
+ vm_db1_name:
+ type: string
+ default: vDB1
+ description: name of VM
+
+resources:
+# scp_be_wait_condition:
+# type: OS::Heat::WaitCondition
+# properties:
+# handle: { get_resource: scp_be_wait_handle }
+# count: 5
+# timeout: 300
+# scp_be_wait_handle:
+# type: OS::Heat::WaitConditionHandle
+#
+# scp_fe_wait_condition:
+# type: OS::Heat::WaitCondition
+# properties:
+# handle: { get_resource: scp_fe_wait_handle }
+# count: 2
+# timeout: 300
+# scp_fe_wait_handle:
+# type: OS::Heat::WaitConditionHandle
+#
+# smp_wait_condition:
+# type: OS::Heat::WaitCondition
+# properties:
+# handle: { get_resource: smp_wait_handle }
+# count: 2
+# timeout: 300
+# smp_wait_handle:
+# type: OS::Heat::WaitConditionHandle
+#
+# db_wait_condition:
+# type: OS::Heat::WaitCondition
+# properties:
+# handle: { get_resource: db_wait_handle }
+# count: 2
+# timeout: 300
+# db_wait_handle:
+# type: OS::Heat::WaitConditionHandle
+
+ FE_Affinity:
+ type: OS::Nova::ServerGroup
+ properties:
+ policies: ["anti-affinity"]
+ BE_Affinity:
+ type: OS::Nova::ServerGroup
+ properties:
+ policies: ["anti-affinity"]
+ SMP_Affinity:
+ type: OS::Nova::ServerGroup
+ properties:
+ policies: ["anti-affinity"]
+ DB_Affinity:
+ type: OS::Nova::ServerGroup
+ properties:
+ policies: ["anti-affinity"]
+
+ FE_Clustering_KA:
+ type: OS::Contrail::VirtualNetwork
+ properties:
+ name: { get_param: int_vscp_fe_cluster_net_id }
+
+ FE_Clustering_subnet:
+ type: OS::Neutron::Subnet
+ properties:
+ network_id: { get_resource: FE_Clustering_KA }
+ cidr: { get_param: int_vscp_fe_cluster_cidr }
+
+ Clustering_Network:
+ type: OS::Contrail::VirtualNetwork
+ properties:
+ name: { get_param: int_vscp_cluster_net_id }
+
+ Clustering_Network_subnet:
+ type: OS::Neutron::Subnet
+ properties:
+ network_id: { get_resource: Clustering_Network }
+ cidr: { get_param: int_vscp_cluster_cidr }
+
+ DB_Network:
+ type: OS::Contrail::VirtualNetwork
+ properties:
+ name: { get_param: int_vscp_db_network_net_id }
+
+ DB_Network_subnet:
+ type: OS::Neutron::Subnet
+ properties:
+ network_id: { get_resource: DB_Network }
+ cidr: { get_param: int_vscp_db_network_cidr }
+
+ server_scp_be0:
+ type: OS::Nova::Server
+# depends on: db_wait_condition
+ properties:
+ name: { get_param: vm_scp_be0_name }
+ image: { get_param: image_scp_be_id }
+# availability_zone: { get_param: availability_zone_be0 }
+ flavor: { get_param: flavor_scp_be_id }
+ scheduler_hints: { group: { get_resource: BE_Affinity } }
+ networks:
+ - port: { get_resource: be0_port_3 }
+ - port: { get_resource: be0_port_4 }
+ - port: { get_resource: be0_port_5 }
+ - port: { get_resource: be0_port_7 }
+ metadata:
+ vnf_id: { get_param: vnf_id }
+ user_data:
+ str_replace:
+ template: |
+ #!/bin/bash
+ #todo: provision $vm_name
+ wc_notify --data-binary '{"status": "SUCCESS"}'
+ params:
+ $vm_name: {get_param: vm_scp_be0_name}
+# wc_notify: { get_attr: ['scp_be_wait_handle', 'curl_cli'] }
+ be0_port_2:
+ type: OS::Neutron::Port
+ properties:
+ network_id: { get_resource: Clustering_Network }
+
+ be0_port_3:
+ type: OS::Neutron::Port
+ properties:
+ network_id: { get_resource: Clustering_Network }
+
+ be0_port_4:
+ type: OS::Neutron::Port
+ properties:
+ network_id: { get_resource: DB_Network }
+
+ be0_port_5:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: Cricket_OCS_protected_net_id }
+ fixed_ips: [{"ip_address": {get_param: be0_Cricket_OCS_protected_ips}}]
+
+ be0_port_7:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: OAM_direct_net_id }
+ fixed_ips: [{"ip_address": {get_param: be0_OAM_direct_ips}}]
+
+ server_scp_be1:
+ type: OS::Nova::Server
+# depends on: db_wait_condition
+ properties:
+ name: { get_param: vm_scp_be1_name }
+ image: { get_param: image_scp_be_id }
+# availability_zone: { get_param: availability_zone_be1 }
+ flavor: { get_param: flavor_scp_be_id }
+ scheduler_hints: { group: { get_resource: BE_Affinity } }
+ networks:
+ - port: { get_resource: be1_port_3 }
+ - port: { get_resource: be1_port_4 }
+ - port: { get_resource: be1_port_5 }
+ - port: { get_resource: be1_port_7 }
+ metadata:
+ vnf_id: { get_param: vnf_id }
+ user_data:
+ str_replace:
+ template: |
+ #!/bin/bash
+ #todo: provision $vm_name
+ wc_notify --data-binary '{"status": "SUCCESS"}'
+ params:
+ $vm_name: {get_param: vm_scp_be1_name}
+# wc_notify: { get_attr: ['scp_be_wait_handle', 'curl_cli'] }
+
+ be1_port_3:
+ type: OS::Neutron::Port
+ properties:
+ network_id: { get_resource: Clustering_Network }
+
+ be1_port_4:
+ type: OS::Neutron::Port
+ properties:
+ network_id: { get_resource: DB_Network }
+
+ be1_port_5:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: Cricket_OCS_protected_net_id }
+ fixed_ips: [{"ip_address": {get_param: be1_Cricket_OCS_protected_ips}}]
+
+ be1_port_7:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: OAM_direct_net_id }
+ fixed_ips: [{"ip_address": {get_param: be1_OAM_direct_ips}}]
+
+ server_scp_be2:
+ type: OS::Nova::Server
+# depends on: db_wait_condition
+ properties:
+ name: { get_param: vm_scp_be2_name }
+ image: { get_param: image_scp_be_id }
+# availability_zone: { get_param: availability_zone_be2 }
+ flavor: { get_param: flavor_scp_be_id }
+ scheduler_hints: { group: { get_resource: BE_Affinity } }
+ networks:
+ - port: { get_resource: be2_port_3 }
+ - port: { get_resource: be2_port_4 }
+ - port: { get_resource: be2_port_5 }
+ - port: { get_resource: be2_port_7 }
+ metadata:
+ vnf_id: { get_param: vnf_id }
+ user_data:
+ str_replace:
+ template: |
+ #!/bin/bash
+ #todo: provision $vm_name
+ wc_notify --data-binary '{"status": "SUCCESS"}'
+ params:
+ $vm_name: {get_param: vm_scp_be2_name}
+# wc_notify: { get_attr: ['scp_be_wait_handle', 'curl_cli'] }
+
+ be2_port_3:
+ type: OS::Neutron::Port
+ properties:
+ network_id: { get_resource: Clustering_Network }
+
+ be2_port_4:
+ type: OS::Neutron::Port
+ properties:
+ network_id: { get_resource: DB_Network }
+
+ be2_port_5:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: Cricket_OCS_protected_net_id }
+ fixed_ips: [{"ip_address": {get_param: be2_Cricket_OCS_protected_ips}}]
+
+ be2_port_7:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: OAM_direct_net_id }
+ fixed_ips: [{"ip_address": {get_param: be2_OAM_direct_ips}}]
+
+ server_scp_be3:
+ type: OS::Nova::Server
+# depends on: db_wait_condition
+ properties:
+ name: { get_param: vm_scp_be3_name }
+ image: { get_param: image_scp_be_id }
+# availability_zone: { get_param: availability_zone_be3 }
+ flavor: { get_param: flavor_scp_be_id }
+ scheduler_hints: { group: { get_resource: BE_Affinity } }
+ networks:
+ - port: { get_resource: be3_port_3 }
+ - port: { get_resource: be3_port_4 }
+ - port: { get_resource: be3_port_5 }
+ - port: { get_resource: be3_port_7 }
+ metadata:
+ vnf_id: { get_param: vnf_id }
+ user_data:
+ str_replace:
+ template: |
+ #!/bin/bash
+ #todo: provision $vm_name
+ wc_notify --data-binary '{"status": "SUCCESS"}'
+ params:
+ $vm_name: {get_param: vm_scp_be3_name}
+# wc_notify: { get_attr: ['scp_be_wait_handle', 'curl_cli'] }
+
+ be3_port_3:
+ type: OS::Neutron::Port
+ properties:
+ network_id: { get_resource: Clustering_Network }
+
+ be3_port_4:
+ type: OS::Neutron::Port
+ properties:
+ network_id: { get_resource: DB_Network }
+
+ be3_port_5:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: Cricket_OCS_protected_net_id }
+ fixed_ips: [{"ip_address": {get_param: be3_Cricket_OCS_protected_ips}}]
+
+ be3_port_7:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: OAM_direct_net_id }
+ fixed_ips: [{"ip_address": {get_param: be3_OAM_direct_ips}}]
+
+ server_scp_be4:
+ type: OS::Nova::Server
+# depends on: db_wait_condition
+ properties:
+ name: { get_param: vm_scp_be4_name }
+ image: { get_param: image_scp_be_id }
+# availability_zone: { get_param: availability_zone_be4 }
+ flavor: { get_param: flavor_scp_be_id }
+ scheduler_hints: { group: { get_resource: BE_Affinity } }
+ networks:
+ - port: { get_resource: be4_port_3 }
+ - port: { get_resource: be4_port_4 }
+ - port: { get_resource: be4_port_5 }
+ - port: { get_resource: be4_port_7 }
+ metadata:
+ vnf_id: { get_param: vnf_id }
+ user_data:
+ str_replace:
+ template: |
+ #!/bin/bash
+ #todo: provision $vm_name
+ wc_notify --data-binary '{"status": "SUCCESS"}'
+ params:
+ $vm_name: {get_param: vm_scp_be4_name}
+# wc_notify: { get_attr: ['scp_be_wait_handle', 'curl_cli'] }
+
+ be4_port_3:
+ type: OS::Neutron::Port
+ properties:
+ network_id: { get_resource: Clustering_Network }
+
+ be4_port_4:
+ type: OS::Neutron::Port
+ properties:
+ network_id: { get_resource: DB_Network }
+
+ be4_port_5:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: Cricket_OCS_protected_net_id }
+ fixed_ips: [{"ip_address": {get_param: be4_Cricket_OCS_protected_ips}}]
+
+ be4_port_7:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: OAM_direct_net_id }
+ fixed_ips: [{"ip_address": {get_param: be4_OAM_direct_ips}}]
+
+ server_scp_fe0:
+ type: OS::Nova::Server
+# depends on: scp_be_wait_condition
+ properties:
+ name: { get_param: vm_scp_fe0_name }
+ image: { get_param: image_scp_fe_id }
+# availability_zone: { get_param: availability_zone_fe0 }
+ flavor: { get_param: flavor_scp_fe_id }
+ scheduler_hints: { group: { get_resource: FE_Affinity } }
+ networks:
+ - port: { get_resource: fe0_port_0 }
+ - port: { get_resource: fe0_port_2 }
+ - port: { get_resource: fe0_port_3 }
+ - port: { get_resource: fe0_port_7 }
+ metadata:
+ vnf_id: { get_param: vnf_id }
+ user_data:
+ str_replace:
+ template: |
+ #!/bin/bash
+ #todo: provision $vm_name
+ wc_notify --data-binary '{"status": "SUCCESS"}'
+ params:
+ $vm_name: {get_param: vm_scp_fe0_name}
+# wc_notify: { get_attr: ['scp_fe_wait_handle', 'curl_cli'] }
+
+ fe0_port_0:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: SIGNET_vrf_A1_direct_net_id }
+ fixed_ips: [{"ip_address": {get_param: fe0_SIGNET_vrf_A1_direct_ips}}]
+
+ fe0_port_2:
+ type: OS::Neutron::Port
+ properties:
+ network_id: { get_resource: FE_Clustering_KA }
+
+ fe0_port_3:
+ type: OS::Neutron::Port
+ properties:
+ network_id: { get_resource: Clustering_Network }
+
+ fe0_port_7:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: OAM_direct_net_id }
+ fixed_ips: [{"ip_address": {get_param: fe0_OAM_direct_ips}}]
+
+ server_scp_fe1:
+ type: OS::Nova::Server
+# depends on: scp_be_wait_condition
+ properties:
+ name: { get_param: vm_scp_fe1_name }
+ image: { get_param: image_scp_fe_id }
+# availability_zone: { get_param: availability_zone_fe1 }
+ flavor: { get_param: flavor_scp_fe_id }
+ scheduler_hints: { group: { get_resource: FE_Affinity } }
+ networks:
+ - port: { get_resource: fe1_port_1 }
+ - port: { get_resource: fe1_port_2 }
+ - port: { get_resource: fe1_port_3 }
+ - port: { get_resource: fe1_port_7 }
+ metadata:
+ vnf_id: { get_param: vnf_id }
+ user_data:
+ str_replace:
+ template: |
+ #!/bin/bash
+ #todo: provision $vm_name
+ wc_notify --data-binary '{"status": "SUCCESS"}'
+ params:
+ $vm_name: {get_param: vm_scp_fe1_name}
+# wc_notify: { get_attr: ['scp_fe_wait_handle', 'curl_cli'] }
+
+ fe1_port_1:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: SIGNET_vrf_B1_direct_net_id }
+ fixed_ips: [{"ip_address": {get_param: fe1_SIGNET_vrf_B1_direct_ips}}]
+
+ fe1_port_2:
+ type: OS::Neutron::Port
+ properties:
+ network_id: { get_resource: FE_Clustering_KA }
+
+ fe1_port_3:
+ type: OS::Neutron::Port
+ properties:
+ network_id: { get_resource: Clustering_Network }
+
+ fe1_port_7:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: OAM_direct_net_id }
+ fixed_ips: [{"ip_address": {get_param: fe1_OAM_direct_ips}}]
+
+ server_smp0:
+ type: OS::Nova::Server
+ properties:
+ name: { get_param: vm_smp0_name }
+ image: { get_param: image_smp_id }
+# availability_zone: { get_param: availability_zone_smp0 }
+ flavor: { get_param: flavor_smp_id }
+ scheduler_hints: { group: { get_resource: SMP_Affinity } }
+ networks:
+ - port: { get_resource: smp0_port_7 }
+ metadata:
+ vnf_id: { get_param: vnf_id }
+ user_data:
+ str_replace:
+ template: |
+ #!/bin/bash
+ #todo: provision $vm_name
+ wc_notify --data-binary '{"status": "SUCCESS"}'
+ params:
+ $vm_name: {get_param: vm_smp0_name}
+# wc_notify: { get_attr: ['smp_wait_handle', 'curl_cli'] }
+
+ smp0_port_7:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: OAM_direct_net_id }
+ fixed_ips: [{"ip_address": {get_param: smp0_OAM_direct_ips}}]
+
+ server_smp1:
+ type: OS::Nova::Server
+ properties:
+ name: { get_param: vm_smp1_name }
+ image: { get_param: image_smp_id }
+# availability_zone: { get_param: availability_zone_smp1 }
+ flavor: { get_param: flavor_smp_id }
+ scheduler_hints: { group: { get_resource: SMP_Affinity } }
+ networks:
+ - port: { get_resource: smp1_port_7 }
+ metadata:
+ vnf_id: { get_param: vnf_id }
+ user_data:
+ str_replace:
+ template: |
+ #!/bin/bash
+ #todo: provision $vm_name
+ wc_notify --data-binary '{"status": "SUCCESS"}'
+ params:
+ $vm_name: {get_param: vm_smp1_name}
+# wc_notify: { get_attr: ['smp_wait_handle', 'curl_cli'] }
+
+ smp1_port_7:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: OAM_direct_net_id }
+ fixed_ips: [{"ip_address": {get_param: smp1_OAM_direct_ips}}]
+
+ server_db0:
+ type: OS::Nova::Server
+# depends_on: smp_wait_condition
+ properties:
+ name: { get_param: vm_db0_name }
+ image: { get_param: image_db_id }
+# availability_zone: { get_param: availability_zone_db0 }
+ flavor: { get_param: flavor_db_id }
+ scheduler_hints: { group: { get_resource: DB_Affinity } }
+ networks:
+ - port: { get_resource: db0_port_4 }
+ - port: { get_resource: db0_port_7 }
+ metadata:
+ vnf_id: { get_param: vnf_id }
+ user_data:
+ str_replace:
+ template: |
+ #!/bin/bash
+ #todo: provision $vm_name
+ wc_notify --data-binary '{"status": "SUCCESS"}'
+ params:
+ $vm_name: {get_param: vm_db0_name}
+# wc_notify: { get_attr: ['db_wait_handle', 'curl_cli'] }
+
+ db0_port_4:
+ type: OS::Neutron::Port
+ properties:
+ network_id: { get_resource: DB_Network }
+
+ db0_port_7:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: OAM_direct_net_id }
+ fixed_ips: [{"ip_address": {get_param: db0_OAM_direct_ips}}]
+
+ server_db1:
+ type: OS::Nova::Server
+# depends_on: smp_wait_condition
+ properties:
+ name: { get_param: vm_db1_name }
+ image: { get_param: image_db_id }
+# availability_zone: { get_param: availability_zone_db1 }
+ flavor: { get_param: flavor_db_id }
+ scheduler_hints: { group: { get_resource: DB_Affinity } }
+ networks:
+ - port: { get_resource: db1_port_4 }
+ - port: { get_resource: db1_port_7 }
+ metadata:
+ vnf_id: { get_param: vnf_id }
+ user_data:
+ str_replace:
+ template: |
+ #!/bin/bash
+ #todo: provision $vm_name
+ wc_notify --data-binary '{"status": "SUCCESS"}'
+ params:
+ $vm_name: {get_param: vm_db1_name}
+# wc_notify: { get_attr: ['db_wait_handle', 'curl_cli'] }
+
+ db1_port_4:
+ type: OS::Neutron::Port
+ properties:
+ network_id: { get_resource: DB_Network }
+
+ db1_port_7:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: OAM_direct_net_id }
+ fixed_ips: [{"ip_address": {get_param: db1_OAM_direct_ips}}]
\ No newline at end of file
diff --git a/ui-ci-dev/src/main/resources/Files/Heat-File 2.yaml b/ui-ci-dev/src/main/resources/Files/Heat-File 2.yaml
new file mode 100644
index 0000000..d332078
--- /dev/null
+++ b/ui-ci-dev/src/main/resources/Files/Heat-File 2.yaml
@@ -0,0 +1,791 @@
+heat_template_version: 2013-05-23
+#################################
+#
+# Changes in v0.2:
+# - Unique availability zone for each VM
+# - LAN8 and SLAN networks removed according to latest Prod/Type I diagram
+# - 2 DB VMs added
+# - Images corrected
+# - VM start-up order: SMP->DB->BE->FE (no error handling yet)
+# - Provisioning scripts placeholders
+#
+#################################
+
+description: ASC Template
+
+parameters:
+# availability_zone_smp0:
+# type: string
+# default: nova
+# availability_zone_smp1:
+# type: string
+# default: nova
+# availability_zone_fe0:
+# type: string
+# default: nova
+# availability_zone_fe1:
+# type: string
+# default: nova
+# availability_zone_db0:
+# type: string
+# default: nova
+# availability_zone_db1:
+# type: string
+# default: nova
+# availability_zone_be0:
+# type: string
+# default: nova
+# availability_zone_be1:
+# type: string
+# default: nova
+# availability_zone_be2:
+# type: string
+# default: nova
+# availability_zone_be3:
+# type: string
+# default: nova
+# availability_zone_be4:
+# type: string
+# default: nova
+
+ vnf_name:
+ type: string
+ description: Unique name for this VNF instance
+ default: This_is_the_SCP_name
+ vnf_id:
+ type: string
+ description: Unique ID for this VNF instance
+ default: This_is_ths_SCP_id
+
+ flavor_scp_be_id:
+ type: string
+ description: flavor type
+ default: a1.Small
+ flavor_scp_fe_id:
+ type: string
+ description: flavor type
+ default: a1.Small
+ flavor_smp_id:
+ type: string
+ description: flavor type
+ default: a1.Small
+ flavor_db_id:
+ type: string
+ description: flavor type
+ default: a1.Small
+ image_scp_be_id:
+ type: string
+ description: Image use to boot a server
+ default: asc_base_image_be
+ image_scp_fe_id:
+ type: string
+ description: Image use to boot a server
+ default: asc_base_image_fe
+ image_smp_id:
+ type: string
+ description: Image use to boot a server
+ default: asc_base_image_smp
+ image_db_id:
+ type: string
+ description: Image use to boot a server
+ default: asc_base_image_db
+
+ int_vscp_fe_cluster_net_id:
+ type: string
+ description: LAN2 FE Cluster/KA
+ int_vscp_fe_cluster_cidr:
+ type: string
+ description: Private Network2 Address (CIDR notation)
+ int_vscp_cluster_net_id:
+ type: string
+ description: LAN3 Cluster
+ int_vscp_cluster_cidr:
+ type: string
+ description: Private Network3 Address (CIDR notation)
+ int_vscp_db_network_net_id:
+ type: string
+ description: LAN4 DB
+ int_vscp_db_network_cidr:
+ type: string
+ description: Private Network4 Address (CIDR notation)
+ SIGNET_vrf_A1_direct_net_id:
+ type: string
+ description: Network name for SIGTRAN_A
+ SIGNET_vrf_B1_direct_net_id:
+ type: string
+ description: Network name for SIGTRAN_B
+ Cricket_OCS_protected_net_id:
+ type: string
+ description: Network name for CRICKET_OCS
+ OAM_direct_net_id:
+ type: string
+ description: Network name for OAM
+ be0_Cricket_OCS_protected_ips:
+ type: string
+ label: be0 port 5 OAM ip address
+ description: be0 port 5 OAM ip address
+ be1_Cricket_OCS_protected_ips:
+ type: string
+ label: be1 port 5 OAM ip address
+ description: be1 port 5 OAM ip address
+ be2_Cricket_OCS_protected_ips:
+ type: string
+ label: be2 port 5 OAM ip address
+ description: be2 port 5 OAM ip address
+ be3_Cricket_OCS_protected_ips:
+ type: string
+ label: be3 port 5 OAM ip address
+ description: be3 port 5 OAM ip address
+ be4_Cricket_OCS_protected_ips:
+ type: string
+ label: be4 port 5 OAM ip address
+ description: be4 port 5 OAM ip address
+ be0_OAM_direct_ips:
+ type: string
+ label: be0 port 7 OAM ip address
+ description: be0 port 7 OAM ip address
+ be1_OAM_direct_ips:
+ type: string
+ label: be1 port 7 OAM ip address
+ description: be1 port 7 OAM ip address
+ be2_OAM_direct_ips:
+ type: string
+ label: be2 port 7 OAM ip address
+ description: be2 port 7 OAM ip address
+ be3_OAM_direct_ips:
+ type: string
+ label: be3 port 7 OAM ip address
+ description: be3 port 7 OAM ip address
+ be4_OAM_direct_ips:
+ type: string
+ label: be4 port 7 OAM ip address
+ description: be4 port 7 OAM ip address
+ fe0_SIGNET_vrf_A1_direct_ips:
+ type: string
+ label: fe0 port 0 SIGTRAN ip address
+ description: fe0 port 0 SIGTRAN ip address
+ fe0_OAM_direct_ips:
+ type: string
+ label: fe0 port 7 OAM ip address
+ description: fe0 port 7 OAM ip address
+ fe1_SIGNET_vrf_B1_direct_ips:
+ type: string
+ label: fe1 port 1 SIGTRAN ip address
+ description: fe1 port 1 SIGTRAN ip address
+ fe1_OAM_direct_ips:
+ type: string
+ label: fe1 port 7 OAM ip address
+ description: fe1 port 7 OAM ip address
+ smp0_OAM_direct_ips:
+ type: string
+ label: smp0 port 7 OAM ip address
+ description: smp0 port 7 OAM ip address
+ smp1_OAM_direct_ips:
+ type: string
+ label: smp1 port 7 OAM ip address
+ description: smp1 port 7 OAM ip address
+ db0_OAM_direct_ips:
+ type: string
+ label: db0 port 7 OAM ip address
+ description: smp0 port 7 OAM ip address
+ db1_OAM_direct_ips:
+ type: string
+ label: smp1 port 7 OAM ip address
+ description: db1 port 7 OAM ip address
+ vm_scp_be0_name:
+ type: string
+ default: vSCP_BE0
+ description: name of VM
+ vm_scp_be1_name:
+ type: string
+ default: vSCP_BE1
+ description: name of VM
+ vm_scp_be2_name:
+ type: string
+ default: vSCP_BE2
+ description: name of VM
+ vm_scp_be3_name:
+ type: string
+ default: vSCP_BE3
+ description: name of VM
+ vm_scp_be4_name:
+ type: string
+ default: vSCP_BE4
+ description: name of VM
+ vm_scp_fe0_name:
+ type: string
+ default: vSCP_FE0
+ description: name of VM
+ vm_scp_fe1_name:
+ type: string
+ default: vSCP_FE1
+ description: name of VM
+ vm_smp0_name:
+ type: string
+ default: vSMP0
+ description: name of VM
+ vm_smp1_name:
+ type: string
+ default: vSMP1
+ description: name of VM
+ vm_db0_name:
+ type: string
+ default: vDB0
+ description: name of VM
+ vm_db1_name:
+ type: string
+ default: vDB1
+ description: name of VM
+
+resources:
+# scp_be_wait_condition:
+# type: OS::Heat::WaitCondition
+# properties:
+# handle: { get_resource: scp_be_wait_handle }
+# count: 5
+# timeout: 300
+# scp_be_wait_handle:
+# type: OS::Heat::WaitConditionHandle
+#
+# scp_fe_wait_condition:
+# type: OS::Heat::WaitCondition
+# properties:
+# handle: { get_resource: scp_fe_wait_handle }
+# count: 2
+# timeout: 300
+# scp_fe_wait_handle:
+# type: OS::Heat::WaitConditionHandle
+#
+# smp_wait_condition:
+# type: OS::Heat::WaitCondition
+# properties:
+# handle: { get_resource: smp_wait_handle }
+# count: 2
+# timeout: 300
+# smp_wait_handle:
+# type: OS::Heat::WaitConditionHandle
+#
+# db_wait_condition:
+# type: OS::Heat::WaitCondition
+# properties:
+# handle: { get_resource: db_wait_handle }
+# count: 2
+# timeout: 300
+# db_wait_handle:
+# type: OS::Heat::WaitConditionHandle
+
+ FE_Affinity:
+ type: OS::Nova::ServerGroup
+ properties:
+ policies: ["anti-affinity"]
+ BE_Affinity:
+ type: OS::Nova::ServerGroup
+ properties:
+ policies: ["anti-affinity"]
+ SMP_Affinity:
+ type: OS::Nova::ServerGroup
+ properties:
+ policies: ["anti-affinity"]
+ DB_Affinity:
+ type: OS::Nova::ServerGroup
+ properties:
+ policies: ["anti-affinity"]
+
+ FE_Clustering_KA:
+ type: OS::Contrail::VirtualNetwork
+ properties:
+ name: { get_param: int_vscp_fe_cluster_net_id }
+
+ FE_Clustering_subnet:
+ type: OS::Neutron::Subnet
+ properties:
+ network_id: { get_resource: FE_Clustering_KA }
+ cidr: { get_param: int_vscp_fe_cluster_cidr }
+
+ Clustering_Network:
+ type: OS::Contrail::VirtualNetwork
+ properties:
+ name: { get_param: int_vscp_cluster_net_id }
+
+ Clustering_Network_subnet:
+ type: OS::Neutron::Subnet
+ properties:
+ network_id: { get_resource: Clustering_Network }
+ cidr: { get_param: int_vscp_cluster_cidr }
+
+ DB_Network:
+ type: OS::Contrail::VirtualNetwork
+ properties:
+ name: { get_param: int_vscp_db_network_net_id }
+
+ DB_Network_subnet:
+ type: OS::Neutron::Subnet
+ properties:
+ network_id: { get_resource: DB_Network }
+ cidr: { get_param: int_vscp_db_network_cidr }
+
+ server_scp_be0:
+ type: OS::Nova::Server
+# depends on: db_wait_condition
+ properties:
+ name: { get_param: vm_scp_be0_name }
+ image: { get_param: image_scp_be_id }
+# availability_zone: { get_param: availability_zone_be0 }
+ flavor: { get_param: flavor_scp_be_id }
+ scheduler_hints: { group: { get_resource: BE_Affinity } }
+ networks:
+ - port: { get_resource: be0_port_3 }
+ - port: { get_resource: be0_port_4 }
+ - port: { get_resource: be0_port_5 }
+ - port: { get_resource: be0_port_7 }
+ metadata:
+ vnf_id: { get_param: vnf_id }
+ user_data:
+ str_replace:
+ template: |
+ #!/bin/bash
+ #todo: provision $vm_name
+ wc_notify --data-binary '{"status": "SUCCESS"}'
+ params:
+ $vm_name: {get_param: vm_scp_be0_name}
+# wc_notify: { get_attr: ['scp_be_wait_handle', 'curl_cli'] }
+ be0_port_2:
+ type: OS::Neutron::Port
+ properties:
+ network_id: { get_resource: Clustering_Network }
+
+ be0_port_3:
+ type: OS::Neutron::Port
+ properties:
+ network_id: { get_resource: Clustering_Network }
+
+ be0_port_4:
+ type: OS::Neutron::Port
+ properties:
+ network_id: { get_resource: DB_Network }
+
+ be0_port_5:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: Cricket_OCS_protected_net_id }
+ fixed_ips: [{"ip_address": {get_param: be0_Cricket_OCS_protected_ips}}]
+
+ be0_port_7:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: OAM_direct_net_id }
+ fixed_ips: [{"ip_address": {get_param: be0_OAM_direct_ips}}]
+
+ server_scp_be1:
+ type: OS::Nova::Server
+# depends on: db_wait_condition
+ properties:
+ name: { get_param: vm_scp_be1_name }
+ image: { get_param: image_scp_be_id }
+# availability_zone: { get_param: availability_zone_be1 }
+ flavor: { get_param: flavor_scp_be_id }
+ scheduler_hints: { group: { get_resource: BE_Affinity } }
+ networks:
+ - port: { get_resource: be1_port_3 }
+ - port: { get_resource: be1_port_4 }
+ - port: { get_resource: be1_port_5 }
+ - port: { get_resource: be1_port_7 }
+ metadata:
+ vnf_id: { get_param: vnf_id }
+ user_data:
+ str_replace:
+ template: |
+ #!/bin/bash
+ #todo: provision $vm_name
+ wc_notify --data-binary '{"status": "SUCCESS"}'
+ params:
+ $vm_name: {get_param: vm_scp_be1_name}
+# wc_notify: { get_attr: ['scp_be_wait_handle', 'curl_cli'] }
+
+ be1_port_3:
+ type: OS::Neutron::Port
+ properties:
+ network_id: { get_resource: Clustering_Network }
+
+ be1_port_4:
+ type: OS::Neutron::Port
+ properties:
+ network_id: { get_resource: DB_Network }
+
+ be1_port_5:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: Cricket_OCS_protected_net_id }
+ fixed_ips: [{"ip_address": {get_param: be1_Cricket_OCS_protected_ips}}]
+
+ be1_port_7:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: OAM_direct_net_id }
+ fixed_ips: [{"ip_address": {get_param: be1_OAM_direct_ips}}]
+
+ server_scp_be2:
+ type: OS::Nova::Server
+# depends on: db_wait_condition
+ properties:
+ name: { get_param: vm_scp_be2_name }
+ image: { get_param: image_scp_be_id }
+# availability_zone: { get_param: availability_zone_be2 }
+ flavor: { get_param: flavor_scp_be_id }
+ scheduler_hints: { group: { get_resource: BE_Affinity } }
+ networks:
+ - port: { get_resource: be2_port_3 }
+ - port: { get_resource: be2_port_4 }
+ - port: { get_resource: be2_port_5 }
+ - port: { get_resource: be2_port_7 }
+ metadata:
+ vnf_id: { get_param: vnf_id }
+ user_data:
+ str_replace:
+ template: |
+ #!/bin/bash
+ #todo: provision $vm_name
+ wc_notify --data-binary '{"status": "SUCCESS"}'
+ params:
+ $vm_name: {get_param: vm_scp_be2_name}
+# wc_notify: { get_attr: ['scp_be_wait_handle', 'curl_cli'] }
+
+ be2_port_3:
+ type: OS::Neutron::Port
+ properties:
+ network_id: { get_resource: Clustering_Network }
+
+ be2_port_4:
+ type: OS::Neutron::Port
+ properties:
+ network_id: { get_resource: DB_Network }
+
+ be2_port_5:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: Cricket_OCS_protected_net_id }
+ fixed_ips: [{"ip_address": {get_param: be2_Cricket_OCS_protected_ips}}]
+
+ be2_port_7:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: OAM_direct_net_id }
+ fixed_ips: [{"ip_address": {get_param: be2_OAM_direct_ips}}]
+
+ server_scp_be3:
+ type: OS::Nova::Server
+# depends on: db_wait_condition
+ properties:
+ name: { get_param: vm_scp_be3_name }
+ image: { get_param: image_scp_be_id }
+# availability_zone: { get_param: availability_zone_be3 }
+ flavor: { get_param: flavor_scp_be_id }
+ scheduler_hints: { group: { get_resource: BE_Affinity } }
+ networks:
+ - port: { get_resource: be3_port_3 }
+ - port: { get_resource: be3_port_4 }
+ - port: { get_resource: be3_port_5 }
+ - port: { get_resource: be3_port_7 }
+ metadata:
+ vnf_id: { get_param: vnf_id }
+ user_data:
+ str_replace:
+ template: |
+ #!/bin/bash
+ #todo: provision $vm_name
+ wc_notify --data-binary '{"status": "SUCCESS"}'
+ params:
+ $vm_name: {get_param: vm_scp_be3_name}
+# wc_notify: { get_attr: ['scp_be_wait_handle', 'curl_cli'] }
+
+ be3_port_3:
+ type: OS::Neutron::Port
+ properties:
+ network_id: { get_resource: Clustering_Network }
+
+ be3_port_4:
+ type: OS::Neutron::Port
+ properties:
+ network_id: { get_resource: DB_Network }
+
+ be3_port_5:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: Cricket_OCS_protected_net_id }
+ fixed_ips: [{"ip_address": {get_param: be3_Cricket_OCS_protected_ips}}]
+
+ be3_port_7:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: OAM_direct_net_id }
+ fixed_ips: [{"ip_address": {get_param: be3_OAM_direct_ips}}]
+
+ server_scp_be4:
+ type: OS::Nova::Server
+# depends on: db_wait_condition
+ properties:
+ name: { get_param: vm_scp_be4_name }
+ image: { get_param: image_scp_be_id }
+# availability_zone: { get_param: availability_zone_be4 }
+ flavor: { get_param: flavor_scp_be_id }
+ scheduler_hints: { group: { get_resource: BE_Affinity } }
+ networks:
+ - port: { get_resource: be4_port_3 }
+ - port: { get_resource: be4_port_4 }
+ - port: { get_resource: be4_port_5 }
+ - port: { get_resource: be4_port_7 }
+ metadata:
+ vnf_id: { get_param: vnf_id }
+ user_data:
+ str_replace:
+ template: |
+ #!/bin/bash
+ #todo: provision $vm_name
+ wc_notify --data-binary '{"status": "SUCCESS"}'
+ params:
+ $vm_name: {get_param: vm_scp_be4_name}
+# wc_notify: { get_attr: ['scp_be_wait_handle', 'curl_cli'] }
+
+ be4_port_3:
+ type: OS::Neutron::Port
+ properties:
+ network_id: { get_resource: Clustering_Network }
+
+ be4_port_4:
+ type: OS::Neutron::Port
+ properties:
+ network_id: { get_resource: DB_Network }
+
+ be4_port_5:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: Cricket_OCS_protected_net_id }
+ fixed_ips: [{"ip_address": {get_param: be4_Cricket_OCS_protected_ips}}]
+
+ be4_port_7:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: OAM_direct_net_id }
+ fixed_ips: [{"ip_address": {get_param: be4_OAM_direct_ips}}]
+
+ server_scp_fe0:
+ type: OS::Nova::Server
+# depends on: scp_be_wait_condition
+ properties:
+ name: { get_param: vm_scp_fe0_name }
+ image: { get_param: image_scp_fe_id }
+# availability_zone: { get_param: availability_zone_fe0 }
+ flavor: { get_param: flavor_scp_fe_id }
+ scheduler_hints: { group: { get_resource: FE_Affinity } }
+ networks:
+ - port: { get_resource: fe0_port_0 }
+ - port: { get_resource: fe0_port_2 }
+ - port: { get_resource: fe0_port_3 }
+ - port: { get_resource: fe0_port_7 }
+ metadata:
+ vnf_id: { get_param: vnf_id }
+ user_data:
+ str_replace:
+ template: |
+ #!/bin/bash
+ #todo: provision $vm_name
+ wc_notify --data-binary '{"status": "SUCCESS"}'
+ params:
+ $vm_name: {get_param: vm_scp_fe0_name}
+# wc_notify: { get_attr: ['scp_fe_wait_handle', 'curl_cli'] }
+
+ fe0_port_0:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: SIGNET_vrf_A1_direct_net_id }
+ fixed_ips: [{"ip_address": {get_param: fe0_SIGNET_vrf_A1_direct_ips}}]
+
+ fe0_port_2:
+ type: OS::Neutron::Port
+ properties:
+ network_id: { get_resource: FE_Clustering_KA }
+
+ fe0_port_3:
+ type: OS::Neutron::Port
+ properties:
+ network_id: { get_resource: Clustering_Network }
+
+ fe0_port_7:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: OAM_direct_net_id }
+ fixed_ips: [{"ip_address": {get_param: fe0_OAM_direct_ips}}]
+
+ server_scp_fe1:
+ type: OS::Nova::Server
+# depends on: scp_be_wait_condition
+ properties:
+ name: { get_param: vm_scp_fe1_name }
+ image: { get_param: image_scp_fe_id }
+# availability_zone: { get_param: availability_zone_fe1 }
+ flavor: { get_param: flavor_scp_fe_id }
+ scheduler_hints: { group: { get_resource: FE_Affinity } }
+ networks:
+ - port: { get_resource: fe1_port_1 }
+ - port: { get_resource: fe1_port_2 }
+ - port: { get_resource: fe1_port_3 }
+ - port: { get_resource: fe1_port_7 }
+ metadata:
+ vnf_id: { get_param: vnf_id }
+ user_data:
+ str_replace:
+ template: |
+ #!/bin/bash
+ #todo: provision $vm_name
+ wc_notify --data-binary '{"status": "SUCCESS"}'
+ params:
+ $vm_name: {get_param: vm_scp_fe1_name}
+# wc_notify: { get_attr: ['scp_fe_wait_handle', 'curl_cli'] }
+
+ fe1_port_1:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: SIGNET_vrf_B1_direct_net_id }
+ fixed_ips: [{"ip_address": {get_param: fe1_SIGNET_vrf_B1_direct_ips}}]
+
+ fe1_port_2:
+ type: OS::Neutron::Port
+ properties:
+ network_id: { get_resource: FE_Clustering_KA }
+
+ fe1_port_3:
+ type: OS::Neutron::Port
+ properties:
+ network_id: { get_resource: Clustering_Network }
+
+ fe1_port_7:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: OAM_direct_net_id }
+ fixed_ips: [{"ip_address": {get_param: fe1_OAM_direct_ips}}]
+
+ server_smp0:
+ type: OS::Nova::Server
+ properties:
+ name: { get_param: vm_smp0_name }
+ image: { get_param: image_smp_id }
+# availability_zone: { get_param: availability_zone_smp0 }
+ flavor: { get_param: flavor_smp_id }
+ scheduler_hints: { group: { get_resource: SMP_Affinity } }
+ networks:
+ - port: { get_resource: smp0_port_7 }
+ metadata:
+ vnf_id: { get_param: vnf_id }
+ user_data:
+ str_replace:
+ template: |
+ #!/bin/bash
+ #todo: provision $vm_name
+ wc_notify --data-binary '{"status": "SUCCESS"}'
+ params:
+ $vm_name: {get_param: vm_smp0_name}
+# wc_notify: { get_attr: ['smp_wait_handle', 'curl_cli'] }
+
+ smp0_port_7:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: OAM_direct_net_id }
+ fixed_ips: [{"ip_address": {get_param: smp0_OAM_direct_ips}}]
+
+ server_smp1:
+ type: OS::Nova::Server
+ properties:
+ name: { get_param: vm_smp1_name }
+ image: { get_param: image_smp_id }
+# availability_zone: { get_param: availability_zone_smp1 }
+ flavor: { get_param: flavor_smp_id }
+ scheduler_hints: { group: { get_resource: SMP_Affinity } }
+ networks:
+ - port: { get_resource: smp1_port_7 }
+ metadata:
+ vnf_id: { get_param: vnf_id }
+ user_data:
+ str_replace:
+ template: |
+ #!/bin/bash
+ #todo: provision $vm_name
+ wc_notify --data-binary '{"status": "SUCCESS"}'
+ params:
+ $vm_name: {get_param: vm_smp1_name}
+# wc_notify: { get_attr: ['smp_wait_handle', 'curl_cli'] }
+
+ smp1_port_7:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: OAM_direct_net_id }
+ fixed_ips: [{"ip_address": {get_param: smp1_OAM_direct_ips}}]
+
+ server_db0:
+ type: OS::Nova::Server
+# depends_on: smp_wait_condition
+ properties:
+ name: { get_param: vm_db0_name }
+ image: { get_param: image_db_id }
+# availability_zone: { get_param: availability_zone_db0 }
+ flavor: { get_param: flavor_db_id }
+ scheduler_hints: { group: { get_resource: DB_Affinity } }
+ networks:
+ - port: { get_resource: db0_port_4 }
+ - port: { get_resource: db0_port_7 }
+ metadata:
+ vnf_id: { get_param: vnf_id }
+ user_data:
+ str_replace:
+ template: |
+ #!/bin/bash
+ #todo: provision $vm_name
+ wc_notify --data-binary '{"status": "SUCCESS"}'
+ params:
+ $vm_name: {get_param: vm_db0_name}
+# wc_notify: { get_attr: ['db_wait_handle', 'curl_cli'] }
+
+ db0_port_4:
+ type: OS::Neutron::Port
+ properties:
+ network_id: { get_resource: DB_Network }
+
+ db0_port_7:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: OAM_direct_net_id }
+ fixed_ips: [{"ip_address": {get_param: db0_OAM_direct_ips}}]
+
+ server_db1:
+ type: OS::Nova::Server
+# depends_on: smp_wait_condition
+ properties:
+ name: { get_param: vm_db1_name }
+ image: { get_param: image_db_id }
+# availability_zone: { get_param: availability_zone_db1 }
+ flavor: { get_param: flavor_db_id }
+ scheduler_hints: { group: { get_resource: DB_Affinity } }
+ networks:
+ - port: { get_resource: db1_port_4 }
+ - port: { get_resource: db1_port_7 }
+ metadata:
+ vnf_id: { get_param: vnf_id }
+ user_data:
+ str_replace:
+ template: |
+ #!/bin/bash
+ #todo: provision $vm_name
+ wc_notify --data-binary '{"status": "SUCCESS"}'
+ params:
+ $vm_name: {get_param: vm_db1_name}
+# wc_notify: { get_attr: ['db_wait_handle', 'curl_cli'] }
+
+ db1_port_4:
+ type: OS::Neutron::Port
+ properties:
+ network_id: { get_resource: DB_Network }
+
+ db1_port_7:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: OAM_direct_net_id }
+ fixed_ips: [{"ip_address": {get_param: db1_OAM_direct_ips}}]
\ No newline at end of file
diff --git a/ui-ci-dev/src/main/resources/Files/Heat-File.yaml b/ui-ci-dev/src/main/resources/Files/Heat-File.yaml
new file mode 100644
index 0000000..d332078
--- /dev/null
+++ b/ui-ci-dev/src/main/resources/Files/Heat-File.yaml
@@ -0,0 +1,791 @@
+heat_template_version: 2013-05-23
+#################################
+#
+# Changes in v0.2:
+# - Unique availability zone for each VM
+# - LAN8 and SLAN networks removed according to latest Prod/Type I diagram
+# - 2 DB VMs added
+# - Images corrected
+# - VM start-up order: SMP->DB->BE->FE (no error handling yet)
+# - Provisioning scripts placeholders
+#
+#################################
+
+description: ASC Template
+
+parameters:
+# availability_zone_smp0:
+# type: string
+# default: nova
+# availability_zone_smp1:
+# type: string
+# default: nova
+# availability_zone_fe0:
+# type: string
+# default: nova
+# availability_zone_fe1:
+# type: string
+# default: nova
+# availability_zone_db0:
+# type: string
+# default: nova
+# availability_zone_db1:
+# type: string
+# default: nova
+# availability_zone_be0:
+# type: string
+# default: nova
+# availability_zone_be1:
+# type: string
+# default: nova
+# availability_zone_be2:
+# type: string
+# default: nova
+# availability_zone_be3:
+# type: string
+# default: nova
+# availability_zone_be4:
+# type: string
+# default: nova
+
+ vnf_name:
+ type: string
+ description: Unique name for this VNF instance
+ default: This_is_the_SCP_name
+ vnf_id:
+ type: string
+ description: Unique ID for this VNF instance
+ default: This_is_ths_SCP_id
+
+ flavor_scp_be_id:
+ type: string
+ description: flavor type
+ default: a1.Small
+ flavor_scp_fe_id:
+ type: string
+ description: flavor type
+ default: a1.Small
+ flavor_smp_id:
+ type: string
+ description: flavor type
+ default: a1.Small
+ flavor_db_id:
+ type: string
+ description: flavor type
+ default: a1.Small
+ image_scp_be_id:
+ type: string
+ description: Image use to boot a server
+ default: asc_base_image_be
+ image_scp_fe_id:
+ type: string
+ description: Image use to boot a server
+ default: asc_base_image_fe
+ image_smp_id:
+ type: string
+ description: Image use to boot a server
+ default: asc_base_image_smp
+ image_db_id:
+ type: string
+ description: Image use to boot a server
+ default: asc_base_image_db
+
+ int_vscp_fe_cluster_net_id:
+ type: string
+ description: LAN2 FE Cluster/KA
+ int_vscp_fe_cluster_cidr:
+ type: string
+ description: Private Network2 Address (CIDR notation)
+ int_vscp_cluster_net_id:
+ type: string
+ description: LAN3 Cluster
+ int_vscp_cluster_cidr:
+ type: string
+ description: Private Network3 Address (CIDR notation)
+ int_vscp_db_network_net_id:
+ type: string
+ description: LAN4 DB
+ int_vscp_db_network_cidr:
+ type: string
+ description: Private Network4 Address (CIDR notation)
+ SIGNET_vrf_A1_direct_net_id:
+ type: string
+ description: Network name for SIGTRAN_A
+ SIGNET_vrf_B1_direct_net_id:
+ type: string
+ description: Network name for SIGTRAN_B
+ Cricket_OCS_protected_net_id:
+ type: string
+ description: Network name for CRICKET_OCS
+ OAM_direct_net_id:
+ type: string
+ description: Network name for OAM
+ be0_Cricket_OCS_protected_ips:
+ type: string
+ label: be0 port 5 OAM ip address
+ description: be0 port 5 OAM ip address
+ be1_Cricket_OCS_protected_ips:
+ type: string
+ label: be1 port 5 OAM ip address
+ description: be1 port 5 OAM ip address
+ be2_Cricket_OCS_protected_ips:
+ type: string
+ label: be2 port 5 OAM ip address
+ description: be2 port 5 OAM ip address
+ be3_Cricket_OCS_protected_ips:
+ type: string
+ label: be3 port 5 OAM ip address
+ description: be3 port 5 OAM ip address
+ be4_Cricket_OCS_protected_ips:
+ type: string
+ label: be4 port 5 OAM ip address
+ description: be4 port 5 OAM ip address
+ be0_OAM_direct_ips:
+ type: string
+ label: be0 port 7 OAM ip address
+ description: be0 port 7 OAM ip address
+ be1_OAM_direct_ips:
+ type: string
+ label: be1 port 7 OAM ip address
+ description: be1 port 7 OAM ip address
+ be2_OAM_direct_ips:
+ type: string
+ label: be2 port 7 OAM ip address
+ description: be2 port 7 OAM ip address
+ be3_OAM_direct_ips:
+ type: string
+ label: be3 port 7 OAM ip address
+ description: be3 port 7 OAM ip address
+ be4_OAM_direct_ips:
+ type: string
+ label: be4 port 7 OAM ip address
+ description: be4 port 7 OAM ip address
+ fe0_SIGNET_vrf_A1_direct_ips:
+ type: string
+ label: fe0 port 0 SIGTRAN ip address
+ description: fe0 port 0 SIGTRAN ip address
+ fe0_OAM_direct_ips:
+ type: string
+ label: fe0 port 7 OAM ip address
+ description: fe0 port 7 OAM ip address
+ fe1_SIGNET_vrf_B1_direct_ips:
+ type: string
+ label: fe1 port 1 SIGTRAN ip address
+ description: fe1 port 1 SIGTRAN ip address
+ fe1_OAM_direct_ips:
+ type: string
+ label: fe1 port 7 OAM ip address
+ description: fe1 port 7 OAM ip address
+ smp0_OAM_direct_ips:
+ type: string
+ label: smp0 port 7 OAM ip address
+ description: smp0 port 7 OAM ip address
+ smp1_OAM_direct_ips:
+ type: string
+ label: smp1 port 7 OAM ip address
+ description: smp1 port 7 OAM ip address
+ db0_OAM_direct_ips:
+ type: string
+ label: db0 port 7 OAM ip address
+ description: smp0 port 7 OAM ip address
+ db1_OAM_direct_ips:
+ type: string
+ label: smp1 port 7 OAM ip address
+ description: db1 port 7 OAM ip address
+ vm_scp_be0_name:
+ type: string
+ default: vSCP_BE0
+ description: name of VM
+ vm_scp_be1_name:
+ type: string
+ default: vSCP_BE1
+ description: name of VM
+ vm_scp_be2_name:
+ type: string
+ default: vSCP_BE2
+ description: name of VM
+ vm_scp_be3_name:
+ type: string
+ default: vSCP_BE3
+ description: name of VM
+ vm_scp_be4_name:
+ type: string
+ default: vSCP_BE4
+ description: name of VM
+ vm_scp_fe0_name:
+ type: string
+ default: vSCP_FE0
+ description: name of VM
+ vm_scp_fe1_name:
+ type: string
+ default: vSCP_FE1
+ description: name of VM
+ vm_smp0_name:
+ type: string
+ default: vSMP0
+ description: name of VM
+ vm_smp1_name:
+ type: string
+ default: vSMP1
+ description: name of VM
+ vm_db0_name:
+ type: string
+ default: vDB0
+ description: name of VM
+ vm_db1_name:
+ type: string
+ default: vDB1
+ description: name of VM
+
+resources:
+# scp_be_wait_condition:
+# type: OS::Heat::WaitCondition
+# properties:
+# handle: { get_resource: scp_be_wait_handle }
+# count: 5
+# timeout: 300
+# scp_be_wait_handle:
+# type: OS::Heat::WaitConditionHandle
+#
+# scp_fe_wait_condition:
+# type: OS::Heat::WaitCondition
+# properties:
+# handle: { get_resource: scp_fe_wait_handle }
+# count: 2
+# timeout: 300
+# scp_fe_wait_handle:
+# type: OS::Heat::WaitConditionHandle
+#
+# smp_wait_condition:
+# type: OS::Heat::WaitCondition
+# properties:
+# handle: { get_resource: smp_wait_handle }
+# count: 2
+# timeout: 300
+# smp_wait_handle:
+# type: OS::Heat::WaitConditionHandle
+#
+# db_wait_condition:
+# type: OS::Heat::WaitCondition
+# properties:
+# handle: { get_resource: db_wait_handle }
+# count: 2
+# timeout: 300
+# db_wait_handle:
+# type: OS::Heat::WaitConditionHandle
+
+ FE_Affinity:
+ type: OS::Nova::ServerGroup
+ properties:
+ policies: ["anti-affinity"]
+ BE_Affinity:
+ type: OS::Nova::ServerGroup
+ properties:
+ policies: ["anti-affinity"]
+ SMP_Affinity:
+ type: OS::Nova::ServerGroup
+ properties:
+ policies: ["anti-affinity"]
+ DB_Affinity:
+ type: OS::Nova::ServerGroup
+ properties:
+ policies: ["anti-affinity"]
+
+ FE_Clustering_KA:
+ type: OS::Contrail::VirtualNetwork
+ properties:
+ name: { get_param: int_vscp_fe_cluster_net_id }
+
+ FE_Clustering_subnet:
+ type: OS::Neutron::Subnet
+ properties:
+ network_id: { get_resource: FE_Clustering_KA }
+ cidr: { get_param: int_vscp_fe_cluster_cidr }
+
+ Clustering_Network:
+ type: OS::Contrail::VirtualNetwork
+ properties:
+ name: { get_param: int_vscp_cluster_net_id }
+
+ Clustering_Network_subnet:
+ type: OS::Neutron::Subnet
+ properties:
+ network_id: { get_resource: Clustering_Network }
+ cidr: { get_param: int_vscp_cluster_cidr }
+
+ DB_Network:
+ type: OS::Contrail::VirtualNetwork
+ properties:
+ name: { get_param: int_vscp_db_network_net_id }
+
+ DB_Network_subnet:
+ type: OS::Neutron::Subnet
+ properties:
+ network_id: { get_resource: DB_Network }
+ cidr: { get_param: int_vscp_db_network_cidr }
+
+ server_scp_be0:
+ type: OS::Nova::Server
+# depends on: db_wait_condition
+ properties:
+ name: { get_param: vm_scp_be0_name }
+ image: { get_param: image_scp_be_id }
+# availability_zone: { get_param: availability_zone_be0 }
+ flavor: { get_param: flavor_scp_be_id }
+ scheduler_hints: { group: { get_resource: BE_Affinity } }
+ networks:
+ - port: { get_resource: be0_port_3 }
+ - port: { get_resource: be0_port_4 }
+ - port: { get_resource: be0_port_5 }
+ - port: { get_resource: be0_port_7 }
+ metadata:
+ vnf_id: { get_param: vnf_id }
+ user_data:
+ str_replace:
+ template: |
+ #!/bin/bash
+ #todo: provision $vm_name
+ wc_notify --data-binary '{"status": "SUCCESS"}'
+ params:
+ $vm_name: {get_param: vm_scp_be0_name}
+# wc_notify: { get_attr: ['scp_be_wait_handle', 'curl_cli'] }
+ be0_port_2:
+ type: OS::Neutron::Port
+ properties:
+ network_id: { get_resource: Clustering_Network }
+
+ be0_port_3:
+ type: OS::Neutron::Port
+ properties:
+ network_id: { get_resource: Clustering_Network }
+
+ be0_port_4:
+ type: OS::Neutron::Port
+ properties:
+ network_id: { get_resource: DB_Network }
+
+ be0_port_5:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: Cricket_OCS_protected_net_id }
+ fixed_ips: [{"ip_address": {get_param: be0_Cricket_OCS_protected_ips}}]
+
+ be0_port_7:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: OAM_direct_net_id }
+ fixed_ips: [{"ip_address": {get_param: be0_OAM_direct_ips}}]
+
+ server_scp_be1:
+ type: OS::Nova::Server
+# depends on: db_wait_condition
+ properties:
+ name: { get_param: vm_scp_be1_name }
+ image: { get_param: image_scp_be_id }
+# availability_zone: { get_param: availability_zone_be1 }
+ flavor: { get_param: flavor_scp_be_id }
+ scheduler_hints: { group: { get_resource: BE_Affinity } }
+ networks:
+ - port: { get_resource: be1_port_3 }
+ - port: { get_resource: be1_port_4 }
+ - port: { get_resource: be1_port_5 }
+ - port: { get_resource: be1_port_7 }
+ metadata:
+ vnf_id: { get_param: vnf_id }
+ user_data:
+ str_replace:
+ template: |
+ #!/bin/bash
+ #todo: provision $vm_name
+ wc_notify --data-binary '{"status": "SUCCESS"}'
+ params:
+ $vm_name: {get_param: vm_scp_be1_name}
+# wc_notify: { get_attr: ['scp_be_wait_handle', 'curl_cli'] }
+
+ be1_port_3:
+ type: OS::Neutron::Port
+ properties:
+ network_id: { get_resource: Clustering_Network }
+
+ be1_port_4:
+ type: OS::Neutron::Port
+ properties:
+ network_id: { get_resource: DB_Network }
+
+ be1_port_5:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: Cricket_OCS_protected_net_id }
+ fixed_ips: [{"ip_address": {get_param: be1_Cricket_OCS_protected_ips}}]
+
+ be1_port_7:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: OAM_direct_net_id }
+ fixed_ips: [{"ip_address": {get_param: be1_OAM_direct_ips}}]
+
+ server_scp_be2:
+ type: OS::Nova::Server
+# depends on: db_wait_condition
+ properties:
+ name: { get_param: vm_scp_be2_name }
+ image: { get_param: image_scp_be_id }
+# availability_zone: { get_param: availability_zone_be2 }
+ flavor: { get_param: flavor_scp_be_id }
+ scheduler_hints: { group: { get_resource: BE_Affinity } }
+ networks:
+ - port: { get_resource: be2_port_3 }
+ - port: { get_resource: be2_port_4 }
+ - port: { get_resource: be2_port_5 }
+ - port: { get_resource: be2_port_7 }
+ metadata:
+ vnf_id: { get_param: vnf_id }
+ user_data:
+ str_replace:
+ template: |
+ #!/bin/bash
+ #todo: provision $vm_name
+ wc_notify --data-binary '{"status": "SUCCESS"}'
+ params:
+ $vm_name: {get_param: vm_scp_be2_name}
+# wc_notify: { get_attr: ['scp_be_wait_handle', 'curl_cli'] }
+
+ be2_port_3:
+ type: OS::Neutron::Port
+ properties:
+ network_id: { get_resource: Clustering_Network }
+
+ be2_port_4:
+ type: OS::Neutron::Port
+ properties:
+ network_id: { get_resource: DB_Network }
+
+ be2_port_5:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: Cricket_OCS_protected_net_id }
+ fixed_ips: [{"ip_address": {get_param: be2_Cricket_OCS_protected_ips}}]
+
+ be2_port_7:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: OAM_direct_net_id }
+ fixed_ips: [{"ip_address": {get_param: be2_OAM_direct_ips}}]
+
+ server_scp_be3:
+ type: OS::Nova::Server
+# depends on: db_wait_condition
+ properties:
+ name: { get_param: vm_scp_be3_name }
+ image: { get_param: image_scp_be_id }
+# availability_zone: { get_param: availability_zone_be3 }
+ flavor: { get_param: flavor_scp_be_id }
+ scheduler_hints: { group: { get_resource: BE_Affinity } }
+ networks:
+ - port: { get_resource: be3_port_3 }
+ - port: { get_resource: be3_port_4 }
+ - port: { get_resource: be3_port_5 }
+ - port: { get_resource: be3_port_7 }
+ metadata:
+ vnf_id: { get_param: vnf_id }
+ user_data:
+ str_replace:
+ template: |
+ #!/bin/bash
+ #todo: provision $vm_name
+ wc_notify --data-binary '{"status": "SUCCESS"}'
+ params:
+ $vm_name: {get_param: vm_scp_be3_name}
+# wc_notify: { get_attr: ['scp_be_wait_handle', 'curl_cli'] }
+
+ be3_port_3:
+ type: OS::Neutron::Port
+ properties:
+ network_id: { get_resource: Clustering_Network }
+
+ be3_port_4:
+ type: OS::Neutron::Port
+ properties:
+ network_id: { get_resource: DB_Network }
+
+ be3_port_5:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: Cricket_OCS_protected_net_id }
+ fixed_ips: [{"ip_address": {get_param: be3_Cricket_OCS_protected_ips}}]
+
+ be3_port_7:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: OAM_direct_net_id }
+ fixed_ips: [{"ip_address": {get_param: be3_OAM_direct_ips}}]
+
+ server_scp_be4:
+ type: OS::Nova::Server
+# depends on: db_wait_condition
+ properties:
+ name: { get_param: vm_scp_be4_name }
+ image: { get_param: image_scp_be_id }
+# availability_zone: { get_param: availability_zone_be4 }
+ flavor: { get_param: flavor_scp_be_id }
+ scheduler_hints: { group: { get_resource: BE_Affinity } }
+ networks:
+ - port: { get_resource: be4_port_3 }
+ - port: { get_resource: be4_port_4 }
+ - port: { get_resource: be4_port_5 }
+ - port: { get_resource: be4_port_7 }
+ metadata:
+ vnf_id: { get_param: vnf_id }
+ user_data:
+ str_replace:
+ template: |
+ #!/bin/bash
+ #todo: provision $vm_name
+ wc_notify --data-binary '{"status": "SUCCESS"}'
+ params:
+ $vm_name: {get_param: vm_scp_be4_name}
+# wc_notify: { get_attr: ['scp_be_wait_handle', 'curl_cli'] }
+
+ be4_port_3:
+ type: OS::Neutron::Port
+ properties:
+ network_id: { get_resource: Clustering_Network }
+
+ be4_port_4:
+ type: OS::Neutron::Port
+ properties:
+ network_id: { get_resource: DB_Network }
+
+ be4_port_5:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: Cricket_OCS_protected_net_id }
+ fixed_ips: [{"ip_address": {get_param: be4_Cricket_OCS_protected_ips}}]
+
+ be4_port_7:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: OAM_direct_net_id }
+ fixed_ips: [{"ip_address": {get_param: be4_OAM_direct_ips}}]
+
+ server_scp_fe0:
+ type: OS::Nova::Server
+# depends on: scp_be_wait_condition
+ properties:
+ name: { get_param: vm_scp_fe0_name }
+ image: { get_param: image_scp_fe_id }
+# availability_zone: { get_param: availability_zone_fe0 }
+ flavor: { get_param: flavor_scp_fe_id }
+ scheduler_hints: { group: { get_resource: FE_Affinity } }
+ networks:
+ - port: { get_resource: fe0_port_0 }
+ - port: { get_resource: fe0_port_2 }
+ - port: { get_resource: fe0_port_3 }
+ - port: { get_resource: fe0_port_7 }
+ metadata:
+ vnf_id: { get_param: vnf_id }
+ user_data:
+ str_replace:
+ template: |
+ #!/bin/bash
+ #todo: provision $vm_name
+ wc_notify --data-binary '{"status": "SUCCESS"}'
+ params:
+ $vm_name: {get_param: vm_scp_fe0_name}
+# wc_notify: { get_attr: ['scp_fe_wait_handle', 'curl_cli'] }
+
+ fe0_port_0:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: SIGNET_vrf_A1_direct_net_id }
+ fixed_ips: [{"ip_address": {get_param: fe0_SIGNET_vrf_A1_direct_ips}}]
+
+ fe0_port_2:
+ type: OS::Neutron::Port
+ properties:
+ network_id: { get_resource: FE_Clustering_KA }
+
+ fe0_port_3:
+ type: OS::Neutron::Port
+ properties:
+ network_id: { get_resource: Clustering_Network }
+
+ fe0_port_7:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: OAM_direct_net_id }
+ fixed_ips: [{"ip_address": {get_param: fe0_OAM_direct_ips}}]
+
+ server_scp_fe1:
+ type: OS::Nova::Server
+# depends on: scp_be_wait_condition
+ properties:
+ name: { get_param: vm_scp_fe1_name }
+ image: { get_param: image_scp_fe_id }
+# availability_zone: { get_param: availability_zone_fe1 }
+ flavor: { get_param: flavor_scp_fe_id }
+ scheduler_hints: { group: { get_resource: FE_Affinity } }
+ networks:
+ - port: { get_resource: fe1_port_1 }
+ - port: { get_resource: fe1_port_2 }
+ - port: { get_resource: fe1_port_3 }
+ - port: { get_resource: fe1_port_7 }
+ metadata:
+ vnf_id: { get_param: vnf_id }
+ user_data:
+ str_replace:
+ template: |
+ #!/bin/bash
+ #todo: provision $vm_name
+ wc_notify --data-binary '{"status": "SUCCESS"}'
+ params:
+ $vm_name: {get_param: vm_scp_fe1_name}
+# wc_notify: { get_attr: ['scp_fe_wait_handle', 'curl_cli'] }
+
+ fe1_port_1:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: SIGNET_vrf_B1_direct_net_id }
+ fixed_ips: [{"ip_address": {get_param: fe1_SIGNET_vrf_B1_direct_ips}}]
+
+ fe1_port_2:
+ type: OS::Neutron::Port
+ properties:
+ network_id: { get_resource: FE_Clustering_KA }
+
+ fe1_port_3:
+ type: OS::Neutron::Port
+ properties:
+ network_id: { get_resource: Clustering_Network }
+
+ fe1_port_7:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: OAM_direct_net_id }
+ fixed_ips: [{"ip_address": {get_param: fe1_OAM_direct_ips}}]
+
+ server_smp0:
+ type: OS::Nova::Server
+ properties:
+ name: { get_param: vm_smp0_name }
+ image: { get_param: image_smp_id }
+# availability_zone: { get_param: availability_zone_smp0 }
+ flavor: { get_param: flavor_smp_id }
+ scheduler_hints: { group: { get_resource: SMP_Affinity } }
+ networks:
+ - port: { get_resource: smp0_port_7 }
+ metadata:
+ vnf_id: { get_param: vnf_id }
+ user_data:
+ str_replace:
+ template: |
+ #!/bin/bash
+ #todo: provision $vm_name
+ wc_notify --data-binary '{"status": "SUCCESS"}'
+ params:
+ $vm_name: {get_param: vm_smp0_name}
+# wc_notify: { get_attr: ['smp_wait_handle', 'curl_cli'] }
+
+ smp0_port_7:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: OAM_direct_net_id }
+ fixed_ips: [{"ip_address": {get_param: smp0_OAM_direct_ips}}]
+
+ server_smp1:
+ type: OS::Nova::Server
+ properties:
+ name: { get_param: vm_smp1_name }
+ image: { get_param: image_smp_id }
+# availability_zone: { get_param: availability_zone_smp1 }
+ flavor: { get_param: flavor_smp_id }
+ scheduler_hints: { group: { get_resource: SMP_Affinity } }
+ networks:
+ - port: { get_resource: smp1_port_7 }
+ metadata:
+ vnf_id: { get_param: vnf_id }
+ user_data:
+ str_replace:
+ template: |
+ #!/bin/bash
+ #todo: provision $vm_name
+ wc_notify --data-binary '{"status": "SUCCESS"}'
+ params:
+ $vm_name: {get_param: vm_smp1_name}
+# wc_notify: { get_attr: ['smp_wait_handle', 'curl_cli'] }
+
+ smp1_port_7:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: OAM_direct_net_id }
+ fixed_ips: [{"ip_address": {get_param: smp1_OAM_direct_ips}}]
+
+ server_db0:
+ type: OS::Nova::Server
+# depends_on: smp_wait_condition
+ properties:
+ name: { get_param: vm_db0_name }
+ image: { get_param: image_db_id }
+# availability_zone: { get_param: availability_zone_db0 }
+ flavor: { get_param: flavor_db_id }
+ scheduler_hints: { group: { get_resource: DB_Affinity } }
+ networks:
+ - port: { get_resource: db0_port_4 }
+ - port: { get_resource: db0_port_7 }
+ metadata:
+ vnf_id: { get_param: vnf_id }
+ user_data:
+ str_replace:
+ template: |
+ #!/bin/bash
+ #todo: provision $vm_name
+ wc_notify --data-binary '{"status": "SUCCESS"}'
+ params:
+ $vm_name: {get_param: vm_db0_name}
+# wc_notify: { get_attr: ['db_wait_handle', 'curl_cli'] }
+
+ db0_port_4:
+ type: OS::Neutron::Port
+ properties:
+ network_id: { get_resource: DB_Network }
+
+ db0_port_7:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: OAM_direct_net_id }
+ fixed_ips: [{"ip_address": {get_param: db0_OAM_direct_ips}}]
+
+ server_db1:
+ type: OS::Nova::Server
+# depends_on: smp_wait_condition
+ properties:
+ name: { get_param: vm_db1_name }
+ image: { get_param: image_db_id }
+# availability_zone: { get_param: availability_zone_db1 }
+ flavor: { get_param: flavor_db_id }
+ scheduler_hints: { group: { get_resource: DB_Affinity } }
+ networks:
+ - port: { get_resource: db1_port_4 }
+ - port: { get_resource: db1_port_7 }
+ metadata:
+ vnf_id: { get_param: vnf_id }
+ user_data:
+ str_replace:
+ template: |
+ #!/bin/bash
+ #todo: provision $vm_name
+ wc_notify --data-binary '{"status": "SUCCESS"}'
+ params:
+ $vm_name: {get_param: vm_db1_name}
+# wc_notify: { get_attr: ['db_wait_handle', 'curl_cli'] }
+
+ db1_port_4:
+ type: OS::Neutron::Port
+ properties:
+ network_id: { get_resource: DB_Network }
+
+ db1_port_7:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: OAM_direct_net_id }
+ fixed_ips: [{"ip_address": {get_param: db1_OAM_direct_ips}}]
\ No newline at end of file
diff --git a/ui-ci-dev/src/main/resources/Files/InValid_tosca_File .yml b/ui-ci-dev/src/main/resources/Files/InValid_tosca_File .yml
new file mode 100644
index 0000000..4eea0a1
--- /dev/null
+++ b/ui-ci-dev/src/main/resources/Files/InValid_tosca_File .yml
@@ -0,0 +1,34 @@
+node_types:
+ org.openecomp.resource.MyCompute:
+ derived_from: tosca.nodes.Root
+ attributes:
+ private_address:
+ type: string
+ public_address:
+ type: string
+ networks:
+ type: map
+ entry_schema:
+ type: tosca.datatypes.network.NetworkInfo
+ ports:
+ type: map
+ entry_schema:
+ type: tosca.datatypes.network.PortInfo
+ requirements:
+ - local_storage:
+ capability: tosca.capabilities.Attachment
+ node: tosca.nodes.BlockStorage
+ relationship: tosca.relationships.AttachesTo
+ occurrences: [0, UNBOUNDED]
+ capabilities:
+ host:
+ type: tosca.capabilities.Container
+ valid_source_types: [tosca.nodes.SoftwareComponent]
+ endpoint :
+ type: tosca.capabilities.Endpoint.Admin
+ os:
+ type: tosca.capabilities.OperatingSystem
+ scalable:
+ type: tosca.capabilities.Scalable
+ binding:
+ type: tosca.capabilities.network.Bindable
diff --git a/ui-ci-dev/src/main/resources/Files/JDM_vf.yml b/ui-ci-dev/src/main/resources/Files/JDM_vf.yml
new file mode 100644
index 0000000..5a7edd4
--- /dev/null
+++ b/ui-ci-dev/src/main/resources/Files/JDM_vf.yml
@@ -0,0 +1,57 @@
+tosca_definitions_version: tosca_simple_yaml_1_0_0
+
+node_types:
+ org.openecomp.resource.vf.JDM:
+ derived_from: tosca.nodes.Root
+ properties:
+ att-part-number:
+ type: string
+ vendor-name:
+ type: string
+ vendor-part-number:
+ type: string
+ vendor-model:
+ type: string
+ vendor-model-description:
+ type: string
+ vcpu-default:
+ type: integer
+ vcpu-min:
+ type: integer
+ vcpu-max:
+ type: integer
+ vmemory-default:
+ type: integer
+ vmemory-units:
+ type: string
+ default: "GB"
+ vmemory-min:
+ type: integer
+ vmemory-max:
+ type: integer
+ vdisk-default:
+ type: integer
+ vdisk-units:
+ type: string
+ default: "GB"
+ vdisk-min:
+ type: integer
+ vdisk-max:
+ type: integer
+ vnf-type:
+ type: string
+ software-version:
+ type: string
+ software-version-state:
+ type: integer
+ software-file-name:
+ type: string
+ vnf-feature:
+ type: string
+ requirements:
+ - host:
+ capability: tosca.capabilities.Container
+ relationship: tosca.relationships.HostedOn
+ capabilities:
+ binding:
+ type: tosca.capabilities.network.Bindable
\ No newline at end of file
diff --git a/ui-ci-dev/src/main/resources/Files/JDM_vfc.yml b/ui-ci-dev/src/main/resources/Files/JDM_vfc.yml
new file mode 100644
index 0000000..b9c9ca0
--- /dev/null
+++ b/ui-ci-dev/src/main/resources/Files/JDM_vfc.yml
@@ -0,0 +1,57 @@
+tosca_definitions_version: tosca_simple_yaml_1_0_0
+
+node_types:
+ org.openecomp.resource.vfc.JDM:
+ derived_from: tosca.nodes.Root
+ properties:
+ att-part-number:
+ type: string
+ vendor-name:
+ type: string
+ vendor-part-number:
+ type: string
+ vendor-model:
+ type: string
+ vendor-model-description:
+ type: string
+ vcpu-default:
+ type: integer
+ vcpu-min:
+ type: integer
+ vcpu-max:
+ type: integer
+ vmemory-default:
+ type: integer
+ vmemory-units:
+ type: string
+ default: "GB"
+ vmemory-min:
+ type: integer
+ vmemory-max:
+ type: integer
+ vdisk-default:
+ type: integer
+ vdisk-units:
+ type: string
+ default: "GB"
+ vdisk-min:
+ type: integer
+ vdisk-max:
+ type: integer
+ vnf-type:
+ type: string
+ software-version:
+ type: string
+ software-version-state:
+ type: integer
+ software-file-name:
+ type: string
+ vnf-feature:
+ type: string
+ requirements:
+ - host:
+ capability: tosca.capabilities.Container
+ relationship: tosca.relationships.HostedOn
+ capabilities:
+ binding:
+ type: tosca.capabilities.network.Bindable
\ No newline at end of file
diff --git a/ui-ci-dev/src/main/resources/Files/Sample_CSAR.csar b/ui-ci-dev/src/main/resources/Files/Sample_CSAR.csar
new file mode 100644
index 0000000..fe95e79
--- /dev/null
+++ b/ui-ci-dev/src/main/resources/Files/Sample_CSAR.csar
Binary files differ
diff --git a/ui-ci-dev/src/main/resources/Files/Sample_CSAR2.csar b/ui-ci-dev/src/main/resources/Files/Sample_CSAR2.csar
new file mode 100644
index 0000000..3001fe8
--- /dev/null
+++ b/ui-ci-dev/src/main/resources/Files/Sample_CSAR2.csar
Binary files differ
diff --git a/ui-ci-dev/src/main/resources/Files/UCPE_VFC.yml b/ui-ci-dev/src/main/resources/Files/UCPE_VFC.yml
new file mode 100644
index 0000000..ef3966b
--- /dev/null
+++ b/ui-ci-dev/src/main/resources/Files/UCPE_VFC.yml
@@ -0,0 +1,65 @@
+tosca_definitions_version: tosca_simple_yaml_1_0_0
+
+node_types:
+ org.openecomp.resource.vfc.uCPE:
+ derived_from: tosca.nodes.Root
+ properties:
+ att-ucpe-part-number:
+ type: string
+ vendor-name:
+ type: string
+ required: true
+ vendor-model:
+ type: string
+ required: true
+ total-vcpu:
+ type: integer
+ description: number of vCPUs
+ total-memory:
+ type: integer
+ description: GB
+ total-disk:
+ type: integer
+ description: GB
+ base-system-image-file-name:
+ type: string
+ linux-host-vendor:
+ type: string
+ linux-host-os-version:
+ type: version
+ base-system-software:
+ type: string
+ jdm-vcpu:
+ type: integer
+ jdm-memory:
+ type: integer
+ description: GB
+ jdm-disk:
+ type: integer
+ description: GB
+ jdm-version:
+ type: string
+ jcp-vcpu:
+ type: integer
+ jcp-memory:
+ type: integer
+ description: GB
+ jcp-disk:
+ type: integer
+ description: GB
+ jcp-version:
+ type: version
+ capabilities:
+ vnf_hosting:
+ type: tosca.capabilities.Container
+ description: Provides hosting capability for VNFs
+ WAN_connectivity:
+ type: tosca.capabilities.network.Bindable
+ valid_source_types: [org.openecomp.cp.Wan]
+ description: external WAN1 n/w interface
+ occurrences: [1,2]
+ LAN_connectivity:
+ type: tosca.capabilities.network.Bindable
+ valid_source_types: [org.openecomp.cp.Lan]
+ description: external LAN n/w interface
+ occurrences: [1,8]
\ No newline at end of file
diff --git a/ui-ci-dev/src/main/resources/Files/VF.yml b/ui-ci-dev/src/main/resources/Files/VF.yml
new file mode 100644
index 0000000..ec08990
--- /dev/null
+++ b/ui-ci-dev/src/main/resources/Files/VF.yml
@@ -0,0 +1,17 @@
+tosca_definitions_version: tosca_simple_yaml_1_0_0
+
+node_types:
+ org.openecomp.resource.vf.VFF:
+ derived_from: tosca.nodes.Root
+ properties:
+ vendor:
+ type: string
+ required: false
+ vl_name:
+ type: string
+ required: false
+ capabilities:
+ virtual_linkable:
+ type: tosca.capabilities.network.Linkable
+
+
\ No newline at end of file
diff --git a/ui-ci-dev/src/main/resources/Files/VFC.yml b/ui-ci-dev/src/main/resources/Files/VFC.yml
new file mode 100644
index 0000000..853ed35
--- /dev/null
+++ b/ui-ci-dev/src/main/resources/Files/VFC.yml
@@ -0,0 +1,77 @@
+tosca_definitions_version: tosca_simple_yaml_1_0_0
+
+node_types:
+ org.openecomp.resource.vfc.vRouter:
+ derived_from: tosca.nodes.Root
+ properties:
+ att-part-number:
+ type: string
+ vendor-name:
+ type: string
+ vendor-part-number:
+ type: string
+ vendor-model:
+ type: string
+ vendor-model-description:
+ type: string
+ vcpu-default:
+ type: integer
+ vcpu-min:
+ type: integer
+ vcpu-max:
+ type: integer
+ vmemory-default:
+ type: integer
+ vmemory-units:
+ type: string
+ default: "GB"
+ vmemory-min:
+ type: integer
+ vmemory-max:
+ type: integer
+ vdisk-default:
+ type: integer
+ vdisk-units:
+ type: string
+ default: "GB"
+ vdisk-min:
+ type: integer
+ vdisk-max:
+ type: integer
+ vnf-type:
+ type: string
+ software-version:
+ type: string
+ software-version-state:
+ type: integer
+ software-file-name:
+ type: string
+ vnf-feature:
+ type: string
+ management-v6-address:
+ type: string
+ nm-lan-v6-address:
+ type: string
+ nm-lan-v6-prefix-length:
+ type: string
+ management-v4-address:
+ type: string
+ nm-lan-v4-address:
+ type: string
+ nm-lan-v4-prefix-length:
+ type: string
+ routing-instance-name:
+ type: string
+ routing-instances:
+ type: map
+ entry_schema:
+ type: string
+ requirements:
+ - host:
+ capability: tosca.capabilities.Container
+ relationship: tosca.relationships.HostedOn
+ capabilities:
+ binding:
+ type: tosca.capabilities.network.Bindable
+ occurrences: [1,UNBOUNDED]
+
\ No newline at end of file
diff --git a/ui-ci-dev/src/main/resources/Files/VFCWithAttributes.yml b/ui-ci-dev/src/main/resources/Files/VFCWithAttributes.yml
new file mode 100644
index 0000000..133fd02
--- /dev/null
+++ b/ui-ci-dev/src/main/resources/Files/VFCWithAttributes.yml
@@ -0,0 +1,43 @@
+tosca_definitions_version: tosca_simple_yaml_1_0_0
+
+node_types:
+ org.openecomp.resource.vfc.VFC:
+ derived_from: tosca.nodes.Root
+ properties:
+ jcp-memory:
+ type: integer
+ description: GB
+ jcp-disk:
+ type: integer
+ description: GB
+ jcp-version:
+ type: version
+ attributes:
+ my_attr:
+ type: integer
+ private_address:
+ type: string
+ public_address:
+ type: string
+ networks:
+ type: map
+ entry_schema:
+ type: tosca.datatypes.network.NetworkInfo
+ ports:
+ type: map
+ entry_schema:
+ type: tosca.datatypes.network.PortInfo
+ capabilities:
+ vnf_hosting:
+ type: tosca.capabilities.Container
+ description: Provides hosting capability for VNFs
+ WAN_connectivity:
+ type: tosca.capabilities.network.Bindable
+ valid_source_types: [org.openecomp.cp.Wan]
+ description: external WAN1 n/w interface
+ occurrences: [1,2]
+ LAN_connectivity:
+ type: tosca.capabilities.network.Bindable
+ valid_source_types: [org.openecomp.cp.Lan]
+ description: external LAN n/w interface
+ occurrences: [1,8]
\ No newline at end of file
diff --git a/ui-ci-dev/src/main/resources/Files/VL.yml b/ui-ci-dev/src/main/resources/Files/VL.yml
new file mode 100644
index 0000000..74a2405
--- /dev/null
+++ b/ui-ci-dev/src/main/resources/Files/VL.yml
@@ -0,0 +1,17 @@
+tosca_definitions_version: tosca_simple_yaml_1_0_0
+
+node_types:
+ org.openecomp.resource.vl.VL1we23:
+ derived_from: tosca.nodes.Root
+ properties:
+ vendor:
+ type: string
+ required: false
+ vl_name:
+ type: string
+ required: false
+ capabilities:
+ virtual_linkable:
+ type: tosca.capabilities.network.Linkable
+
+
\ No newline at end of file
diff --git a/ui-ci-dev/src/main/resources/Files/Valid xml.xml b/ui-ci-dev/src/main/resources/Files/Valid xml.xml
new file mode 100644
index 0000000..0d67e48
--- /dev/null
+++ b/ui-ci-dev/src/main/resources/Files/Valid xml.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<dirs>
+<entry loc="C:\Program Files\Java\jdk1.7.0_79" stamp="1449076618518"/>
+</dirs>
diff --git a/ui-ci-dev/src/main/resources/Files/Valid_tosca_Mycompute.yml b/ui-ci-dev/src/main/resources/Files/Valid_tosca_Mycompute.yml
new file mode 100644
index 0000000..8fac5e1
--- /dev/null
+++ b/ui-ci-dev/src/main/resources/Files/Valid_tosca_Mycompute.yml
@@ -0,0 +1,35 @@
+tosca_definitions_version: tosca_simple_yaml_1_0_0
+node_types:
+ org.openecomp.resource.vf.Database:
+ derived_from: tosca.nodes.Root
+ attributes:
+ private_address:
+ type: string
+ public_address:
+ type: string
+ networks:
+ type: map
+ entry_schema:
+ type: tosca.datatypes.network.NetworkInfo
+ ports:
+ type: map
+ entry_schema:
+ type: tosca.datatypes.network.PortInfo
+ requirements:
+ - local_storage:
+ capability: tosca.capabilities.Attachment
+ node: tosca.nodes.BlockStorage
+ relationship: tosca.relationships.AttachesTo
+ occurrences: [0, UNBOUNDED]
+ capabilities:
+ host:
+ type: tosca.capabilities.Container
+ valid_source_types: [tosca.nodes.SoftwareComponent]
+ endpoint :
+ type: tosca.capabilities.Endpoint.Admin
+ os:
+ type: tosca.capabilities.OperatingSystem
+ scalable:
+ type: tosca.capabilities.Scalable
+ binding:
+ type: tosca.capabilities.network.Bindable
diff --git a/ui-ci-dev/src/main/resources/Files/Valid_tosca_ReplaceTest.yml b/ui-ci-dev/src/main/resources/Files/Valid_tosca_ReplaceTest.yml
new file mode 100644
index 0000000..90e771d
--- /dev/null
+++ b/ui-ci-dev/src/main/resources/Files/Valid_tosca_ReplaceTest.yml
@@ -0,0 +1,35 @@
+tosca_definitions_version: tosca_simple_yaml_1_0_0
+node_types:
+ org.openecomp.resource.VF.MyCompute:
+ derived_from: tosca.nodes.Root
+ attributes:
+ private_address:
+ type: string
+ public_address:
+ type: string
+ networks:
+ type: map
+ entry_schema:
+ type: tosca.datatypes.network.NetworkInfo
+ ports:
+ type: map
+ entry_schema:
+ type: tosca.datatypes.network.PortInfo
+ requirements:
+ - local_storage:
+ capability: tosca.capabilities.Attachment
+ node: tosca.nodes.BlockStorage
+ relationship: tosca.relationships.AttachesTo
+ occurrences: [0, UNBOUNDED]
+ capabilities:
+ host:
+ type: tosca.capabilities.Container
+ valid_source_types: [tosca.nodes.SoftwareComponent]
+ endpoint :
+ type: tosca.capabilities.Endpoint.Admin
+ os:
+ type: tosca.capabilities.OperatingSystem
+ scalable:
+ type: tosca.capabilities.Scalable
+ binding:
+ type: tosca.capabilities.network.Bindable
diff --git a/ui-ci-dev/src/main/resources/Files/hot-nimbus-oam-volumes_v0.3.env b/ui-ci-dev/src/main/resources/Files/hot-nimbus-oam-volumes_v0.3.env
new file mode 100644
index 0000000..b494d8c
--- /dev/null
+++ b/ui-ci-dev/src/main/resources/Files/hot-nimbus-oam-volumes_v0.3.env
@@ -0,0 +1,6 @@
+parameters:
+ pcrf_oam_vol_size: 500
+ pcrf_oam_volume_silver-1: Silver
+ pcrf_oam_volume_silver-2: Silver
+ pcrf_oam_vol_name_1: sde1-pcrfx01-oam001-vol-1
+ pcrf_oam_vol_name_2: sde1-pcrfx01-oam001-vol-2
\ No newline at end of file
diff --git a/ui-ci-dev/src/main/resources/Files/hot-nimbus-oam_v0.6.env b/ui-ci-dev/src/main/resources/Files/hot-nimbus-oam_v0.6.env
new file mode 100644
index 0000000..cf7cf71
--- /dev/null
+++ b/ui-ci-dev/src/main/resources/Files/hot-nimbus-oam_v0.6.env
@@ -0,0 +1,18 @@
+parameters:
+ pcrf_oam_server_names: ZRDM1PCRF01OAM001,ZRDM1PCRF01OAM002
+ pcrf_oam_image_name: PCRF_8.995-ATTM1.0.3.qcow2
+ pcrf_oam_flavor_name: lc.4xlarge4
+ availabilityzone_name: nova
+ pcrf_cps_net_name: int_pcrf_net_0
+ pcrf_cps_net_ips: 172.26.16.111,172.26.16.112
+ pcrf_arbiter_vip: 172.26.16.115
+ pcrf_cps_net_mask: 255.255.255.0
+ pcrf_oam_net_name: oam_protected_net_0
+ pcrf_oam_net_ips: 107.239.64.117,107.239.64.118
+ pcrf_oam_net_gw: 107.239.64.1
+ pcrf_oam_net_mask: 255.255.248.0
+ pcrf_oam_volume_id_1: a4aa05fb-fcdc-457b-8077-6845fdfc3257
+ pcrf_oam_volume_id_2: 93d8fc1f-f1c3-4933-86b2-039881ee910f
+ pcrf_security_group_name: nimbus_security_group
+ pcrf_vnf_id: 730797234b4a40aa99335157b02871cd
+
diff --git a/ui-ci-dev/src/main/resources/Files/hot-nimbus-oam_v0.6.yaml b/ui-ci-dev/src/main/resources/Files/hot-nimbus-oam_v0.6.yaml
new file mode 100644
index 0000000..6636eba
--- /dev/null
+++ b/ui-ci-dev/src/main/resources/Files/hot-nimbus-oam_v0.6.yaml
@@ -0,0 +1,108 @@
+heat_template_version: 2013-05-23
+
+description: heat template that creates multiple PCRF OAM nodes stack
+
+parameters:
+ pcrf_oam_server_names:
+ type: comma_delimited_list
+ label: PCRF OAM server names
+ description: name of the PCRF OAM instance
+ pcrf_oam_image_name:
+ type: string
+ label: PCRF OAM image name
+ description: PCRF OAM image name
+ pcrf_oam_flavor_name:
+ type: string
+ label: PCRF OAM flavor name
+ description: flavor name of PCRF OAM instance
+ availabilityzone_name:
+ type: string
+ label: availabilityzone name
+ description: availabilityzone name
+ pcrf_cps_net_name:
+ type: string
+ label: CPS network name
+ description: CPS network name
+ pcrf_cps_net_ips:
+ type: comma_delimited_list
+ label: CPS network ips
+ description: CPS network ips
+ pcrf_cps_net_mask:
+ type: string
+ label: CPS network mask
+ description: CPS network mask
+ pcrf_arbiter_vip:
+ type: string
+ label: OAM Arbiter LB VIP
+ description: OAM Arbiter LB VIP
+ pcrf_oam_net_name:
+ type: string
+ label: OAM network name
+ description: OAM network name
+ pcrf_oam_net_ips:
+ type: comma_delimited_list
+ label: OAM network ips
+ description: OAM network ips
+ pcrf_oam_net_gw:
+ type: string
+ label: CPS network gateway
+ description: CPS network gateway
+ pcrf_oam_net_mask:
+ type: string
+ label: CPS network mask
+ description: CPS network mask
+ pcrf_oam_volume_id_1:
+ type: string
+ label: CPS OAM 001 Cinder Volume
+ description: CPS OAM 001 Cinder Volumes
+ pcrf_oam_volume_id_2:
+ type: string
+ label: CPS OAM 002 Cinder Volume
+ description: CPS OAM 002 Cinder Volumes
+ pcrf_security_group_name:
+ type: string
+ label: security group name
+ description: the name of security group
+ pcrf_vnf_id:
+ type: string
+ label: PCRF VNF Id
+ description: PCRF VNF Id
+
+resources:
+ server_pcrf_oam_001:
+ type: nested-oam_v0.2.yaml
+ properties:
+ pcrf_oam_server_name: { get_param: [pcrf_oam_server_names, 0] }
+ pcrf_oam_image_name: { get_param: pcrf_oam_image_name }
+ pcrf_oam_flavor_name: { get_param: pcrf_oam_flavor_name }
+ availabilityzone_name: { get_param: availabilityzone_name }
+ pcrf_security_group_name: { get_param: pcrf_security_group_name }
+ pcrf_oam_volume_id: { get_param: pcrf_oam_volume_id_1 }
+ pcrf_cps_net_name: { get_param: pcrf_cps_net_name }
+ pcrf_cps_net_ip: { get_param: [pcrf_cps_net_ips, 0] }
+ pcrf_cps_net_mask: { get_param: pcrf_cps_net_mask }
+ pcrf_oam_net_name: { get_param: pcrf_oam_net_name }
+ pcrf_oam_net_ip: { get_param: [pcrf_oam_net_ips, 0] }
+ pcrf_oam_net_mask: { get_param: pcrf_oam_net_mask }
+ pcrf_oam_net_gw: { get_param: pcrf_oam_net_gw }
+ pcrf_arbiter_vip: { get_param: pcrf_arbiter_vip }
+ pcrf_vnf_id: {get_param: pcrf_vnf_id}
+
+ server_pcrf_oam_002:
+ type: nested-oam_v0.2.yaml
+ properties:
+ pcrf_oam_server_name: { get_param: [pcrf_oam_server_names, 1] }
+ pcrf_oam_image_name: { get_param: pcrf_oam_image_name }
+ pcrf_oam_flavor_name: { get_param: pcrf_oam_flavor_name }
+ availabilityzone_name: { get_param: availabilityzone_name }
+ pcrf_security_group_name: { get_param: pcrf_security_group_name }
+ pcrf_oam_volume_id: { get_param: pcrf_oam_volume_id_2 }
+ pcrf_cps_net_name: { get_param: pcrf_cps_net_name }
+ pcrf_cps_net_ip: { get_param: [pcrf_cps_net_ips, 1] }
+ pcrf_cps_net_mask: { get_param: pcrf_cps_net_mask }
+ pcrf_oam_net_name: { get_param: pcrf_oam_net_name }
+ pcrf_oam_net_ip: { get_param: [pcrf_oam_net_ips, 1] }
+ pcrf_oam_net_mask: { get_param: pcrf_oam_net_mask }
+ pcrf_oam_net_gw: { get_param: pcrf_oam_net_gw }
+ pcrf_arbiter_vip: { get_param: pcrf_arbiter_vip }
+ pcrf_vnf_id: {get_param: pcrf_vnf_id}
diff --git a/ui-ci-dev/src/main/resources/Files/hot-nimbus-pcm_v0.6.yaml b/ui-ci-dev/src/main/resources/Files/hot-nimbus-pcm_v0.6.yaml
new file mode 100644
index 0000000..5641041
--- /dev/null
+++ b/ui-ci-dev/src/main/resources/Files/hot-nimbus-pcm_v0.6.yaml
@@ -0,0 +1,80 @@
+heat_template_version: 2013-05-23
+
+description: heat template that creates PCRF Cluman stack
+
+parameters:
+ pcrf_pcm_server_names:
+ type: comma_delimited_list
+ label: PCRF CM server names
+ description: name of the PCRF CM instance
+ pcrf_pcm_image_name:
+ type: string
+ label: PCRF CM image name
+ description: PCRF CM image name
+ pcrf_pcm_flavor_name:
+ type: string
+ label: PCRF CM flavor name
+ description: flavor name of PCRF CM instance
+ availabilityzone_name:
+ type: string
+ label: availabilityzone name
+ description: availabilityzone name
+ pcrf_cps_net_name:
+ type: string
+ label: CPS network name
+ description: CPS network name
+ pcrf_cps_net_ips:
+ type: comma_delimited_list
+ label: CPS network ips
+ description: CPS network ips
+ pcrf_cps_net_mask:
+ type: string
+ label: CPS network mask
+ description: CPS network mask
+ pcrf_oam_net_name:
+ type: string
+ label: OAM network name
+ description: OAM network name
+ pcrf_oam_net_ips:
+ type: comma_delimited_list
+ label: OAM network ips
+ description: OAM network ips
+ pcrf_oam_net_gw:
+ type: string
+ label: CPS network gateway
+ description: CPS network gateway
+ pcrf_oam_net_mask:
+ type: string
+ label: CPS network mask
+ description: CPS network mask
+ pcrf_pcm_volume_id_1:
+ type: string
+ label: CPS Cluman Cinder Volume
+ description: CPS Cluman Cinder Volume
+ pcrf_security_group_name:
+ type: string
+ label: security group name
+ description: the name of security group
+ pcrf_vnf_id:
+ type: string
+ label: PCRF VNF Id
+ description: PCRF VNF Id
+
+resources:
+ server_pcrf_pcm_001:
+ type: nested-pcm_v0.2.yaml
+ properties:
+ pcrf_pcm_server_name: { get_param: [pcrf_pcm_server_names, 0] }
+ pcrf_pcm_image_name: { get_param: pcrf_pcm_image_name }
+ pcrf_pcm_flavor_name: { get_param: pcrf_pcm_flavor_name }
+ availabilityzone_name: { get_param: availabilityzone_name }
+ pcrf_security_group_name: { get_param: pcrf_security_group_name }
+ pcrf_pcm_volume_id: { get_param: pcrf_pcm_volume_id_1 }
+ pcrf_cps_net_name: { get_param: pcrf_cps_net_name }
+ pcrf_cps_net_ip: { get_param: [pcrf_cps_net_ips, 0] }
+ pcrf_cps_net_mask: { get_param: pcrf_cps_net_mask }
+ pcrf_oam_net_name: { get_param: pcrf_oam_net_name }
+ pcrf_oam_net_ip: { get_param: [pcrf_oam_net_ips, 0] }
+ pcrf_oam_net_mask: { get_param: pcrf_oam_net_mask }
+ pcrf_oam_net_gw: { get_param: pcrf_oam_net_gw }
+ pcrf_vnf_id: {get_param: pcrf_vnf_id}
diff --git a/ui-ci-dev/src/main/resources/Files/myYang.xml b/ui-ci-dev/src/main/resources/Files/myYang.xml
new file mode 100644
index 0000000..0d86d21
--- /dev/null
+++ b/ui-ci-dev/src/main/resources/Files/myYang.xml
@@ -0,0 +1,8 @@
+<beans xmlns="http://www.springframework.org/schema/beans"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.springframework.org/schema/beans
+ http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
+
+ <bean id="muranoLogic" class="org.openecomp.sdc.impl.MuranoLogic"> </bean>
+
+</beans>
\ No newline at end of file
diff --git a/ui-ci-dev/src/main/resources/Files/mycompute.yml b/ui-ci-dev/src/main/resources/Files/mycompute.yml
new file mode 100644
index 0000000..c8a0c03
--- /dev/null
+++ b/ui-ci-dev/src/main/resources/Files/mycompute.yml
@@ -0,0 +1,18 @@
+tosca_definitions_version: tosca_simple_yaml_1_0_0
+node_types:
+ org.openecomp.resource.vfc.mycompute:
+ derived_from: tosca.nodes.Compute
+ capabilities:
+ scalable:
+ type: tosca.capabilities.Scalable
+ properties:
+ propertyForTest:
+ type: string
+ description: test
+ required: true
+ default: success
+ # min_instances property should override property from tosca.capabilities.Scalable
+ min_instances:
+ type: integer
+ default: 3
+
diff --git a/ui-ci-dev/src/main/resources/Files/service_with_inputs.csar b/ui-ci-dev/src/main/resources/Files/service_with_inputs.csar
new file mode 100644
index 0000000..c4d4881
--- /dev/null
+++ b/ui-ci-dev/src/main/resources/Files/service_with_inputs.csar
Binary files differ
diff --git a/ui-ci-dev/src/main/resources/Files/vADTRAN.zip b/ui-ci-dev/src/main/resources/Files/vADTRAN.zip
new file mode 100644
index 0000000..3ecde2c
--- /dev/null
+++ b/ui-ci-dev/src/main/resources/Files/vADTRAN.zip
Binary files differ
diff --git a/ui-ci-dev/src/main/resources/Files/vCDN.zip b/ui-ci-dev/src/main/resources/Files/vCDN.zip
new file mode 100644
index 0000000..51e654a
--- /dev/null
+++ b/ui-ci-dev/src/main/resources/Files/vCDN.zip
Binary files differ
diff --git a/ui-ci-dev/src/main/resources/Files/vFW_VF.yml b/ui-ci-dev/src/main/resources/Files/vFW_VF.yml
new file mode 100644
index 0000000..100883e
--- /dev/null
+++ b/ui-ci-dev/src/main/resources/Files/vFW_VF.yml
@@ -0,0 +1,58 @@
+tosca_definitions_version: tosca_simple_yaml_1_0_0
+
+node_types:
+
+ org.openecomp.resource.vf.vFW:
+ derived_from: tosca.nodes.Root
+ properties:
+ att-part-number:
+ type: string
+ vendor-name:
+ type: string
+ vendor-part-number:
+ type: string
+ vendor-model:
+ type: string
+ vendor-model-description:
+ type: string
+ vcpu-default:
+ type: integer
+ vcpu-min:
+ type: integer
+ vcpu-max:
+ type: integer
+ vmemory-default:
+ type: integer
+ vmemory-units:
+ type: string
+ default: "GB"
+ vmemory-min:
+ type: integer
+ vmemory-max:
+ type: integer
+ vdisk-default:
+ type: integer
+ vdisk-units:
+ type: string
+ default: "GB"
+ vdisk-min:
+ type: integer
+ vdisk-max:
+ type: integer
+ vnf-type:
+ type: string
+ software-version:
+ type: version
+ software-version-state:
+ type: integer
+ software-file-name:
+ type: string
+ vnf-feature:
+ type: string
+ requirements:
+ - host:
+ capability: tosca.capabilities.Container
+ relationship: tosca.relationships.HostedOn
+ capabilities:
+ binding:
+ type: tosca.capabilities.network.Bindable
\ No newline at end of file
diff --git a/ui-ci-dev/src/main/resources/Files/vFW_VFC.yml b/ui-ci-dev/src/main/resources/Files/vFW_VFC.yml
new file mode 100644
index 0000000..d0814c4
--- /dev/null
+++ b/ui-ci-dev/src/main/resources/Files/vFW_VFC.yml
@@ -0,0 +1,58 @@
+tosca_definitions_version: tosca_simple_yaml_1_0_0
+
+node_types:
+
+ org.openecomp.resource.vfc.vFW:
+ derived_from: tosca.nodes.Root
+ properties:
+ att-part-number:
+ type: string
+ vendor-name:
+ type: string
+ vendor-part-number:
+ type: string
+ vendor-model:
+ type: string
+ vendor-model-description:
+ type: string
+ vcpu-default:
+ type: integer
+ vcpu-min:
+ type: integer
+ vcpu-max:
+ type: integer
+ vmemory-default:
+ type: integer
+ vmemory-units:
+ type: string
+ default: "GB"
+ vmemory-min:
+ type: integer
+ vmemory-max:
+ type: integer
+ vdisk-default:
+ type: integer
+ vdisk-units:
+ type: string
+ default: "GB"
+ vdisk-min:
+ type: integer
+ vdisk-max:
+ type: integer
+ vnf-type:
+ type: string
+ software-version:
+ type: version
+ software-version-state:
+ type: integer
+ software-file-name:
+ type: string
+ vnf-feature:
+ type: string
+ requirements:
+ - host:
+ capability: tosca.capabilities.Container
+ relationship: tosca.relationships.HostedOn
+ capabilities:
+ binding:
+ type: tosca.capabilities.network.Bindable
\ No newline at end of file
diff --git a/ui-ci-dev/src/main/resources/Files/vRouter_vfc.yml b/ui-ci-dev/src/main/resources/Files/vRouter_vfc.yml
new file mode 100644
index 0000000..95ffe95
--- /dev/null
+++ b/ui-ci-dev/src/main/resources/Files/vRouter_vfc.yml
@@ -0,0 +1,78 @@
+tosca_definitions_version: tosca_simple_yaml_1_0_0
+
+
+node_types:
+ org.openecomp.resource.vfc.vRouter:
+ derived_from: tosca.nodes.Root
+ properties:
+ att-part-number:
+ type: string
+ vendor-name:
+ type: string
+ vendor-part-number:
+ type: string
+ vendor-model:
+ type: string
+ vendor-model-description:
+ type: string
+ vcpu-default:
+ type: integer
+ vcpu-min:
+ type: integer
+ vcpu-max:
+ type: integer
+ vmemory-default:
+ type: integer
+ vmemory-units:
+ type: string
+ default: "GB"
+ vmemory-min:
+ type: integer
+ vmemory-max:
+ type: integer
+ vdisk-default:
+ type: integer
+ vdisk-units:
+ type: string
+ default: "GB"
+ vdisk-min:
+ type: integer
+ vdisk-max:
+ type: integer
+ vnf-type:
+ type: string
+ software-version:
+ type: string
+ software-version-state:
+ type: integer
+ software-file-name:
+ type: string
+ vnf-feature:
+ type: string
+ management-v6-address:
+ type: string
+ nm-lan-v6-address:
+ type: string
+ nm-lan-v6-prefix-length:
+ type: string
+ management-v4-address:
+ type: string
+ nm-lan-v4-address:
+ type: string
+ nm-lan-v4-prefix-length:
+ type: string
+ routing-instance-name:
+ type: string
+ routing-instances:
+ type: map
+ entry_schema:
+ type: string
+ requirements:
+ - host:
+ capability: tosca.capabilities.Container
+ relationship: tosca.relationships.HostedOn
+ capabilities:
+ binding:
+ type: tosca.capabilities.network.Bindable
+ occurrences: [1,UNBOUNDED]
+
\ No newline at end of file
diff --git a/ui-ci-dev/src/main/resources/Files/valid HEAT_ENV files.env b/ui-ci-dev/src/main/resources/Files/valid HEAT_ENV files.env
new file mode 100644
index 0000000..e576c0f
--- /dev/null
+++ b/ui-ci-dev/src/main/resources/Files/valid HEAT_ENV files.env
@@ -0,0 +1,54 @@
+parameters:
+ flavor_scp_be_id: m1.small
+ flavor_scp_fe_id: m1.small
+ flavor_smp_id: m1.small
+ flavor_db_id: m1.small
+ image_scp_be_id: CCLINUX
+ image_scp_fe_id: CCLINUX
+ image_smp_id: CCLINUX
+ image_db_id: CCLINUX
+
+ int_vscp_fe_cluster_net_id: int_vscp_fe_cluster_net
+ int_vscp_fe_cluster_cidr: 172.26.2.0/24
+ int_vscp_cluster_net_id: int_vscp_cluster_net
+ int_vscp_cluster_cidr: 172.26.3.0/24
+ int_vscp_db_network_net_id: int_vscp_db_network_net
+ int_vscp_db_network_cidr: 172.26.1.0/24
+
+ SIGNET_vrf_A1_direct_net_id: SIGNET_vrf_A1_direct_net
+ SIGNET_vrf_B1_direct_net_id: SIGNET_vrf_B1_direct_net
+ Cricket_OCS_protected_net_id: Cricket_OCS_protected_net
+# OAM_direct_net_id: OAM_net
+# OAM_direct_net_id: oam-direct-net
+ OAM_direct_net_id: Marks_OAM_direct_net
+
+ be0_Cricket_OCS_protected_ips: 107.239.15.17
+ be1_Cricket_OCS_protected_ips: 107.239.15.18
+ be2_Cricket_OCS_protected_ips: 107.239.15.19
+ be3_Cricket_OCS_protected_ips: 107.239.15.20
+ be4_Cricket_OCS_protected_ips: 107.239.15.21
+ be0_OAM_direct_ips: 10.250.10.33
+ be1_OAM_direct_ips: 10.250.10.34
+ be2_OAM_direct_ips: 10.250.10.35
+ be3_OAM_direct_ips: 10.250.10.36
+ be4_OAM_direct_ips: 10.250.10.37
+ fe0_SIGNET_vrf_A1_direct_ips: 172.26.4.1
+ fe0_OAM_direct_ips: 10.250.10.38
+ fe1_SIGNET_vrf_B1_direct_ips: 172.26.4.5
+ fe1_OAM_direct_ips: 10.250.10.39
+ smp0_OAM_direct_ips: 10.250.10.40
+ smp1_OAM_direct_ips: 10.250.10.41
+ db0_OAM_direct_ips: 10.250.10.42
+ db1_OAM_direct_ips: 10.250.10.43
+
+ vm_scp_be0_name: vSCP_BE0
+ vm_scp_be1_name: vSCP_BE1
+ vm_scp_be2_name: vSCP_BE2
+ vm_scp_be3_name: vSCP_BE3
+ vm_scp_be4_name: vSCP_BE4
+ vm_scp_fe0_name: vSCP_FE0
+ vm_scp_fe1_name: vSCP_FE1
+ vm_smp0_name: vSMP0
+ vm_smp1_name: vSMP1
+ vm_db0_name: vDB0
+ vm_db1_name: vDB1
diff --git a/ui-ci-dev/src/main/resources/Files/validHEATfiles.yaml b/ui-ci-dev/src/main/resources/Files/validHEATfiles.yaml
new file mode 100644
index 0000000..6835485
--- /dev/null
+++ b/ui-ci-dev/src/main/resources/Files/validHEATfiles.yaml
@@ -0,0 +1,787 @@
+heat_template_version: 2013-05-23
+#################################
+#
+# Changes in v0.2:
+# - Unique availability zone for each VM
+# - LAN8 and SLAN networks removed according to latest Prod/Type I diagram
+# - 2 DB VMs added
+# - Images corrected
+# - VM start-up order: SMP->DB->BE->FE (no error handling yet)
+# - Provisioning scripts placeholders
+#
+#################################
+
+description: ASC Template
+
+parameters:
+# availability_zone_smp0:
+# type: string
+# default: nova
+# availability_zone_smp1:
+# type: string
+# default: nova
+# availability_zone_fe0:
+# type: string
+# default: nova
+# availability_zone_fe1:
+# type: string
+# default: nova
+# availability_zone_db0:
+# type: string
+# default: nova
+# availability_zone_db1:
+# type: string
+# default: nova
+# availability_zone_be0:
+# type: string
+# default: nova
+# availability_zone_be1:
+# type: string
+# default: nova
+# availability_zone_be2:
+# type: string
+# default: nova
+# availability_zone_be3:
+# type: string
+# default: nova
+# availability_zone_be4:
+# type: string
+# default: nova
+
+ vnf_name:
+ type: string
+ description: Unique name for this VNF instance
+ default: This_is_the_SCP_name
+ vnf_id:
+ type: string
+ description: Unique ID for this VNF instance
+ default: This_is_ths_SCP_id
+
+ flavor_scp_be_id:
+ type: string
+ description: flavor type
+ default: a1.Small
+ flavor_scp_fe_id:
+ type: string
+ description: flavor type
+ default: a1.Small
+ flavor_smp_id:
+ type: string
+ description: flavor type
+ default: a1.Small
+ flavor_db_id:
+ type: string
+ description: flavor type
+ default: a1.Small
+ image_scp_be_id:
+ type: string
+ description: Image use to boot a server
+ default: asc_base_image_be
+ image_scp_fe_id:
+ type: string
+ description: Image use to boot a server
+ default: asc_base_image_fe
+ image_smp_id:
+ type: string
+ description: Image use to boot a server
+ default: asc_base_image_smp
+ image_db_id:
+ type: string
+ description: Image use to boot a server
+ default: asc_base_image_db
+
+ int_vscp_fe_cluster_net_id:
+ type: string
+ description: LAN2 FE Cluster/KA
+ int_vscp_fe_cluster_cidr:
+ type: string
+ description: Private Network2 Address (CIDR notation)
+ int_vscp_cluster_net_id:
+ type: string
+ description: LAN3 Cluster
+ int_vscp_cluster_cidr:
+ type: string
+ description: Private Network3 Address (CIDR notation)
+ int_vscp_db_network_net_id:
+ type: string
+ description: LAN4 DB
+ int_vscp_db_network_cidr:
+ type: string
+ description: Private Network4 Address (CIDR notation)
+ SIGNET_vrf_A1_direct_net_id:
+ type: string
+ description: Network name for SIGTRAN_A
+ SIGNET_vrf_B1_direct_net_id:
+ type: string
+ description: Network name for SIGTRAN_B
+ Cricket_OCS_protected_net_id:
+ type: string
+ description: Network name for CRICKET_OCS
+ OAM_direct_net_id:
+ type: string
+ description: Network name for OAM
+ be0_Cricket_OCS_protected_ips:
+ type: string
+ label: be0 port 5 OAM ip address
+ description: be0 port 5 OAM ip address
+ be1_Cricket_OCS_protected_ips:
+ type: string
+ label: be1 port 5 OAM ip address
+ description: be1 port 5 OAM ip address
+ be2_Cricket_OCS_protected_ips:
+ type: string
+ label: be2 port 5 OAM ip address
+ description: be2 port 5 OAM ip address
+ be3_Cricket_OCS_protected_ips:
+ type: string
+ label: be3 port 5 OAM ip address
+ description: be3 port 5 OAM ip address
+ be4_Cricket_OCS_protected_ips:
+ type: string
+ label: be4 port 5 OAM ip address
+ description: be4 port 5 OAM ip address
+ be0_OAM_direct_ips:
+ type: string
+ label: be0 port 7 OAM ip address
+ description: be0 port 7 OAM ip address
+ be1_OAM_direct_ips:
+ type: string
+ label: be1 port 7 OAM ip address
+ description: be1 port 7 OAM ip address
+ be2_OAM_direct_ips:
+ type: string
+ label: be2 port 7 OAM ip address
+ description: be2 port 7 OAM ip address
+ be3_OAM_direct_ips:
+ type: string
+ label: be3 port 7 OAM ip address
+ description: be3 port 7 OAM ip address
+ be4_OAM_direct_ips:
+ type: string
+ label: be4 port 7 OAM ip address
+ description: be4 port 7 OAM ip address
+ fe0_SIGNET_vrf_A1_direct_ips:
+ type: string
+ label: fe0 port 0 SIGTRAN ip address
+ description: fe0 port 0 SIGTRAN ip address
+ fe0_OAM_direct_ips:
+ type: string
+ label: fe0 port 7 OAM ip address
+ description: fe0 port 7 OAM ip address
+ fe1_SIGNET_vrf_B1_direct_ips:
+ type: string
+ label: fe1 port 1 SIGTRAN ip address
+ description: fe1 port 1 SIGTRAN ip address
+ fe1_OAM_direct_ips:
+ type: string
+ label: fe1 port 7 OAM ip address
+ description: fe1 port 7 OAM ip address
+ smp0_OAM_direct_ips:
+ type: string
+ label: smp0 port 7 OAM ip address
+ description: smp0 port 7 OAM ip address
+ smp1_OAM_direct_ips:
+ type: string
+ label: smp1 port 7 OAM ip address
+ description: smp1 port 7 OAM ip address
+ db0_OAM_direct_ips:
+ type: string
+ label: db0 port 7 OAM ip address
+ description: smp0 port 7 OAM ip address
+ db1_OAM_direct_ips:
+ type: string
+ label: smp1 port 7 OAM ip address
+ description: db1 port 7 OAM ip address
+ vm_scp_be0_name:
+ type: string
+ default: vSCP_BE0
+ description: name of VM
+ vm_scp_be1_name:
+ type: string
+ default: vSCP_BE1
+ description: name of VM
+ vm_scp_be2_name:
+ type: string
+ default: vSCP_BE2
+ description: name of VM
+ vm_scp_be3_name:
+ type: string
+ default: vSCP_BE3
+ description: name of VM
+ vm_scp_be4_name:
+ type: string
+ default: vSCP_BE4
+ description: name of VM
+ vm_scp_fe0_name:
+ type: string
+ default: vSCP_FE0
+ description: name of VM
+ vm_scp_fe1_name:
+ type: string
+ default: vSCP_FE1
+ description: name of VM
+ vm_smp0_name:
+ type: string
+ default: vSMP0
+ description: name of VM
+ vm_smp1_name:
+ type: string
+ default: vSMP1
+ description: name of VM
+ vm_db0_name:
+ type: string
+ default: vDB0
+ description: name of VM
+ vm_db1_name:
+ type: string
+ default: vDB1
+ description: name of VM
+
+resources:
+# scp_be_wait_condition:
+# type: OS::Heat::WaitCondition
+# properties:
+# handle: { get_resource: scp_be_wait_handle }
+# count: 5
+# timeout: 300
+# scp_be_wait_handle:
+# type: OS::Heat::WaitConditionHandle
+#
+# scp_fe_wait_condition:
+# type: OS::Heat::WaitCondition
+# properties:
+# handle: { get_resource: scp_fe_wait_handle }
+# count: 2
+# timeout: 300
+# scp_fe_wait_handle:
+# type: OS::Heat::WaitConditionHandle
+#
+# smp_wait_condition:
+# type: OS::Heat::WaitCondition
+# properties:
+# handle: { get_resource: smp_wait_handle }
+# count: 2
+# timeout: 300
+# smp_wait_handle:
+# type: OS::Heat::WaitConditionHandle
+#
+# db_wait_condition:
+# type: OS::Heat::WaitCondition
+# properties:
+# handle: { get_resource: db_wait_handle }
+# count: 2
+# timeout: 300
+# db_wait_handle:
+# type: OS::Heat::WaitConditionHandle
+
+ FE_Affinity:
+ type: OS::Nova::ServerGroup
+ properties:
+ policies: ["anti-affinity"]
+ BE_Affinity:
+ type: OS::Nova::ServerGroup
+ properties:
+ policies: ["anti-affinity"]
+ SMP_Affinity:
+ type: OS::Nova::ServerGroup
+ properties:
+ policies: ["anti-affinity"]
+ DB_Affinity:
+ type: OS::Nova::ServerGroup
+ properties:
+ policies: ["anti-affinity"]
+
+ FE_Clustering_KA:
+ type: OS::Contrail::VirtualNetwork
+ properties:
+ name: { get_param: int_vscp_fe_cluster_net_id }
+
+ FE_Clustering_subnet:
+ type: OS::Neutron::Subnet
+ properties:
+ network_id: { get_resource: FE_Clustering_KA }
+ cidr: { get_param: int_vscp_fe_cluster_cidr }
+
+ Clustering_Network:
+ type: OS::Contrail::VirtualNetwork
+ properties:
+ name: { get_param: int_vscp_cluster_net_id }
+
+ Clustering_Network_subnet:
+ type: OS::Neutron::Subnet
+ properties:
+ network_id: { get_resource: Clustering_Network }
+ cidr: { get_param: int_vscp_cluster_cidr }
+
+ DB_Network:
+ type: OS::Contrail::VirtualNetwork
+ properties:
+ name: { get_param: int_vscp_db_network_net_id }
+
+ DB_Network_subnet:
+ type: OS::Neutron::Subnet
+ properties:
+ network_id: { get_resource: DB_Network }
+ cidr: { get_param: int_vscp_db_network_cidr }
+
+ server_scp_be0:
+ type: OS::Nova::Server
+# depends on: db_wait_condition
+ properties:
+ name: { get_param: vm_scp_be0_name }
+ image: { get_param: image_scp_be_id }
+# availability_zone: { get_param: availability_zone_be0 }
+ flavor: { get_param: flavor_scp_be_id }
+ scheduler_hints: { group: { get_resource: BE_Affinity } }
+ networks:
+ - port: { get_resource: be0_port_3 }
+ - port: { get_resource: be0_port_4 }
+ - port: { get_resource: be0_port_5 }
+ - port: { get_resource: be0_port_7 }
+ metadata:
+ vnf_id: { get_param: vnf_id }
+ user_data:
+ str_replace:
+ template: |
+ #!/bin/bash
+ #todo: provision $vm_name
+ wc_notify --data-binary '{"status": "SUCCESS"}'
+ params:
+ $vm_name: {get_param: vm_scp_be0_name}
+# wc_notify: { get_attr: ['scp_be_wait_handle', 'curl_cli'] }
+
+ be0_port_3:
+ type: OS::Neutron::Port
+ properties:
+ network_id: { get_resource: Clustering_Network }
+
+ be0_port_4:
+ type: OS::Neutron::Port
+ properties:
+ network_id: { get_resource: DB_Network }
+
+ be0_port_5:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: Cricket_OCS_protected_net_id }
+ fixed_ips: [{"ip_address": {get_param: be0_Cricket_OCS_protected_ips}}]
+
+ be0_port_7:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: OAM_direct_net_id }
+ fixed_ips: [{"ip_address": {get_param: be0_OAM_direct_ips}}]
+
+ server_scp_be1:
+ type: OS::Nova::Server
+# depends on: db_wait_condition
+ properties:
+ name: { get_param: vm_scp_be1_name }
+ image: { get_param: image_scp_be_id }
+# availability_zone: { get_param: availability_zone_be1 }
+ flavor: { get_param: flavor_scp_be_id }
+ scheduler_hints: { group: { get_resource: BE_Affinity } }
+ networks:
+ - port: { get_resource: be1_port_3 }
+ - port: { get_resource: be1_port_4 }
+ - port: { get_resource: be1_port_5 }
+ - port: { get_resource: be1_port_7 }
+ metadata:
+ vnf_id: { get_param: vnf_id }
+ user_data:
+ str_replace:
+ template: |
+ #!/bin/bash
+ #todo: provision $vm_name
+ wc_notify --data-binary '{"status": "SUCCESS"}'
+ params:
+ $vm_name: {get_param: vm_scp_be1_name}
+# wc_notify: { get_attr: ['scp_be_wait_handle', 'curl_cli'] }
+
+ be1_port_3:
+ type: OS::Neutron::Port
+ properties:
+ network_id: { get_resource: Clustering_Network }
+
+ be1_port_4:
+ type: OS::Neutron::Port
+ properties:
+ network_id: { get_resource: DB_Network }
+
+ be1_port_5:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: Cricket_OCS_protected_net_id }
+ fixed_ips: [{"ip_address": {get_param: be1_Cricket_OCS_protected_ips}}]
+
+ be1_port_7:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: OAM_direct_net_id }
+ fixed_ips: [{"ip_address": {get_param: be1_OAM_direct_ips}}]
+
+ server_scp_be2:
+ type: OS::Nova::Server
+# depends on: db_wait_condition
+ properties:
+ name: { get_param: vm_scp_be2_name }
+ image: { get_param: image_scp_be_id }
+# availability_zone: { get_param: availability_zone_be2 }
+ flavor: { get_param: flavor_scp_be_id }
+ scheduler_hints: { group: { get_resource: BE_Affinity } }
+ networks:
+ - port: { get_resource: be2_port_3 }
+ - port: { get_resource: be2_port_4 }
+ - port: { get_resource: be2_port_5 }
+ - port: { get_resource: be2_port_7 }
+ metadata:
+ vnf_id: { get_param: vnf_id }
+ user_data:
+ str_replace:
+ template: |
+ #!/bin/bash
+ #todo: provision $vm_name
+ wc_notify --data-binary '{"status": "SUCCESS"}'
+ params:
+ $vm_name: {get_param: vm_scp_be2_name}
+# wc_notify: { get_attr: ['scp_be_wait_handle', 'curl_cli'] }
+
+ be2_port_3:
+ type: OS::Neutron::Port
+ properties:
+ network_id: { get_resource: Clustering_Network }
+
+ be2_port_4:
+ type: OS::Neutron::Port
+ properties:
+ network_id: { get_resource: DB_Network }
+
+ be2_port_5:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: Cricket_OCS_protected_net_id }
+ fixed_ips: [{"ip_address": {get_param: be2_Cricket_OCS_protected_ips}}]
+
+ be2_port_7:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: OAM_direct_net_id }
+ fixed_ips: [{"ip_address": {get_param: be2_OAM_direct_ips}}]
+
+ server_scp_be3:
+ type: OS::Nova::Server
+# depends on: db_wait_condition
+ properties:
+ name: { get_param: vm_scp_be3_name }
+ image: { get_param: image_scp_be_id }
+# availability_zone: { get_param: availability_zone_be3 }
+ flavor: { get_param: flavor_scp_be_id }
+ scheduler_hints: { group: { get_resource: BE_Affinity } }
+ networks:
+ - port: { get_resource: be3_port_3 }
+ - port: { get_resource: be3_port_4 }
+ - port: { get_resource: be3_port_5 }
+ - port: { get_resource: be3_port_7 }
+ metadata:
+ vnf_id: { get_param: vnf_id }
+ user_data:
+ str_replace:
+ template: |
+ #!/bin/bash
+ #todo: provision $vm_name
+ wc_notify --data-binary '{"status": "SUCCESS"}'
+ params:
+ $vm_name: {get_param: vm_scp_be3_name}
+# wc_notify: { get_attr: ['scp_be_wait_handle', 'curl_cli'] }
+
+ be3_port_3:
+ type: OS::Neutron::Port
+ properties:
+ network_id: { get_resource: Clustering_Network }
+
+ be3_port_4:
+ type: OS::Neutron::Port
+ properties:
+ network_id: { get_resource: DB_Network }
+
+ be3_port_5:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: Cricket_OCS_protected_net_id }
+ fixed_ips: [{"ip_address": {get_param: be3_Cricket_OCS_protected_ips}}]
+
+ be3_port_7:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: OAM_direct_net_id }
+ fixed_ips: [{"ip_address": {get_param: be3_OAM_direct_ips}}]
+
+ server_scp_be4:
+ type: OS::Nova::Server
+# depends on: db_wait_condition
+ properties:
+ name: { get_param: vm_scp_be4_name }
+ image: { get_param: image_scp_be_id }
+# availability_zone: { get_param: availability_zone_be4 }
+ flavor: { get_param: flavor_scp_be_id }
+ scheduler_hints: { group: { get_resource: BE_Affinity } }
+ networks:
+ - port: { get_resource: be4_port_3 }
+ - port: { get_resource: be4_port_4 }
+ - port: { get_resource: be4_port_5 }
+ - port: { get_resource: be4_port_7 }
+ metadata:
+ vnf_id: { get_param: vnf_id }
+ user_data:
+ str_replace:
+ template: |
+ #!/bin/bash
+ #todo: provision $vm_name
+ wc_notify --data-binary '{"status": "SUCCESS"}'
+ params:
+ $vm_name: {get_param: vm_scp_be4_name}
+# wc_notify: { get_attr: ['scp_be_wait_handle', 'curl_cli'] }
+
+ be4_port_3:
+ type: OS::Neutron::Port
+ properties:
+ network_id: { get_resource: Clustering_Network }
+
+ be4_port_4:
+ type: OS::Neutron::Port
+ properties:
+ network_id: { get_resource: DB_Network }
+
+ be4_port_5:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: Cricket_OCS_protected_net_id }
+ fixed_ips: [{"ip_address": {get_param: be4_Cricket_OCS_protected_ips}}]
+
+ be4_port_7:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: OAM_direct_net_id }
+ fixed_ips: [{"ip_address": {get_param: be4_OAM_direct_ips}}]
+
+ server_scp_fe0:
+ type: OS::Nova::Server
+# depends on: scp_be_wait_condition
+ properties:
+ name: { get_param: vm_scp_fe0_name }
+ image: { get_param: image_scp_fe_id }
+# availability_zone: { get_param: availability_zone_fe0 }
+ flavor: { get_param: flavor_scp_fe_id }
+ scheduler_hints: { group: { get_resource: FE_Affinity } }
+ networks:
+ - port: { get_resource: fe0_port_0 }
+ - port: { get_resource: fe0_port_2 }
+ - port: { get_resource: fe0_port_3 }
+ - port: { get_resource: fe0_port_7 }
+ metadata:
+ vnf_id: { get_param: vnf_id }
+ user_data:
+ str_replace:
+ template: |
+ #!/bin/bash
+ #todo: provision $vm_name
+ wc_notify --data-binary '{"status": "SUCCESS"}'
+ params:
+ $vm_name: {get_param: vm_scp_fe0_name}
+# wc_notify: { get_attr: ['scp_fe_wait_handle', 'curl_cli'] }
+
+ fe0_port_0:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: SIGNET_vrf_A1_direct_net_id }
+ fixed_ips: [{"ip_address": {get_param: fe0_SIGNET_vrf_A1_direct_ips}}]
+
+ fe0_port_2:
+ type: OS::Neutron::Port
+ properties:
+ network_id: { get_resource: FE_Clustering_KA }
+
+ fe0_port_3:
+ type: OS::Neutron::Port
+ properties:
+ network_id: { get_resource: Clustering_Network }
+
+ fe0_port_7:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: OAM_direct_net_id }
+ fixed_ips: [{"ip_address": {get_param: fe0_OAM_direct_ips}}]
+
+ server_scp_fe1:
+ type: OS::Nova::Server
+# depends on: scp_be_wait_condition
+ properties:
+ name: { get_param: vm_scp_fe1_name }
+ image: { get_param: image_scp_fe_id }
+# availability_zone: { get_param: availability_zone_fe1 }
+ flavor: { get_param: flavor_scp_fe_id }
+ scheduler_hints: { group: { get_resource: FE_Affinity } }
+ networks:
+ - port: { get_resource: fe1_port_1 }
+ - port: { get_resource: fe1_port_2 }
+ - port: { get_resource: fe1_port_3 }
+ - port: { get_resource: fe1_port_7 }
+ metadata:
+ vnf_id: { get_param: vnf_id }
+ user_data:
+ str_replace:
+ template: |
+ #!/bin/bash
+ #todo: provision $vm_name
+ wc_notify --data-binary '{"status": "SUCCESS"}'
+ params:
+ $vm_name: {get_param: vm_scp_fe1_name}
+# wc_notify: { get_attr: ['scp_fe_wait_handle', 'curl_cli'] }
+
+ fe1_port_1:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: SIGNET_vrf_B1_direct_net_id }
+ fixed_ips: [{"ip_address": {get_param: fe1_SIGNET_vrf_B1_direct_ips}}]
+
+ fe1_port_2:
+ type: OS::Neutron::Port
+ properties:
+ network_id: { get_resource: FE_Clustering_KA }
+
+ fe1_port_3:
+ type: OS::Neutron::Port
+ properties:
+ network_id: { get_resource: Clustering_Network }
+
+ fe1_port_7:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: OAM_direct_net_id }
+ fixed_ips: [{"ip_address": {get_param: fe1_OAM_direct_ips}}]
+
+ server_smp0:
+ type: OS::Nova::Server
+ properties:
+ name: { get_param: vm_smp0_name }
+ image: { get_param: image_smp_id }
+# availability_zone: { get_param: availability_zone_smp0 }
+ flavor: { get_param: flavor_smp_id }
+ scheduler_hints: { group: { get_resource: SMP_Affinity } }
+ networks:
+ - port: { get_resource: smp0_port_7 }
+ metadata:
+ vnf_id: { get_param: vnf_id }
+ user_data:
+ str_replace:
+ template: |
+ #!/bin/bash
+ #todo: provision $vm_name
+ wc_notify --data-binary '{"status": "SUCCESS"}'
+ params:
+ $vm_name: {get_param: vm_smp0_name}
+# wc_notify: { get_attr: ['smp_wait_handle', 'curl_cli'] }
+
+ smp0_port_7:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: OAM_direct_net_id }
+ fixed_ips: [{"ip_address": {get_param: smp0_OAM_direct_ips}}]
+
+ server_smp1:
+ type: OS::Nova::Server
+ properties:
+ name: { get_param: vm_smp1_name }
+ image: { get_param: image_smp_id }
+# availability_zone: { get_param: availability_zone_smp1 }
+ flavor: { get_param: flavor_smp_id }
+ scheduler_hints: { group: { get_resource: SMP_Affinity } }
+ networks:
+ - port: { get_resource: smp1_port_7 }
+ metadata:
+ vnf_id: { get_param: vnf_id }
+ user_data:
+ str_replace:
+ template: |
+ #!/bin/bash
+ #todo: provision $vm_name
+ wc_notify --data-binary '{"status": "SUCCESS"}'
+ params:
+ $vm_name: {get_param: vm_smp1_name}
+# wc_notify: { get_attr: ['smp_wait_handle', 'curl_cli'] }
+
+ smp1_port_7:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: OAM_direct_net_id }
+ fixed_ips: [{"ip_address": {get_param: smp1_OAM_direct_ips}}]
+
+ server_db0:
+ type: OS::Nova::Server
+# depends_on: smp_wait_condition
+ properties:
+ name: { get_param: vm_db0_name }
+ image: { get_param: image_db_id }
+# availability_zone: { get_param: availability_zone_db0 }
+ flavor: { get_param: flavor_db_id }
+ scheduler_hints: { group: { get_resource: DB_Affinity } }
+ networks:
+ - port: { get_resource: db0_port_4 }
+ - port: { get_resource: db0_port_7 }
+ metadata:
+ vnf_id: { get_param: vnf_id }
+ user_data:
+ str_replace:
+ template: |
+ #!/bin/bash
+ #todo: provision $vm_name
+ wc_notify --data-binary '{"status": "SUCCESS"}'
+ params:
+ $vm_name: {get_param: vm_db0_name}
+# wc_notify: { get_attr: ['db_wait_handle', 'curl_cli'] }
+
+ db0_port_4:
+ type: OS::Neutron::Port
+ properties:
+ network_id: { get_resource: DB_Network }
+
+ db0_port_7:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: OAM_direct_net_id }
+ fixed_ips: [{"ip_address": {get_param: db0_OAM_direct_ips}}]
+
+ server_db1:
+ type: OS::Nova::Server
+# depends_on: smp_wait_condition
+ properties:
+ name: { get_param: vm_db1_name }
+ image: { get_param: image_db_id }
+# availability_zone: { get_param: availability_zone_db1 }
+ flavor: { get_param: flavor_db_id }
+ scheduler_hints: { group: { get_resource: DB_Affinity } }
+ networks:
+ - port: { get_resource: db1_port_4 }
+ - port: { get_resource: db1_port_7 }
+ metadata:
+ vnf_id: { get_param: vnf_id }
+ user_data:
+ str_replace:
+ template: |
+ #!/bin/bash
+ #todo: provision $vm_name
+ wc_notify --data-binary '{"status": "SUCCESS"}'
+ params:
+ $vm_name: {get_param: vm_db1_name}
+# wc_notify: { get_attr: ['db_wait_handle', 'curl_cli'] }
+
+ db1_port_4:
+ type: OS::Neutron::Port
+ properties:
+ network_id: { get_resource: DB_Network }
+
+ db1_port_7:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: OAM_direct_net_id }
+ fixed_ips: [{"ip_address": {get_param: db1_OAM_direct_ips}}]
\ No newline at end of file
diff --git a/ui-ci-dev/src/main/resources/Files/valid_vf.csar b/ui-ci-dev/src/main/resources/Files/valid_vf.csar
new file mode 100644
index 0000000..01bf159
--- /dev/null
+++ b/ui-ci-dev/src/main/resources/Files/valid_vf.csar
Binary files differ
diff --git a/ui-ci-dev/src/main/resources/Files/vf_with_groups.csar b/ui-ci-dev/src/main/resources/Files/vf_with_groups.csar
new file mode 100644
index 0000000..61ea8ce
--- /dev/null
+++ b/ui-ci-dev/src/main/resources/Files/vf_with_groups.csar
Binary files differ
diff --git a/ui-ci-dev/src/main/resources/Files/yamlSample.yml b/ui-ci-dev/src/main/resources/Files/yamlSample.yml
new file mode 100644
index 0000000..10ccf71
--- /dev/null
+++ b/ui-ci-dev/src/main/resources/Files/yamlSample.yml
@@ -0,0 +1,5 @@
+tosca_definitions_version: tosca_simple_yaml_1_0_0
+
+node_types:
+ org.openecomp.resource.cp.CP:
+ derived_from: org.openecomp.resource.cp.root
\ No newline at end of file
diff --git a/ui-ci-dev/src/main/resources/Files/yamlSample2.yml b/ui-ci-dev/src/main/resources/Files/yamlSample2.yml
new file mode 100644
index 0000000..10ccf71
--- /dev/null
+++ b/ui-ci-dev/src/main/resources/Files/yamlSample2.yml
@@ -0,0 +1,5 @@
+tosca_definitions_version: tosca_simple_yaml_1_0_0
+
+node_types:
+ org.openecomp.resource.cp.CP:
+ derived_from: org.openecomp.resource.cp.root
\ No newline at end of file
diff --git a/ui-ci-dev/src/main/resources/ci/conf/credentials.yaml b/ui-ci-dev/src/main/resources/ci/conf/credentials.yaml
new file mode 100644
index 0000000..63a4280
--- /dev/null
+++ b/ui-ci-dev/src/main/resources/ci/conf/credentials.yaml
@@ -0,0 +1,48 @@
+ designer: {
+ username: m99121,
+ password: 66-Percent,
+ firstname: ASDC,
+ lastname: KASPIN
+ }
+ admin: {
+ username: m99122,
+ password: 98-Degrees,
+ firstname: ASDC,
+ lastname: KASPIN
+ }
+ ops: {
+ username: m99123,
+ password: 17-Diameter,
+ firstname: ASDC,
+ lastname: KASPIN
+ }
+ tester: {
+ username: m99124,
+ password: 802-NotaGroup,
+ firstname: ASDC,
+ lastname: KASPIN
+ }
+ governor: {
+ username: m99125,
+ password: 142-Officiant,
+ firstname: ASDC,
+ lastname: KASPIN
+ }
+ product_strategist: {
+ username: m99126,
+ password: 1910-FruitGum,
+ firstname: ASDC,
+ lastname: KASPIN
+ }
+ product_manager: {
+ username: m99127,
+ password: 747-Airplane,
+ firstname: ASDC,
+ lastname: KASPIN
+ }
+ product_local: {
+ username: pm0001,
+ password: 123123a,
+ firstname: ASDC,
+ lastname: KASPIN
+ }
\ No newline at end of file
diff --git a/ui-ci-dev/src/main/resources/ci/conf/log4j.properties b/ui-ci-dev/src/main/resources/ci/conf/log4j.properties
new file mode 100644
index 0000000..3e159ec
--- /dev/null
+++ b/ui-ci-dev/src/main/resources/ci/conf/log4j.properties
@@ -0,0 +1,34 @@
+# Define the root logger with appender file
+log4j.rootLogger = DEBUG, FILE, stdout
+
+# Define the file appender
+log4j.appender.FILE=org.apache.log4j.RollingFileAppender
+log4j.appender.FILE.File=${targetlog}logs/ci-log.out
+
+# Define the layout for file appender
+log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
+log4j.appender.FILE.layout.conversionPattern=%d{yyyy-MM-dd HH:mm:ss} %5p [%10c] : %m%n
+
+# Set the maximum file size before rollover
+log4j.appender.FILE.maxFileSize=5MB
+
+# Set the the backup index
+log4j.appender.FILE.maxBackupIndex=10
+
+
+#############################################################
+
+# Direct log messages to stdout
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.Target=System.out
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+#log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
+log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %5p %10c:%L - %m%n
+
+log4j.logger.org.apache.cassandra.service.StorageProxy=DEBUG
+log4j.logger.com.thinkaurelius.titan.diskstorage.cassandra.CassandraTransaction=INFO, FILE, stdout
+
+log4j.logger.org.openecomp.sdc.ci.tests.utils=TRACE, FILE, stdout
+log4j.additivity.org.openecomp.sdc.ci.tests.utils=false
+
+
diff --git a/ui-ci-dev/src/main/resources/ci/conf/sdc-packages.yaml b/ui-ci-dev/src/main/resources/ci/conf/sdc-packages.yaml
new file mode 100644
index 0000000..dcb78ee
--- /dev/null
+++ b/ui-ci-dev/src/main/resources/ci/conf/sdc-packages.yaml
@@ -0,0 +1,2 @@
+packages:
+ - org.openecomp.sdc.ci.tests.execute.resourceui
\ No newline at end of file
diff --git a/ui-ci-dev/src/main/resources/ci/conf/sdc.yaml b/ui-ci-dev/src/main/resources/ci/conf/sdc.yaml
new file mode 100644
index 0000000..bdca2ab
--- /dev/null
+++ b/ui-ci-dev/src/main/resources/ci/conf/sdc.yaml
@@ -0,0 +1,80 @@
+outputFolder: target
+reportName: index.html
+catalogBeHost: behost
+catalogFeHost: fehost
+esHost: eshost
+disributionClientHost: disClient
+catalogFePort: 8181
+catalogBePort: 8080
+disributionClientPort: 8181
+esPort: 9200
+neoHost: neoHost
+neoPort: 7474
+neoDBusername: neo4j
+neoDBpassword: 123456
+#url: http://localhost:9000/#/dashboard
+url: http://localhost:8181/sdc1/proxy-designer1#/dashboard
+
+webSealSimulatorUrl: http://localhost:8285/sdc1
+remoteTestingMachineIP: 1.2.3.4
+remoteTestingMachinePort: 5555
+remoteTesting: false
+
+resourceConfigDir: src/test/resources/CI/tests
+componentsConfigDir: src/test/resources/CI/components
+importResourceConfigDir: ../catalog-be/src/main/resources/import/tosca/capability-types
+importResourceTestsConfigDir: src/test/resources/CI/importResourceTests
+errorConfigurationFile: ../catalog-be/src/main/resources/config/error-configuration.yaml
+configurationFile: ../catalog-be/src/main/resources/config/configuration.yaml
+importTypesConfigDir: src/test/resources/CI/importTypesTest
+
+
+titanPropertiesFile: src/main/resources/ci/conf/titan.properties
+cassandraHost: 127.0.0.1
+cassandraAuthenticate: false
+cassandraUsername: koko
+cassandraPassword: bobo
+cassandraSsl: false
+cassandraTruststorePath : /path/path
+cassandraTruststorePassword : 123123
+cassandraAuditKeySpace: sdcAudit
+cassandraArtifactKeySpace: sdcArtifact
+
+stopOnClassFailure: false
+
+#List of non-abstract resources to keep during titan cleanup between tests
+#Only 1.0 version will be kept
+resourcesNotToDelete:
+ - Compute
+ - Database
+ - ObjectStorage
+ - BlockStorage
+ - LoadBalancer
+ - Port
+ - Network
+ - Root
+ - ContainerApplication
+ - ContainerRuntime
+ - DBMS
+ - SoftwareComponent
+ - WebApplication
+ - WebServer
+ - CinderVolume
+ - ContrailVirtualNetwork
+ - NeutronNet
+ - NeutronPort
+ - NovaServer
+#Resource categories to keep (including all their subcategories)
+resourceCategoriesNotToDelete:
+ - Generic
+ - Network L2-3
+ - Network L4+
+ - Application L4+
+ - Network Connectivity
+
+#Service categories to keep
+serviceCategoriesNotToDelete:
+ - Mobility
+ - Network L1-3
+ - Network L4
+ - VoIP Call Control
\ No newline at end of file
diff --git a/ui-ci-dev/src/main/resources/ci/conf/titan.properties b/ui-ci-dev/src/main/resources/ci/conf/titan.properties
new file mode 100644
index 0000000..94d12cf
--- /dev/null
+++ b/ui-ci-dev/src/main/resources/ci/conf/titan.properties
@@ -0,0 +1,7 @@
+storage.backend=cassandra
+storage.hostname=cassandrahost
+storage.port=9160
+
+cache.db-cache-clean-wait = 20
+cache.db-cache-time = 180000
+cache.db-cache-size = 0.5
\ No newline at end of file
diff --git a/ui-ci-dev/src/main/resources/ci/scripts/startTest.sh b/ui-ci-dev/src/main/resources/ci/scripts/startTest.sh
new file mode 100644
index 0000000..2793369
--- /dev/null
+++ b/ui-ci-dev/src/main/resources/ci/scripts/startTest.sh
@@ -0,0 +1,123 @@
+#!/bin/bash
+
+TOMCAT_DIR=/home/apache-tomcat-7.0.41/webapps/sdc-ci
+
+function usage {
+ echo "Usage: $0 <jar file>"
+}
+
+function exitOnError() {
+ if [ $1 -ne 0 ]
+ then
+ echo "Failed running task $2"
+ exit 2
+ fi
+}
+
+if [ $# -lt 1 ]
+then
+ usage
+ exit 2
+fi
+
+CURRENT_DIR=`pwd`
+BASEDIR=$(dirname $0)
+
+if [ ${BASEDIR:0:1} = "/" ]
+then
+ FULL_PATH=$BASEDIR
+else
+ FULL_PATH=$CURRENT_DIR/$BASEDIR
+fi
+
+LOGS_PROP_FILE=file:${FULL_PATH}/../conf/log4j.properties
+#############################################
+TARGET_DIR=${FULL_PATH}/../target
+TARGET_LOG_DIR="${TARGET_DIR}/"
+CONF_FILE=${FULL_PATH}/../conf/sdc.yaml
+DEBUG=true
+MainClass=org.openecomp.sdc.ci.tests.run.StartTest
+
+JAR_FILE=$1
+
+#TARGET_DIR=`echo ${TARGET_DIR} | sed 's/\//\//g'`
+#echo $TARGET_DIR
+
+TESTS_DIR=/opt/app/sdc/ci/resources/tests
+COMPONENTS_DIR=/opt/app/sdc/ci/resources/components
+
+
+sed -i 's#\(outputFolder:\).*#\1 '${TARGET_DIR}'#g' $CONF_FILE
+sed -i 's#\(resourceConfigDir:\).*#\1 '${TESTS_DIR}'#g' $CONF_FILE
+sed -i 's#\(componentsConfigDir:\).*#\1 '${COMPONENTS_DIR}'#g' $CONF_FILE
+
+
+
+mkdir -p ${TARGET_DIR}
+if [ -d ${TARGET_DIR} ]
+then
+ rm -rf ${TARGET_DIR}/*
+ exitOnError $? "Failed_to_delete_target_dir"
+fi
+
+
+debug_port=8800
+#JAVA_OPTION="-javaagent:/var/tmp/jacoco/lib/jacocoagent.jar=destfile=jacoco-it.exec"
+JAVA_OPTION=""
+case "$2" in
+ -debug) echo "Debug mode, Listen on port $debug_port"; JAVA_OPTION="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=${debug_port}" ;;
+ "") echo "Standard mode";;
+ *) echo "USAGE: startTest.sh [-debug]";;
+esac
+
+#cmd="java $JAVA_OPTION -Dconfig.resource=attodlit.conf -Dlog4j.configuration=file:./conf/log4j.properties -cp #att-odl-it_0.0.1-SNAPSHOT-jar-with-dependencies.jar org.openecomp.d2.it.StartTest"
+
+#cmd="java $JAVA_OPTION -Dconfig.resource=attsdc.conf -Ddebug=true -Dlog4j.configuration=file:./conf/log4j.properties -cp uber-ci-1.0.0-SNAPSHOT.jar org.openecomp.sdc.ci.tests.run.StartTest"
+
+
+cmd="java $JAVA_OPTION -DdisplayException=true -Dtargetlog=${TARGET_LOG_DIR} -Dconfig.resource=${CONF_FILE} -Ddebug=${DEBUG} -Dlog4j.configuration=${LOGS_PROP_FILE} -cp $JAR_FILE ${MainClass}"
+
+#echo $cmd
+#console=`$cmd`
+
+
+
+if [ $DEBUG == "true" ]
+then
+ $cmd
+else
+ $cmd >> /dev/null
+fi
+status=`echo $?`
+
+#echo "console=$console"
+#echo "status=$status"
+#tomcat=`ps -ef | grep tomcat | grep java | wc -l`
+
+#if [ $tomcat == 0 ]; then
+# echo "Bring tomcat up"
+# apache-tomcat-7.0.41/bin/startup.sh
+#fi
+
+#`rm -rf ./html/*.html`
+#`mv *.html ./html/`
+
+
+if [ -d ${TOMCAT_DIR} ]
+then
+
+ cp ${TARGET_DIR}/*.html ${TOMCAT_DIR}
+ mv ${TOMCAT_DIR}/SDC-testReport.html ${TOMCAT_DIR}/index.html
+fi
+
+#echo "tomcat=$tomcat"
+#ip=`ifconfig | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p' | grep 172.20`
+
+#echo "Report url: http://$ip:8090/att-odl-it/"
+
+echo "##################################################"
+echo "################# status is $status "
+echo "##################################################"
+
+exit $status
+
diff --git a/ui-ci-dev/src/main/resources/ci/testSuites/fullTests.xml b/ui-ci-dev/src/main/resources/ci/testSuites/fullTests.xml
new file mode 100644
index 0000000..9f912e5
--- /dev/null
+++ b/ui-ci-dev/src/main/resources/ci/testSuites/fullTests.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
+<suite name="uiFullTests" configfailurepolicy="continue" verbose="2">
+ <parameter name="clean-type" value="FULL" /> <!--Valid Values are: PARTIAL, FULL, NONE -->
+ <test name="Vfc Tests">
+ <classes>
+ <class name="org.openecomp.sdc.uici.tests.execute.vfc.VfcBasicTests"></class>
+ </classes>
+ </test>
+
+ <test name="VF Tests">
+ <classes>
+ <class name="org.openecomp.sdc.uici.tests.execute.vf.VfBasicTests" />
+ <class name="org.openecomp.sdc.uici.tests.execute.vf.VfCanvasTests" />
+ <class name="org.openecomp.sdc.uici.tests.execute.vf.VfOnboardingTests" />
+ <class name="org.openecomp.sdc.uici.tests.execute.vf.VfDeploymentTests"/>
+ </classes>
+ </test>
+
+ <test name="Service Tests">
+ <classes>
+ <class name="org.openecomp.sdc.uici.tests.execute.service.ServiceBasicTests"></class>
+ <class name="org.openecomp.sdc.uici.tests.execute.service.ServiceInputsTests"></class>
+ </classes>
+ </test>
+</suite>
diff --git a/ui-ci-dev/src/main/resources/ci/testSuites/sanity.xml b/ui-ci-dev/src/main/resources/ci/testSuites/sanity.xml
new file mode 100644
index 0000000..99e8765
--- /dev/null
+++ b/ui-ci-dev/src/main/resources/ci/testSuites/sanity.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
+<suite name="uiSanity" configfailurepolicy="continue" verbose="2">
+ <parameter name="clean-type" value="FULL" /> <!--Valid Values are: PARTIAL, FULL, NONE -->
+ <test name="Vfc Tests">
+ <classes>
+ <class name="org.openecomp.sdc.uici.tests.execute.vfc.VfcBasicTests">
+ <methods>
+ <include name="testImportVfc" />
+ <include name="testUpdateTypeForAttributeOfVfc" />
+ </methods>
+ </class>
+ </classes>
+ </test>
+
+ <test name="VF Tests">
+ <classes>
+ <class name="org.openecomp.sdc.uici.tests.execute.vf.VfBasicTests">
+ <methods>
+ <include name="testImportVf" />
+ <include name="testUpdateInstanceAttributeValue" />
+ <include name="testVfCertification" />
+ </methods>
+ </class>
+ <class name="org.openecomp.sdc.uici.tests.execute.vf.VfCanvasTests">
+ <methods>
+ <include name="testCanvasVFSanity" />
+ </methods>
+ </class>
+ <class name="org.openecomp.sdc.uici.tests.execute.vf.VfDeploymentTests">
+ <methods>
+ <include name="testUpdateModuleNameSanity" />
+ <include name="testTabsViewSanity"/>
+ </methods>
+ </class>
+ </classes>
+ </test>
+
+ <test name="Service Tests">
+ <classes>
+ <class name="org.openecomp.sdc.uici.tests.execute.service.ServiceBasicTests">
+ <methods>
+ <include name="testLinkTwoRI" />
+ <include name="testBuildServiceForDistribution" />
+ </methods>
+ </class>
+ <class name="org.openecomp.sdc.uici.tests.execute.service.ServiceInputsTests">
+ <methods>
+ <include name="testInputsSanity" />
+ </methods>
+ </class>
+ </classes>
+ </test>
+
+</suite>
diff --git a/ui-ci-dev/src/main/resources/images/gizmorambo.jpg b/ui-ci-dev/src/main/resources/images/gizmorambo.jpg
new file mode 100644
index 0000000..c9a8fe8
--- /dev/null
+++ b/ui-ci-dev/src/main/resources/images/gizmorambo.jpg
Binary files differ
diff --git a/ui-ci-dev/src/test/Completetheform.js b/ui-ci-dev/src/test/Completetheform.js
new file mode 100644
index 0000000..7e8b757
--- /dev/null
+++ b/ui-ci-dev/src/test/Completetheform.js
@@ -0,0 +1,3 @@
+/**
+ * New node file
+ */
diff --git a/ui-ci-dev/tarball.xml b/ui-ci-dev/tarball.xml
new file mode 100644
index 0000000..9262e6f
--- /dev/null
+++ b/ui-ci-dev/tarball.xml
@@ -0,0 +1,66 @@
+<assembly
+ xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
+ <id>bin</id>
+ <formats>
+ <format>tar</format>
+ </formats>
+ <files>
+ <file>
+ <source>${project.build.directory}/${project.artifactId}-${project.version}-jar-with-dependencies.jar</source>
+ <outputDirectory>./</outputDirectory>
+ <destName>${project.artifactId}-${project.version}-jar-with-dependencies.jar</destName>
+ </file>
+ <file>
+ <source>../asdc-tests/src/main/resources/ci/scripts/startTest.sh</source>
+ <outputDirectory>./</outputDirectory>
+ <destName>startTest.sh</destName>
+ </file>
+ <!--file> <source>src/main/resources/ci/scripts/postinstall</source> <outputDirectory>./</outputDirectory>
+ <destName>postinstall</destName> </file -->
+ <file>
+ <source>../asdc-tests/src/main/resources/ci/conf/sdc.yaml</source>
+ <outputDirectory>conf</outputDirectory>
+ <destName>sdc.yaml</destName>
+ </file>
+ <file>
+ <source>src/main/resources/ci/conf/sdc-packages.yaml</source>
+ <outputDirectory>conf</outputDirectory>
+ <destName>sdc-packages.yaml</destName>
+ </file>
+ <file>
+ <source>../asdc-tests/src/main/resources/ci/conf/log4j.properties</source>
+ <outputDirectory>conf</outputDirectory>
+ <destName>log4j.properties</destName>
+ </file>
+<!-- <file>
+ <source>src/main/resources/ci/conf/titan.properties</source>
+ <outputDirectory>conf</outputDirectory>
+ <destName>titan.properties</destName>
+ </file> -->
+<!-- <file>
+ <source>${project.basedir}/../catalog-be/src/main/resources/config/error-configuration.yaml</source>
+ <outputDirectory>conf</outputDirectory>
+ <destName>error-configuration.yaml</destName>
+ </file> -->
+ <file>
+ <source>src/main/resources/ci/conf/credentials.yaml</source>
+ <outputDirectory>conf</outputDirectory>
+ <destName>credentials.yaml</destName>
+ </file>
+
+ </files>
+
+ <fileSets>
+ <fileSet>
+ <directory>src/test/resources</directory>
+ <outputDirectory>./</outputDirectory>
+ </fileSet>
+ <fileSet>
+ <directory>src/main/resources/ci/testSuites</directory>
+ <outputDirectory>./testSuites</outputDirectory>
+ </fileSet>
+ </fileSets>
+
+</assembly>