diff options
17 files changed, 3980 insertions, 7 deletions
@@ -24,4 +24,11 @@ Steps involved in running CSIT in kubernetes: 2. Deploys policy helm charts under the default namespace. 3. Builds docker image of the robot framework and deploys robot framework helm chart in the default namespace. 4. Invokes the respective robot test file for the project supplied by the user. - The test execution results can be viewed from the logs of policy-csit-robot pod.
\ No newline at end of file + The test execution results can be viewed from the logs of policy-csit-robot pod. + +Running Policy Regression Tests: + ACM regression tests can be invoked using the script docker/csit/run-acm-regression.sh with the arguments {ACM-R release name} {participant release name} + For example, if ACM-R and participants needs to be tested for backward compatbility between montreal and london versions, the script can be invoked + with the command "./run-acm-regression.sh montreal london" + This will deploy ACM-R and other policy components in montreal version and the participants in london version before invoking the test suite. + The script can also be invoked without any arguments to deploy all the components in the default version of the repo. diff --git a/compose/docker-compose.yml b/compose/docker-compose.yml index 5effc256..0264b290 100644 --- a/compose/docker-compose.yml +++ b/compose/docker-compose.yml @@ -266,7 +266,7 @@ services: ] policy-clamp-ac-http-ppnt: - image: ${CONTAINER_LOCATION}onap/policy-clamp-ac-http-ppnt:${POLICY_CLAMP_VERSION} + image: ${CONTAINER_LOCATION}onap/policy-clamp-ac-http-ppnt:${POLICY_CLAMP_PPNT_VERSION} container_name: policy-clamp-ac-http-ppnt depends_on: - kafka @@ -283,7 +283,7 @@ services: 'kafka', '9092' ] policy-clamp-ac-k8s-ppnt: - image: ${CONTAINER_LOCATION}onap/policy-clamp-ac-k8s-ppnt:${POLICY_CLAMP_VERSION} + image: ${CONTAINER_LOCATION}onap/policy-clamp-ac-k8s-ppnt:${POLICY_CLAMP_PPNT_VERSION} container_name: policy-clamp-ac-k8s-ppnt depends_on: - kafka @@ -300,7 +300,7 @@ services: 'kafka', '9092' ] policy-clamp-ac-pf-ppnt: - image: ${CONTAINER_LOCATION}onap/policy-clamp-ac-pf-ppnt:${POLICY_CLAMP_VERSION} + image: ${CONTAINER_LOCATION}onap/policy-clamp-ac-pf-ppnt:${POLICY_CLAMP_PPNT_VERSION} container_name: policy-clamp-ac-pf-ppnt depends_on: - kafka @@ -319,7 +319,7 @@ services: 'api', '6969' ] policy-clamp-ac-a1pms-ppnt: - image: ${CONTAINER_LOCATION}onap/policy-clamp-ac-a1pms-ppnt:${POLICY_CLAMP_VERSION} + image: ${CONTAINER_LOCATION}onap/policy-clamp-ac-a1pms-ppnt:${POLICY_CLAMP_PPNT_VERSION} container_name: policy-clamp-ac-a1pms-ppnt depends_on: - kafka @@ -336,7 +336,7 @@ services: 'kafka', '9092' ] policy-clamp-ac-kserve-ppnt: - image: ${CONTAINER_LOCATION}onap/policy-clamp-ac-kserve-ppnt:${POLICY_CLAMP_VERSION} + image: ${CONTAINER_LOCATION}onap/policy-clamp-ac-kserve-ppnt:${POLICY_CLAMP_PPNT_VERSION} container_name: policy-clamp-ac-kserve-ppnt depends_on: - kafka diff --git a/compose/get-versions-regression.sh b/compose/get-versions-regression.sh new file mode 100755 index 00000000..c4347481 --- /dev/null +++ b/compose/get-versions-regression.sh @@ -0,0 +1,149 @@ +#! /bin/bash + +# ============LICENSE_START==================================================== +# Copyright (C) 2024 Nordix Foundation. All rights reserved. +# ============================================================================= +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# SPDX-License-Identifier: Apache-2.0 +# ============LICENSE_END====================================================== + + +function getDockerVersion +{ + REPO=${1} + GERRIT_BRANCH=${2} + DEFAULT_DOCKER_IMAGE_NAME=${3:-} + DEFAULT_DOCKER_IMAGE_VERSION=${4:-} + + REPO_RELEASE_DATA=$( + curl -qL --silent \ + "https://github.com/onap/policy-parent/raw/${GERRIT_BRANCH}/integration/src/main/resources/release/pf_release_data.csv" | + grep "^policy/$REPO" + ) + + # shellcheck disable=SC2034 + read -r repo \ + latest_released_tag \ + latest_snapshot_tag \ + changed_files \ + docker_images \ + <<< "$(echo "$REPO_RELEASE_DATA" | tr ',' ' ' )" + + if [[ -z "$docker_images" ]] + then + if [[ -z "$DEFAULT_DOCKER_IMAGE_NAME" ]] + then + echo "repo $REPO does not produce a docker image, execution terminated" + exit 1 + else + docker_images="$DEFAULT_DOCKER_IMAGE_NAME" + fi + fi + + # docker_image_version=$(echo "$latest_snapshot_tag" | awk -F \. '{print $1"."$2"-SNAPSHOT-latest"}') + docker_image_version=$latest_snapshot_tag + docker_image_name=$(echo "$docker_images" | sed -e "s/^.*://" -e "s/^.//" -e "s/.$//") + + if \ + curl -qL --silent \ + "https://nexus3.onap.org/service/rest/repository/browse/docker.snapshot/v2/onap/$docker_image_name/tags/" | + grep -q "$docker_image_version" + then + echo "using \"$docker_image_name:$docker_image_version\" docker image for repo \"$repo\"" + return + fi + + docker_image_version="$latest_released_tag" + if \ + curl -qL --silent \ + "https://nexus3.onap.org/service/rest/repository/browse/docker.release/v2/onap/$docker_image_name/tags/" | + grep -q "$docker_image_version" + then + echo "using \"$docker_image_name:$docker_image_version\" docker image for repo \"$repo\"" + return + fi + + docker_image_version="$DEFAULT_DOCKER_IMAGE_VERSION" + if \ + curl -qL --silent \ + "https://nexus3.onap.org/service/rest/repository/browse/docker.release/v2/onap/$docker_image_name/tags/" | + grep -q "$docker_image_version" + then + echo "using \"$docker_image_name:$docker_image_version\" docker image for repo \"$repo\"" + return + else + echo "docker image \"$docker_image_name:$docker_image_version\" not found for repo \"$repo\"" + exit 1 + fi +} + + +if [ -z "${WORKSPACE}" ]; then + WORKSPACE=$(git rev-parse --show-toplevel) + export WORKSPACE +fi + +if [ $# -eq 0 ]; then + echo "No release versions provided. Fetching the default version for ACM and participants" + echo "Usage: $0 <acm_release> <participant_release> ..." + ACM_RELEASE=$(awk -F= '$1 == "defaultbranch" { print $2 }' \ + "${WORKSPACE}"/.gitreview) + PPNT_RELEASE=$ACM_RELEASE +fi +if [ $1 ]; then + ACM_RELEASE=$1 +fi + +if [ $2 ]; then + PPNT_RELEASE=$2 +fi + +export POLICY_MARIADB_VER=10.10.2 +echo POLICY_MARIADB_VER=${POLICY_MARIADB_VER} + +export POLICY_POSTGRES_VER=11.1 +echo POLICY_POSTGRES_VER=${POLICY_POSTGRES_VER} + +getDockerVersion models $ACM_RELEASE "'policy-models-simulator'" 3.0.1 +export POLICY_MODELS_VERSION="$docker_image_version" + +getDockerVersion docker $ACM_RELEASE +export POLICY_DOCKER_VERSION="$docker_image_version" + +getDockerVersion api $ACM_RELEASE +export POLICY_API_VERSION="$docker_image_version" + +getDockerVersion pap $ACM_RELEASE +export POLICY_PAP_VERSION="$docker_image_version" + +getDockerVersion apex-pdp $ACM_RELEASE +export POLICY_APEX_PDP_VERSION="$docker_image_version" + +getDockerVersion clamp $ACM_RELEASE +export POLICY_CLAMP_VERSION="$docker_image_version" + +getDockerVersion clamp $PPNT_RELEASE +export POLICY_CLAMP_PPNT_VERSION="$docker_image_version" + +getDockerVersion drools-pdp $ACM_RELEASE +export POLICY_DROOLS_PDP_VERSION="$docker_image_version" + +getDockerVersion xacml-pdp $ACM_RELEASE +export POLICY_XACML_PDP_VERSION="$docker_image_version" + +getDockerVersion distribution $ACM_RELEASE +export POLICY_DISTRIBUTION_VERSION="$docker_image_version" + +getDockerVersion drools-applications $ACM_RELEASE +export POLICY_DROOLS_APPS_VERSION="$docker_image_version" diff --git a/compose/get-versions.sh b/compose/get-versions.sh index 2c11f0e1..13dc3653 100755 --- a/compose/get-versions.sh +++ b/compose/get-versions.sh @@ -2,7 +2,7 @@ # ============LICENSE_START==================================================== # Copyright (C) 2020-2021 AT&T Intellectual Property. All rights reserved. -# Modification Copyright 2021-2023 Nordix Foundation. +# Modification Copyright 2021-2024 Nordix Foundation. # Modifications Copyright (C) 2021 Bell Canada. All rights reserved. # ============================================================================= # Licensed under the Apache License, Version 2.0 (the "License"); @@ -130,6 +130,7 @@ export POLICY_DISTRIBUTION_VERSION="$docker_image_version" getDockerVersion clamp export POLICY_CLAMP_VERSION="$docker_image_version" +export POLICY_CLAMP_PPNT_VERSION=$POLICY_CLAMP_VERSION getDockerVersion gui export POLICY_GUI_VERSION="$docker_image_version" diff --git a/csit/run-acm-regression.sh b/csit/run-acm-regression.sh new file mode 100755 index 00000000..615e4a94 --- /dev/null +++ b/csit/run-acm-regression.sh @@ -0,0 +1,68 @@ +#!/bin/bash +# +# Copyright 2024 Nordix Foundation. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# Script to run the ACM regression test suite in cucumber. +# Deploys ACM-R and participants in two different release versions for testing backward compatibility. + +if [ $# -eq 0 ] +then + echo "No release versions provided. Testing ACM-R and participants with the default version" + echo "Usage: $0 <acm_release> <compatibility_test_release>" + ACM_RELEASE=$(awk -F= '$1 == "defaultbranch" { print $2 }' \ + "${WORKSPACE}"/.gitreview) + PPNT_RELEASE=$ACM_RELEASE +fi + +if [ $1 ]; then + ACM_RELEASE=$1 +fi + +if [ $2 ]; then + PPNT_RELEASE=$2 +fi + +if [ -z "${WORKSPACE}" ]; then + WORKSPACE=$(git rev-parse --show-toplevel) + export WORKSPACE +fi + + +export SCRIPTS="${WORKSPACE}/csit/resources/scripts" + +COMPOSE_FOLDER="${WORKSPACE}"/compose +REGRESSION_FOLDER="${WORKSPACE}"/policy-regression-tests/policy-clamp-regression/ +export PROJECT='clamp' + +# Sign in to nexus3 docker repo +docker login -u docker -p docker nexus3.onap.org:10001 + +cd ${COMPOSE_FOLDER} + +echo "Configuring docker compose..." + +source export-ports.sh > /dev/null 2>&1 +source get-versions-regression.sh $ACM_RELEASE $PPNT_RELEASE > /dev/null 2>&1 + +docker-compose -f docker-compose.yml up -d "policy-clamp-runtime-acm" + +# wait for the app to start up +"${SCRIPTS}"/wait_for_rest.sh localhost "${ACM_PORT}" + +cd ${REGRESSION_FOLDER} + +# Invoke the regression test cases +mvn clean test
\ No newline at end of file diff --git a/policy-regression-tests/policy-clamp-regression/pom.xml b/policy-regression-tests/policy-clamp-regression/pom.xml new file mode 100644 index 00000000..a9f31c97 --- /dev/null +++ b/policy-regression-tests/policy-clamp-regression/pom.xml @@ -0,0 +1,72 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xmlns="http://maven.apache.org/POM/4.0.0" + 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.onap.policy.regression</groupId> + <artifactId>policy-regression-tests</artifactId> + <version>1.0-SNAPSHOT</version> + </parent> + + <artifactId>policy-clamp-regression</artifactId> + <packaging>jar</packaging> + + <properties> + <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> + <version.cucumber>7.15.0</version.cucumber> + <version.rest-assured>5.4.0</version.rest-assured> + <version.junit-platform>1.10.2</version.junit-platform> + </properties> + + <dependencies> + <dependency> + <groupId>io.cucumber</groupId> + <artifactId>cucumber-java</artifactId> + <version>${version.cucumber}</version> + <scope>test</scope> + </dependency> + + <dependency> + <groupId>io.cucumber</groupId> + <artifactId>cucumber-junit-platform-engine</artifactId> + <version>${version.cucumber}</version> + <scope>test</scope> + </dependency> + + <dependency> + <groupId>org.junit.jupiter</groupId> + <artifactId>junit-jupiter</artifactId> + <version>${version.jupiter}</version> + <scope>test</scope> + </dependency> + + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-test</artifactId> + <scope>test</scope> + </dependency> + + <dependency> + <groupId>jakarta.xml.bind</groupId> + <artifactId>jakarta.xml.bind-api</artifactId> + </dependency> + + <dependency> + <groupId>io.rest-assured</groupId> + <artifactId>rest-assured</artifactId> + <version>${version.rest-assured}</version> + <scope>test</scope> + </dependency> + + <dependency> + <groupId>org.junit.platform</groupId> + <artifactId>junit-platform-suite</artifactId> + <version>${version.junit-platform}</version> + <scope>test</scope> + </dependency> + + </dependencies> + +</project> diff --git a/policy-regression-tests/policy-clamp-regression/src/test/java/org.onap.policy.clamp.regression/AcmRegressionTests.java b/policy-regression-tests/policy-clamp-regression/src/test/java/org.onap.policy.clamp.regression/AcmRegressionTests.java new file mode 100644 index 00000000..90ec0ce5 --- /dev/null +++ b/policy-regression-tests/policy-clamp-regression/src/test/java/org.onap.policy.clamp.regression/AcmRegressionTests.java @@ -0,0 +1,37 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2024 Nordix Foundation. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.clamp.regression; + +import static io.cucumber.junit.platform.engine.Constants.PLUGIN_PROPERTY_NAME; + +import org.junit.platform.suite.api.ConfigurationParameter; +import org.junit.platform.suite.api.IncludeEngines; +import org.junit.platform.suite.api.SelectClasspathResource; +import org.junit.platform.suite.api.Suite; + +@Suite +@IncludeEngines("cucumber") +@SelectClasspathResource("features") +@ConfigurationParameter(key = PLUGIN_PROPERTY_NAME, value = "pretty") +public class AcmRegressionTests { + + +} diff --git a/policy-regression-tests/policy-clamp-regression/src/test/java/org.onap.policy.clamp.regression/StepDefinitions.java b/policy-regression-tests/policy-clamp-regression/src/test/java/org.onap.policy.clamp.regression/StepDefinitions.java new file mode 100644 index 00000000..b8454592 --- /dev/null +++ b/policy-regression-tests/policy-clamp-regression/src/test/java/org.onap.policy.clamp.regression/StepDefinitions.java @@ -0,0 +1,354 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2024 Nordix Foundation. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.clamp.regression; + +import static io.restassured.config.EncoderConfig.encoderConfig; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import io.cucumber.java.en.Then; +import io.cucumber.java.en.When; +import io.restassured.RestAssured; +import io.restassured.http.ContentType; +import io.restassured.path.json.JsonPath; +import io.restassured.response.Response; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.concurrent.TimeUnit; +import org.json.JSONException; +import org.json.JSONObject; + + +public class StepDefinitions { + private static final String acmUrl = "http://localhost:30007/"; + private static final String username = "runtimeUser"; + private static final String password = "zb!XztG34"; + private static String compositionId; + private static String instanceId; + private static String targetCompositionId; + + private Response response; + + /** + * Verify ACM healthcheck. + */ + @When("the acm health check endpoint is invoked {string}") + public void isAcmEndpointRunning(String endpoint) { + response = RestAssured.given() + .auth().basic(username, password) + .baseUri(acmUrl) + .get(endpoint); + } + + /** + * Verify commissioning. + */ + @When("the ACM commissioning endpoint {string} is invoked with {string} {string}") + public void commissioningIsAccepted(String endpoint, String filePath, String isMigration) throws IOException { + var jsonContent = new String(Files.readAllBytes(Path.of(filePath))); + response = RestAssured.given() + .config(RestAssured.config().encoderConfig(encoderConfig() + .encodeContentTypeAs("", ContentType.JSON))) + .auth().basic(username, password) + .contentType(ContentType.JSON) + .accept(ContentType.JSON) + .baseUri(acmUrl) + .body(jsonContent) + .post(endpoint); + var jsonPath = new JsonPath(response.getBody().asString()); + if (Boolean.parseBoolean(isMigration)) { + targetCompositionId = jsonPath.getString("compositionId"); + } else { + compositionId = jsonPath.getString("compositionId"); + } + } + + /** + * Register participants. + */ + @When("the register participants endpoint is invoked {string}") + public void registerParticipants(String endpoint) { + response = RestAssured.given() + .auth().basic(username, password) + .baseUri(acmUrl) + .put(endpoint); + } + + /** + * Verify priming. + */ + @When("the ACM participants are primed {string} {string}") + public void primeTheParticipants(String endpoint, String isMigration) throws JSONException { + var jsonBody = new JSONObject().put("primeOrder", "PRIME"); + response = RestAssured.given() + .config(RestAssured.config().encoderConfig(encoderConfig() + .encodeContentTypeAs("", ContentType.JSON))) + .auth().basic(username, password) + .contentType(ContentType.JSON) + .accept(ContentType.JSON) + .baseUri(acmUrl) + .body(jsonBody.toString()) + .put(endpoint.replace("{compositionId}", + Boolean.parseBoolean(isMigration) ? targetCompositionId : compositionId)); + } + + /** + * Fetch composition by Id. + */ + @When("the ACM composition is fetched {string}") + public void fetchCompositionById(String endpoint) { + response = RestAssured.given() + .auth().basic(username, password) + .baseUri(acmUrl) + .get(endpoint.replace("{compositionId}", compositionId)); + } + + /** + * Wait and retry requests until the keyword is present. + */ + @Then("Wait and retry until the response contains the keyword {string} {string} {string}") + public void waitUntilKeyword(String keyword, String endpoint, String isMigration) throws InterruptedException { + var startTime = System.currentTimeMillis(); + var maxWaitTime = TimeUnit.MINUTES.toMillis(2); // 2 minutes in milliseconds + var conditionMet = false; + while (!conditionMet && System.currentTimeMillis() - startTime < maxWaitTime) { + var jsonPath = new JsonPath(response.getBody().asString()); + switch (keyword) { + case "PRIMED", "COMMISSIONED" -> { + conditionMet = keyword.equals(jsonPath.getString("state")); + if (!conditionMet) { + Thread.sleep(10000); // Wait for 10 second before retrying + fetchCompositionById(endpoint); + } + } + case "DEPLOYED", "UNDEPLOYED" -> { + conditionMet = keyword.equals(jsonPath.getString("deployState")); + if (!conditionMet) { + Thread.sleep(10000); // Wait for 10 second before retrying + fetchAcInstanceById(endpoint, + Boolean.parseBoolean(isMigration) ? targetCompositionId : compositionId); + } + } + default -> { + break; + } + } + } + assertTrue(conditionMet); + } + + + /** + * Verify AC instantiation. + */ + @When("the ACM instance is created {string} with {string}") + public void instantiate(String endpoint, String filePath) throws IOException { + var jsonContent = new String(Files.readAllBytes(Path.of(filePath))); + response = RestAssured.given() + .config(RestAssured.config().encoderConfig(encoderConfig() + .encodeContentTypeAs("", ContentType.JSON))) + .auth().basic(username, password) + .contentType(ContentType.JSON) + .accept(ContentType.JSON) + .baseUri(acmUrl) + .body(jsonContent.replace("COMPOSITIONIDPLACEHOLDER", compositionId)) + .post(endpoint.replace("{compositionId}", compositionId)); + var jsonPath = new JsonPath(response.getBody().asString()); + instanceId = jsonPath.getString("instanceId"); + } + + /** + * Verify update property. + */ + @When("the AC instance property is updated {string} {string}") + public void updateInstanceProperty(String endpoint, String filePath) throws IOException { + var jsonContent = new String(Files.readAllBytes(Path.of(filePath))); + response = RestAssured.given() + .config(RestAssured.config().encoderConfig(encoderConfig() + .encodeContentTypeAs("", ContentType.JSON))) + .auth().basic(username, password) + .contentType(ContentType.JSON) + .accept(ContentType.JSON) + .baseUri(acmUrl) + .body(jsonContent.replace("COMPOSITIONIDPLACEHOLDER", compositionId) + .replace("INSTANCEIDPLACEHOLDER", instanceId)) + .post(endpoint.replace("{compositionId}", compositionId)); + var jsonPath = new JsonPath(response.getBody().asString()); + instanceId = jsonPath.getString("instanceId"); + } + + /** + * Verify AC deployment. + */ + @When("the AC instance is deployed {string}") + public void deployAcInstance(String endpoint) throws JSONException { + var jsonBody = new JSONObject().put("deployOrder", "DEPLOY"); + response = RestAssured.given() + .config(RestAssured.config().encoderConfig(encoderConfig() + .encodeContentTypeAs("", ContentType.JSON))) + .auth().basic(username, password) + .contentType(ContentType.JSON) + .accept(ContentType.JSON) + .baseUri(acmUrl) + .body(jsonBody.toString()) + .put(endpoint.replace("{compositionId}", compositionId) + .replace("{instanceId}", instanceId)); + } + + /** + * Fetch Ac instance by id. + */ + @When("the AC instance is fetched {string} {string}") + public void fetchAcInstanceById(String endpoint, String isMigration) { + response = RestAssured.given() + .auth().basic(username, password) + .baseUri(acmUrl) + .get(endpoint.replace("{compositionId}", + Boolean.parseBoolean(isMigration) ? targetCompositionId : compositionId) + .replace("{instanceId}", instanceId)); + } + + /** + * Verify Ac undeployment. + */ + @When("the AC instance is undeployed {string}") + public void unDeployAcInstance(String endpoint) throws JSONException { + var jsonBody = new JSONObject().put("deployOrder", "UNDEPLOY"); + response = RestAssured.given() + .config(RestAssured.config().encoderConfig(encoderConfig() + .encodeContentTypeAs("", ContentType.JSON))) + .auth().basic(username, password) + .contentType(ContentType.JSON) + .accept(ContentType.JSON) + .baseUri(acmUrl) + .body(jsonBody.toString()) + .put(endpoint.replace("{compositionId}", compositionId) + .replace("{instanceId}", instanceId)); + } + + /** + * Verify Ac uninstantiation. + */ + @When("the ACM instance is uninstantiated {string}") + public void unInstantiate(String endpoint) { + response = RestAssured.given() + .auth().basic(username, password) + .baseUri(acmUrl) + .delete(endpoint.replace("{compositionId}", compositionId).replace("{instanceId}", instanceId)); + } + + /** + * Fetch all Ac instances for the given composition id. + */ + @When("all the AC instances are fetched {string}") + public void fetchAllAcInstances(String endpoint) { + response = RestAssured.given() + .auth().basic(username, password) + .baseUri(acmUrl) + .get(endpoint.replace("{compositionId}", compositionId)); + } + + /** + * Wait and retry request until the instance list is empty in the response. + */ + @Then("Wait and retry until the ac instance list is empty {string}") + public void waitUntilTheCondition(String endpoint) throws InterruptedException { + var startTime = System.currentTimeMillis(); + var maxWaitTime = TimeUnit.MINUTES.toMillis(2); // 2 minutes in milliseconds + var conditionMet = false; + while (!conditionMet && System.currentTimeMillis() - startTime < maxWaitTime) { + var size = response.getBody().jsonPath().getList("automationCompositionList").size(); + conditionMet = Integer.valueOf(0).equals(size); + if (!conditionMet) { + Thread.sleep(10000); // Wait for 10 second before retrying + fetchAllAcInstances(endpoint); + } + } + } + + /** + * Verify de-priming. + */ + @When("the ACM participants are deprimed {string}") + public void deprimeTheParticipants(String endpoint) throws JSONException { + var jsonBody = new JSONObject().put("primeOrder", "DEPRIME"); + response = RestAssured.given() + .config(RestAssured.config().encoderConfig(encoderConfig() + .encodeContentTypeAs("", ContentType.JSON))) + .auth().basic(username, password) + .contentType(ContentType.JSON) + .accept(ContentType.JSON) + .baseUri(acmUrl) + .body(jsonBody.toString()) + .put(endpoint.replace("{compositionId}", compositionId)); + } + + /** + * Verify deletion of composition defintion. + */ + @When("the AC definition is deleted {string}") + public void deleteAcDefinition(String endpoint) throws IOException { + response = RestAssured.given() + .auth().basic(username, password) + .baseUri(acmUrl) + .delete(endpoint.replace("{compositionId}", compositionId)); + } + + /** + * Verify migration functionality. + */ + @When("the ACM instance is migrated {string} with {string}") + public void migrate(String endpoint, String filePath) throws IOException { + var jsonContent = new String(Files.readAllBytes(Path.of(filePath))); + response = RestAssured.given() + .config(RestAssured.config().encoderConfig(encoderConfig() + .encodeContentTypeAs("", ContentType.JSON))) + .auth().basic(username, password) + .contentType(ContentType.JSON) + .accept(ContentType.JSON) + .baseUri(acmUrl) + .body(jsonContent + .replace("COMPOSITIONIDPLACEHOLDER", compositionId) + .replace("INSTANCEIDPLACEHOLDER", instanceId) + .replace("COMPOSITIONTARGETIDPLACEHOLDER", targetCompositionId)) + .post(endpoint.replace("{compositionId}", compositionId)); + } + + /** + * Verify the response status. + */ + @Then("the response status code should be {int}") + public void theUserEndpointIsUpAndRunning(int expectedStatus) { + assertEquals(expectedStatus, response.getStatusCode()); + } + + /** + * Verify the response contains specific keywords. + */ + @Then("the response should contain the updated properties {string} {string}") + public void theUserEndpointIsUpAndRunning(String value1, String value2) { + assertThat(value1, response.getBody().asString().contains(value1)); + assertThat(value1, response.getBody().asString().contains(value2)); + } + +} diff --git a/policy-regression-tests/policy-clamp-regression/src/test/resources/data/AcInstantiate.json b/policy-regression-tests/policy-clamp-regression/src/test/resources/data/AcInstantiate.json new file mode 100644 index 00000000..6b0b1553 --- /dev/null +++ b/policy-regression-tests/policy-clamp-regression/src/test/resources/data/AcInstantiate.json @@ -0,0 +1,25 @@ +{ + "name": "DemoInstance0", + "version": "1.0.1", + "compositionId": "COMPOSITIONIDPLACEHOLDER", + "description": "Demo automation composition instance 0", + "elements": { + "709c62b3-8918-41b9-a747-d21eb79c6c20": { + "id": "709c62b3-8918-41b9-a747-d21eb79c6c20", + "definition": { + "name": "onap.policy.clamp.ac.element.Policy_AutomationCompositionElement", + "version": "1.2.3" + }, + "description": "Policy Automation Composition Element for the Demo", + "properties": { + "policy_type_id": { + "name": "onap.policies.native.Apex", + "version": "1.0.0" + }, + "policy_id": { + "get_input": "acm_element_policy" + } + } + } + } +}
\ No newline at end of file diff --git a/policy-regression-tests/policy-clamp-regression/src/test/resources/data/AcMigrateInstance.json b/policy-regression-tests/policy-clamp-regression/src/test/resources/data/AcMigrateInstance.json new file mode 100644 index 00000000..1d505ae5 --- /dev/null +++ b/policy-regression-tests/policy-clamp-regression/src/test/resources/data/AcMigrateInstance.json @@ -0,0 +1,27 @@ +{ + "name": "DemoInstance0", + "version": "1.0.1", + "compositionId": "COMPOSITIONIDPLACEHOLDER", + "instanceId": "INSTANCEIDPLACEHOLDER", + "compositionTargetId": "COMPOSITIONTARGETIDPLACEHOLDER", + "description": "Demo automation composition instance 0", + "elements": { + "709c62b3-8918-41b9-a747-d21eb79c6c20": { + "id": "709c62b3-8918-41b9-a747-d21eb79c6c20", + "definition": { + "name": "onap.policy.clamp.ac.element.Policy_AutomationCompositionElement", + "version": "1.2.3" + }, + "description": "Policy Automation Composition Element for the Demo", + "properties": { + "policy_type_id": { + "name": "onap.policies.native.Apex", + "version": "1.0.0" + }, + "policy_id": { + "get_input": "acm_element_policy" + } + } + } + } +}
\ No newline at end of file diff --git a/policy-regression-tests/policy-clamp-regression/src/test/resources/data/AcUpdateProperty.json b/policy-regression-tests/policy-clamp-regression/src/test/resources/data/AcUpdateProperty.json new file mode 100644 index 00000000..a8598aaf --- /dev/null +++ b/policy-regression-tests/policy-clamp-regression/src/test/resources/data/AcUpdateProperty.json @@ -0,0 +1,27 @@ +{ + "name": "DemoInstance0", + "version": "1.0.1", + "compositionId": "COMPOSITIONIDPLACEHOLDER", + "instanceId": "INSTANCEIDPLACEHOLDER", + "description": "Demo automation composition instance 0", + "elements": { + "709c62b3-8918-41b9-a747-d21eb79c6c20": { + "id": "709c62b3-8918-41b9-a747-d21eb79c6c20", + "definition": { + "name": "onap.policy.clamp.ac.element.Policy_AutomationCompositionElement", + "version": "1.2.3" + }, + "description": "Policy Automation Composition Element for the Demo", + "properties": { + "policy_type_id": { + "name": "onap.policies.native.Apex", + "version": "1.0.0" + }, + "policy_id": { + "get_input": "acm_element_policy_updated" + }, + "new_property": "test" + } + } + } +}
\ No newline at end of file diff --git a/policy-regression-tests/policy-clamp-regression/src/test/resources/data/acelement-usecase1.json b/policy-regression-tests/policy-clamp-regression/src/test/resources/data/acelement-usecase1.json new file mode 100644 index 00000000..ff7539f8 --- /dev/null +++ b/policy-regression-tests/policy-clamp-regression/src/test/resources/data/acelement-usecase1.json @@ -0,0 +1,1498 @@ +{ + "tosca_definitions_version": "tosca_simple_yaml_1_3", + "data_types": { + "onap.datatypes.ToscaConceptIdentifier": { + "derived_from": "tosca.datatypes.Root", + "properties": { + "name": { + "type": "string", + "required": true + }, + "version": { + "type": "string", + "required": true + } + } + }, + "onap.datatypes.native.apex.EngineService": { + "derived_from": "tosca.datatypes.Root", + "properties": { + "name": { + "type": "string", + "description": "Specifies the engine name", + "required": false, + "default": "ApexEngineService" + }, + "version": { + "type": "string", + "description": "Specifies the engine version in double dotted format", + "required": false, + "default": "1.0.0" + }, + "id": { + "type": "integer", + "description": "Specifies the engine id", + "required": true + }, + "instance_count": { + "type": "integer", + "description": "Specifies the number of engine threads that should be run", + "required": true + }, + "deployment_port": { + "type": "integer", + "description": "Specifies the port to connect to for engine administration", + "required": false, + "default": 1 + }, + "policy_model_file_name": { + "type": "string", + "description": "The name of the file from which to read the APEX policy model", + "required": false + }, + "policy_type_impl": { + "type": "string", + "description": "The policy type implementation from which to read the APEX policy model", + "required": false + }, + "periodic_event_period": { + "type": "string", + "description": "The time interval in milliseconds for the periodic scanning event, 0 means don't scan", + "required": false + }, + "engine": { + "type": "onap.datatypes.native.apex.engineservice.Engine", + "description": "The parameters for all engines in the APEX engine service", + "required": true + } + } + }, + "onap.datatypes.native.apex.EventHandler": { + "derived_from": "tosca.datatypes.Root", + "properties": { + "name": { + "type": "string", + "description": "Specifies the event handler name, if not specified this is set to the key name", + "required": false + }, + "carrier_technology": { + "type": "onap.datatypes.native.apex.CarrierTechnology", + "description": "Specifies the carrier technology of the event handler (such as REST/Web Socket/Kafka)", + "required": true + }, + "event_protocol": { + "type": "onap.datatypes.native.apex.EventProtocol", + "description": "Specifies the event protocol of events for the event handler (such as Yaml/JSON/XML/POJO)", + "required": true + }, + "event_name": { + "type": "string", + "description": "Specifies the event name for events on this event handler, if not specified, the event name is read from or written to the event being received or sent", + "required": false + }, + "event_name_filter": { + "type": "string", + "description": "Specifies a filter as a regular expression, events that do not match the filter are dropped, the default is to let all events through", + "required": false + }, + "synchronous_mode": { + "type": "boolean", + "description": "Specifies the event handler is syncronous (receive event and send response)", + "required": false, + "default": false + }, + "synchronous_peer": { + "type": "string", + "description": "The peer event handler (output for input or input for output) of this event handler in synchronous mode, this parameter is mandatory if the event handler is in synchronous mode", + "required": false + }, + "synchronous_timeout": { + "type": "integer", + "description": "The timeout in milliseconds for responses to be issued by APEX torequests, this parameter is mandatory if the event handler is in synchronous mode", + "required": false + }, + "requestor_mode": { + "type": "boolean", + "description": "Specifies the event handler is in requestor mode (send event and wait for response mode)", + "required": false, + "default": false + }, + "requestor_peer": { + "type": "string", + "description": "The peer event handler (output for input or input for output) of this event handler in requestor mode, this parameter is mandatory if the event handler is in requestor mode", + "required": false + }, + "requestor_timeout": { + "type": "integer", + "description": "The timeout in milliseconds for wait for responses to requests, this parameter is mandatory if the event handler is in requestor mode", + "required": false + } + } + }, + "onap.datatypes.native.apex.CarrierTechnology": { + "derived_from": "tosca.datatypes.Root", + "properties": { + "label": { + "type": "string", + "description": "The label (name) of the carrier technology (such as REST, Kafka, WebSocket)", + "required": true + }, + "plugin_parameter_class_name": { + "type": "string", + "description": "The class name of the class that overrides default handling of event input or output for this carrier technology, defaults to the supplied input or output class", + "required": false + } + } + }, + "onap.datatypes.native.apex.EventProtocol": { + "derived_from": "tosca.datatypes.Root", + "properties": { + "label": { + "type": "string", + "description": "The label (name) of the event protocol (such as Yaml, JSON, XML, or POJO)", + "required": true + }, + "event_protocol_plugin_class": { + "type": "string", + "description": "The class name of the class that overrides default handling of the event protocol for this carrier technology, defaults to the supplied event protocol class", + "required": false + } + } + }, + "onap.datatypes.native.apex.Environment": { + "derived_from": "tosca.datatypes.Root", + "properties": { + "name": { + "type": "string", + "description": "The name of the environment variable", + "required": true + }, + "value": { + "type": "string", + "description": "The value of the environment variable", + "required": true + } + } + }, + "onap.datatypes.native.apex.engineservice.Engine": { + "derived_from": "tosca.datatypes.Root", + "properties": { + "context": { + "type": "onap.datatypes.native.apex.engineservice.engine.Context", + "description": "The properties for handling context in APEX engines, defaults to using Java maps for context", + "required": false + }, + "executors": { + "type": "map", + "description": "The plugins for policy executors used in engines such as javascript, MVEL, Jython", + "required": true, + "entry_schema": { + "description": "The plugin class path for this policy executor", + "type": "string" + } + } + } + }, + "onap.datatypes.native.apex.engineservice.engine.Context": { + "derived_from": "tosca.datatypes.Root", + "properties": { + "distributor": { + "type": "onap.datatypes.native.apex.Plugin", + "description": "The plugin to be used for distributing context between APEX PDPs at runtime", + "required": false + }, + "schemas": { + "type": "map", + "description": "The plugins for context schemas available in APEX PDPs such as Java and Avro", + "required": false, + "entry_schema": { + "type": "onap.datatypes.native.apex.Plugin" + } + }, + "locking": { + "type": "onap.datatypes.native.apex.Plugin", + "description": "The plugin to be used for locking context in and between APEX PDPs at runtime", + "required": false + }, + "persistence": { + "type": "onap.datatypes.native.apex.Plugin", + "description": "The plugin to be used for persisting context for APEX PDPs at runtime", + "required": false + } + } + }, + "onap.datatypes.native.apex.Plugin": { + "derived_from": "tosca.datatypes.Root", + "properties": { + "name": { + "type": "string", + "description": "The name of the executor such as Javascript, Jython or MVEL", + "required": true + }, + "plugin_class_name": { + "type": "string", + "description": "The class path of the plugin class for this executor" + } + } + }, + "org.onap.datatypes.policy.clamp.acm.httpAutomationCompositionElement.RestRequest": { + "version": "1.0.0", + "derived_from": "tosca.datatypes.Root", + "properties": { + "restRequestId": { + "type": "onap.datatypes.ToscaConceptIdentifier", + "required": true, + "description": "The name and version of a REST request to be sent to a REST endpoint" + }, + "httpMethod": { + "type": "string", + "required": true, + "constraints": [ + { + "valid_values": [ + "POST", + "PUT", + "GET", + "DELETE" + ] + } + ], + "description": "The REST method to use" + }, + "path": { + "type": "string", + "required": true, + "description": "The path of the REST request relative to the base URL" + }, + "body": { + "type": "string", + "required": false, + "description": "The body of the REST request for PUT and POST requests" + }, + "expectedResponse": { + "type": "integer", + "required": true, + "constraints": [], + "description": "THe expected HTTP status code for the REST request" + } + } + }, + "org.onap.datatypes.policy.clamp.acm.httpAutomationCompositionElement.ConfigurationEntity": { + "version": "1.0.0", + "derived_from": "tosca.datatypes.Root", + "properties": { + "configurationEntityId": { + "type": "onap.datatypes.ToscaConceptIdentifier", + "required": true, + "description": "The name and version of a Configuration Entity to be handled by the HTTP Automation Composition Element" + }, + "restSequence": { + "type": "list", + "entry_schema": { + "type": "org.onap.datatypes.policy.clamp.acm.httpAutomationCompositionElement.RestRequest", + "type_version": "1.0.0" + }, + "description": "A sequence of REST commands to send to the REST endpoint" + } + } + } + }, + "policy_types": { + "onap.policies.Native": { + "derived_from": "tosca.policies.Root", + "description": "a base policy type for all native PDP policies", + "version": "1.0.0", + "name": "onap.policies.Native" + }, + "onap.policies.native.Apex": { + "derived_from": "onap.policies.Native", + "description": "a policy type for native apex policies", + "version": "1.0.0", + "name": "onap.policies.native.Apex", + "properties": { + "engine_service": { + "type": "onap.datatypes.native.apex.EngineService", + "description": "APEX Engine Service Parameters" + }, + "inputs": { + "type": "map", + "description": "Inputs for handling events coming into the APEX engine", + "entry_schema": { + "type": "onap.datatypes.native.apex.EventHandler" + } + }, + "outputs": { + "type": "map", + "description": "Outputs for handling events going out of the APEX engine", + "entry_schema": { + "type": "onap.datatypes.native.apex.EventHandler" + } + }, + "environment": { + "type": "list", + "description": "Envioronmental parameters for the APEX engine", + "entry_schema": { + "type": "onap.datatypes.native.apex.Environment" + } + } + } + } + }, + "node_types": { + "org.onap.policy.clamp.acm.Participant": { + "version": "1.0.1", + "derived_from": "tosca.nodetypes.Root", + "properties": { + "provider": { + "type": "string", + "required": false + } + } + }, + "org.onap.policy.clamp.acm.AutomationCompositionElement": { + "version": "1.0.1", + "derived_from": "tosca.nodetypes.Root", + "properties": { + "provider": { + "type": "string", + "required": false, + "metadata": { + "common": true + }, + "description": "Specifies the organization that provides the automation composition element" + }, + "startPhase": { + "type": "integer", + "required": false, + "constraints": [ + { + "greater_or_equal": 0 + } + ], + "metadata": { + "common": true + }, + "description": "A value indicating the start phase in which this automation composition element will be started, the first start phase is zero. Automation Composition Elements are started in their start_phase order and stopped in reverse start phase order. Automation Composition Elements with the same start phase are started and stopped simultaneously" + }, + "uninitializedToPassiveTimeout": { + "type": "integer", + "required": false, + "constraints": [ + { + "greater_or_equal": 0 + } + ], + "default": 60, + "metadata": { + "common": true + }, + "description": "The maximum time in seconds to wait for a state chage from uninitialized to passive" + }, + "passiveToRunningTimeout": { + "type": "integer", + "required": false, + "constraints": [ + { + "greater_or_equal": 0 + } + ], + "default": 60, + "metadata": { + "common": true + }, + "description": "The maximum time in seconds to wait for a state chage from passive to running" + }, + "runningToPassiveTimeout": { + "type": "integer", + "required": false, + "constraints": [ + { + "greater_or_equal": 0 + } + ], + "default": 60, + "metadata": { + "common": true + }, + "description": "The maximum time in seconds to wait for a state chage from running to passive" + }, + "passiveToUninitializedTimeout": { + "type": "integer", + "required": false, + "constraints": [ + { + "greater_or_equal": 0 + } + ], + "default": 60, + "metadata": { + "common": true + }, + "description": "The maximum time in seconds to wait for a state chage from passive to uninitialized" + } + } + }, + "org.onap.policy.clamp.acm.AutomationComposition": { + "version": "1.0.1", + "derived_from": "tosca.nodetypes.Root", + "properties": { + "provider": { + "type": "string", + "required": false, + "metadata": { + "common": true + }, + "description": "Specifies the organization that provides the automation composition element" + }, + "elements": { + "type": "list", + "required": true, + "metadata": { + "common": true + }, + "entry_schema": { + "type": "onap.datatypes.ToscaConceptIdentifier" + }, + "description": "Specifies a list of automation composition element definitions that make up this automation composition definition" + } + } + }, + "org.onap.policy.clamp.acm.PolicyAutomationCompositionElement": { + "version": "1.0.0", + "derived_from": "org.onap.policy.clamp.acm.AutomationCompositionElement", + "properties": { + "policy_type_id": { + "type": "onap.datatypes.ToscaConceptIdentifier", + "required": true + }, + "policy_id": { + "type": "onap.datatypes.ToscaConceptIdentifier", + "required": false + } + } + }, + "org.onap.policy.clamp.acm.K8SMicroserviceAutomationCompositionElement": { + "version": "1.0.0", + "derived_from": "org.onap.policy.clamp.acm.AutomationCompositionElement", + "properties": { + "chart": { + "type": "string", + "required": true + }, + "configs": { + "type": "list", + "required": false + }, + "requirements": { + "type": "string", + "required": false + }, + "templates": { + "type": "list", + "required": false, + "entry_schema": null + }, + "values": { + "type": "string", + "required": true + } + } + }, + "org.onap.policy.clamp.acm.HttpAutomationCompositionElement": { + "version": "1.0.0", + "derived_from": "org.onap.policy.clamp.acm.AutomationCompositionElement", + "properties": { + "baseUrl": { + "type": "string", + "required": true, + "description": "The base URL to be prepended to each path, identifies the host for the REST endpoints." + }, + "httpHeaders": { + "type": "map", + "required": false, + "entry_schema": { + "type": "string" + }, + "description": "HTTP headers to send on REST requests" + }, + "configurationEntities": { + "type": "map", + "required": true, + "entry_schema": { + "type": "org.onap.datatypes.policy.clamp.acm.httpAutomationCompositionElement.ConfigurationEntity", + "type_version": "1.0.0" + }, + "description": "The connfiguration entities the Automation Composition Element is managing and their associated REST requests" + } + } + } + }, + "topology_template": { + "inputs": { + "acm_element_policy": { + "type": "onap.datatypes.ToscaConceptIdentifier", + "description": "The ID of the operational policy to use", + "default": { + "name": "onap.policies.native.apex.ac.element", + "version": "1.0.0" + } + } + }, + "node_templates": { + "org.onap.policy.clamp.acm.PolicyParticipant": { + "version": "2.3.1", + "type": "org.onap.policy.clamp.acm.Participant", + "type_version": "1.0.1", + "description": "Participant for Policy microservices", + "properties": { + "provider": "ONAP" + } + }, + "onap.policy.clamp.ac.element.Policy_AutomationCompositionElement": { + "version": "1.2.3", + "type": "org.onap.policy.clamp.acm.PolicyAutomationCompositionElement", + "type_version": "1.0.0", + "description": "Automation composition element for the operational policy for Performance Management Subscription Handling", + "properties": { + "provider": "Ericsson", + "startPhase": 0 + } + }, + "org.onap.k8s.acm.K8SAutomationCompositionParticipant": { + "version": "2.3.4", + "type": "org.onap.policy.clamp.acm.Participant", + "type_version": "1.0.1", + "description": "Participant for K8S", + "properties": { + "provider": "ONAP" + } + }, + "onap.policy.clamp.ac.element.K8S_StarterAutomationCompositionElement": { + "version": "1.2.3", + "type": "org.onap.policy.clamp.acm.K8SMicroserviceAutomationCompositionElement", + "type_version": "1.0.0", + "description": "Automation composition element for the K8S microservice for AC Element Starter", + "properties": { + "provider": "ONAP", + "startPhase": 0, + "uninitializedToPassiveTimeout": 300, + "podStatusCheckInterval": 30 + } + }, + "onap.policy.clamp.ac.element.K8S_BridgeAutomationCompositionElement": { + "version": "1.2.3", + "type": "org.onap.policy.clamp.acm.K8SMicroserviceAutomationCompositionElement", + "type_version": "1.0.0", + "description": "Automation composition element for the K8S microservice for AC Element Bridge", + "properties": { + "provider": "ONAP", + "startPhase": 0, + "uninitializedToPassiveTimeout": 300, + "podStatusCheckInterval": 30 + } + }, + "onap.policy.clamp.ac.element.K8S_SinkAutomationCompositionElement": { + "version": "1.2.3", + "type": "org.onap.policy.clamp.acm.K8SMicroserviceAutomationCompositionElement", + "type_version": "1.0.0", + "description": "Automation composition element for the K8S microservice for AC Element Sink", + "properties": { + "provider": "ONAP", + "startPhase": 0, + "uninitializedToPassiveTimeout": 300, + "podStatusCheckInterval": 30 + } + }, + "org.onap.policy.clamp.acm.HttpParticipant": { + "version": "2.3.4", + "type": "org.onap.policy.clamp.acm.Participant", + "type_version": "1.0.1", + "description": "Participant for Http requests", + "properties": { + "provider": "ONAP" + } + }, + "onap.policy.clamp.ac.element.Http_StarterAutomationCompositionElement": { + "version": "1.2.3", + "type": "org.onap.policy.clamp.acm.HttpAutomationCompositionElement", + "type_version": "1.0.0", + "description": "Automation composition element for the http requests of AC Element Starter microservice", + "properties": { + "provider": "ONAP", + "uninitializedToPassiveTimeout": 300, + "startPhase": 1 + } + }, + "onap.policy.clamp.ac.element.Http_BridgeAutomationCompositionElement": { + "version": "1.2.3", + "type": "org.onap.policy.clamp.acm.HttpAutomationCompositionElement", + "type_version": "1.0.0", + "description": "Automation composition element for the http requests of AC Element Bridge microservice", + "properties": { + "provider": "ONAP", + "uninitializedToPassiveTimeout": 300, + "startPhase": 1 + } + }, + "onap.policy.clamp.ac.element.Http_SinkAutomationCompositionElement": { + "version": "1.2.3", + "type": "org.onap.policy.clamp.acm.HttpAutomationCompositionElement", + "type_version": "1.0.0", + "description": "Automation composition element for the http requests of AC Element Sink microservice", + "properties": { + "provider": "ONAP", + "uninitializedToPassiveTimeout": 300, + "startPhase": 1 + } + }, + "onap.policy.clamp.ac.element.AutomationCompositionDefinition": { + "version": "1.2.3", + "type": "org.onap.policy.clamp.acm.AutomationComposition", + "type_version": "1.0.1", + "description": "Automation composition for Demo", + "properties": { + "provider": "ONAP", + "elements": [ + { + "name": "onap.policy.clamp.ac.element.Policy_AutomationCompositionElement", + "version": "1.2.3" + }, + { + "name": "onap.policy.clamp.ac.element.K8S_StarterAutomationCompositionElement", + "version": "1.2.3" + }, + { + "name": "onap.policy.clamp.ac.element.K8S_BridgeAutomationCompositionElement", + "version": "1.2.3" + }, + { + "name": "onap.policy.clamp.ac.element.K8S_SinkAutomationCompositionElement", + "version": "1.2.3" + }, + { + "name": "onap.policy.clamp.ac.element.Http_StarterAutomationCompositionElement", + "version": "1.2.3" + }, + { + "name": "onap.policy.clamp.ac.element.Http_BridgeAutomationCompositionElement", + "version": "1.2.3" + }, + { + "name": "onap.policy.clamp.ac.element.Http_SinkAutomationCompositionElement", + "version": "1.2.3" + } + ] + } + } + }, + "policies": [ + { + "onap.policies.native.apex.ac.element": { + "type": "onap.policies.native.Apex", + "type_version": "1.0.0", + "properties": { + "engineServiceParameters": { + "name": "MyApexEngine", + "version": "0.0.1", + "id": 45, + "instanceCount": 2, + "deploymentPort": 12561, + "engineParameters": { + "executorParameters": { + "JAVASCRIPT": { + "parameterClassName": "org.onap.policy.apex.plugins.executor.javascript.JavascriptExecutorParameters" + } + }, + "contextParameters": { + "parameterClassName": "org.onap.policy.apex.context.parameters.ContextParameters", + "schemaParameters": { + "Json": { + "parameterClassName": "org.onap.policy.apex.plugins.context.schema.json.JsonSchemaHelperParameters" + } + } + } + }, + "policy_type_impl": { + "policies": { + "key": { + "name": "APEXacElementPolicy_Policies", + "version": "0.0.1" + }, + "policyMap": { + "entry": [ + { + "key": { + "name": "ReceiveEventPolicy", + "version": "0.0.1" + }, + "value": { + "policyKey": { + "name": "ReceiveEventPolicy", + "version": "0.0.1" + }, + "template": "Freestyle", + "state": { + "entry": [ + { + "key": "DecideForwardingState", + "value": { + "stateKey": { + "parentKeyName": "ReceiveEventPolicy", + "parentKeyVersion": "0.0.1", + "parentLocalName": "NULL", + "localName": "DecideForwardingState" + }, + "trigger": { + "name": "AcElementEvent", + "version": "0.0.1" + }, + "stateOutputs": { + "entry": [ + { + "key": "CreateForwardPayload", + "value": { + "key": { + "parentKeyName": "ReceiveEventPolicy", + "parentKeyVersion": "0.0.1", + "parentLocalName": "DecideForwardingState", + "localName": "CreateForwardPayload" + }, + "outgoingEvent": { + "name": "DmaapResponseStatusEvent", + "version": "0.0.1" + }, + "outgoingEventReference": [ + { + "name": "DmaapResponseStatusEvent", + "version": "0.0.1" + } + ], + "nextState": { + "parentKeyName": "NULL", + "parentKeyVersion": "0.0.0", + "parentLocalName": "NULL", + "localName": "NULL" + } + } + } + ] + }, + "contextAlbumReference": [], + "taskSelectionLogic": { + "key": { + "parentKeyName": "NULL", + "parentKeyVersion": "0.0.0", + "parentLocalName": "NULL", + "localName": "NULL" + }, + "logicFlavour": "UNDEFINED", + "logic": "" + }, + "stateFinalizerLogicMap": { + "entry": [] + }, + "defaultTask": { + "name": "ForwardPayloadTask", + "version": "0.0.1" + }, + "taskReferences": { + "entry": [ + { + "key": { + "name": "ForwardPayloadTask", + "version": "0.0.1" + }, + "value": { + "key": { + "parentKeyName": "ReceiveEventPolicy", + "parentKeyVersion": "0.0.1", + "parentLocalName": "DecideForwardingState", + "localName": "ReceiveEventPolicy" + }, + "outputType": "DIRECT", + "output": { + "parentKeyName": "ReceiveEventPolicy", + "parentKeyVersion": "0.0.1", + "parentLocalName": "DecideForwardingState", + "localName": "CreateForwardPayload" + } + } + } + ] + } + } + } + ] + }, + "firstState": "DecideForwardingState" + } + } + ] + } + }, + "tasks": { + "key": { + "name": "APEXacElementPolicy_Tasks", + "version": "0.0.1" + }, + "taskMap": { + "entry": [ + { + "key": { + "name": "ForwardPayloadTask", + "version": "0.0.1" + }, + "value": { + "key": { + "name": "ForwardPayloadTask", + "version": "0.0.1" + }, + "inputEvent": { + "key": { + "name": "AcElementEvent", + "version": "0.0.1" + }, + "nameSpace": "org.onap.policy.apex.ac.element", + "source": "Dmaap", + "target": "APEX", + "parameter": { + "entry": [ + { + "key": "DmaapResponseEvent", + "value": { + "key": { + "parentKeyName": "AcElementEvent", + "parentKeyVersion": "0.0.1", + "parentLocalName": "NULL", + "localName": "DmaapResponseEvent" + }, + "fieldSchemaKey": { + "name": "ACEventType", + "version": "0.0.1" + }, + "optional": false + } + } + ] + }, + "toscaPolicyState": "ENTRY" + }, + "outputEvents": { + "entry": [ + { + "key": "DmaapResponseStatusEvent", + "value": { + "key": { + "name": "DmaapResponseStatusEvent", + "version": "0.0.1" + }, + "nameSpace": "org.onap.policy.apex.ac.element", + "source": "APEX", + "target": "Dmaap", + "parameter": { + "entry": [ + { + "key": "DmaapResponseStatusEvent", + "value": { + "key": { + "parentKeyName": "DmaapResponseStatusEvent", + "parentKeyVersion": "0.0.1", + "parentLocalName": "NULL", + "localName": "DmaapResponseStatusEvent" + }, + "fieldSchemaKey": { + "name": "ACEventType", + "version": "0.0.1" + }, + "optional": false + } + } + ] + }, + "toscaPolicyState": "" + } + } + ] + }, + "taskParameters": { + "entry": [] + }, + "contextAlbumReference": [ + { + "name": "ACElementAlbum", + "version": "0.0.1" + } + ], + "taskLogic": { + "key": { + "parentKeyName": "ForwardPayloadTask", + "parentKeyVersion": "0.0.1", + "parentLocalName": "NULL", + "localName": "TaskLogic" + }, + "logicFlavour": "JAVASCRIPT", + "logic": "/*\n * ============LICENSE_START=======================================================\n * Copyright (C) 2022 Nordix. All rights reserved.\n * ================================================================================\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * SPDX-License-Identifier: Apache-2.0\n * ============LICENSE_END=========================================================\n */\n\nexecutor.logger.info(executor.subject.id);\nexecutor.logger.info(executor.inFields);\n\nvar msgResponse = executor.inFields.get('DmaapResponseEvent');\nexecutor.logger.info('Task in progress with mesages: ' + msgResponse);\n\nvar elementId = msgResponse.get('elementId').get('name');\n\nif (msgResponse.get('messageType') == 'STATUS' &&\n (elementId == 'onap.policy.clamp.ac.startertobridge'\n || elementId == 'onap.policy.clamp.ac.bridgetosink')) {\n\n var receiverId = '';\n if (elementId == 'onap.policy.clamp.ac.startertobridge') {\n receiverId = 'onap.policy.clamp.ac.bridge';\n } else {\n receiverId = 'onap.policy.clamp.ac.sink';\n }\n\n var elementIdResponse = new java.util.HashMap();\n elementIdResponse.put('name', receiverId);\n elementIdResponse.put('version', msgResponse.get('elementId').get('version'));\n\n var dmaapResponse = new java.util.HashMap();\n dmaapResponse.put('elementId', elementIdResponse);\n\n var message = msgResponse.get('message') + ' trace added from policy';\n dmaapResponse.put('message', message);\n dmaapResponse.put('messageType', 'STATUS');\n dmaapResponse.put('messageId', msgResponse.get('messageId'));\n dmaapResponse.put('timestamp', msgResponse.get('timestamp'));\n\n executor.logger.info('Sending forwarding Event to Ac element: ' + dmaapResponse);\n\n executor.outFields.put('DmaapResponseStatusEvent', dmaapResponse);\n}\n\ntrue;" + } + } + } + ] + } + }, + "events": { + "key": { + "name": "APEXacElementPolicy_Events", + "version": "0.0.1" + }, + "eventMap": { + "entry": [ + { + "key": { + "name": "AcElementEvent", + "version": "0.0.1" + }, + "value": { + "key": { + "name": "AcElementEvent", + "version": "0.0.1" + }, + "nameSpace": "org.onap.policy.apex.ac.element", + "source": "Dmaap", + "target": "APEX", + "parameter": { + "entry": [ + { + "key": "DmaapResponseEvent", + "value": { + "key": { + "parentKeyName": "AcElementEvent", + "parentKeyVersion": "0.0.1", + "parentLocalName": "NULL", + "localName": "DmaapResponseEvent" + }, + "fieldSchemaKey": { + "name": "ACEventType", + "version": "0.0.1" + }, + "optional": false + } + } + ] + }, + "toscaPolicyState": "ENTRY" + } + }, + { + "key": { + "name": "DmaapResponseStatusEvent", + "version": "0.0.1" + }, + "value": { + "key": { + "name": "DmaapResponseStatusEvent", + "version": "0.0.1" + }, + "nameSpace": "org.onap.policy.apex.ac.element", + "source": "APEX", + "target": "Dmaap", + "parameter": { + "entry": [ + { + "key": "DmaapResponseStatusEvent", + "value": { + "key": { + "parentKeyName": "DmaapResponseStatusEvent", + "parentKeyVersion": "0.0.1", + "parentLocalName": "NULL", + "localName": "DmaapResponseStatusEvent" + }, + "fieldSchemaKey": { + "name": "ACEventType", + "version": "0.0.1" + }, + "optional": false + } + } + ] + }, + "toscaPolicyState": "" + } + }, + { + "key": { + "name": "LogEvent", + "version": "0.0.1" + }, + "value": { + "key": { + "name": "LogEvent", + "version": "0.0.1" + }, + "nameSpace": "org.onap.policy.apex.ac.element", + "source": "APEX", + "target": "file", + "parameter": { + "entry": [ + { + "key": "final_status", + "value": { + "key": { + "parentKeyName": "LogEvent", + "parentKeyVersion": "0.0.1", + "parentLocalName": "NULL", + "localName": "final_status" + }, + "fieldSchemaKey": { + "name": "SimpleStringType", + "version": "0.0.1" + }, + "optional": false + } + }, + { + "key": "message", + "value": { + "key": { + "parentKeyName": "LogEvent", + "parentKeyVersion": "0.0.1", + "parentLocalName": "NULL", + "localName": "message" + }, + "fieldSchemaKey": { + "name": "SimpleStringType", + "version": "0.0.1" + }, + "optional": false + } + } + ] + }, + "toscaPolicyState": "" + } + } + ] + } + }, + "albums": { + "key": { + "name": "APEXacElementPolicy_Albums", + "version": "0.0.1" + }, + "albums": { + "entry": [ + { + "key": { + "name": "ACElementAlbum", + "version": "0.0.1" + }, + "value": { + "key": { + "name": "ACElementAlbum", + "version": "0.0.1" + }, + "scope": "policy", + "isWritable": true, + "itemSchema": { + "name": "ACEventType", + "version": "0.0.1" + } + } + } + ] + } + }, + "schemas": { + "key": { + "name": "APEXacElementPolicy_Schemas", + "version": "0.0.1" + }, + "schemas": { + "entry": [ + { + "key": { + "name": "ACEventType", + "version": "0.0.1" + }, + "value": { + "key": { + "name": "ACEventType", + "version": "0.0.1" + }, + "schemaFlavour": "Json", + "schemaDefinition": "{\n \"$schema\": \"http://json-schema.org/draft-04/schema#\",\n \"type\": \"object\",\n \"properties\": {\n \"elementId\": {\n \"type\": \"object\",\n \"properties\": {\n \"name\": {\n \"type\": \"string\"\n },\n \"version\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"name\",\n \"version\"\n ]\n },\n \"message\": {\n \"type\": \"string\"\n },\n \"messageType\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"elementId\",\n \"message\",\n \"messageType\"\n ]\n}" + } + }, + { + "key": { + "name": "SimpleIntType", + "version": "0.0.1" + }, + "value": { + "key": { + "name": "SimpleIntType", + "version": "0.0.1" + }, + "schemaFlavour": "Java", + "schemaDefinition": "java.lang.Integer" + } + }, + { + "key": { + "name": "SimpleStringType", + "version": "0.0.1" + }, + "value": { + "key": { + "name": "SimpleStringType", + "version": "0.0.1" + }, + "schemaFlavour": "Java", + "schemaDefinition": "java.lang.String" + } + }, + { + "key": { + "name": "UUIDType", + "version": "0.0.1" + }, + "value": { + "key": { + "name": "UUIDType", + "version": "0.0.1" + }, + "schemaFlavour": "Java", + "schemaDefinition": "java.util.UUID" + } + } + ] + } + }, + "key": { + "name": "APEXacElementPolicy", + "version": "0.0.1" + }, + "keyInformation": { + "key": { + "name": "APEXacElementPolicy_KeyInfo", + "version": "0.0.1" + }, + "keyInfoMap": { + "entry": [ + { + "key": { + "name": "ACElementAlbum", + "version": "0.0.1" + }, + "value": { + "key": { + "name": "ACElementAlbum", + "version": "0.0.1" + }, + "UUID": "7cddfab8-6d3f-3f7f-8ac3-e2eb5979c900", + "description": "Generated description for concept referred to by key \"ACElementAlbum:0.0.1\"" + } + }, + { + "key": { + "name": "ACEventType", + "version": "0.0.1" + }, + "value": { + "key": { + "name": "ACEventType", + "version": "0.0.1" + }, + "UUID": "dab78794-b666-3929-a75b-70d634b04fe5", + "description": "Generated description for concept referred to by key \"ACEventType:0.0.1\"" + } + }, + { + "key": { + "name": "APEXacElementPolicy", + "version": "0.0.1" + }, + "value": { + "key": { + "name": "APEXacElementPolicy", + "version": "0.0.1" + }, + "UUID": "da478611-7d77-3c46-b4be-be968769ba4e", + "description": "Generated description for concept referred to by key \"APEXacElementPolicy:0.0.1\"" + } + }, + { + "key": { + "name": "APEXacElementPolicy_Albums", + "version": "0.0.1" + }, + "value": { + "key": { + "name": "APEXacElementPolicy_Albums", + "version": "0.0.1" + }, + "UUID": "fa8dc15e-8c8d-3de3-a0f8-585b76511175", + "description": "Generated description for concept referred to by key \"APEXacElementPolicy_Albums:0.0.1\"" + } + }, + { + "key": { + "name": "APEXacElementPolicy_Events", + "version": "0.0.1" + }, + "value": { + "key": { + "name": "APEXacElementPolicy_Events", + "version": "0.0.1" + }, + "UUID": "8508cd65-8dd2-342d-a5c6-1570810dbe2b", + "description": "Generated description for concept referred to by key \"APEXacElementPolicy_Events:0.0.1\"" + } + }, + { + "key": { + "name": "APEXacElementPolicy_KeyInfo", + "version": "0.0.1" + }, + "value": { + "key": { + "name": "APEXacElementPolicy_KeyInfo", + "version": "0.0.1" + }, + "UUID": "09e6927d-c5ac-3779-919f-9333994eed22", + "description": "Generated description for concept referred to by key \"APEXacElementPolicy_KeyInfo:0.0.1\"" + } + }, + { + "key": { + "name": "APEXacElementPolicy_Policies", + "version": "0.0.1" + }, + "value": { + "key": { + "name": "APEXacElementPolicy_Policies", + "version": "0.0.1" + }, + "UUID": "cade3c9a-1600-3642-a6f4-315612187f46", + "description": "Generated description for concept referred to by key \"APEXacElementPolicy_Policies:0.0.1\"" + } + }, + { + "key": { + "name": "APEXacElementPolicy_Schemas", + "version": "0.0.1" + }, + "value": { + "key": { + "name": "APEXacElementPolicy_Schemas", + "version": "0.0.1" + }, + "UUID": "5bb4a8e9-35fa-37db-9a49-48ef036a7ba9", + "description": "Generated description for concept referred to by key \"APEXacElementPolicy_Schemas:0.0.1\"" + } + }, + { + "key": { + "name": "APEXacElementPolicy_Tasks", + "version": "0.0.1" + }, + "value": { + "key": { + "name": "APEXacElementPolicy_Tasks", + "version": "0.0.1" + }, + "UUID": "2527eeec-0d1f-3094-ad3f-212622b12836", + "description": "Generated description for concept referred to by key \"APEXacElementPolicy_Tasks:0.0.1\"" + } + }, + { + "key": { + "name": "AcElementEvent", + "version": "0.0.1" + }, + "value": { + "key": { + "name": "AcElementEvent", + "version": "0.0.1" + }, + "UUID": "32c013e2-2740-3986-a626-cbdf665b63e9", + "description": "Generated description for concept referred to by key \"AcElementEvent:0.0.1\"" + } + }, + { + "key": { + "name": "DmaapResponseStatusEvent", + "version": "0.0.1" + }, + "value": { + "key": { + "name": "DmaapResponseStatusEvent", + "version": "0.0.1" + }, + "UUID": "2715cb6c-2778-3461-8b69-871e79f95935", + "description": "Generated description for concept referred to by key \"DmaapResponseStatusEvent:0.0.1\"" + } + }, + { + "key": { + "name": "ForwardPayloadTask", + "version": "0.0.1" + }, + "value": { + "key": { + "name": "ForwardPayloadTask", + "version": "0.0.1" + }, + "UUID": "51defa03-1ecf-3314-bf34-2a652bce57fa", + "description": "Generated description for concept referred to by key \"ForwardPayloadTask:0.0.1\"" + } + }, + { + "key": { + "name": "LogEvent", + "version": "0.0.1" + }, + "value": { + "key": { + "name": "LogEvent", + "version": "0.0.1" + }, + "UUID": "c540f048-96af-35e3-a36e-e9c29377cba7", + "description": "Generated description for concept referred to by key \"LogEvent:0.0.1\"" + } + }, + { + "key": { + "name": "ReceiveEventPolicy", + "version": "0.0.1" + }, + "value": { + "key": { + "name": "ReceiveEventPolicy", + "version": "0.0.1" + }, + "UUID": "568b7345-9de1-36d3-b6a3-9b857e6809a1", + "description": "Generated description for concept referred to by key \"ReceiveEventPolicy:0.0.1\"" + } + }, + { + "key": { + "name": "SimpleIntType", + "version": "0.0.1" + }, + "value": { + "key": { + "name": "SimpleIntType", + "version": "0.0.1" + }, + "UUID": "153791fd-ae0a-36a7-88a5-309a7936415d", + "description": "Generated description for concept referred to by key \"SimpleIntType:0.0.1\"" + } + }, + { + "key": { + "name": "SimpleStringType", + "version": "0.0.1" + }, + "value": { + "key": { + "name": "SimpleStringType", + "version": "0.0.1" + }, + "UUID": "8a4957cf-9493-3a76-8c22-a208e23259af", + "description": "Generated description for concept referred to by key \"SimpleStringType:0.0.1\"" + } + }, + { + "key": { + "name": "UUIDType", + "version": "0.0.1" + }, + "value": { + "key": { + "name": "UUIDType", + "version": "0.0.1" + }, + "UUID": "6a8cc68e-dfc8-3403-9c6d-071c886b319c", + "description": "Generated description for concept referred to by key \"UUIDType:0.0.1\"" + } + } + ] + } + } + } + }, + "eventInputParameters": { + "DmaapConsumer": { + "carrierTechnologyParameters": { + "carrierTechnology": "KAFKA", + "parameterClassName": "org.onap.policy.apex.plugins.event.carrier.kafka.KafkaCarrierTechnologyParameters", + "parameters": { + "bootstrapServers": "kafka:9092", + "groupId": "clamp-grp", + "enableAutoCommit": true, + "autoCommitTime": 1000, + "sessionTimeout": 30000, + "consumerPollTime": 100, + "consumerTopicList": [ + "ac_element_msg" + ], + "keyDeserializer": "org.apache.kafka.common.serialization.StringDeserializer", + "valueDeserializer": "org.apache.kafka.common.serialization.StringDeserializer", + "kafkaProperties": [] + } + }, + "eventProtocolParameters": { + "eventProtocol": "JSON", + "parameters": { + "pojoField": "DmaapResponseEvent" + } + }, + "eventName": "AcElementEvent", + "eventNameFilter": "AcElementEvent" + } + }, + "eventOutputParameters": { + "logOutputter": { + "carrierTechnologyParameters": { + "carrierTechnology": "FILE", + "parameters": { + "fileName": "outputevents.log" + } + }, + "eventProtocolParameters": { + "eventProtocol": "JSON" + } + }, + "DmaapReplyProducer": { + "carrierTechnologyParameters": { + "carrierTechnology": "KAFKA", + "parameterClassName": "org.onap.policy.apex.plugins.event.carrier.kafka.KafkaCarrierTechnologyParameters", + "parameters": { + "bootstrapServers": "kafka:9092", + "acks": "all", + "retries": 0, + "batchSize": 16384, + "lingerTime": 1, + "bufferMemory": 33554432, + "producerTopic": "policy_update_msg", + "keySerializer": "org.apache.kafka.common.serialization.StringSerializer", + "valueSerializer": "org.apache.kafka.common.serialization.StringSerializer", + "kafkaProperties": [] + } + }, + "eventProtocolParameters": { + "eventProtocol": "JSON", + "parameters": { + "pojoField": "DmaapResponseStatusEvent" + } + }, + "eventNameFilter": "LogEvent|DmaapResponseStatusEvent" + } + } + }, + "name": "onap.policies.native.apex.ac.element", + "version": "1.0.0" + } + } + ] + } +}
\ No newline at end of file diff --git a/policy-regression-tests/policy-clamp-regression/src/test/resources/data/acelement-usecase2.json b/policy-regression-tests/policy-clamp-regression/src/test/resources/data/acelement-usecase2.json new file mode 100644 index 00000000..a64e4851 --- /dev/null +++ b/policy-regression-tests/policy-clamp-regression/src/test/resources/data/acelement-usecase2.json @@ -0,0 +1,1498 @@ +{ + "tosca_definitions_version": "tosca_simple_yaml_1_3", + "data_types": { + "onap.datatypes.ToscaConceptIdentifier": { + "derived_from": "tosca.datatypes.Root", + "properties": { + "name": { + "type": "string", + "required": true + }, + "version": { + "type": "string", + "required": true + } + } + }, + "onap.datatypes.native.apex.EngineService": { + "derived_from": "tosca.datatypes.Root", + "properties": { + "name": { + "type": "string", + "description": "Specifies the engine name", + "required": false, + "default": "ApexEngineService" + }, + "version": { + "type": "string", + "description": "Specifies the engine version in double dotted format", + "required": false, + "default": "1.0.0" + }, + "id": { + "type": "integer", + "description": "Specifies the engine id", + "required": true + }, + "instance_count": { + "type": "integer", + "description": "Specifies the number of engine threads that should be run", + "required": true + }, + "deployment_port": { + "type": "integer", + "description": "Specifies the port to connect to for engine administration", + "required": false, + "default": 1 + }, + "policy_model_file_name": { + "type": "string", + "description": "The name of the file from which to read the APEX policy model", + "required": false + }, + "policy_type_impl": { + "type": "string", + "description": "The policy type implementation from which to read the APEX policy model", + "required": false + }, + "periodic_event_period": { + "type": "string", + "description": "The time interval in milliseconds for the periodic scanning event, 0 means don't scan", + "required": false + }, + "engine": { + "type": "onap.datatypes.native.apex.engineservice.Engine", + "description": "The parameters for all engines in the APEX engine service", + "required": true + } + } + }, + "onap.datatypes.native.apex.EventHandler": { + "derived_from": "tosca.datatypes.Root", + "properties": { + "name": { + "type": "string", + "description": "Specifies the event handler name, if not specified this is set to the key name", + "required": false + }, + "carrier_technology": { + "type": "onap.datatypes.native.apex.CarrierTechnology", + "description": "Specifies the carrier technology of the event handler (such as REST/Web Socket/Kafka)", + "required": true + }, + "event_protocol": { + "type": "onap.datatypes.native.apex.EventProtocol", + "description": "Specifies the event protocol of events for the event handler (such as Yaml/JSON/XML/POJO)", + "required": true + }, + "event_name": { + "type": "string", + "description": "Specifies the event name for events on this event handler, if not specified, the event name is read from or written to the event being received or sent", + "required": false + }, + "event_name_filter": { + "type": "string", + "description": "Specifies a filter as a regular expression, events that do not match the filter are dropped, the default is to let all events through", + "required": false + }, + "synchronous_mode": { + "type": "boolean", + "description": "Specifies the event handler is syncronous (receive event and send response)", + "required": false, + "default": false + }, + "synchronous_peer": { + "type": "string", + "description": "The peer event handler (output for input or input for output) of this event handler in synchronous mode, this parameter is mandatory if the event handler is in synchronous mode", + "required": false + }, + "synchronous_timeout": { + "type": "integer", + "description": "The timeout in milliseconds for responses to be issued by APEX torequests, this parameter is mandatory if the event handler is in synchronous mode", + "required": false + }, + "requestor_mode": { + "type": "boolean", + "description": "Specifies the event handler is in requestor mode (send event and wait for response mode)", + "required": false, + "default": false + }, + "requestor_peer": { + "type": "string", + "description": "The peer event handler (output for input or input for output) of this event handler in requestor mode, this parameter is mandatory if the event handler is in requestor mode", + "required": false + }, + "requestor_timeout": { + "type": "integer", + "description": "The timeout in milliseconds for wait for responses to requests, this parameter is mandatory if the event handler is in requestor mode", + "required": false + } + } + }, + "onap.datatypes.native.apex.CarrierTechnology": { + "derived_from": "tosca.datatypes.Root", + "properties": { + "label": { + "type": "string", + "description": "The label (name) of the carrier technology (such as REST, Kafka, WebSocket)", + "required": true + }, + "plugin_parameter_class_name": { + "type": "string", + "description": "The class name of the class that overrides default handling of event input or output for this carrier technology, defaults to the supplied input or output class", + "required": false + } + } + }, + "onap.datatypes.native.apex.EventProtocol": { + "derived_from": "tosca.datatypes.Root", + "properties": { + "label": { + "type": "string", + "description": "The label (name) of the event protocol (such as Yaml, JSON, XML, or POJO)", + "required": true + }, + "event_protocol_plugin_class": { + "type": "string", + "description": "The class name of the class that overrides default handling of the event protocol for this carrier technology, defaults to the supplied event protocol class", + "required": false + } + } + }, + "onap.datatypes.native.apex.Environment": { + "derived_from": "tosca.datatypes.Root", + "properties": { + "name": { + "type": "string", + "description": "The name of the environment variable", + "required": true + }, + "value": { + "type": "string", + "description": "The value of the environment variable", + "required": true + } + } + }, + "onap.datatypes.native.apex.engineservice.Engine": { + "derived_from": "tosca.datatypes.Root", + "properties": { + "context": { + "type": "onap.datatypes.native.apex.engineservice.engine.Context", + "description": "The properties for handling context in APEX engines, defaults to using Java maps for context", + "required": false + }, + "executors": { + "type": "map", + "description": "The plugins for policy executors used in engines such as javascript, MVEL, Jython", + "required": true, + "entry_schema": { + "description": "The plugin class path for this policy executor", + "type": "string" + } + } + } + }, + "onap.datatypes.native.apex.engineservice.engine.Context": { + "derived_from": "tosca.datatypes.Root", + "properties": { + "distributor": { + "type": "onap.datatypes.native.apex.Plugin", + "description": "The plugin to be used for distributing context between APEX PDPs at runtime", + "required": false + }, + "schemas": { + "type": "map", + "description": "The plugins for context schemas available in APEX PDPs such as Java and Avro", + "required": false, + "entry_schema": { + "type": "onap.datatypes.native.apex.Plugin" + } + }, + "locking": { + "type": "onap.datatypes.native.apex.Plugin", + "description": "The plugin to be used for locking context in and between APEX PDPs at runtime", + "required": false + }, + "persistence": { + "type": "onap.datatypes.native.apex.Plugin", + "description": "The plugin to be used for persisting context for APEX PDPs at runtime", + "required": false + } + } + }, + "onap.datatypes.native.apex.Plugin": { + "derived_from": "tosca.datatypes.Root", + "properties": { + "name": { + "type": "string", + "description": "The name of the executor such as Javascript, Jython or MVEL", + "required": true + }, + "plugin_class_name": { + "type": "string", + "description": "The class path of the plugin class for this executor" + } + } + }, + "org.onap.datatypes.policy.clamp.acm.httpAutomationCompositionElement.RestRequest": { + "version": "1.0.0", + "derived_from": "tosca.datatypes.Root", + "properties": { + "restRequestId": { + "type": "onap.datatypes.ToscaConceptIdentifier", + "required": true, + "description": "The name and version of a REST request to be sent to a REST endpoint" + }, + "httpMethod": { + "type": "string", + "required": true, + "constraints": [ + { + "valid_values": [ + "POST", + "PUT", + "GET", + "DELETE" + ] + } + ], + "description": "The REST method to use" + }, + "path": { + "type": "string", + "required": true, + "description": "The path of the REST request relative to the base URL" + }, + "body": { + "type": "string", + "required": false, + "description": "The body of the REST request for PUT and POST requests" + }, + "expectedResponse": { + "type": "integer", + "required": true, + "constraints": [], + "description": "THe expected HTTP status code for the REST request" + } + } + }, + "org.onap.datatypes.policy.clamp.acm.httpAutomationCompositionElement.ConfigurationEntity": { + "version": "1.0.0", + "derived_from": "tosca.datatypes.Root", + "properties": { + "configurationEntityId": { + "type": "onap.datatypes.ToscaConceptIdentifier", + "required": true, + "description": "The name and version of a Configuration Entity to be handled by the HTTP Automation Composition Element" + }, + "restSequence": { + "type": "list", + "entry_schema": { + "type": "org.onap.datatypes.policy.clamp.acm.httpAutomationCompositionElement.RestRequest", + "type_version": "1.0.0" + }, + "description": "A sequence of REST commands to send to the REST endpoint" + } + } + } + }, + "policy_types": { + "onap.policies.Native": { + "derived_from": "tosca.policies.Root", + "description": "a base policy type for all native PDP policies", + "version": "1.0.0", + "name": "onap.policies.Native" + }, + "onap.policies.native.Apex": { + "derived_from": "onap.policies.Native", + "description": "a policy type for native apex policies", + "version": "1.0.0", + "name": "onap.policies.native.Apex", + "properties": { + "engine_service": { + "type": "onap.datatypes.native.apex.EngineService", + "description": "APEX Engine Service Parameters" + }, + "inputs": { + "type": "map", + "description": "Inputs for handling events coming into the APEX engine", + "entry_schema": { + "type": "onap.datatypes.native.apex.EventHandler" + } + }, + "outputs": { + "type": "map", + "description": "Outputs for handling events going out of the APEX engine", + "entry_schema": { + "type": "onap.datatypes.native.apex.EventHandler" + } + }, + "environment": { + "type": "list", + "description": "Envioronmental parameters for the APEX engine", + "entry_schema": { + "type": "onap.datatypes.native.apex.Environment" + } + } + } + } + }, + "node_types": { + "org.onap.policy.clamp.acm.Participant": { + "version": "1.0.1", + "derived_from": "tosca.nodetypes.Root", + "properties": { + "provider": { + "type": "string", + "required": false + } + } + }, + "org.onap.policy.clamp.acm.AutomationCompositionElement": { + "version": "1.0.1", + "derived_from": "tosca.nodetypes.Root", + "properties": { + "provider": { + "type": "string", + "required": false, + "metadata": { + "common": true + }, + "description": "Specifies the organization that provides the automation composition element" + }, + "startPhase": { + "type": "integer", + "required": false, + "constraints": [ + { + "greater_or_equal": 0 + } + ], + "metadata": { + "common": true + }, + "description": "A value indicating the start phase in which this automation composition element will be started, the first start phase is zero. Automation Composition Elements are started in their start_phase order and stopped in reverse start phase order. Automation Composition Elements with the same start phase are started and stopped simultaneously" + }, + "uninitializedToPassiveTimeout": { + "type": "integer", + "required": false, + "constraints": [ + { + "greater_or_equal": 0 + } + ], + "default": 60, + "metadata": { + "common": true + }, + "description": "The maximum time in seconds to wait for a state chage from uninitialized to passive" + }, + "passiveToRunningTimeout": { + "type": "integer", + "required": false, + "constraints": [ + { + "greater_or_equal": 0 + } + ], + "default": 60, + "metadata": { + "common": true + }, + "description": "The maximum time in seconds to wait for a state chage from passive to running" + }, + "runningToPassiveTimeout": { + "type": "integer", + "required": false, + "constraints": [ + { + "greater_or_equal": 0 + } + ], + "default": 60, + "metadata": { + "common": true + }, + "description": "The maximum time in seconds to wait for a state chage from running to passive" + }, + "passiveToUninitializedTimeout": { + "type": "integer", + "required": false, + "constraints": [ + { + "greater_or_equal": 0 + } + ], + "default": 60, + "metadata": { + "common": true + }, + "description": "The maximum time in seconds to wait for a state chage from passive to uninitialized" + } + } + }, + "org.onap.policy.clamp.acm.AutomationComposition": { + "version": "1.0.1", + "derived_from": "tosca.nodetypes.Root", + "properties": { + "provider": { + "type": "string", + "required": false, + "metadata": { + "common": true + }, + "description": "Specifies the organization that provides the automation composition element" + }, + "elements": { + "type": "list", + "required": true, + "metadata": { + "common": true + }, + "entry_schema": { + "type": "onap.datatypes.ToscaConceptIdentifier" + }, + "description": "Specifies a list of automation composition element definitions that make up this automation composition definition" + } + } + }, + "org.onap.policy.clamp.acm.PolicyAutomationCompositionElement": { + "version": "1.0.0", + "derived_from": "org.onap.policy.clamp.acm.AutomationCompositionElement", + "properties": { + "policy_type_id": { + "type": "onap.datatypes.ToscaConceptIdentifier", + "required": true + }, + "policy_id": { + "type": "onap.datatypes.ToscaConceptIdentifier", + "required": false + } + } + }, + "org.onap.policy.clamp.acm.K8SMicroserviceAutomationCompositionElement": { + "version": "1.0.0", + "derived_from": "org.onap.policy.clamp.acm.AutomationCompositionElement", + "properties": { + "chart": { + "type": "string", + "required": true + }, + "configs": { + "type": "list", + "required": false + }, + "requirements": { + "type": "string", + "required": false + }, + "templates": { + "type": "list", + "required": false, + "entry_schema": null + }, + "values": { + "type": "string", + "required": true + } + } + }, + "org.onap.policy.clamp.acm.HttpAutomationCompositionElement": { + "version": "1.0.0", + "derived_from": "org.onap.policy.clamp.acm.AutomationCompositionElement", + "properties": { + "baseUrl": { + "type": "string", + "required": true, + "description": "The base URL to be prepended to each path, identifies the host for the REST endpoints." + }, + "httpHeaders": { + "type": "map", + "required": false, + "entry_schema": { + "type": "string" + }, + "description": "HTTP headers to send on REST requests" + }, + "configurationEntities": { + "type": "map", + "required": true, + "entry_schema": { + "type": "org.onap.datatypes.policy.clamp.acm.httpAutomationCompositionElement.ConfigurationEntity", + "type_version": "1.0.0" + }, + "description": "The connfiguration entities the Automation Composition Element is managing and their associated REST requests" + } + } + } + }, + "topology_template": { + "inputs": { + "acm_element_policy": { + "type": "onap.datatypes.ToscaConceptIdentifier", + "description": "The ID of the operational policy to use", + "default": { + "name": "onap.policies.native.apex.ac.element", + "version": "1.0.2" + } + } + }, + "node_templates": { + "org.onap.policy.clamp.acm.PolicyParticipant": { + "version": "2.3.1", + "type": "org.onap.policy.clamp.acm.Participant", + "type_version": "1.0.1", + "description": "Participant for Policy microservices", + "properties": { + "provider": "ONAP" + } + }, + "onap.policy.clamp.ac.element.Policy_AutomationCompositionElement": { + "version": "1.2.3", + "type": "org.onap.policy.clamp.acm.PolicyAutomationCompositionElement", + "type_version": "1.0.0", + "description": "Automation composition element for the operational policy for Performance Management Subscription Handling", + "properties": { + "provider": "Ericsson", + "startPhase": 0 + } + }, + "org.onap.k8s.acm.K8SAutomationCompositionParticipant": { + "version": "2.3.4", + "type": "org.onap.policy.clamp.acm.Participant", + "type_version": "1.0.1", + "description": "Participant for K8S", + "properties": { + "provider": "ONAP" + } + }, + "onap.policy.clamp.ac.element.K8S_StarterAutomationCompositionElement": { + "version": "1.2.3", + "type": "org.onap.policy.clamp.acm.K8SMicroserviceAutomationCompositionElement", + "type_version": "1.0.0", + "description": "Automation composition element for the K8S microservice for AC Element Starter", + "properties": { + "provider": "ONAP", + "startPhase": 0, + "uninitializedToPassiveTimeout": 300, + "podStatusCheckInterval": 30 + } + }, + "onap.policy.clamp.ac.element.K8S_BridgeAutomationCompositionElement": { + "version": "1.2.3", + "type": "org.onap.policy.clamp.acm.K8SMicroserviceAutomationCompositionElement", + "type_version": "1.0.0", + "description": "Automation composition element for the K8S microservice for AC Element Bridge", + "properties": { + "provider": "ONAP", + "startPhase": 0, + "uninitializedToPassiveTimeout": 300, + "podStatusCheckInterval": 30 + } + }, + "onap.policy.clamp.ac.element.K8S_SinkAutomationCompositionElement": { + "version": "1.2.3", + "type": "org.onap.policy.clamp.acm.K8SMicroserviceAutomationCompositionElement", + "type_version": "1.0.0", + "description": "Automation composition element for the K8S microservice for AC Element Sink", + "properties": { + "provider": "ONAP", + "startPhase": 0, + "uninitializedToPassiveTimeout": 300, + "podStatusCheckInterval": 30 + } + }, + "org.onap.policy.clamp.acm.HttpParticipant": { + "version": "2.3.4", + "type": "org.onap.policy.clamp.acm.Participant", + "type_version": "1.0.1", + "description": "Participant for Http requests", + "properties": { + "provider": "ONAP" + } + }, + "onap.policy.clamp.ac.element.Http_StarterAutomationCompositionElement": { + "version": "1.2.3", + "type": "org.onap.policy.clamp.acm.HttpAutomationCompositionElement", + "type_version": "1.0.0", + "description": "Automation composition element for the http requests of AC Element Starter microservice", + "properties": { + "provider": "ONAP", + "uninitializedToPassiveTimeout": 300, + "startPhase": 1 + } + }, + "onap.policy.clamp.ac.element.Http_BridgeAutomationCompositionElement": { + "version": "1.2.3", + "type": "org.onap.policy.clamp.acm.HttpAutomationCompositionElement", + "type_version": "1.0.0", + "description": "Automation composition element for the http requests of AC Element Bridge microservice", + "properties": { + "provider": "ONAP", + "uninitializedToPassiveTimeout": 300, + "startPhase": 1 + } + }, + "onap.policy.clamp.ac.element.Http_SinkAutomationCompositionElement": { + "version": "1.2.3", + "type": "org.onap.policy.clamp.acm.HttpAutomationCompositionElement", + "type_version": "1.0.0", + "description": "Automation composition element for the http requests of AC Element Sink microservice", + "properties": { + "provider": "ONAP", + "uninitializedToPassiveTimeout": 300, + "startPhase": 1 + } + }, + "onap.policy.clamp.ac.element.AutomationCompositionDefinition": { + "version": "1.2.3", + "type": "org.onap.policy.clamp.acm.AutomationComposition", + "type_version": "1.0.1", + "description": "Automation composition for Demo", + "properties": { + "provider": "ONAP", + "elements": [ + { + "name": "onap.policy.clamp.ac.element.Policy_AutomationCompositionElement", + "version": "1.2.3" + }, + { + "name": "onap.policy.clamp.ac.element.K8S_StarterAutomationCompositionElement", + "version": "1.2.3" + }, + { + "name": "onap.policy.clamp.ac.element.K8S_BridgeAutomationCompositionElement", + "version": "1.2.3" + }, + { + "name": "onap.policy.clamp.ac.element.K8S_SinkAutomationCompositionElement", + "version": "1.2.3" + }, + { + "name": "onap.policy.clamp.ac.element.Http_StarterAutomationCompositionElement", + "version": "1.2.3" + }, + { + "name": "onap.policy.clamp.ac.element.Http_BridgeAutomationCompositionElement", + "version": "1.2.3" + }, + { + "name": "onap.policy.clamp.ac.element.Http_SinkAutomationCompositionElement", + "version": "1.2.3" + } + ] + } + } + }, + "policies": [ + { + "onap.policies.native.apex.ac.element": { + "type": "onap.policies.native.Apex", + "type_version": "1.0.0", + "properties": { + "engineServiceParameters": { + "name": "MyApexEngine", + "version": "0.0.1", + "id": 45, + "instanceCount": 3, + "deploymentPort": 12561, + "engineParameters": { + "executorParameters": { + "JAVASCRIPT": { + "parameterClassName": "org.onap.policy.apex.plugins.executor.javascript.JavascriptExecutorParameters" + } + }, + "contextParameters": { + "parameterClassName": "org.onap.policy.apex.context.parameters.ContextParameters", + "schemaParameters": { + "Json": { + "parameterClassName": "org.onap.policy.apex.plugins.context.schema.json.JsonSchemaHelperParameters" + } + } + } + }, + "policy_type_impl": { + "policies": { + "key": { + "name": "APEXacElementPolicy_Policies", + "version": "0.0.1" + }, + "policyMap": { + "entry": [ + { + "key": { + "name": "ReceiveEventPolicy", + "version": "0.0.1" + }, + "value": { + "policyKey": { + "name": "ReceiveEventPolicy", + "version": "0.0.1" + }, + "template": "Freestyle", + "state": { + "entry": [ + { + "key": "DecideForwardingState", + "value": { + "stateKey": { + "parentKeyName": "ReceiveEventPolicy", + "parentKeyVersion": "0.0.1", + "parentLocalName": "NULL", + "localName": "DecideForwardingState" + }, + "trigger": { + "name": "AcElementEvent", + "version": "0.0.1" + }, + "stateOutputs": { + "entry": [ + { + "key": "CreateForwardPayload", + "value": { + "key": { + "parentKeyName": "ReceiveEventPolicy", + "parentKeyVersion": "0.0.1", + "parentLocalName": "DecideForwardingState", + "localName": "CreateForwardPayload" + }, + "outgoingEvent": { + "name": "DmaapResponseStatusEvent", + "version": "0.0.1" + }, + "outgoingEventReference": [ + { + "name": "DmaapResponseStatusEvent", + "version": "0.0.1" + } + ], + "nextState": { + "parentKeyName": "NULL", + "parentKeyVersion": "0.0.0", + "parentLocalName": "NULL", + "localName": "NULL" + } + } + } + ] + }, + "contextAlbumReference": [], + "taskSelectionLogic": { + "key": { + "parentKeyName": "NULL", + "parentKeyVersion": "0.0.0", + "parentLocalName": "NULL", + "localName": "NULL" + }, + "logicFlavour": "UNDEFINED", + "logic": "" + }, + "stateFinalizerLogicMap": { + "entry": [] + }, + "defaultTask": { + "name": "ForwardPayloadTask", + "version": "0.0.1" + }, + "taskReferences": { + "entry": [ + { + "key": { + "name": "ForwardPayloadTask", + "version": "0.0.1" + }, + "value": { + "key": { + "parentKeyName": "ReceiveEventPolicy", + "parentKeyVersion": "0.0.1", + "parentLocalName": "DecideForwardingState", + "localName": "ReceiveEventPolicy" + }, + "outputType": "DIRECT", + "output": { + "parentKeyName": "ReceiveEventPolicy", + "parentKeyVersion": "0.0.1", + "parentLocalName": "DecideForwardingState", + "localName": "CreateForwardPayload" + } + } + } + ] + } + } + } + ] + }, + "firstState": "DecideForwardingState" + } + } + ] + } + }, + "tasks": { + "key": { + "name": "APEXacElementPolicy_Tasks", + "version": "0.0.1" + }, + "taskMap": { + "entry": [ + { + "key": { + "name": "ForwardPayloadTask", + "version": "0.0.1" + }, + "value": { + "key": { + "name": "ForwardPayloadTask", + "version": "0.0.1" + }, + "inputEvent": { + "key": { + "name": "AcElementEvent", + "version": "0.0.1" + }, + "nameSpace": "org.onap.policy.apex.ac.element", + "source": "Dmaap", + "target": "APEX", + "parameter": { + "entry": [ + { + "key": "DmaapResponseEvent", + "value": { + "key": { + "parentKeyName": "AcElementEvent", + "parentKeyVersion": "0.0.1", + "parentLocalName": "NULL", + "localName": "DmaapResponseEvent" + }, + "fieldSchemaKey": { + "name": "ACEventType", + "version": "0.0.1" + }, + "optional": false + } + } + ] + }, + "toscaPolicyState": "ENTRY" + }, + "outputEvents": { + "entry": [ + { + "key": "DmaapResponseStatusEvent", + "value": { + "key": { + "name": "DmaapResponseStatusEvent", + "version": "0.0.1" + }, + "nameSpace": "org.onap.policy.apex.ac.element", + "source": "APEX", + "target": "Dmaap", + "parameter": { + "entry": [ + { + "key": "DmaapResponseStatusEvent", + "value": { + "key": { + "parentKeyName": "DmaapResponseStatusEvent", + "parentKeyVersion": "0.0.1", + "parentLocalName": "NULL", + "localName": "DmaapResponseStatusEvent" + }, + "fieldSchemaKey": { + "name": "ACEventType", + "version": "0.0.1" + }, + "optional": false + } + } + ] + }, + "toscaPolicyState": "" + } + } + ] + }, + "taskParameters": { + "entry": [] + }, + "contextAlbumReference": [ + { + "name": "ACElementAlbum", + "version": "0.0.1" + } + ], + "taskLogic": { + "key": { + "parentKeyName": "ForwardPayloadTask", + "parentKeyVersion": "0.0.1", + "parentLocalName": "NULL", + "localName": "TaskLogic" + }, + "logicFlavour": "JAVASCRIPT", + "logic": "/*\n * ============LICENSE_START=======================================================\n * Copyright (C) 2022 Nordix. All rights reserved.\n * ================================================================================\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * SPDX-License-Identifier: Apache-2.0\n * ============LICENSE_END=========================================================\n */\n\nexecutor.logger.info(executor.subject.id);\nexecutor.logger.info(executor.inFields);\n\nvar msgResponse = executor.inFields.get('DmaapResponseEvent');\nexecutor.logger.info('Task in progress with mesages: ' + msgResponse);\n\nvar elementId = msgResponse.get('elementId').get('name');\n\nif (msgResponse.get('messageType') == 'STATUS' &&\n (elementId == 'onap.policy.clamp.ac.startertobridge'\n || elementId == 'onap.policy.clamp.ac.bridgetosink')) {\n\n var receiverId = '';\n if (elementId == 'onap.policy.clamp.ac.startertobridge') {\n receiverId = 'onap.policy.clamp.ac.bridge';\n } else {\n receiverId = 'onap.policy.clamp.ac.sink';\n }\n\n var elementIdResponse = new java.util.HashMap();\n elementIdResponse.put('name', receiverId);\n elementIdResponse.put('version', msgResponse.get('elementId').get('version'));\n\n var dmaapResponse = new java.util.HashMap();\n dmaapResponse.put('elementId', elementIdResponse);\n\n var message = msgResponse.get('message') + ' trace added from policy';\n dmaapResponse.put('message', message);\n dmaapResponse.put('messageType', 'STATUS');\n dmaapResponse.put('messageId', msgResponse.get('messageId'));\n dmaapResponse.put('timestamp', msgResponse.get('timestamp'));\n\n executor.logger.info('Sending forwarding Event to Ac element: ' + dmaapResponse);\n\n executor.outFields.put('DmaapResponseStatusEvent', dmaapResponse);\n}\n\ntrue;" + } + } + } + ] + } + }, + "events": { + "key": { + "name": "APEXacElementPolicy_Events", + "version": "0.0.1" + }, + "eventMap": { + "entry": [ + { + "key": { + "name": "AcElementEvent", + "version": "0.0.1" + }, + "value": { + "key": { + "name": "AcElementEvent", + "version": "0.0.1" + }, + "nameSpace": "org.onap.policy.apex.ac.element", + "source": "Dmaap", + "target": "APEX", + "parameter": { + "entry": [ + { + "key": "DmaapResponseEvent", + "value": { + "key": { + "parentKeyName": "AcElementEvent", + "parentKeyVersion": "0.0.1", + "parentLocalName": "NULL", + "localName": "DmaapResponseEvent" + }, + "fieldSchemaKey": { + "name": "ACEventType", + "version": "0.0.1" + }, + "optional": false + } + } + ] + }, + "toscaPolicyState": "ENTRY" + } + }, + { + "key": { + "name": "DmaapResponseStatusEvent", + "version": "0.0.1" + }, + "value": { + "key": { + "name": "DmaapResponseStatusEvent", + "version": "0.0.1" + }, + "nameSpace": "org.onap.policy.apex.ac.element", + "source": "APEX", + "target": "Dmaap", + "parameter": { + "entry": [ + { + "key": "DmaapResponseStatusEvent", + "value": { + "key": { + "parentKeyName": "DmaapResponseStatusEvent", + "parentKeyVersion": "0.0.1", + "parentLocalName": "NULL", + "localName": "DmaapResponseStatusEvent" + }, + "fieldSchemaKey": { + "name": "ACEventType", + "version": "0.0.1" + }, + "optional": false + } + } + ] + }, + "toscaPolicyState": "" + } + }, + { + "key": { + "name": "LogEvent", + "version": "0.0.1" + }, + "value": { + "key": { + "name": "LogEvent", + "version": "0.0.1" + }, + "nameSpace": "org.onap.policy.apex.ac.element", + "source": "APEX", + "target": "file", + "parameter": { + "entry": [ + { + "key": "final_status", + "value": { + "key": { + "parentKeyName": "LogEvent", + "parentKeyVersion": "0.0.1", + "parentLocalName": "NULL", + "localName": "final_status" + }, + "fieldSchemaKey": { + "name": "SimpleStringType", + "version": "0.0.1" + }, + "optional": false + } + }, + { + "key": "message", + "value": { + "key": { + "parentKeyName": "LogEvent", + "parentKeyVersion": "0.0.1", + "parentLocalName": "NULL", + "localName": "message" + }, + "fieldSchemaKey": { + "name": "SimpleStringType", + "version": "0.0.1" + }, + "optional": false + } + } + ] + }, + "toscaPolicyState": "" + } + } + ] + } + }, + "albums": { + "key": { + "name": "APEXacElementPolicy_Albums", + "version": "0.0.1" + }, + "albums": { + "entry": [ + { + "key": { + "name": "ACElementAlbum", + "version": "0.0.1" + }, + "value": { + "key": { + "name": "ACElementAlbum", + "version": "0.0.1" + }, + "scope": "policy", + "isWritable": true, + "itemSchema": { + "name": "ACEventType", + "version": "0.0.1" + } + } + } + ] + } + }, + "schemas": { + "key": { + "name": "APEXacElementPolicy_Schemas", + "version": "0.0.1" + }, + "schemas": { + "entry": [ + { + "key": { + "name": "ACEventType", + "version": "0.0.1" + }, + "value": { + "key": { + "name": "ACEventType", + "version": "0.0.1" + }, + "schemaFlavour": "Json", + "schemaDefinition": "{\n \"$schema\": \"http://json-schema.org/draft-04/schema#\",\n \"type\": \"object\",\n \"properties\": {\n \"elementId\": {\n \"type\": \"object\",\n \"properties\": {\n \"name\": {\n \"type\": \"string\"\n },\n \"version\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"name\",\n \"version\"\n ]\n },\n \"message\": {\n \"type\": \"string\"\n },\n \"messageType\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"elementId\",\n \"message\",\n \"messageType\"\n ]\n}" + } + }, + { + "key": { + "name": "SimpleIntType", + "version": "0.0.1" + }, + "value": { + "key": { + "name": "SimpleIntType", + "version": "0.0.1" + }, + "schemaFlavour": "Java", + "schemaDefinition": "java.lang.Integer" + } + }, + { + "key": { + "name": "SimpleStringType", + "version": "0.0.1" + }, + "value": { + "key": { + "name": "SimpleStringType", + "version": "0.0.1" + }, + "schemaFlavour": "Java", + "schemaDefinition": "java.lang.String" + } + }, + { + "key": { + "name": "UUIDType", + "version": "0.0.1" + }, + "value": { + "key": { + "name": "UUIDType", + "version": "0.0.1" + }, + "schemaFlavour": "Java", + "schemaDefinition": "java.util.UUID" + } + } + ] + } + }, + "key": { + "name": "APEXacElementPolicy", + "version": "0.0.1" + }, + "keyInformation": { + "key": { + "name": "APEXacElementPolicy_KeyInfo", + "version": "0.0.1" + }, + "keyInfoMap": { + "entry": [ + { + "key": { + "name": "ACElementAlbum", + "version": "0.0.1" + }, + "value": { + "key": { + "name": "ACElementAlbum", + "version": "0.0.1" + }, + "UUID": "7cddfab8-6d3f-3f7f-8ac3-e2eb5979c900", + "description": "Generated description for concept referred to by key \"ACElementAlbum:0.0.1\"" + } + }, + { + "key": { + "name": "ACEventType", + "version": "0.0.1" + }, + "value": { + "key": { + "name": "ACEventType", + "version": "0.0.1" + }, + "UUID": "dab78794-b666-3929-a75b-70d634b04fe5", + "description": "Generated description for concept referred to by key \"ACEventType:0.0.1\"" + } + }, + { + "key": { + "name": "APEXacElementPolicy", + "version": "0.0.1" + }, + "value": { + "key": { + "name": "APEXacElementPolicy", + "version": "0.0.1" + }, + "UUID": "da478611-7d77-3c46-b4be-be968769ba4e", + "description": "Generated description for concept referred to by key \"APEXacElementPolicy:0.0.1\"" + } + }, + { + "key": { + "name": "APEXacElementPolicy_Albums", + "version": "0.0.1" + }, + "value": { + "key": { + "name": "APEXacElementPolicy_Albums", + "version": "0.0.1" + }, + "UUID": "fa8dc15e-8c8d-3de3-a0f8-585b76511175", + "description": "Generated description for concept referred to by key \"APEXacElementPolicy_Albums:0.0.1\"" + } + }, + { + "key": { + "name": "APEXacElementPolicy_Events", + "version": "0.0.1" + }, + "value": { + "key": { + "name": "APEXacElementPolicy_Events", + "version": "0.0.1" + }, + "UUID": "8508cd65-8dd2-342d-a5c6-1570810dbe2b", + "description": "Generated description for concept referred to by key \"APEXacElementPolicy_Events:0.0.1\"" + } + }, + { + "key": { + "name": "APEXacElementPolicy_KeyInfo", + "version": "0.0.1" + }, + "value": { + "key": { + "name": "APEXacElementPolicy_KeyInfo", + "version": "0.0.1" + }, + "UUID": "09e6927d-c5ac-3779-919f-9333994eed22", + "description": "Generated description for concept referred to by key \"APEXacElementPolicy_KeyInfo:0.0.1\"" + } + }, + { + "key": { + "name": "APEXacElementPolicy_Policies", + "version": "0.0.1" + }, + "value": { + "key": { + "name": "APEXacElementPolicy_Policies", + "version": "0.0.1" + }, + "UUID": "cade3c9a-1600-3642-a6f4-315612187f46", + "description": "Generated description for concept referred to by key \"APEXacElementPolicy_Policies:0.0.1\"" + } + }, + { + "key": { + "name": "APEXacElementPolicy_Schemas", + "version": "0.0.1" + }, + "value": { + "key": { + "name": "APEXacElementPolicy_Schemas", + "version": "0.0.1" + }, + "UUID": "5bb4a8e9-35fa-37db-9a49-48ef036a7ba9", + "description": "Generated description for concept referred to by key \"APEXacElementPolicy_Schemas:0.0.1\"" + } + }, + { + "key": { + "name": "APEXacElementPolicy_Tasks", + "version": "0.0.1" + }, + "value": { + "key": { + "name": "APEXacElementPolicy_Tasks", + "version": "0.0.1" + }, + "UUID": "2527eeec-0d1f-3094-ad3f-212622b12836", + "description": "Generated description for concept referred to by key \"APEXacElementPolicy_Tasks:0.0.1\"" + } + }, + { + "key": { + "name": "AcElementEvent", + "version": "0.0.1" + }, + "value": { + "key": { + "name": "AcElementEvent", + "version": "0.0.1" + }, + "UUID": "32c013e2-2740-3986-a626-cbdf665b63e9", + "description": "Generated description for concept referred to by key \"AcElementEvent:0.0.1\"" + } + }, + { + "key": { + "name": "DmaapResponseStatusEvent", + "version": "0.0.1" + }, + "value": { + "key": { + "name": "DmaapResponseStatusEvent", + "version": "0.0.1" + }, + "UUID": "2715cb6c-2778-3461-8b69-871e79f95935", + "description": "Generated description for concept referred to by key \"DmaapResponseStatusEvent:0.0.1\"" + } + }, + { + "key": { + "name": "ForwardPayloadTask", + "version": "0.0.1" + }, + "value": { + "key": { + "name": "ForwardPayloadTask", + "version": "0.0.1" + }, + "UUID": "51defa03-1ecf-3314-bf34-2a652bce57fa", + "description": "Generated description for concept referred to by key \"ForwardPayloadTask:0.0.1\"" + } + }, + { + "key": { + "name": "LogEvent", + "version": "0.0.1" + }, + "value": { + "key": { + "name": "LogEvent", + "version": "0.0.1" + }, + "UUID": "c540f048-96af-35e3-a36e-e9c29377cba7", + "description": "Generated description for concept referred to by key \"LogEvent:0.0.1\"" + } + }, + { + "key": { + "name": "ReceiveEventPolicy", + "version": "0.0.1" + }, + "value": { + "key": { + "name": "ReceiveEventPolicy", + "version": "0.0.1" + }, + "UUID": "568b7345-9de1-36d3-b6a3-9b857e6809a1", + "description": "Generated description for concept referred to by key \"ReceiveEventPolicy:0.0.1\"" + } + }, + { + "key": { + "name": "SimpleIntType", + "version": "0.0.1" + }, + "value": { + "key": { + "name": "SimpleIntType", + "version": "0.0.1" + }, + "UUID": "153791fd-ae0a-36a7-88a5-309a7936415d", + "description": "Generated description for concept referred to by key \"SimpleIntType:0.0.1\"" + } + }, + { + "key": { + "name": "SimpleStringType", + "version": "0.0.1" + }, + "value": { + "key": { + "name": "SimpleStringType", + "version": "0.0.1" + }, + "UUID": "8a4957cf-9493-3a76-8c22-a208e23259af", + "description": "Generated description for concept referred to by key \"SimpleStringType:0.0.1\"" + } + }, + { + "key": { + "name": "UUIDType", + "version": "0.0.1" + }, + "value": { + "key": { + "name": "UUIDType", + "version": "0.0.1" + }, + "UUID": "6a8cc68e-dfc8-3403-9c6d-071c886b319c", + "description": "Generated description for concept referred to by key \"UUIDType:0.0.1\"" + } + } + ] + } + } + } + }, + "eventInputParameters": { + "DmaapConsumer": { + "carrierTechnologyParameters": { + "carrierTechnology": "KAFKA", + "parameterClassName": "org.onap.policy.apex.plugins.event.carrier.kafka.KafkaCarrierTechnologyParameters", + "parameters": { + "bootstrapServers": "kafka:9092", + "groupId": "clamp-grp", + "enableAutoCommit": true, + "autoCommitTime": 1000, + "sessionTimeout": 30000, + "consumerPollTime": 100, + "consumerTopicList": [ + "ac_element_msg" + ], + "keyDeserializer": "org.apache.kafka.common.serialization.StringDeserializer", + "valueDeserializer": "org.apache.kafka.common.serialization.StringDeserializer", + "kafkaProperties": [] + } + }, + "eventProtocolParameters": { + "eventProtocol": "JSON", + "parameters": { + "pojoField": "DmaapResponseEvent" + } + }, + "eventName": "AcElementEvent", + "eventNameFilter": "AcElementEvent" + } + }, + "eventOutputParameters": { + "logOutputter": { + "carrierTechnologyParameters": { + "carrierTechnology": "FILE", + "parameters": { + "fileName": "outputevents.log" + } + }, + "eventProtocolParameters": { + "eventProtocol": "JSON" + } + }, + "DmaapReplyProducer": { + "carrierTechnologyParameters": { + "carrierTechnology": "KAFKA", + "parameterClassName": "org.onap.policy.apex.plugins.event.carrier.kafka.KafkaCarrierTechnologyParameters", + "parameters": { + "bootstrapServers": "kafka:9092", + "acks": "all", + "retries": 0, + "batchSize": 16384, + "lingerTime": 1, + "bufferMemory": 33554432, + "producerTopic": "policy_update_msg", + "keySerializer": "org.apache.kafka.common.serialization.StringSerializer", + "valueSerializer": "org.apache.kafka.common.serialization.StringSerializer", + "kafkaProperties": [] + } + }, + "eventProtocolParameters": { + "eventProtocol": "JSON", + "parameters": { + "pojoField": "DmaapResponseStatusEvent" + } + }, + "eventNameFilter": "LogEvent|DmaapResponseStatusEvent" + } + } + }, + "name": "onap.policies.native.apex.ac.element", + "version": "1.0.2" + } + } + ] + } +}
\ No newline at end of file diff --git a/policy-regression-tests/policy-clamp-regression/src/test/resources/features/acm-basic-workflow.feature b/policy-regression-tests/policy-clamp-regression/src/test/resources/features/acm-basic-workflow.feature new file mode 100644 index 00000000..9d2ed611 --- /dev/null +++ b/policy-regression-tests/policy-clamp-regression/src/test/resources/features/acm-basic-workflow.feature @@ -0,0 +1,97 @@ +Feature: ACM basic workflow + # Verifies ACM basic workflows commission, prime, de-prime, instantiate, deploy, update-properties, undeploy, uninstantiate and delete. + + Scenario: ACM Health check should be up + When the acm health check endpoint is invoked "/onap/policy/clamp/acm/health" + Then the response status code should be 200 + + Scenario Outline: Verify the ACM commissioning works + When the ACM commissioning endpoint "/onap/policy/clamp/acm/v2/compositions" is invoked with "<AcDefinitionFile>" "<isMigration>" + Then the response status code should be 201 + Examples: + | AcDefinitionFile | isMigration | + | src/test/resources/data/acelement-usecase1.json | false | + + Scenario: Make sure the participants are registered with runtime + When the register participants endpoint is invoked "/onap/policy/clamp/acm/v2/participants" + Then the response status code should be 202 + + Scenario Outline: Verify the priming is accepted + When the ACM participants are primed "/onap/policy/clamp/acm/v2/compositions/{compositionId}" "<isMigration>" + Then the response status code should be 202 + Examples: + | isMigration | + | false | + + Scenario Outline: Wait until all the participants are primed + When the ACM composition is fetched "/onap/policy/clamp/acm/v2/compositions/{compositionId}" + Then the response status code should be 200 + Then Wait and retry until the response contains the keyword "PRIMED" "/onap/policy/clamp/acm/v2/compositions/{compositionId}" "<isMigration>" + Examples: + | isMigration | + | false | + + Scenario Outline: Verify AC Instantiation works + When the ACM instance is created "/onap/policy/clamp/acm/v2/compositions/{compositionId}/instances" with "<AcInstantiateFile>" + Then the response status code should be 201 + Examples: + | AcInstantiateFile | + | src/test/resources/data/AcInstantiate.json | + + Scenario: Verify the AC deployment is accepted + When the AC instance is deployed "/onap/policy/clamp/acm/v2/compositions/{compositionId}/instances/{instanceId}" + Then the response status code should be 202 + + Scenario Outline: Wait until all the AC elements are deployed + When the AC instance is fetched "/onap/policy/clamp/acm/v2/compositions/{compositionId}/instances/{instanceId}" "<isMigration>" + Then the response status code should be 200 + Then Wait and retry until the response contains the keyword "DEPLOYED" "/onap/policy/clamp/acm/v2/compositions/{compositionId}/instances/{instanceId}" "<isMigration>" + Examples: + | isMigration | + | false | + + Scenario Outline: Update instance property after deployment + When the AC instance property is updated "/onap/policy/clamp/acm/v2/compositions/{compositionId}/instances" "<AcUpdatePropertyFile>" + Then the response status code should be 200 + Then Wait and retry until the response contains the keyword "DEPLOYED" "/onap/policy/clamp/acm/v2/compositions/{compositionId}/instances/{instanceId}" "<isMigration>" + Then the response should contain the updated properties "acm_element_policy_updated" "test" + Examples: + | AcUpdatePropertyFile | isMigration | + | src/test/resources/data/AcUpdateProperty.json | false | + + Scenario: Verify AC instance undeployment is accepted + When the AC instance is undeployed "/onap/policy/clamp/acm/v2/compositions/{compositionId}/instances/{instanceId}" + Then the response status code should be 202 + + Scenario Outline: Wait until all the AC elements are undeployed + When the AC instance is fetched "/onap/policy/clamp/acm/v2/compositions/{compositionId}/instances/{instanceId}" "<isMigration>" + Then the response status code should be 200 + Then Wait and retry until the response contains the keyword "UNDEPLOYED" "/onap/policy/clamp/acm/v2/compositions/{compositionId}/instances/{instanceId}" "<isMigration>" + Examples: + | isMigration | + | false | + + Scenario: Verify AC UnInstantiation is accepted + When the ACM instance is uninstantiated " /onap/policy/clamp/acm/v2/compositions/{compositionId}/instances/{instanceId}" + Then the response status code should be 202 + + Scenario: Wait until the AC instance is uninstatiated + When all the AC instances are fetched "/onap/policy/clamp/acm/v2/compositions/{compositionId}/instances" + Then the response status code should be 200 + Then Wait and retry until the ac instance list is empty "/onap/policy/clamp/acm/v2/compositions/{compositionId}/instances" + + Scenario: Verify the DePriming is accepted + When the ACM participants are deprimed "/onap/policy/clamp/acm/v2/compositions/{compositionId}" + Then the response status code should be 202 + + Scenario Outline: Wait until all the participants are deprimed + When the ACM composition is fetched "/onap/policy/clamp/acm/v2/compositions/{compositionId}" + Then the response status code should be 200 + Then Wait and retry until the response contains the keyword "COMMISSIONED" "/onap/policy/clamp/acm/v2/compositions/{compositionId}" "<isMigration>" + Examples: + | isMigration | + | false | + + Scenario: Verify the deletion of Ac definition + When the AC definition is deleted "/onap/policy/clamp/acm/v2/compositions/{compositionId}" + Then the response status code should be 200
\ No newline at end of file diff --git a/policy-regression-tests/policy-clamp-regression/src/test/resources/features/acm-migration-workflow.feature b/policy-regression-tests/policy-clamp-regression/src/test/resources/features/acm-migration-workflow.feature new file mode 100644 index 00000000..c15cdaab --- /dev/null +++ b/policy-regression-tests/policy-clamp-regression/src/test/resources/features/acm-migration-workflow.feature @@ -0,0 +1,88 @@ +Feature: ACM migration workflow + # Verifies ACM migration of instance from one AC definition to another + + Scenario: ACM Health check should be up + When the acm health check endpoint is invoked "/onap/policy/clamp/acm/health" + Then the response status code should be 200 + + Scenario Outline: Verify the ACM commissioning works + When the ACM commissioning endpoint "/onap/policy/clamp/acm/v2/compositions" is invoked with "<AcDefinitionFile>" "<isMigration>" + Then the response status code should be 201 + Examples: + | AcDefinitionFile | isMigration | + | src/test/resources/data/acelement-usecase2.json | false | + + Scenario: Make sure the participants are registered with runtime + When the register participants endpoint is invoked "/onap/policy/clamp/acm/v2/participants" + Then the response status code should be 202 + + Scenario Outline: Verify the priming is accepted + When the ACM participants are primed "/onap/policy/clamp/acm/v2/compositions/{compositionId}" "<isMigration>" + Then the response status code should be 202 + Examples: + | isMigration | + | false | + + Scenario Outline: Wait until all the participants are primed + When the ACM composition is fetched "/onap/policy/clamp/acm/v2/compositions/{compositionId}" + Then the response status code should be 200 + Then Wait and retry until the response contains the keyword "PRIMED" "/onap/policy/clamp/acm/v2/compositions/{compositionId}" "<isMigration>" + Examples: + | isMigration | + | false | + + Scenario Outline: Verify AC Instantiation works + When the ACM instance is created "/onap/policy/clamp/acm/v2/compositions/{compositionId}/instances" with "<AcInstantiateFile>" + Then the response status code should be 201 + Examples: + | AcInstantiateFile | + | src/test/resources/data/AcInstantiate.json | + + Scenario: Verify the AC deployment is accepted + When the AC instance is deployed "/onap/policy/clamp/acm/v2/compositions/{compositionId}/instances/{instanceId}" + Then the response status code should be 202 + + Scenario Outline: Wait until all the AC elements are deployed + When the AC instance is fetched "/onap/policy/clamp/acm/v2/compositions/{compositionId}/instances/{instanceId}" "<isMigration>" + Then the response status code should be 200 + Then Wait and retry until the response contains the keyword "DEPLOYED" "/onap/policy/clamp/acm/v2/compositions/{compositionId}/instances/{instanceId}" "<isMigration>" + Examples: + | isMigration | + | false | + + Scenario Outline: Commission the AC definition file for migration + When the ACM commissioning endpoint "/onap/policy/clamp/acm/v2/compositions" is invoked with "<AcDefinitionFile>" "<isMigration>" + Then the response status code should be 201 + Examples: + | AcDefinitionFile | isMigration | + | src/test/resources/data/acelement-usecase2.json | true | + + Scenario Outline: Prime the second AC definition to the participants + When the ACM participants are primed "/onap/policy/clamp/acm/v2/compositions/{compositionId}" "<isMigration>" + Then the response status code should be 202 + Examples: + | isMigration | + | true | + + Scenario Outline: Wait until all the participants are primed + When the ACM composition is fetched "/onap/policy/clamp/acm/v2/compositions/{compositionId}" + Then the response status code should be 200 + Then Wait and retry until the response contains the keyword "PRIMED" "/onap/policy/clamp/acm/v2/compositions/{compositionId}" "<isMigration>" + Examples: + | isMigration | + | true | + + Scenario Outline: Migrate the existing instance to the new AC definition + When the ACM instance is migrated "/onap/policy/clamp/acm/v2/compositions/{compositionId}/instances" with "<AcMigrationFile>" + Then the response status code should be 200 + Examples: + | AcMigrationFile | + | src/test/resources/data/AcMigrateInstance.json | + + Scenario Outline: Wait until all the AC elements are migrated + When the AC instance is fetched "/onap/policy/clamp/acm/v2/compositions/{compositionId}/instances/{instanceId}" "<isMigration>" + Then the response status code should be 200 + Then Wait and retry until the response contains the keyword "DEPLOYED" "/onap/policy/clamp/acm/v2/compositions/{compositionId}/instances/{instanceId}" "<isMigration>" + Examples: + | isMigration | + | true |
\ No newline at end of file diff --git a/policy-regression-tests/pom.xml b/policy-regression-tests/pom.xml new file mode 100644 index 00000000..9073913c --- /dev/null +++ b/policy-regression-tests/pom.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<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.onap.policy.docker</groupId> + <artifactId>docker</artifactId> + <version>3.1.1-SNAPSHOT</version> + </parent> + + <groupId>org.onap.policy.regression</groupId> + <artifactId>policy-regression-tests</artifactId> + <name>policy regression tests</name> + <version>1.0-SNAPSHOT</version> + <packaging>pom</packaging> + + <modules> + <module>policy-clamp-regression</module> + </modules> + +</project> @@ -43,6 +43,7 @@ <module>policy-jre</module> <module>policy-jdk</module> <module>policy-db-migrator</module> + <module>policy-regression-tests</module> </modules> </profile> <profile> @@ -51,6 +52,7 @@ <module>policy-jre</module> <module>policy-jdk</module> <module>policy-db-migrator</module> + <module>policy-regression-tests</module> </modules> <properties> <docker.dbm.dockerFile>suse.Dockerfile</docker.dbm.dockerFile> |