From 1feb0a77c857d811283d74d0f3df018d42c2debe Mon Sep 17 00:00:00 2001 From: ajay_dp001 Date: Thu, 3 Dec 2020 15:18:08 +0530 Subject: [PATCH] CSIT Support for ServiceLevel PNF Software Upgrade - Details on CSIT test cases: https://wiki.onap.org/display/DW/E2E+Integration+Test+Cases+PNF-Software+Upgrade+With+Schema+Updates - Newly added test are listed below: 1. Distribute Service Level Upgrade Template 2. Get ServiceModel Version from AAI using ServiceModelInVariant UUId 3. Invoke Service Instantiation for ServiceLevel Upgrade 4. Verify PNF-1 Configuration for Service Level Upgrade 5. AAI-Update for PNF-1 Target Software Version after Service Level Upgrade 6. Verify PNF-2 Configuration for Service Level Upgrade 7. AAI-Update for PNF-2 Target Software Version after Service Level Upgrade 8. Test AAI-Update for ServiceInstance after Service Level Upgrade Issue-ID: INT-1591 Signed-off-by: ajay_dp001 Change-Id: I7bd1ee8d19692f16e0f4415b5115e88a9feff869 --- .../pnf-sw-upgrade/setup.sh | 1 + .../simulators/pnfsim/docker-compose.yml | 10 ++ .../a51e2bef-961c-496f-b235-b4540400e885.json | 20 +++ .../config/aai-simulator-populate-data/pnf.json | 2 +- .../config/aai-simulator-populate-data/pnf2.json | 16 ++ .../service-instance-aai.json | 4 +- .../sorch/config/apply-workarounds.sh | 3 + .../zipped_sdc_csar_2.0.tar.gz | Bin 0 -> 59004 bytes .../pnf-sw-upgrade/sorch/config/env | 2 +- .../sorch/config/populate-aai-simulator.sh | 11 +- .../pnf-sw-upgrade/sorch/docker-compose.yml | 4 +- .../sorch/simulator/aai-simulator/pom.xml | 5 + .../ServiceDesignAndCreationController.java | 19 ++- .../org/onap/aaisimulator/models/ModelVersion.java | 86 +++++++++++ .../onap/aaisimulator/models/ModelVersions.java | 39 +++++ .../aaisimulator/models/ServiceModelVersion.java | 38 +++++ .../ServiceDesignAndCreationControllerTest.java | 49 +++--- .../a51e2bef-961c-496f-b235-b4540400e885.json | 20 +++ .../a51e2bef-961c-496f-b235-b4540400e885.xml | 17 --- .../pnf-sw-upgrade/sorch/so_setup.sh | 2 + .../pnf-sw-upgrade/data/blueprint_archive.zip | Bin 18151 -> 18276 bytes .../data/distributeServiceTemplate_2.0.json | 35 +++++ .../pnf-sw-upgrade/data/mount2.json | 18 +++ .../data/serviceLevelUpgradeRequest.json | 38 +++++ .../pnf-sw-upgrade/pnf-sw-upgrade.robot | 170 ++++++++++++++++++++- 25 files changed, 555 insertions(+), 54 deletions(-) create mode 100644 plans/usecases-pnf-sw-upgrade/pnf-sw-upgrade/sorch/config/a51e2bef-961c-496f-b235-b4540400e885.json create mode 100755 plans/usecases-pnf-sw-upgrade/pnf-sw-upgrade/sorch/config/aai-simulator-populate-data/pnf2.json create mode 100644 plans/usecases-pnf-sw-upgrade/pnf-sw-upgrade/sorch/config/distribution-test-zip/zipped_sdc_csar_2.0.tar.gz create mode 100644 plans/usecases-pnf-sw-upgrade/pnf-sw-upgrade/sorch/simulator/aai-simulator/src/main/java/org/onap/aaisimulator/models/ModelVersion.java create mode 100644 plans/usecases-pnf-sw-upgrade/pnf-sw-upgrade/sorch/simulator/aai-simulator/src/main/java/org/onap/aaisimulator/models/ModelVersions.java create mode 100644 plans/usecases-pnf-sw-upgrade/pnf-sw-upgrade/sorch/simulator/aai-simulator/src/main/java/org/onap/aaisimulator/models/ServiceModelVersion.java create mode 100644 plans/usecases-pnf-sw-upgrade/pnf-sw-upgrade/sorch/simulator/aai-simulator/src/test/resources/test-data/service-design-and-creation-responses/a51e2bef-961c-496f-b235-b4540400e885.json delete mode 100644 plans/usecases-pnf-sw-upgrade/pnf-sw-upgrade/sorch/simulator/aai-simulator/src/test/resources/test-data/service-design-and-creation-responses/a51e2bef-961c-496f-b235-b4540400e885.xml create mode 100644 tests/usecases-pnf-sw-upgrade/pnf-sw-upgrade/data/distributeServiceTemplate_2.0.json create mode 100755 tests/usecases-pnf-sw-upgrade/pnf-sw-upgrade/data/mount2.json create mode 100644 tests/usecases-pnf-sw-upgrade/pnf-sw-upgrade/data/serviceLevelUpgradeRequest.json diff --git a/plans/usecases-pnf-sw-upgrade/pnf-sw-upgrade/setup.sh b/plans/usecases-pnf-sw-upgrade/pnf-sw-upgrade/setup.sh index 65cd576f..6dbe58c1 100755 --- a/plans/usecases-pnf-sw-upgrade/pnf-sw-upgrade/setup.sh +++ b/plans/usecases-pnf-sw-upgrade/pnf-sw-upgrade/setup.sh @@ -57,6 +57,7 @@ docker-compose -f $PNF_SIM_DOCKER_PATH/docker-compose.yml -p $PROJECT_NAME up -d ##### update pnf simulator ip in config deploy request ####### RES_KEY=$(uuidgen -r) sed -i "s/pnfaddr/$LOCAL_IP/g" $REQUEST_DATA_PATH/mount.json +sed -i "s/pnfaddr/$LOCAL_IP/g" $REQUEST_DATA_PATH/mount2.json ############################################################## diff --git a/plans/usecases-pnf-sw-upgrade/pnf-sw-upgrade/simulators/pnfsim/docker-compose.yml b/plans/usecases-pnf-sw-upgrade/pnf-sw-upgrade/simulators/pnfsim/docker-compose.yml index 7b1d5a8f..c6657e27 100755 --- a/plans/usecases-pnf-sw-upgrade/pnf-sw-upgrade/simulators/pnfsim/docker-compose.yml +++ b/plans/usecases-pnf-sw-upgrade/pnf-sw-upgrade/simulators/pnfsim/docker-compose.yml @@ -8,5 +8,15 @@ services: ports: - "830:830" - "6513:6513" + volumes: + - ./:/config/modules + + netconf-pnp-simulator-2: + image: nexus3.onap.org:10001/onap/integration/simulators/netconf-pnp-simulator:2.8.6 + container_name: netconf-pnp-simulator-2 + restart: always + ports: + - "831:830" + - "6514:6513" volumes: - ./:/config/modules \ No newline at end of file diff --git a/plans/usecases-pnf-sw-upgrade/pnf-sw-upgrade/sorch/config/a51e2bef-961c-496f-b235-b4540400e885.json b/plans/usecases-pnf-sw-upgrade/pnf-sw-upgrade/sorch/config/a51e2bef-961c-496f-b235-b4540400e885.json new file mode 100644 index 00000000..fc42fa55 --- /dev/null +++ b/plans/usecases-pnf-sw-upgrade/pnf-sw-upgrade/sorch/config/a51e2bef-961c-496f-b235-b4540400e885.json @@ -0,0 +1,20 @@ +{ + "model-vers": { + "model-ver": [ + { + "model-version-id": "cd4decf6-4f27-4775-9561-0e683ed43635", + "model-name": "EricService", + "model-version": "1.0", + "model-description": "service_instance_1.0", + "resource-version": "1594657102313" + }, + { + "model-version-id": "4442dfc1-0d2d-46b4-b0bc-a2ac10448269", + "model-name": "EricService", + "model-version": "2.0", + "model-description": "service_instance_2.0", + "resource-version": "1594707742646" + } + ] + } +} \ No newline at end of file diff --git a/plans/usecases-pnf-sw-upgrade/pnf-sw-upgrade/sorch/config/aai-simulator-populate-data/pnf.json b/plans/usecases-pnf-sw-upgrade/pnf-sw-upgrade/sorch/config/aai-simulator-populate-data/pnf.json index ab39d8c7..331b249d 100755 --- a/plans/usecases-pnf-sw-upgrade/pnf-sw-upgrade/sorch/config/aai-simulator-populate-data/pnf.json +++ b/plans/usecases-pnf-sw-upgrade/pnf-sw-upgrade/sorch/config/aai-simulator-populate-data/pnf.json @@ -1,5 +1,5 @@ { - "pnf-name2":"PNFDemo-pnf-name2-val-78244", + "pnf-name2":"6513", "pnf-name2-source":"PNFDemo-pnf-name2-source-val-99275", "equip-type":"PNFDemo-equip-type-val-20348", "equip-vendor":"PNFDemo-equip-vendor-val-52182", diff --git a/plans/usecases-pnf-sw-upgrade/pnf-sw-upgrade/sorch/config/aai-simulator-populate-data/pnf2.json b/plans/usecases-pnf-sw-upgrade/pnf-sw-upgrade/sorch/config/aai-simulator-populate-data/pnf2.json new file mode 100755 index 00000000..07732f21 --- /dev/null +++ b/plans/usecases-pnf-sw-upgrade/pnf-sw-upgrade/sorch/config/aai-simulator-populate-data/pnf2.json @@ -0,0 +1,16 @@ +{ + "pnf-name2":"6514", + "pnf-name2-source":"PNFDemo1-pnf-name2-source-val-99275", + "equip-type":"PNFDemo1-equip-type-val-20348", + "equip-vendor":"PNFDemo1-equip-vendor-val-52182", + "equip-model":"PNFDemo1-equip-model-val-8370", + "management-option":"PNFDemo1-management-option-val-72881", + "ipaddress-v4-oam":"pnfaddr", + "ipaddress-v6-oam":"0:0:0:0:0:0", + "sw-version":"pnf_sw_version-1.0.0", + "pnf-name":"PNFDemo1", + "pnf-id":"PNFDemo1", + "in-maint":false, + "resource-version":"1371558818531", + "selflink": "http://localhost:9993/pnf/PNFDemo1" +} \ No newline at end of file diff --git a/plans/usecases-pnf-sw-upgrade/pnf-sw-upgrade/sorch/config/aai-simulator-populate-data/service-instance-aai.json b/plans/usecases-pnf-sw-upgrade/pnf-sw-upgrade/sorch/config/aai-simulator-populate-data/service-instance-aai.json index 8ea4263b..53dc39d2 100644 --- a/plans/usecases-pnf-sw-upgrade/pnf-sw-upgrade/sorch/config/aai-simulator-populate-data/service-instance-aai.json +++ b/plans/usecases-pnf-sw-upgrade/pnf-sw-upgrade/sorch/config/aai-simulator-populate-data/service-instance-aai.json @@ -1,9 +1,9 @@ { - "service-instance-id": "5df8b6de-2083-11e7-93ae-92361f002676", + "service-instance-id": "df4decf6-h727-8875-8761-89683ed43645", "service-instance-name": "Service_Ete_Name123452c4-3d7f-42ce-8188-818fab951269", "environment-context": "General_Revenue-Bearing", "workload-context": "Production", - "model-version-id": "d88da85c-d9e8-4f73-b837-3a72a431622b", + "model-version-id": "cd4decf6-4f27-4775-9561-0e683ed43635", "modelInvariantId": "fe41489e-1563-46a3-b90a-1db629e4375b", "resource-version": "1595258335377", "selflink": "restconf/config/GENERIC-RESOURCE-API:services/service/5df8b6de-2083-11e7-93ae-92361f002676/service-data/service-topology/", diff --git a/plans/usecases-pnf-sw-upgrade/pnf-sw-upgrade/sorch/config/apply-workarounds.sh b/plans/usecases-pnf-sw-upgrade/pnf-sw-upgrade/sorch/config/apply-workarounds.sh index cb61ca34..72e84347 100755 --- a/plans/usecases-pnf-sw-upgrade/pnf-sw-upgrade/sorch/config/apply-workarounds.sh +++ b/plans/usecases-pnf-sw-upgrade/pnf-sw-upgrade/sorch/config/apply-workarounds.sh @@ -72,6 +72,9 @@ apply_workaround() insert into $WORKFLOW_TABLE_NAME(artifact_uuid, artifact_name, name, operation_name, version, description, body, resource_target, source) values ('02bffbd9-6af0-4f8d-bf9b-d1dfccd28c84','GenericPnfSWUPDownload','GenericPnfSWUPDownload','GenericPnfSWUPDownload',1.0,'Pnf Workflow to download software',null,'pnf','native'); + insert into $WORKFLOW_TABLE_NAME(artifact_uuid, artifact_name, name, operation_name, version, description, body, resource_target, source) values + ('03fcdjf2-6af0-4f8d-bf9b-s3frzca23c19','ServiceLevelUpgrade','ServiceLevelUpgrade','ServiceLevelUpgrade',1.0,'ServiceLevel Upgrade Workflow to upgrade software',null,'service','native'); + COMMIT; EOF diff --git a/plans/usecases-pnf-sw-upgrade/pnf-sw-upgrade/sorch/config/distribution-test-zip/zipped_sdc_csar_2.0.tar.gz b/plans/usecases-pnf-sw-upgrade/pnf-sw-upgrade/sorch/config/distribution-test-zip/zipped_sdc_csar_2.0.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..357260ef78eb1b25656b46c9d13ea340202acbca GIT binary patch literal 59004 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�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 JZ1MmY0RS|FQJ4S# literal 0 HcmV?d00001 diff --git a/plans/usecases-pnf-sw-upgrade/pnf-sw-upgrade/sorch/config/env b/plans/usecases-pnf-sw-upgrade/pnf-sw-upgrade/sorch/config/env index ab4e3df4..71e9daff 100644 --- a/plans/usecases-pnf-sw-upgrade/pnf-sw-upgrade/sorch/config/env +++ b/plans/usecases-pnf-sw-upgrade/pnf-sw-upgrade/sorch/config/env @@ -1,6 +1,6 @@ NEXUS_DOCKER_REPO_MSO=nexus3.onap.org:10001 DOCKER_ENVIRONMENT=remote -TAG=1.7.7-STAGING-latest +TAG=1.8.0-STAGING-latest TIME_OUT_DEFAULT_VALUE_SEC=1200 PROJECT_NAME=pnfSwU DEFAULT_NETWORK_NAME=pnfswu_default diff --git a/plans/usecases-pnf-sw-upgrade/pnf-sw-upgrade/sorch/config/populate-aai-simulator.sh b/plans/usecases-pnf-sw-upgrade/pnf-sw-upgrade/sorch/config/populate-aai-simulator.sh index 26673fcf..bbc5b9f3 100755 --- a/plans/usecases-pnf-sw-upgrade/pnf-sw-upgrade/sorch/config/populate-aai-simulator.sh +++ b/plans/usecases-pnf-sw-upgrade/pnf-sw-upgrade/sorch/config/populate-aai-simulator.sh @@ -62,6 +62,7 @@ populate_aai_simulator() ESR_SYSTEM_INFO_JSON_FILE=$AAI_SIMULATOR_DATA_DIR/esr-system-info.json CLOUD_ESR_SYSTEM_INFO_JSON_FILE=$AAI_SIMULATOR_DATA_DIR/cloud-esr-system-info.json PNF_JSON_FILE=$AAI_SIMULATOR_DATA_DIR/pnf.json + PNF2_JSON_FILE=$AAI_SIMULATOR_DATA_DIR/pnf2.json SERVICE_INSTANCE_JSON_FILE=$AAI_SIMULATOR_DATA_DIR/service-instance-aai.json STATUS_CODE_ACCEPTED="202" @@ -157,8 +158,16 @@ populate_aai_simulator() exit 1 fi + echo "$SCRIPT_NAME $(current_timestamp): Adding PNF_2.0" + status_code=$(curl -k --write-out %{http_code} --silent --output /dev/null -H "$BASIC_AUTHORIZATION_HEADER" -H "$ACCEPT_HEADER" -H "$CONTENT_TYPE_HEADER" $BASE_URL/network/pnfs/pnf/PNFDemo1 -X PUT -d @$"$PNF2_JSON_FILE") + + if [[ "$status_code" -ne "$STATUS_CODE_ACCEPTED" ]] ; then + echo "$SCRIPT_NAME $(current_timestamp) ERROR: Unable to put PNF data in AAI Simulator. Status code received: $status_code" + exit 1 + fi + echo "$SCRIPT_NAME $(current_timestamp): Adding ServiceInstance" - status_code=$(curl -k --write-out %{http_code} --silent --output /dev/null -H "$BASIC_AUTHORIZATION_HEADER" -H "$ACCEPT_HEADER" -H "$CONTENT_TYPE_HEADER" $BASE_URL/business/customers/customer/5df8b6de-2083-11e7-93ae-92361f002676/service-subscriptions/service-subscription/pNF/service-instances/service-instance/ETE_Customer_807c7a02-249c-4db8-9fa9-bee973fe08ce -X PUT -d @$"$SERVICE_INSTANCE_JSON_FILE") + status_code=$(curl -k --write-out %{http_code} --silent --output /dev/null -H "$BASIC_AUTHORIZATION_HEADER" -H "$ACCEPT_HEADER" -H "$CONTENT_TYPE_HEADER" $BASE_URL/business/customers/customer/807c7a02-249c-4db8-9fa9-bee973fe08ce/service-subscriptions/service-subscription/pNF/service-instances/service-instance/cd4decf6-4f27-4775-9561-0e683ed43635 -X PUT -d @$"$SERVICE_INSTANCE_JSON_FILE") if [[ "$status_code" -ne "$STATUS_CODE_ACCEPTED" ]] ; then echo "$SCRIPT_NAME $(current_timestamp) ERROR: Unable to put ServiceInstance data in AAI Simulator. Status code received: $status_code" diff --git a/plans/usecases-pnf-sw-upgrade/pnf-sw-upgrade/sorch/docker-compose.yml b/plans/usecases-pnf-sw-upgrade/pnf-sw-upgrade/sorch/docker-compose.yml index 0886d9d5..4699be33 100755 --- a/plans/usecases-pnf-sw-upgrade/pnf-sw-upgrade/sorch/docker-compose.yml +++ b/plans/usecases-pnf-sw-upgrade/pnf-sw-upgrade/sorch/docker-compose.yml @@ -140,6 +140,7 @@ services: - /etc/localtime:/etc/localtime:ro - ${TEST_LAB_DIR}/volumes/so/ca-certificates/onapheat:/app/ca-certificates - ${CONFIG_DIR_PATH}/distribution-test-zip/zipped_sdc_csar.tar.gz:/distribution-test-zip/zipped_sdc_csar.tar.gz + - ${CONFIG_DIR_PATH}/distribution-test-zip/zipped_sdc_csar_2.0.tar.gz:/distribution-test-zip/zipped_sdc_csar_2.0.tar.gz - ${CONFIG_DIR_PATH}/override-files/sdc-controller/onapheat:/app/config environment: - APP=sdc-controller @@ -160,7 +161,7 @@ services: entrypoint: - /bin/sh - -c - - 'mkdir -p /app/distribution-test-zip/unzipped && cp -R /distribution-test-zip/zipped_sdc_csar.tar.gz /app && tar -xvzf /app/zipped_sdc_csar.tar.gz -C /app/distribution-test-zip/unzipped && /app/wait-for.sh -q -t "300" request-db-adapter:8083 -- "/app/start-app.sh"' + - 'mkdir -p /app/distribution-test-zip/unzipped && cp -R /distribution-test-zip/zipped_sdc_csar.tar.gz /app && cp -R /distribution-test-zip/zipped_sdc_csar_2.0.tar.gz /app && tar -xvzf /app/zipped_sdc_csar.tar.gz -C /app/distribution-test-zip/unzipped && tar -xvzf /app/zipped_sdc_csar_2.0.tar.gz -C /app/distribution-test-zip/unzipped && /app/wait-for.sh -q -t "300" request-db-adapter:8083 -- "/app/start-app.sh"' ################################################################################ bpmn-infra: user: root @@ -246,6 +247,7 @@ services: container_name: aai-simulator volumes: - /etc/localtime:/etc/localtime:ro + - ${CONFIG_DIR_PATH}/a51e2bef-961c-496f-b235-b4540400e885.json:/app/a51e2bef-961c-496f-b235-b4540400e885.json ports: - "9993:9993" environment: diff --git a/plans/usecases-pnf-sw-upgrade/pnf-sw-upgrade/sorch/simulator/aai-simulator/pom.xml b/plans/usecases-pnf-sw-upgrade/pnf-sw-upgrade/sorch/simulator/aai-simulator/pom.xml index 30d25215..99768146 100755 --- a/plans/usecases-pnf-sw-upgrade/pnf-sw-upgrade/sorch/simulator/aai-simulator/pom.xml +++ b/plans/usecases-pnf-sw-upgrade/pnf-sw-upgrade/sorch/simulator/aai-simulator/pom.xml @@ -55,6 +55,11 @@ javax.activation activation + + com.google.code.gson + gson + 2.8.5 + diff --git a/plans/usecases-pnf-sw-upgrade/pnf-sw-upgrade/sorch/simulator/aai-simulator/src/main/java/org/onap/aaisimulator/controller/ServiceDesignAndCreationController.java b/plans/usecases-pnf-sw-upgrade/pnf-sw-upgrade/sorch/simulator/aai-simulator/src/main/java/org/onap/aaisimulator/controller/ServiceDesignAndCreationController.java index ddc2b624..13753871 100644 --- a/plans/usecases-pnf-sw-upgrade/pnf-sw-upgrade/sorch/simulator/aai-simulator/src/main/java/org/onap/aaisimulator/controller/ServiceDesignAndCreationController.java +++ b/plans/usecases-pnf-sw-upgrade/pnf-sw-upgrade/sorch/simulator/aai-simulator/src/main/java/org/onap/aaisimulator/controller/ServiceDesignAndCreationController.java @@ -1,6 +1,6 @@ /*- * ============LICENSE_START======================================================= - * Copyright (C) 2019 Nordix Foundation. + * Copyright (C) 2020 Nordix Foundation. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,11 +19,14 @@ */ package org.onap.aaisimulator.controller; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import javax.ws.rs.core.MediaType; +import org.onap.aaisimulator.models.ServiceModelVersion; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -50,25 +53,27 @@ public class ServiceDesignAndCreationController { @Value("${SERVICE_DESIGN_AND_CREATION_RESPONSES_LOCATION:./}") private String responsesLocation; - @GetMapping(path = "/models/model/{model-invariant-id}/model-vers", - produces = MediaType.APPLICATION_XML_VALUE) + @GetMapping(path = "/models/model/{model-invariant-id}/model-vers", produces = {MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) public ResponseEntity getModelVers(@PathVariable("model-invariant-id") String modelInvariantId) { Path responsesPath = Paths.get(responsesLocation).toAbsolutePath(); LOGGER.info("Will get ModelVer for 'model-invariant-id': {}, looking under {}", modelInvariantId, responsesPath.toString()); - Path responsePath = responsesPath.resolve(modelInvariantId + ".xml"); + Path responsePath = responsesPath.resolve(modelInvariantId + ".json"); if (!responsePath.toFile().exists()) { LOGGER.error("{} not found", responsePath.toString()); return ResponseEntity.notFound().build(); } try { String content = new String(Files.readAllBytes(responsePath), StandardCharsets.UTF_8); + Gson gson = new GsonBuilder().setPrettyPrinting().create(); + ServiceModelVersion json = gson.fromJson(content, ServiceModelVersion.class); + String jsonInString = gson.toJson(json); LOGGER.info("{} found with {} characters", responsePath.toString(), content.length()); - return ResponseEntity.ok().body(content); + return ResponseEntity.ok().body(jsonInString); } catch (IOException e) { LOGGER.error("Failed to read response from {}: {}}", responsePath.toString(), e.getMessage()); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); } } -} +} \ No newline at end of file diff --git a/plans/usecases-pnf-sw-upgrade/pnf-sw-upgrade/sorch/simulator/aai-simulator/src/main/java/org/onap/aaisimulator/models/ModelVersion.java b/plans/usecases-pnf-sw-upgrade/pnf-sw-upgrade/sorch/simulator/aai-simulator/src/main/java/org/onap/aaisimulator/models/ModelVersion.java new file mode 100644 index 00000000..d6825089 --- /dev/null +++ b/plans/usecases-pnf-sw-upgrade/pnf-sw-upgrade/sorch/simulator/aai-simulator/src/main/java/org/onap/aaisimulator/models/ModelVersion.java @@ -0,0 +1,86 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2020 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. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ +package org.onap.aaisimulator.models; + +import com.google.gson.annotations.Expose; +import com.google.gson.annotations.SerializedName; + +public class ModelVersion { + + @SerializedName("model-version-id") + @Expose + private String modelVersionId; + + @SerializedName("model-name") + @Expose + private String modelName; + + @SerializedName("model-version") + @Expose + private String modelVersion; + + @SerializedName("model-description") + @Expose + private String modelDescription; + + @SerializedName("resource-version") + @Expose + private String resourceVersion; + + public String getModelVersionId() { + return modelVersionId; + } + + public void setModelVersionId(String modelVersionId) { + this.modelVersionId = modelVersionId; + } + + public String getModelName() { + return modelName; + } + + public void setModelName(String modelName) { + this.modelName = modelName; + } + + public String getModelVersion() { + return modelVersion; + } + + public void setModelVersion(String modelVersion) { + this.modelVersion = modelVersion; + } + + public String getModelDescription() { + return modelDescription; + } + + public void setModelDescription(String modelDescription) { + this.modelDescription = modelDescription; + } + + public String getResourceVersion() { + return resourceVersion; + } + + public void setResourceVersion(String resourceVersion) { + this.resourceVersion = resourceVersion; + } +} diff --git a/plans/usecases-pnf-sw-upgrade/pnf-sw-upgrade/sorch/simulator/aai-simulator/src/main/java/org/onap/aaisimulator/models/ModelVersions.java b/plans/usecases-pnf-sw-upgrade/pnf-sw-upgrade/sorch/simulator/aai-simulator/src/main/java/org/onap/aaisimulator/models/ModelVersions.java new file mode 100644 index 00000000..7d74ec36 --- /dev/null +++ b/plans/usecases-pnf-sw-upgrade/pnf-sw-upgrade/sorch/simulator/aai-simulator/src/main/java/org/onap/aaisimulator/models/ModelVersions.java @@ -0,0 +1,39 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2020 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. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ +package org.onap.aaisimulator.models; + +import com.google.gson.annotations.Expose; +import com.google.gson.annotations.SerializedName; +import java.util.List; + +public class ModelVersions { + + @SerializedName("model-ver") + @Expose + private List modelVer = null; + + public List getModelVer() { + return modelVer; + } + + public void setModelVer(List modelVer) { + this.modelVer = modelVer; + } +} diff --git a/plans/usecases-pnf-sw-upgrade/pnf-sw-upgrade/sorch/simulator/aai-simulator/src/main/java/org/onap/aaisimulator/models/ServiceModelVersion.java b/plans/usecases-pnf-sw-upgrade/pnf-sw-upgrade/sorch/simulator/aai-simulator/src/main/java/org/onap/aaisimulator/models/ServiceModelVersion.java new file mode 100644 index 00000000..d0a879c4 --- /dev/null +++ b/plans/usecases-pnf-sw-upgrade/pnf-sw-upgrade/sorch/simulator/aai-simulator/src/main/java/org/onap/aaisimulator/models/ServiceModelVersion.java @@ -0,0 +1,38 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2020 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. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ +package org.onap.aaisimulator.models; + +import com.google.gson.annotations.Expose; +import com.google.gson.annotations.SerializedName; + +public class ServiceModelVersion { + + @SerializedName("model-vers") + @Expose + private ModelVersions modelVers; + + public ModelVersions getModelVers() { + return modelVers; + } + + public void setModelVers(ModelVersions modelVers) { + this.modelVers = modelVers; + } +} diff --git a/plans/usecases-pnf-sw-upgrade/pnf-sw-upgrade/sorch/simulator/aai-simulator/src/test/java/org/onap/aaisimulator/controller/ServiceDesignAndCreationControllerTest.java b/plans/usecases-pnf-sw-upgrade/pnf-sw-upgrade/sorch/simulator/aai-simulator/src/test/java/org/onap/aaisimulator/controller/ServiceDesignAndCreationControllerTest.java index d0e652bd..8bda17e4 100644 --- a/plans/usecases-pnf-sw-upgrade/pnf-sw-upgrade/sorch/simulator/aai-simulator/src/test/java/org/onap/aaisimulator/controller/ServiceDesignAndCreationControllerTest.java +++ b/plans/usecases-pnf-sw-upgrade/pnf-sw-upgrade/sorch/simulator/aai-simulator/src/test/java/org/onap/aaisimulator/controller/ServiceDesignAndCreationControllerTest.java @@ -1,6 +1,6 @@ /*- * ============LICENSE_START======================================================= - * Copyright (C) 2019 Nordix Foundation. + * Copyright (C) 2020 Nordix Foundation. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,6 +20,7 @@ package org.onap.aaisimulator.controller; import org.junit.Test; +import org.onap.aaisimulator.models.ServiceModelVersion; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.http.HttpStatus; @@ -37,31 +38,35 @@ public class ServiceDesignAndCreationControllerTest extends AbstractSpringBootTe @Test public void should_reply_sample_modelvers_response() { - final String url = getUrl(SERVICE_DESIGN_AND_CREATION_URL, - "/models/model/a51e2bef-961c-496f-b235-b4540400e885/model-vers"); - ResponseEntity actual = testRestTemplateService.invokeHttpGet(url, String.class); - String expectedXml = "\n" + - "\n" + - " \n" + - " c0818142-324d-4a8c-8065-45a61df247a5\n" + - " EricService\n" + - " 1.0\n" + - " blah\n" + - " 1594657102313\n" + - " \n" + - " \n" + - " 4442dfc1-0d2d-46b4-b0bc-a2ac10448269\n" + - " EricService\n" + - " 2.0\n" + - " blahhhh\n" + - " 1594707742646\n" + - " \n" + - ""; + final String url = getUrl(SERVICE_DESIGN_AND_CREATION_URL, "/models/model/a51e2bef-961c-496f-b235-b4540400e885/model-vers"); + + ResponseEntity actual = testRestTemplateService.invokeHttpGet(url, String.class); + + String expectedXml = "{\n" + + " \"model-vers\": {\n" + + " \"model-ver\": [\n" + + " {\n" + + " \"model-version-id\": \"cd4decf6-4f27-4775-9561-0e683ed43635\",\n" + + " \"model-name\": \"EricService\",\n" + + " \"model-version\": \"1.0\",\n" + + " \"model-description\": \"service_instance_1.0\",\n" + + " \"resource-version\": \"1594657102313\"\n" + + " },\n" + + " {\n" + + " \"model-version-id\": \"4442dfc1-0d2d-46b4-b0bc-a2ac10448269\",\n" + + " \"model-name\": \"EricService\",\n" + + " \"model-version\": \"2.0\",\n" + + " \"model-description\": \"service_instance_2.0\",\n" + + " \"resource-version\": \"1594707742646\"\n" + + " }\n" + + " ]\n" + + " }\n" + + "}"; assertEquals(HttpStatus.OK, actual.getStatusCode()); MediaType contentType = actual.getHeaders().getContentType(); assertNotNull(contentType); - assertTrue(contentType.isCompatibleWith(MediaType.APPLICATION_XML)); + assertTrue(contentType.isCompatibleWith(MediaType.APPLICATION_JSON)); assertEquals(expectedXml, actual.getBody()); } } \ No newline at end of file diff --git a/plans/usecases-pnf-sw-upgrade/pnf-sw-upgrade/sorch/simulator/aai-simulator/src/test/resources/test-data/service-design-and-creation-responses/a51e2bef-961c-496f-b235-b4540400e885.json b/plans/usecases-pnf-sw-upgrade/pnf-sw-upgrade/sorch/simulator/aai-simulator/src/test/resources/test-data/service-design-and-creation-responses/a51e2bef-961c-496f-b235-b4540400e885.json new file mode 100644 index 00000000..fc42fa55 --- /dev/null +++ b/plans/usecases-pnf-sw-upgrade/pnf-sw-upgrade/sorch/simulator/aai-simulator/src/test/resources/test-data/service-design-and-creation-responses/a51e2bef-961c-496f-b235-b4540400e885.json @@ -0,0 +1,20 @@ +{ + "model-vers": { + "model-ver": [ + { + "model-version-id": "cd4decf6-4f27-4775-9561-0e683ed43635", + "model-name": "EricService", + "model-version": "1.0", + "model-description": "service_instance_1.0", + "resource-version": "1594657102313" + }, + { + "model-version-id": "4442dfc1-0d2d-46b4-b0bc-a2ac10448269", + "model-name": "EricService", + "model-version": "2.0", + "model-description": "service_instance_2.0", + "resource-version": "1594707742646" + } + ] + } +} \ No newline at end of file diff --git a/plans/usecases-pnf-sw-upgrade/pnf-sw-upgrade/sorch/simulator/aai-simulator/src/test/resources/test-data/service-design-and-creation-responses/a51e2bef-961c-496f-b235-b4540400e885.xml b/plans/usecases-pnf-sw-upgrade/pnf-sw-upgrade/sorch/simulator/aai-simulator/src/test/resources/test-data/service-design-and-creation-responses/a51e2bef-961c-496f-b235-b4540400e885.xml deleted file mode 100644 index 55247be6..00000000 --- a/plans/usecases-pnf-sw-upgrade/pnf-sw-upgrade/sorch/simulator/aai-simulator/src/test/resources/test-data/service-design-and-creation-responses/a51e2bef-961c-496f-b235-b4540400e885.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - c0818142-324d-4a8c-8065-45a61df247a5 - EricService - 1.0 - blah - 1594657102313 - - - 4442dfc1-0d2d-46b4-b0bc-a2ac10448269 - EricService - 2.0 - blahhhh - 1594707742646 - - \ No newline at end of file diff --git a/plans/usecases-pnf-sw-upgrade/pnf-sw-upgrade/sorch/so_setup.sh b/plans/usecases-pnf-sw-upgrade/pnf-sw-upgrade/sorch/so_setup.sh index ed5f6f07..de90c1f3 100755 --- a/plans/usecases-pnf-sw-upgrade/pnf-sw-upgrade/sorch/so_setup.sh +++ b/plans/usecases-pnf-sw-upgrade/pnf-sw-upgrade/sorch/so_setup.sh @@ -45,6 +45,7 @@ WAIT_FOR_WORKAROUND_SCRIPT=$CONFIG_DIR/"wait-for-workaround-job.sh" WAIT_FOR_POPULATE_AAI_SCRIPT=$CONFIG_DIR/"wait-for-aai-config-job.sh" WAIT_FOR_CONTAINER_SCRIPT=$CONFIG_DIR/"wait-for-container.sh" PNF_PAYLOAD_PATH=$CONFIG_DIR/aai-simulator-populate-data/pnf.json +PNF2_PAYLOAD_PATH=$CONFIG_DIR/aai-simulator-populate-data/pnf2.json echo "Running $SCRIPT_HOME/$SCRIPT_NAME ..." @@ -142,6 +143,7 @@ export CONFIG_DIR_PATH=$CONFIG_DIR echo "updating PNF ip-address in pnf.json" sed -i "s/pnfaddr/$LOCAL_IP/g" $PNF_PAYLOAD_PATH +sed -i "s/pnfaddr/$LOCAL_IP/g" $PNF2_PAYLOAD_PATH if [ "$DOCKER_ENVIRONMENT" == "remote" ]; then echo "Starting docker containers with remote images ..." diff --git a/tests/usecases-pnf-sw-upgrade/pnf-sw-upgrade/data/blueprint_archive.zip b/tests/usecases-pnf-sw-upgrade/pnf-sw-upgrade/data/blueprint_archive.zip index 4edc9dedfcabb9fca3c510c5d6b8e6b23065c8e3..055d7dec51f568c64463869434e09f0d874ae949 100644 GIT binary patch delta 7262 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 diff --git a/tests/usecases-pnf-sw-upgrade/pnf-sw-upgrade/data/distributeServiceTemplate_2.0.json b/tests/usecases-pnf-sw-upgrade/pnf-sw-upgrade/data/distributeServiceTemplate_2.0.json new file mode 100644 index 00000000..e5b3d890 --- /dev/null +++ b/tests/usecases-pnf-sw-upgrade/pnf-sw-upgrade/data/distributeServiceTemplate_2.0.json @@ -0,0 +1,35 @@ +{ + "distributionID": "6ac9fa0c-70f0-4213-a8d4-5b58d6a17697", + "serviceName": "Demo_svc", + "serviceVersion": "2.0", + "serviceUUID": "8351245d-50da-4695-8756-3a22618377f7", + "serviceDescription": "ServiceLevelUpgrade", + "serviceInvariantUUID": "fe41489e-1563-46a3-b90a-1db629e4375b", + "resources": [ + { + "resourceInstanceName": "Demo_pnf 0", + "resourceCustomizationUUID": "23b43821-4eds-31f4-bfd4-66a7e0fd9bb2", + "resourceName": "Demo_pnf", + "resourceVersion": "1.0", + "resoucreType": "PNF", + "resourceUUID": "a42f6566-6a29-43e1-bac9-b91a59d702ac", + "resourceInvariantUUID": "fdf44827-35db-4ee5-bd70-7500e633576e", + "category": "Network L4+", + "subcategory": "Common Network Resources", + "artifacts": [] + } + ], + "serviceArtifacts": [ + { + "artifactName": "service-DemoSvc-csar_2.0.csar", + "artifactType": "TOSCA_CSAR", + "artifactURL": "//unzipped_sdc_csar/v1/catalog/services/DemoSvc/2.0/artifacts/service-DemoSvc-csar.csar", + "artifactChecksum": "YjFhZWZhOTU2MzljMDI4ZmVlNzlhOTgxYTcxMzg5ODI\u003d", + "artifactDescription": "TOSCA definition package of the asset", + "artifactTimeout": 0, + "artifactVersion": "2", + "artifactUUID": "809894a4-c862-4294-b2fb-e016b4268546" + } + ], + "workloadContext": "Production" + } \ No newline at end of file diff --git a/tests/usecases-pnf-sw-upgrade/pnf-sw-upgrade/data/mount2.json b/tests/usecases-pnf-sw-upgrade/pnf-sw-upgrade/data/mount2.json new file mode 100755 index 00000000..efe94b42 --- /dev/null +++ b/tests/usecases-pnf-sw-upgrade/pnf-sw-upgrade/data/mount2.json @@ -0,0 +1,18 @@ +{ + "node": [ + { + "node-id": "PNFDemo1", + "netconf-node-topology:protocol": { + "name": "TLS" + }, + "netconf-node-topology:host": "pnfaddr", + "netconf-node-topology:key-based": { + "username": "netconf", + "key-id": "ODL_private_key_0" + }, + "netconf-node-topology:port": 6514, + "netconf-node-topology:tcp-only": false, + "netconf-node-topology:max-connection-attempts": 5 + } + ] +} \ No newline at end of file diff --git a/tests/usecases-pnf-sw-upgrade/pnf-sw-upgrade/data/serviceLevelUpgradeRequest.json b/tests/usecases-pnf-sw-upgrade/pnf-sw-upgrade/data/serviceLevelUpgradeRequest.json new file mode 100644 index 00000000..d7a6b57f --- /dev/null +++ b/tests/usecases-pnf-sw-upgrade/pnf-sw-upgrade/data/serviceLevelUpgradeRequest.json @@ -0,0 +1,38 @@ +{ + "requestDetails": { + "subscriberInfo": { + "globalSubscriberId": "807c7a02-249c-4db8-9fa9-bee973fe08ce" + }, + "modelInfo": { + "modelVersion": "2.0", + "modelVersionId": "8351245d-50da-4695-8756-3a22618377f7", + "modelInvariantId": "fe41489e-1563-46a3-b90a-1db629e4375b", + "modelName": "Demo_svc", + "modelType": "service" + }, + "requestInfo": { + "suppressRollback": false, + "requestorId": "demo", + "instanceName": "testInstanceName", + "source": "VID" + }, + "requestParameters": { + "subscriptionServiceType": "pNF", + "userParams": [ + { + "name": "targetSoftwareVersion", + "value": "pnf_sw_version-4.0.0" + } + ], + "aLaCarte": false, + "payload": "{\"k1\": \"v1\"}" + }, + "project": { + "projectName": "ServiceLevelUpgrade" + }, + "owningEntity": { + "owningEntityId": "67f2e84c-734d-4e90-a1e4-d2ffa2e75849", + "owningEntityName": "OE-Test" + } + } +} \ No newline at end of file diff --git a/tests/usecases-pnf-sw-upgrade/pnf-sw-upgrade/pnf-sw-upgrade.robot b/tests/usecases-pnf-sw-upgrade/pnf-sw-upgrade/pnf-sw-upgrade.robot index d3762a0b..1bb2d714 100644 --- a/tests/usecases-pnf-sw-upgrade/pnf-sw-upgrade/pnf-sw-upgrade.robot +++ b/tests/usecases-pnf-sw-upgrade/pnf-sw-upgrade/pnf-sw-upgrade.robot @@ -8,7 +8,9 @@ Library String *** Variables *** ${SDNC_KEYSTORE_CONFIG_PATH} /restconf/config/netconf-keystore:keystore ${SDNC_MOUNT_PATH} /restconf/config/network-topology:network-topology/topology/topology-netconf/node/PNFDemo +${SDNC_MOUNT_PATH2} /restconf/config/network-topology:network-topology/topology/topology-netconf/node/PNFDemo1 ${PNFSIM_MOUNT_PATH} /restconf/config/network-topology:network-topology/topology/topology-netconf/node/PNFDemo/yang-ext:mount/pnf-sw-upgrade:software-upgrade +${PNFSIM_MOUNT_PATH2} /restconf/config/network-topology:network-topology/topology/topology-netconf/node/PNFDemo1/yang-ext:mount/pnf-sw-upgrade:software-upgrade ${PNFSIM_DELETE_PATH} /restconf/config/network-topology:network-topology/topology/topology-netconf/node/PNFDemo ${BP_UPLOAD_URL} /api/v1/blueprint-model/publish ${BP_PROCESS_URL} /api/v1/execution-service/process @@ -48,12 +50,14 @@ Distribute Service Template ${serviceInstanceId}= Set Variable cd4decf6-4f27-4775-9561-0e683ed43635 SET GLOBAL VARIABLE ${serviceInstanceId} ${pnfName}= Set Variable PNFDemo - SET GLOBAL VARIABLE ${pnfName} + SET GLOBAL VARIABLE ${pnfName} + ${pnfName1}= Set Variable PNFDemo1 + SET GLOBAL VARIABLE ${pnfName1} Get pnf workflow Create Session api_handler_session http://${REPO_IP}:8080 &{headers}= Create Dictionary Authorization=Basic SW5mcmFQb3J0YWxDbGllbnQ6cGFzc3dvcmQxJA== Content-Type=application/json Accept=application/json - ${get_pnfworkflows_request}= Get Request api_handler_session /onap/so/infra/workflowSpecifications/v1/pnfWorkflows headers=${headers} + ${get_pnfworkflows_request}= Get Request api_handler_session /onap/so/infra/workflowSpecifications/v1/workflows headers=${headers} Run Keyword If '${get_pnfworkflows_request.status_code}' == '200' log to console \nexecuted with expected result log to console ${get_pnfworkflows_request.content} ${pnfworkflows_json_response}= Evaluate json.loads(r"""${get_pnfworkflows_request.content}""", strict=False) json @@ -62,6 +66,8 @@ Get pnf workflow ${activate_workflow_name}= Set Variable "" ${download_workflow_uuid}= Set Variable "" ${download_workflow_name}= Set Variable "" + ${serviceLevel_workflow_uuid}= Set Variable "" + ${serviceLevel_workflow_name}= Set Variable "" FOR ${member} IN @{all_wf_members} ${workflow_uuid}= Set Variable ${member}[workflowSpecification][artifactInfo][artifactUuid] ${workflow_name}= Set Variable ${member}[workflowSpecification][artifactInfo][artifactName] @@ -70,14 +76,19 @@ Get pnf workflow ${activate_workflow_name}= Set Variable If '${workflow_name}' == 'GenericPnfSoftwareUpgrade' ${workflow_name} ${activate_workflow_name} ${download_workflow_uuid}= Set Variable If '${workflow_name}' == 'GenericPnfSWUPDownload' ${workflow_uuid} ${download_workflow_uuid} ${download_workflow_name}= Set Variable If '${workflow_name}' == 'GenericPnfSWUPDownload' ${workflow_name} ${download_workflow_name} + ${serviceLevel_workflow_uuid}= Set Variable If '${workflow_name}' == 'ServiceLevelUpgrade' ${workflow_uuid} ${serviceLevel_workflow_uuid} + ${serviceLevel_workflow_name}= Set Variable If '${workflow_name}' == 'ServiceLevelUpgrade' ${workflow_name} ${serviceLevel_workflow_name} END SET GLOBAL VARIABLE ${activate_workflow_uuid} SET GLOBAL VARIABLE ${download_workflow_uuid} + SET GLOBAL VARIABLE ${serviceLevel_workflow_uuid} Run Keyword If '${activate_workflow_name}' == 'GenericPnfSoftwareUpgrade' log to console \nexecuted with expected result Run Keyword If '${download_workflow_name}' == 'GenericPnfSWUPDownload' log to console \nexecuted with expected result + Run Keyword If '${serviceLevel_workflow_name}' == 'ServiceLevelUpgrade' log to console \nexecuted with expected result Should Be Equal As Strings '${activate_workflow_name}' 'GenericPnfSoftwareUpgrade' Should Be Equal As Strings '${download_workflow_name}' 'GenericPnfSWUPDownload' + Should Be Equal As Strings '${serviceLevel_workflow_name}' 'ServiceLevelUpgrade' Invoke Service Instantiation for pnf software download Create Session api_handler_session http://${REPO_IP}:8080 @@ -194,3 +205,158 @@ Test AAI-update for target software version verify Log To Console final target software version received: ${sw_version} Run Keyword If '${sw_version}' == 'pnf_sw_version-3.0.0' log to console \nexecuted with expected result Should Be Equal As Strings '${sw_version}' 'pnf_sw_version-3.0.0' + +Distribute ServiceLevel Upgrade Template + Create Session sdc_controller_session http://${REPO_IP}:8085 + ${data}= Get Binary File ${CURDIR}${/}data${/}distributeServiceTemplate_2.0.json + &{headers}= Create Dictionary Authorization=Basic bXNvX2FkbWluOnBhc3N3b3JkMSQ= resource-location=/app/distribution-test-zip/unzipped/ Content-Type=application/json Accept=application/json + ${resp}= Post Request sdc_controller_session /test/treatNotification/v1 data=${data} headers=${headers} + Run Keyword If '${resp.status_code}' == '200' log to console \nexecuted with expected result + Should Be Equal As Strings '${resp.status_code}' '200' + ${model_version_id_2}= Set Variable 8351245d-50da-4695-8756-3a22618377f7 + SET GLOBAL VARIABLE ${model_version_id_2} + +Get Service-Model-Version From AAI Using Service-Model-InVariant-UUId + Create Session aai_simulator_session https://${REPO_IP}:9993 + &{headers}= Create Dictionary Authorization=Basic YWFpOmFhaS5vbmFwLm9yZzpkZW1vMTIzNDU2IQ== Content-Type=application/xml Accept=application/xml verify=False + ${model-invariant-id}= Set Variable a51e2bef-961c-496f-b235-b4540400e885 + ${get_serviceVersion}= Get Request aai_simulator_session aai/v11/service-design-and-creation/models/model/${model-invariant-id}/model-vers headers=${headers} + Run Keyword If '${get_serviceVersion.status_code}' == '200' log to console \nExecuted with expected + Log to console ${get_serviceVersion.content} + Should Be Equal As Strings ${get_serviceVersion.status_code} 200 + ${serviceVersion_json_response}= Evaluate json.loads(r"""${get_serviceVersion.content}""", strict=False) json + ${all_service_version}= Set Variable ${serviceVersion_json_response['model-vers']['model-ver']} + ${model-version-id_1}= Set Variable "" + ${model-version-id_2}= Set Variable "" + FOR ${member} IN @{all_service_version} + ${model-version}= Set Variable ${member}[model-version] + ${model-version-id}= Set Variable ${member}[model-version-id] + Log to console The ServiceModel Version ${model-version} has ModelVersion Id : ${model-version-id} + ${model-version-id_1}= Set Variable If '${model-version}' == '1.0' ${model-version-id} ${model-version-id_1} + ${model-version-id_2}= Set Variable If '${model-version}' == '2.0' ${model-version-id} ${model-version-id_2} + END + SET GLOBAL VARIABLE ${model-version-id_1} + SET GLOBAL VARIABLE ${model-version-id_2} + +Invoke Service Instantiation for ServiceLevel Upgrade + Create Session api_handler_session http://${REPO_IP}:8080 + ${data}= Get Binary File ${CURDIR}${/}data${/}serviceLevelUpgradeRequest.json + ${serviceInstanceId}= Set Variable ${model-version-id_1} + &{headers}= Create Dictionary Authorization=Basic SW5mcmFQb3J0YWxDbGllbnQ6cGFzc3dvcmQxJA== Content-Type=application/json Accept=application/json X-ONAP-RequestID=0ffc559c-5513-44bc-8b02-5759d84600f4 X-ONAP-PartnerName=ONAP X-RequestorID=VID + ${service_instantiation_request}= Post Request api_handler_session /onap/so/infra/instanceManagement/v1/serviceInstances/${serviceInstanceId}/workflows/${serviceLevel_workflow_uuid} data=${data} headers=${headers} + Run Keyword If '${service_instantiation_request.status_code}' == '200' log to console \nexecuted with expected result + log to console ${service_instantiation_request.content} + ${service_instantiation_json_response}= Evaluate json.loads(r"""${service_instantiation_request.content}""", strict=False) json + ${request_ID}= Set Variable ${service_instantiation_json_response}[requestReferences][requestId] + ${actual_service_request_state}= Set Variable "" + FOR ${INDEX} IN RANGE ${MAXIMUM_ATTEMPTS_BEFORE_TIMEOUT} + ${orchestration_status_service_request}= Get Request api_handler_session /onap/so/infra/orchestrationRequests/v7/${request_ID} + Run Keyword If '${orchestration_status_service_request.status_code}' == '200' log to console \nexecuted with expected result + log to console ${orchestration_status_service_request.content} + ${orchestration_json_service_response}= Evaluate json.loads(r"""${orchestration_status_service_request.content}""", strict=False) json + ${actual_service_request_state}= SET VARIABLE ${orchestration_json_service_response}[request][requestStatus][requestState] + Log To Console Received actual repsonse status:${actual_service_request_state} + RUN KEYWORD IF '${actual_service_request_state}' == 'COMPLETE' or '${actual_service_request_state}' == 'FAILED' Exit For Loop + log to console Will try again after ${SLEEP_INTERVAL_SEC} seconds + SLEEP ${SLEEP_INTERVAL_SEC}s + END + Log To Console final repsonse status received: ${actual_service_request_state} + Run Keyword If '${actual_service_request_state}' == 'COMPLETE' log to console \nexecuted with expected result + Should Be Equal As Strings '${actual_service_request_state}' 'COMPLETE' + +Test Verify PNF-1 Configuration for Service Level Upgrade + [Documentation] Checking PNF configuration params + Create Session sdnc http://${REPO_IP}:8282 + &{headers}= Create Dictionary Authorization=Basic YWRtaW46S3A4Yko0U1hzek0wV1hsaGFrM2VIbGNzZTJnQXc4NHZhb0dHbUp2VXkyVQ== Content-Type=application/json + ${mount}= Get File ${CURDIR}${/}data${/}mount.json + Log to console ${mount} + ${pnf_mount_resp}= Put Request sdnc ${SDNC_MOUNT_PATH} data=${mount} headers=${headers} + Should Be Equal As Strings ${pnf_mount_resp.status_code} 201 + SLEEP 10 + ${pnfsim_software_resp}= Get Request sdnc ${PNFSIM_MOUNT_PATH} headers=${headers} + Should Be Equal As Strings ${pnfsim_software_resp.status_code} 200 + Log to console ${pnfsim_software_resp.content} + ${pnfsim_software_resp_json}= Evaluate json.loads(r"""${pnfsim_software_resp.content}""", strict=False) json + ${all_upgp_members}= Set Variable ${pnfsim_software_resp_json['software-upgrade']['upgrade-package']} + FOR ${member} IN @{all_upgp_members} + ${soft_ver}= Get From Dictionary ${member} software-version + ${soft_status}= Get From Dictionary ${member} current-status + Log to console The node ${pnfName} has software version ${soft_ver} : ${soft_status} + Run Keyword If '${soft_ver}' == 'pnf_sw_version-4.0.0' Exit For Loop + END + Run Keyword If '${soft_ver}' == 'pnf_sw_version-4.0.0' log to console \nexecuted with expected result + Should Be Equal As Strings '${soft_ver}' 'pnf_sw_version-4.0.0' + Should Be Equal As Strings '${soft_status}' 'ACTIVATION_COMPLETED' + +Test AAI-Update for PNF-1 Target Software Version after Service Level Upgrade + Create Session aai_simulator_session https://${REPO_IP}:9993 + &{headers}= Create Dictionary Authorization=Basic YWFpOmFhaS5vbmFwLm9yZzpkZW1vMTIzNDU2IQ== Content-Type=application/json Accept=application/json verify=False + FOR ${INDEX} IN RANGE ${MAXIMUM_ATTEMPTS_BEFORE_TIMEOUT} + ${get_pnf_request}= Get Request aai_simulator_session aai/v11/network/pnfs/pnf/${pnfName} headers=${headers} + Run Keyword If '${get_pnf_request.status_code}' == '200' log to console \nexecuted with expected result + ${get_pnf_json_response}= Evaluate json.loads(r"""${get_pnf_request.content}""", strict=False) json + Log to console ${get_pnf_json_response} + ${sw_version}= Set Variable ${get_pnf_json_response}[sw-version] + Log to console ${sw_version} + Run Keyword If '${sw_version}' == 'pnf_sw_version-4.0.0' Exit For Loop + log to console Will try again after ${SLEEP_INTERVAL_SEC} seconds + SLEEP ${SLEEP_INTERVAL_SEC}s + END + Log To Console final target software version received: ${sw_version} + Run Keyword If '${sw_version}' == 'pnf_sw_version-4.0.0' log to console \nexecuted with expected result + Should Be Equal As Strings '${sw_version}' 'pnf_sw_version-4.0.0' + +Test Verify PNF-2 Configuration for Service Level Upgrade + [Documentation] Checking PNF configuration params + Create Session sdnc http://${REPO_IP}:8282 + &{headers}= Create Dictionary Authorization=Basic YWRtaW46S3A4Yko0U1hzek0wV1hsaGFrM2VIbGNzZTJnQXc4NHZhb0dHbUp2VXkyVQ== Content-Type=application/json + ${mount}= Get File ${CURDIR}${/}data${/}mount2.json + Log to console ${mount} + ${pnf_mount_resp}= Put Request sdnc ${SDNC_MOUNT_PATH2} data=${mount} headers=${headers} + Should Be Equal As Strings ${pnf_mount_resp.status_code} 201 + SLEEP 10 + ${pnfsim_software_resp}= Get Request sdnc ${PNFSIM_MOUNT_PATH2} headers=${headers} + Should Be Equal As Strings ${pnfsim_software_resp.status_code} 200 + Log to console ${pnfsim_software_resp.content} + ${pnfsim_software_resp_json}= Evaluate json.loads(r"""${pnfsim_software_resp.content}""", strict=False) json + ${all_upgp_members}= Set Variable ${pnfsim_software_resp_json['software-upgrade']['upgrade-package']} + FOR ${member} IN @{all_upgp_members} + ${soft_ver}= Get From Dictionary ${member} software-version + ${soft_status}= Get From Dictionary ${member} current-status + Log to console The node ${pnfName1} has software version ${soft_ver} : ${soft_status} + Run Keyword If '${soft_ver}' == 'pnf_sw_version-4.0.0' Exit For Loop + END + Run Keyword If '${soft_ver}' == 'pnf_sw_version-4.0.0' log to console \nexecuted with expected result + Should Be Equal As Strings '${soft_ver}' 'pnf_sw_version-4.0.0' + Should Be Equal As Strings '${soft_status}' 'ACTIVATION_COMPLETED' + +Test AAI-Update for PNF-2 Target Software Version after Service Level Upgrade + Create Session aai_simulator_session https://${REPO_IP}:9993 + &{headers}= Create Dictionary Authorization=Basic YWFpOmFhaS5vbmFwLm9yZzpkZW1vMTIzNDU2IQ== Content-Type=application/json Accept=application/json verify=False + FOR ${INDEX} IN RANGE ${MAXIMUM_ATTEMPTS_BEFORE_TIMEOUT} + ${get_pnf_request}= Get Request aai_simulator_session aai/v11/network/pnfs/pnf/${pnfName1} headers=${headers} + Run Keyword If '${get_pnf_request.status_code}' == '200' log to console \nexecuted with expected result + ${get_pnf_json_response}= Evaluate json.loads(r"""${get_pnf_request.content}""", strict=False) json + Log to console ${get_pnf_json_response} + ${sw_version}= Set Variable ${get_pnf_json_response}[sw-version] + Log to console ${sw_version} + Run Keyword If '${sw_version}' == 'pnf_sw_version-4.0.0' Exit For Loop + log to console Will try again after ${SLEEP_INTERVAL_SEC} seconds + SLEEP ${SLEEP_INTERVAL_SEC}s + END + Log To Console final target software version received: ${sw_version} + Run Keyword If '${sw_version}' == 'pnf_sw_version-4.0.0' log to console \nexecuted with expected result + Should Be Equal As Strings '${sw_version}' 'pnf_sw_version-4.0.0' + +Test AAI-Update for ServiceInstance after Service Level Upgrade + ${globalSubscriberId}= Set Variable 807c7a02-249c-4db8-9fa9-bee973fe08ce + Create Session aai_simulator_session https://${REPO_IP}:9993 + &{headers}= Create Dictionary Authorization=Basic YWFpOmFhaS5vbmFwLm9yZzpkZW1vMTIzNDU2IQ== Content-Type=application/json Accept=application/json verify=False + ${get_service_request}= Get Request aai_simulator_session aai/v17/business/customers/customer/${globalSubscriberId}/service-subscriptions/service-subscription/pNF/service-instances/service-instance/${model_version_id_2} headers=${headers} + Run Keyword If '${get_service_request.status_code}' == '200' log to console \nexecuted with expected result + ${get_service_json_response}= Evaluate json.loads(r"""${get_service_request.content}""", strict=False) json + Log to console ${get_service_json_response} + ${service_instance_id}= Set Variable ${get_service_json_response}[service-instance-id] + Should Be Equal As Strings '${service_instance_id}' 'df4decf6-h727-8875-8761-89683ed43645' + ${model_version_id}= Set Variable ${get_service_json_response}[model-version-id] + Should Be Equal As Strings '${model_version_id}' '${model_version_id_2}' \ No newline at end of file -- 2.16.6