Bug 2327 fix to verify ipaddress in sol003_02 testsuite 48/14148/6 master
authorsritharan <priyadarshini@tataelxsi.co.in>
Tue, 26 Dec 2023 07:04:44 +0000 (07:04 +0000)
committergarciadeblas <gerardo.garciadeblas@telefonica.com>
Wed, 31 Jan 2024 12:04:17 +0000 (13:04 +0100)
Change-Id: I9896f70aa0bc4f62ba1b21106bcf9b8b9ed464ac
Signed-off-by: sritharan <priyadarshini@tataelxsi.co.in>
134 files changed:
.pylintrc [new file with mode: 0644]
Dockerfile
README.md
build-debpkg.sh
cloud-scripts/add-vim-and-k8scluster.sh [new file with mode: 0755]
cloud-scripts/create-k8s.sh [new file with mode: 0755]
cloud-scripts/create-osm-vm.sh [new file with mode: 0755]
cloud-scripts/delete-k8s.sh [new file with mode: 0755]
cloud-scripts/delete-osm-vm.sh [new file with mode: 0755]
cloud-scripts/remote-extract-logs.sh [new file with mode: 0755]
cloud-scripts/remote-install-osm.sh [new file with mode: 0755]
devops-stages/stage-test.sh
envconfig-local.rc
requirements-dev.txt
requirements.in
requirements.txt
robot-systest/lib/connectivity_lib.resource [new file with mode: 0644]
robot-systest/lib/connectivity_lib.robot [deleted file]
robot-systest/lib/juju_lib.resource [new file with mode: 0644]
robot-systest/lib/juju_lib.robot [deleted file]
robot-systest/lib/k8scluster_lib.resource [new file with mode: 0644]
robot-systest/lib/k8scluster_lib.robot [deleted file]
robot-systest/lib/ns_lib.resource [new file with mode: 0644]
robot-systest/lib/ns_lib.robot [deleted file]
robot-systest/lib/ns_operation_lib.resource [new file with mode: 0644]
robot-systest/lib/nsd_lib.resource [new file with mode: 0644]
robot-systest/lib/nsd_lib.robot [deleted file]
robot-systest/lib/nsi_lib.resource [new file with mode: 0644]
robot-systest/lib/nsi_lib.robot [deleted file]
robot-systest/lib/nst_lib.resource [new file with mode: 0644]
robot-systest/lib/nst_lib.robot [deleted file]
robot-systest/lib/openstack_lib.resource [new file with mode: 0644]
robot-systest/lib/openstack_lib.robot [deleted file]
robot-systest/lib/package_lib.resource [new file with mode: 0644]
robot-systest/lib/package_lib.robot [deleted file]
robot-systest/lib/project_lib.resource [new file with mode: 0644]
robot-systest/lib/project_lib.robot [deleted file]
robot-systest/lib/prometheus_lib.resource [new file with mode: 0644]
robot-systest/lib/prometheus_lib.robot [deleted file]
robot-systest/lib/repo_lib.resource [new file with mode: 0644]
robot-systest/lib/rest_lib.resource [new file with mode: 0644]
robot-systest/lib/role_lib.resource [new file with mode: 0644]
robot-systest/lib/role_lib.robot [deleted file]
robot-systest/lib/sdnc_lib.resource [new file with mode: 0644]
robot-systest/lib/sdnc_lib.robot [deleted file]
robot-systest/lib/sol003_common_lib.robot [deleted file]
robot-systest/lib/ssh_lib.resource [new file with mode: 0644]
robot-systest/lib/ssh_lib.robot [deleted file]
robot-systest/lib/user_lib.resource [new file with mode: 0644]
robot-systest/lib/user_lib.robot [deleted file]
robot-systest/lib/vim_lib.resource [new file with mode: 0644]
robot-systest/lib/vim_lib.robot [deleted file]
robot-systest/lib/vnf_lib.resource [new file with mode: 0644]
robot-systest/lib/vnf_lib.robot [deleted file]
robot-systest/lib/vnfd_lib.resource [new file with mode: 0644]
robot-systest/lib/vnfd_lib.robot [deleted file]
robot-systest/resources/basic_01-crud_operations_on_vim_targets_data.py
robot-systest/resources/basic_08-disable_port_security_network_level_data.py
robot-systest/resources/basic_32-volume_with_different_az.py [new file with mode: 0644]
robot-systest/resources/common_helpers.py [deleted file]
robot-systest/resources/epa_03-crud_operations_on_sdnc_data.py [deleted file]
robot-systest/resources/get_clouds_yaml_info.py [new file with mode: 0644]
robot-systest/resources/sa_01-vnf_with_vim_metrics_data.py [deleted file]
robot-systest/resources/sa_02-vnf_with_vim_metrics_and_autoscaling_data.py [deleted file]
robot-systest/resources/sa_07-alarms_from_sa-related_vnfs_data.py [deleted file]
robot-systest/resources/sa_08-vnf_with_vnf_indicators_snmp_data.py [deleted file]
robot-systest/resources/sol003_01-vnf_lifecycle_management.py [deleted file]
robot-systest/resources/sol003_02-dualstack_ip_vnfm.json [new file with mode: 0644]
robot-systest/run_test.sh
robot-systest/testsuite/basic_01-crud_operations_on_vim_targets.robot
robot-systest/testsuite/basic_05-instantiation_parameters_in_cloud_init.robot
robot-systest/testsuite/basic_06-vnf_with_charm.robot
robot-systest/testsuite/basic_07-secure_key_management.robot
robot-systest/testsuite/basic_08-disable_port_security_network_level.robot
robot-systest/testsuite/basic_09-manual_vdu_scaling.robot
robot-systest/testsuite/basic_11-native_charms.robot
robot-systest/testsuite/basic_12-ns_primitives.robot
robot-systest/testsuite/basic_13-ns_relations.robot
robot-systest/testsuite/basic_14-vnf_relations.robot
robot-systest/testsuite/basic_15-rbac_configurations.robot
robot-systest/testsuite/basic_16-advanced_onboarding_and_scaling.robot
robot-systest/testsuite/basic_17-delete_vnf_package.robot
robot-systest/testsuite/basic_18-ns_ip_profile.robot
robot-systest/testsuite/basic_19-vnf_ip_profile.robot
robot-systest/testsuite/basic_20-manual_native_charm_vdu_scaling.robot
robot-systest/testsuite/basic_21-support_of_volumes.robot
robot-systest/testsuite/basic_22-cross_model_relations.robot
robot-systest/testsuite/basic_23-sol004_sol007_packages.robot
robot-systest/testsuite/basic_24-affinity_groups.robot
robot-systest/testsuite/basic_25-update_charm_in_running_vnf_instance.robot
robot-systest/testsuite/basic_26-secure_helm_execution_environment.robot
robot-systest/testsuite/basic_27-update_helm_ee_in_running_vnf_instance.robot
robot-systest/testsuite/basic_28-keep_persistent_volumes.robot
robot-systest/testsuite/basic_29-vnf_ipv6_profile.robot
robot-systest/testsuite/basic_30-ns_ipv6_profile.robot
robot-systest/testsuite/basic_31-multivdu_volume_multiattach.robot
robot-systest/testsuite/basic_32-volume_with_different_az.robot [new file with mode: 0644]
robot-systest/testsuite/epa_01-epa_sriov.robot
robot-systest/testsuite/epa_02-additional_capabilities.robot
robot-systest/testsuite/epa_03-crud_operations_on_sdnc.robot
robot-systest/testsuite/epa_04-epa_underlay_sriov.robot
robot-systest/testsuite/epa_05-epa_underlay_passthrough.robot
robot-systest/testsuite/fail_01-insufficient_resources.robot
robot-systest/testsuite/hackfest_basic.robot
robot-systest/testsuite/hackfest_cloudinit.robot
robot-systest/testsuite/hackfest_multivdu.robot
robot-systest/testsuite/heal_01-volume_vdu_healing.robot
robot-systest/testsuite/heal_02-scale_vdu_healing.robot
robot-systest/testsuite/heal_03-multiple_healing.robot
robot-systest/testsuite/heal_04-autohealing.robot
robot-systest/testsuite/k8s_01-create_k8s_cluster.robot
robot-systest/testsuite/k8s_02-k8scluster_creation.robot
robot-systest/testsuite/k8s_03-simple_k8s.robot
robot-systest/testsuite/k8s_04-openldap_helm.robot
robot-systest/testsuite/k8s_05-k8s_proxy_charms.robot
robot-systest/testsuite/k8s_06-k8s_secure_key_management.robot
robot-systest/testsuite/k8s_07-dummy_helm.robot
robot-systest/testsuite/k8s_08-simple_k8s_scaling.robot
robot-systest/testsuite/k8s_09-pebble_charm_k8s.robot
robot-systest/testsuite/k8s_10-sol004_sol007_with_k8s_proxy_charms.robot
robot-systest/testsuite/k8s_11-simple_helm_k8s_scaling.robot
robot-systest/testsuite/k8s_12-openldap_helm_day-2.robot
robot-systest/testsuite/k8s_13-two_helm_kdu.robot [new file with mode: 0644]
robot-systest/testsuite/lcmop_01-cancel_operation_basic.robot [new file with mode: 0644]
robot-systest/testsuite/quotas_01-quota_enforcement.robot
robot-systest/testsuite/sa_01-vnf_with_vim_metrics.robot
robot-systest/testsuite/sa_02-vnf_with_vim_metrics_and_autoscaling.robot
robot-systest/testsuite/sa_07-alarms_from_sa-related_vnfs.robot
robot-systest/testsuite/sa_08-vnf_with_vnf_indicators_snmp.robot
robot-systest/testsuite/slice_01-network_slicing.robot
robot-systest/testsuite/slice_02-shared_network_slicing.robot
robot-systest/testsuite/sol003_01-vnf-lifecycle-management.robot
robot-systest/testsuite/sol003_02-dualstack_ip_vnfm.robot [new file with mode: 0644]
tox.ini

diff --git a/.pylintrc b/.pylintrc
new file mode 100644 (file)
index 0000000..2f082c9
--- /dev/null
+++ b/.pylintrc
@@ -0,0 +1,18 @@
+#######################################################################################
+# Copyright ETSI Contributors and Others.
+#
+# 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.
+#######################################################################################
+[MAIN]
+init-hook='import sys; sys.path.append("robot-systest/resources")'
index 9206d0c..1ce50d5 100644 (file)
@@ -43,8 +43,6 @@ RUN DEBIAN_FRONTEND=noninteractive apt-get update && \
         tox
 
 RUN DEBIAN_FRONTEND=noninteractive apt-get -y install \
-    libcurl4-openssl-dev \
-    libssl-dev \
     dh-make
 
 ENV LC_ALL C.UTF-8
index 0673b38..7be9050 100644 (file)
--- a/README.md
+++ b/README.md
@@ -17,7 +17,7 @@ limitations under the License
 
 # OSM test automation project - osm/tests
 
-This repository contains tools and configuration files for testing and automation needs of OSM projet
+This repository contains tools and configuration files for testing and automation needs of OSM project.
 
 ## Prerequisites
 
@@ -25,22 +25,17 @@ This repository contains tools and configuration files for testing and automatio
 - VIM already registered in OSM
 - K8s cluster already registered in OSM (for tests involving a K8s cluster)
 
-## Quickstart (run tests using docker)
+## Quickstart. How to run tests using OSM docker images
 
 ### Configure the environment file
 
-```
-export OSM_HOSTNAME=<OSM_IP_ADDRESS>
-export VIM_TARGET=<VIM_REGISTERED_AT_OSM>
-export VIM_MGMT_NET=<NAME_OF_THE_MGMT_NETWORK_IN_THE_VIM>
-export K8S_CREDENTIALS= # path to the kubeconfig file of the K8s cluster to be tested
-export OS_CLOUD=    # OpenStack Cloud defined in $HOME/.config/openstack/clouds.yaml or in /etc/openstack/clouds.yaml
-```
-
-### Create the docker container
+Create a file `envconfig.rc` copying from `envconfig-local.rc` and set the required variables.
 
-```bash
-docker build -f docker/Dockerfile -t osmtests .
+```
+OSM_HOSTNAME=<OSM_IP_ADDRESS>
+VIM_TARGET=<VIM_REGISTERED_AT_OSM>
+VIM_MGMT_NET=<NAME_OF_THE_MGMT_NETWORK_IN_THE_VIM>
+OS_CLOUD=<OPENSTACK_CLOUD>    # OpenStack Cloud defined in $HOME/.config/openstack/clouds.yaml or in /etc/openstack/clouds.yaml
 ```
 
 ### Run the tests
@@ -49,32 +44,41 @@ docker build -f docker/Dockerfile -t osmtests .
 docker run --rm=true --name tests -t --env-file envconfig.rc \
            -v ~/.config/openstack/clouds.yaml:/etc/openstack/clouds.yaml \
            -v ~/tests/reports:/robot-systest/reports \
-           osmtests \
-           -t sol003_01
+           opensourcemano/tests:testing-daily \
+           -t sanity
 ```
 
-You can use a different robot tag instead of `sol003_01`. The whole list of tags are gathered below in this README.
+You can use a different robot tag instead of `sanity`. The whole list of tags are gathered below in this README.
+
+## How to build docker container for tests and run tests from there
+
+### Create the docker container
+
+```bash
+docker build -f docker/Dockerfile -t osmtests .
+```
 
-## How to run sanity tests using daily images from master branch
+### Run the tests
 
 ```bash
 docker run --rm=true --name tests -t --env-file envconfig.rc \
            -v ~/.config/openstack/clouds.yaml:/etc/openstack/clouds.yaml \
            -v ~/tests/reports:/robot-systest/reports \
-           opensourcemano/tests:testing-daily \
-           -t sanity
+           osmtests \
+           -t sol003_01
 ```
 
 ## How to mount local tests folder for developing purposes
 
-The following line will mount the required files for `sol003_01` testuite and will execute that testsuite:
+The following line will mount the folder `robot-systest`, including all libraries and testuites, and will execute the testsuite `sol003_01`:
 
 ```bash
 docker run --rm=true --name tests -t --env-file envconfig.rc \
            -v ~/.config/openstack/clouds.yaml:/etc/openstack/clouds.yaml \
+           -v ~/tests/robot-systest:/robot-systest \
            -v ~/tests/reports:/robot-systest/reports \
-           -v ~/tests/robot-systest/lib/sol003_common_lib.robot:/robot-systest/lib/sol003_common_lib.robot \
-           osmtests \
+           -v ~/osm-packages:/robot-systest/osm-packages \
+           opensourcemano/tests:testing-daily \
            -t sol003_01
 ```
 
@@ -92,10 +96,11 @@ Other relevant options to run tests are:
 - `-p <package_branch>` [OPTIONAL]: OSM packages repository branch. Default: master
 - `-t <testing_tags>` [OPTIONAL]: Robot tests tags. [sanity, regression, particular_test]. Default: sanity
 
-
 ## How to run tests from a host
 
-### Installing
+In general, testing from docker images is the best way if you want to develop for OSM. However, sometimes it could be useful to run tests directly from the host.
+
+### Install dependencies
 
 This bash script can be used to setup your environment to execute the tests.
 
@@ -111,12 +116,23 @@ git clone https://osm.etsi.org/gitlab/vnf-onboarding/osm-packages.git
 
 ### Configure the environment
 
-Create a file `envfile.rc` copying from `envconfig-local.rc` and set the required variables.
+Create a file `envconfig.rc` copying from `envconfig-local.rc` and set the required variables (in this case, the use of `export` is mandatory).
+
+```
+export OSM_HOSTNAME=<OSM_IP_ADDRESS>
+export VIM_TARGET=<VIM_REGISTERED_AT_OSM>
+export VIM_MGMT_NET=<NAME_OF_THE_MGMT_NETWORK_IN_THE_VIM>
+export OS_CLOUD=<OPENSTACK_CLOUD>    # OpenStack Cloud defined in $HOME/.config/openstack/clouds.yaml or in /etc/openstack/clouds.yaml
+export K8S_CREDENTIALS= # path to the kubeconfig file of the K8s cluster to be tested
+export OCI_REGISTRY_URL= # URL of the OCI registry where helm charts used in test packages are stored. 
+export OCI_REGISTRY_USER= # User of the OCI registry
+export OCI_REGISTRY_PASSWORD= # Password of the OCI registry
+```
 
 ### Running the tests
 
 ```bash
-source envfile.rc
+source envconfig.rc
 mkdir reports
 robot -d reports -i <testing_tags> testsuite/
 ```
@@ -169,17 +185,17 @@ The following tags exist for each testsuite:
   - `cluster_relations`: `basic_11`, `basic_13`, `basic_14`
   - `cluster_epa`: `epa_01`, `epa_02`, `epa_03`, `epa_04`, `epa_05`
   - `cluster_k8s`: `k8s_01`, `k8s_02`, `k8s_03`, `k8s_04`, `k8s_05`, `k8s06`,
-    `k8s_07`, `k8s_08`, `k8s_09`, `k8s_10`, `k8s_11`, `sa_08`
+    `k8s_07`, `k8s_08`, `k8s_09`, `k8s_10`, `k8s_11`, `k8s_12`, `k8s_13`, `sa_08`
   - `cluster_k8s_charms`: `k8s_05`, `k8s_06`
   - `cluster_sa`: `sa_01`, `sa_02`, `sa_07`
   - `cluster_slices`: `slice_01`, `slice_02`
   - `cluster_heal`: `heal_01`, `heal_02`, `heal_03`, `heal_04`
-  - `cluster_sol003`: `sol003_01`
+  - `cluster_osm_rest`: `sol003_01`
 - daily: for all testsuites that will run in the daily job
 - regression: for all testsuites that should pass in the current stable branch
 - sanity: for all testsuites that should be passed by each commit in the
-  stage3 to be successfully verified by Jenkins, currently `basic_07`,
-  `basic_11`, `k8s_03`, `k8s_04`, `sa_02`, `hackfest_basic`, `hackfest_cloudinit`
+  stage3 to be successfully verified by Jenkins, currently `k8s_04`,
+  `sa_02`, `hackfest_basic`, `hackfest_cloudinit`
 
 In addition, the tag "cleanup" exists in those tests that perform
 any deletion. In that way, it can be invoked to retry the deletion if
@@ -241,5 +257,5 @@ We use [SemVer](http://semver.org/) for versioning. For the versions available,
 
 ## License
 
-This project is licensed under the Apache2 License - see the [LICENSE.md](LICENSE) file for details
+This project is licensed under the Apache2 License - see the [LICENSE](LICENSE) file for details
 
index 6214460..26441d1 100755 (executable)
@@ -15,7 +15,7 @@
 #    under the License.
 
 
-PKG_DIRECTORIES="robot-systest conformance-tests"
+PKG_DIRECTORIES="robot-systest conformance-tests cloud-scripts"
 PKG_FILES="CONTRIBUTING.md LICENSE README.md charm.sh requirements.txt"
 MDG_NAME=tests
 DEB_INSTALL=debian/osm-${MDG_NAME}.install
diff --git a/cloud-scripts/add-vim-and-k8scluster.sh b/cloud-scripts/add-vim-and-k8scluster.sh
new file mode 100755 (executable)
index 0000000..98010d5
--- /dev/null
@@ -0,0 +1,56 @@
+#!/usr/bin/env bash
+#######################################################################################
+# Copyright ETSI Contributors and Others.
+#
+# 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.
+#######################################################################################
+
+# Add VIM to OSM
+if [ "${CLOUD_TYPE}" == "azure" ]; then
+    echo "Adding VIM to OSM"
+    set +x
+    osm vim-create --name "$VIM_TARGET" --account_type "$CLOUD_TYPE" --auth_url http://www.azure.com \
+        --user "$AZURE_CLIENT_ID" --password "$AZURE_SECRET" --tenant "$AZURE_TENANT" --description "None" \
+        --config "{region_name: '$AZURE_REGION', resource_group: '$RESOURCE_GROUP',
+                subscription_id: '$AZURE_SUBSCRIPTION_ID', vnet_name: '$VNET_NAME',
+                flavors_pattern: '$AZURE_FLAVORS_PATTERN'}"
+    sleep 10
+    osm vim-show "$VIM_TARGET"
+elif [ "${CLOUD_TYPE}" == "gcp" ]; then
+    echo "CLOUD_TYPE '${CLOUD_TYPE}' still not supported"
+    exit
+else
+    echo "CLOUD_TYPE '${CLOUD_TYPE}' not valid"
+    exit
+fi
+
+# Add SDN controller to OSM
+if [ -n "$SDNC_TYPE" ] && [ -n "$SDNC_USER" ]  && [ -n "$SDNC_URL" ]; then
+    echo "Adding $SDNC_TYPE SDN controller to OSM"
+    set +x
+    osm sdnc-create --name sdnc --user "$SDNC_USER" --password "$SDNC_PASSWORD" --url "$SDNC_URL" --type "$SDNC_TYPE"
+    sleep 3
+    osm sdnc-list
+    # TO-DO: add port-mapping file to VIM
+    # osm vim-update "$VIM_TARGET" --sdn_controller sdnc --sdn_port_mapping port-mapping-etsi-vim.yaml
+fi
+
+# Add K8s cluster to OSM
+if [ -n "$K8S_CREDENTIALS" ] && [ -n "$VIM_TARGET" ]  && [ -n "$K8S_IMAGE_NAME" ]; then
+    echo "Adding K8s cluster to OSM"
+    osm k8scluster-add --creds $K8S_CREDENTIALS --version v1 --vim $VIM_TARGET \
+        --k8s-nets "{'net1': '$VIM_MGMT_NET'}" $K8S_IMAGE_NAME --description "Robot cluster"
+    sleep 20
+    osm k8scluster-show $K8S_IMAGE_NAME
+fi
diff --git a/cloud-scripts/create-k8s.sh b/cloud-scripts/create-k8s.sh
new file mode 100755 (executable)
index 0000000..2fcaf40
--- /dev/null
@@ -0,0 +1,297 @@
+#!/usr/bin/env bash
+#######################################################################################
+# Copyright ETSI Contributors and Others.
+#
+# 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.
+#######################################################################################
+
+# Create a new VM for installing a k8s cluster and its NSG on Azure. SSH key pair ~/.ssh/id_rsa and ~/.ssh/id_rsa.pub must exist.
+# To do this it reads the following environment variables:
+# - K8S_IMAGE_NAME: name of the new VM
+# - RESOURCE_GROUP: name of the resource-group where the VM will be created
+# - VNET_NAME: name of the virtual network when creating a new one or referencing an existing one
+# - VIM_MGMT_NET: name or ID of the subnet to which the VM will be connected
+# - SOURCE_IMAGE_NAME: name of operating system image used (e.g. "Canonical:0001-com-ubuntu-server-jammy:22_04-lts:latest")
+# - K8S_FLAVOR_NAME: the VM size to be created (e.g. "Standard_A2_v2")
+# - PRIORITY: "Low", "Regular" or Spot"
+function create_azure_vm {
+    set -eux
+    az vm create --resource-group "${RESOURCE_GROUP}" --name "${K8S_IMAGE_NAME}" --image "${SOURCE_IMAGE_NAME}" --size "${K8S_FLAVOR_NAME}" --vnet-name "${VNET_NAME}" --subnet "${VIM_MGMT_NET}" --public-ip-address "" --admin-username ubuntu --priority "${PRIORITY}"
+    export K8S_IP=$(az vm show -d -g "${RESOURCE_GROUP}" -n "${K8S_IMAGE_NAME}" --query privateIps | tr -d \")
+    # Add a security group rule
+    INTERFACE_ID=$(az vm show --resource-group ${RESOURCE_GROUP} --name ${K8S_IMAGE_NAME} --query networkProfile.networkInterfaces[0].id)
+    INTERFACE_ID=${INTERFACE_ID:1:-1}
+    SECURITY_GROUP_ID=$(az network nic show --id ${INTERFACE_ID} --query networkSecurityGroup.id)
+    SECURITY_GROUP_ID=${SECURITY_GROUP_ID:1:-1}
+    SECURITY_GROUP_NAME=$(az resource show --ids ${SECURITY_GROUP_ID} --query name)
+    SECURITY_GROUP_NAME=${SECURITY_GROUP_NAME:1:-1}
+    az network nsg rule create -n microk8s --nsg-name ${SECURITY_GROUP_NAME} --priority 2000 -g ${RESOURCE_GROUP}  --description "Microk8s port" --protocol TCP --destination-port-ranges 16443
+}
+
+# Create a new VM for installing a k8s cluster on GCP. SSH key pair ~/.ssh/id_rsa and ~/.ssh/id_rsa.pub must exist.
+# To do this it reads the following environment variables:
+# - K8S_IMAGE_NAME: name of the new VM
+# - GCP_PROJECT: name of project where the VM will be allocated
+# - GCP_ZONE: name of the zone (e.g. "europe-west1-b")
+# - VIM_MGMT_NET: name or ID of the subnet to which the VM will be connected
+# - GCP_MACHINE_TYPE: machine type used for the instance (e.g. "e2-standard-4", run 'gcloud compute machine-types list')
+# - GCP_IMAGE_PROJECT: the Google Cloud project against which all image and image family references will be resolved (e.g. "ubuntu-os-cloud")
+# - GCP_IMAGE_FAMILY: the image family for the operating system that the boot disk will be initialized with (e.g. "ubuntu-2204-lts")
+# - GCP_DISK_SIZE: disk size ib GB
+function create_gcp_vm {
+    gcloud compute instances create "${K8S_IMAGE_NAME}" --project="${GCP_PROJECT}" --zone="${GCP_ZONE}" --machine-type="${GCP_MACHINE_TYPE}" \
+    --network-interface=network-tier=PREMIUM,subnet=${VIM_MGMT_NET} --maintenance-policy=MIGRATE \
+    --image-family=${GCP_IMAGE_FAMILY} --image-project=${GCP_IMAGE_PROJECT} --metadata-from-file=ssh-keys=${HOME}/.ssh/id_rsa.pub \
+    --create-disk=auto-delete=yes,boot=yes,image-family=${GCP_IMAGE_FAMILY},image-project=${GCP_IMAGE_PROJECT},device-name=${K8S_IMAGE_NAME},mode=rw,size=${GCP_DISK_SIZE} -q
+}
+
+# Install via SSH a microk8s cluster on a VM. Writes a kubeconfig.yaml file in $ROBOT_REPORT_FOLDER path.
+# To do this it reads the following environment variables:
+# - K8S_IP: IP address of the target machine
+function install_remote_microk8s {
+    set +e
+    ssh -T -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null ubuntu@"${K8S_IP}" 'sudo apt-get update -y && sudo apt-get upgrade -y && sudo reboot'
+    sleep 90
+    ssh -T -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null ubuntu@${K8S_IP} << EOF 2>&1
+set -eux
+sudo snap install yq
+sudo snap install microk8s --classic
+sudo usermod -a -G microk8s ubuntu
+newgrp microk8s
+sudo microk8s.status --wait-ready
+sudo microk8s.enable storage dns
+set +eux
+EOF
+
+    # Enable MetalLB
+    ssh -T -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null ubuntu@${K8S_IP} << 'EOF' 2>&1
+set -eux
+PRIVATE_IP=$(hostname -I | awk '{print $1}')
+echo ${PRIVATE_IP}
+sudo microk8s.enable metallb:${PRIVATE_IP}-${PRIVATE_IP}
+EOF
+
+    # Update the certificate to allow connections from outside as well
+    ssh -T -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null ubuntu@${K8S_IP} << EOF 2>&1
+set -aux
+sudo sed -i "s/\#MOREIPS/IP.3 = ${K8S_IP}/g" /var/snap/microk8s/current/certs/csr.conf.template
+cat /var/snap/microk8s/current/certs/csr.conf.template
+EOF
+
+    # Save the credentials
+    echo ================================================================
+    echo K8s cluster credentials:
+    echo ================================================================
+    echo
+    ssh -T -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null ubuntu@${K8S_IP} \
+'sudo microk8s.config' | sed  "s/server: .*/server: https:\/\/${K8S_IP}:16443/g" \
+| tee ${ROBOT_REPORT_FOLDER}/kubeconfig.yaml
+}
+
+# Create an AKS cluster with one node on Azure using a new subnet. Writes a kubeconfig.yaml file in $ROBOT_REPORT_FOLDER path.
+# Required the following environment variables:
+# - K8S_IMAGE_NAME: name of the AKS cluster to be created
+# - RESOURCE_GROUP: name of the resource-group where the VM will be created
+# - VNET_NAME: name of the virtual network when creating a new one or referencing an existing one
+# - K8S_FLAVOR_NAME: the VM size to be created (e.g. "Standard_D4as_v4")
+# IMPORTANT: required a vnet at least /16 because the it's created a new subnet with a random third byte
+function create_azure_aks {
+    # Gets first subnet prefix and creates a new one with random number in third byte
+    set -eux
+    SUBNET_PREFIX=$(az network vnet show --resource-group "${RESOURCE_GROUP}" --name "${VNET_NAME}" --query subnets[0].addressPrefix -o tsv)
+    IFS=. read BYTE1 BYTE2 BYTE3 BYTE4 <<< "$SUBNET_PREFIX"
+    IFS=/ read BYTE4 MASK <<< "$BYTE4"
+    if [ "$MASK" -ge "24" ]; then
+        BYTE3=$((100 + ($RANDOM % 50) * 2))
+        PREFIX="$BYTE1.$BYTE2.${BYTE3}.$BYTE4/$MASK"
+        SUBNET_NAME="aks-${BYTE3}"
+        BYTE3=$((BYTE3 + 1))
+        CIDR="$BYTE1.$BYTE2.${BYTE3}.$BYTE4/$MASK"
+        DNS_IP="$BYTE1.$BYTE2.${BYTE3}.10"
+        # Verifies that new subnet does not exist previously
+        az network vnet subnet show --resource-group "${RESOURCE_GROUP}" --vnet-name "${VNET_NAME}" --name "$SUBNET_NAME" -o table
+        if [ "$?" -ne 0 ]; then
+            # Creates the subnet in $VNET_NAME network
+            az network vnet subnet create --resource-group "${RESOURCE_GROUP}" --vnet-name "${VNET_NAME}" --name "$SUBNET_NAME" --address-prefixes "${PREFIX}"
+            if [ "$?" -eq 0 ]; then
+                SUBNET_ID=$(az network vnet subnet show --resource-group OSM-CTIO --vnet-name "${VNET_NAME}" --name "${SUBNET_NAME}" --query id -o tsv)
+
+                # Creates k8s cluster
+                az aks create -y --resource-group "${RESOURCE_GROUP}" --name "${K8S_IMAGE_NAME}" --node-count 1 --node-vm-size "${K8S_FLAVOR_NAME}" --dns-service-ip "${DNS_IP}" --network-plugin kubenet --service-cidr "${CIDR}" --vnet-subnet-id "${SUBNET_ID}"
+                az aks get-credentials --resource-group "${RESOURCE_GROUP}" --name "${K8S_IMAGE_NAME}" --admin -f ${ROBOT_REPORT_FOLDER}/kubeconfig.yaml
+            fi
+        fi
+    fi
+}
+
+# Create a GKE cluster with one node on GCP. Writes a kubeconfig.yaml file in $ROBOT_REPORT_FOLDER path.
+# Required the following environment variables:
+# - K8S_IMAGE_NAME: name of the GKE cluster to be created
+# - GCP_PROJECT: name of project where the cluster will be allocated
+# - GCP_ZONE: name of the zone (e.g. "europe-west1-b")
+# - GCP_MACHINE_TYPE: machine type used for the instance (e.g. "e2-standard-4", run 'gcloud compute machine-types list')
+# - GCP_DISK_SIZE: disk size ib GB
+function create_gcp_gke {
+    gcloud container clusters create "${K8S_IMAGE_NAME}" --project="${GCP_PROJECT}" --zone="${GCP_ZONE}" --num-nodes=1 --machine-type="${GCP_MACHINE_TYPE}" --disk-size "${GCP_DISK_SIZE}" --enable-ip-alias --image-type "COS_CONTAINERD"
+}
+
+# Get kubeconfig.yaml from a GKE cluster on GCP. Writes a kubeconfig.yaml file in $ROBOT_REPORT_FOLDER path.
+function get_gke_kubeconfig {
+    set -eu -o pipefail
+    FILE=${ROBOT_REPORT_FOLDER}/kubeconfig.yaml
+    SA=osm-sa
+    NAMESPACE=osm
+    echo "Creating the Kubernetes Service Account with minimal RBAC permissions."
+    kubectl apply -f - <<EOF
+apiVersion: v1
+kind: Namespace
+metadata:
+  name: ${NAMESPACE}
+---
+apiVersion: v1
+kind: ServiceAccount
+metadata:
+  name: ${SA}
+  namespace: ${NAMESPACE}
+---
+apiVersion: rbac.authorization.k8s.io/v1
+kind: ClusterRole
+metadata:
+  name: osm-role
+rules:
+- apiGroups:
+  - ""
+  resources:
+  - users
+  - groups
+  - serviceaccounts
+  verbs:
+  - impersonate
+- apiGroups:
+  - ""
+  resources:
+  - pods
+  verbs:
+  - get
+- apiGroups:
+  - "authorization.k8s.io"
+  resources:
+  - selfsubjectaccessreviews
+  - selfsubjectrulesreviews
+  verbs:
+  - create
+---
+apiVersion: rbac.authorization.k8s.io/v1
+kind: ClusterRoleBinding
+metadata:
+  name: osm-crb
+roleRef:
+  apiGroup: rbac.authorization.k8s.io
+  kind: ClusterRole
+  name: cluster-admin
+subjects:
+- kind: ServiceAccount
+  name: ${SA}
+  namespace: ${NAMESPACE}
+EOF
+
+    # Get the service account token and CA cert.
+    SA_SECRET_NAME=$(kubectl get -n ${NAMESPACE} sa/${SA} -o "jsonpath={.secrets[0]..name}")
+    # Note: service account token is stored base64-encoded in the secret but must
+    # be plaintext in kubeconfig.
+    SA_TOKEN=$(kubectl get -n ${NAMESPACE} secrets/${SA_SECRET_NAME} -o "jsonpath={.data['token']}" | base64 ${BASE64_DECODE_FLAG})
+    CA_CERT=$(kubectl get -n ${NAMESPACE} secrets/${SA_SECRET_NAME} -o "jsonpath={.data['ca\.crt']}")
+
+    # Extract cluster IP from the current context
+    CURRENT_CONTEXT=$(kubectl config current-context)
+    CURRENT_CLUSTER=$(kubectl config view -o jsonpath="{.contexts[?(@.name == \"${CURRENT_CONTEXT}\"})].context.cluster}")
+    CURRENT_CLUSTER_ADDR=$(kubectl config view -o jsonpath="{.clusters[?(@.name == \"${CURRENT_CLUSTER}\"})].cluster.server}")
+
+    echo "Writing $FILE"
+    cat > $FILE <<EOF
+apiVersion: v1
+clusters:
+- cluster:
+    certificate-authority-data: ${CA_CERT}
+    server: ${CURRENT_CLUSTER_ADDR}
+  name: ${CURRENT_CLUSTER}
+contexts:
+- context:
+    cluster: ${CURRENT_CLUSTER}
+    user: ${CURRENT_CLUSTER}-${SA}
+  name: ${CURRENT_CONTEXT}
+current-context: ${CURRENT_CONTEXT}
+kind: Config
+preferences: {}
+users:
+- name: ${CURRENT_CLUSTER}-${SA}
+  user:
+    token: ${SA_TOKEN}
+EOF
+
+    echo "Done!"
+}
+
+# Name of the new VM for K8s (adds a timestamp)
+export K8S_IMAGE_NAME=k8stest$(date '+%Y%m%d%H%M')
+
+# Default USE_PAAS_K8S is "FALSE"
+if [ -z "${USE_PAAS_K8S}" ]; then
+    USE_PAAS_K8S="FALSE"
+fi
+
+# Log new environment variables
+mkdir -p ${ROBOT_REPORT_FOLDER}
+cat <<EOF > ${ROBOT_REPORT_FOLDER}/k8s_environment.rc
+export CLOUD_TYPE="${CLOUD_TYPE}"
+export USE_PAAS_K8S="${USE_PAAS_K8S}"
+EOF
+
+# Branch by USE_PAAS_K8S and CLOUD_TYPE values
+if [ "${USE_PAAS_K8S}" == "FALSE" ]; then
+    echo "Creating a new IaaS k8s cluster in ${CLOUD_TYPE}"
+    if [ "${CLOUD_TYPE}" == "azure" ]; then
+        # Create VM on Azure
+        create_azure_vm
+    elif [ "${CLOUD_TYPE}" == "gcp" ]; then
+        # Create VM on GCP
+        create_gcp_vm
+    else
+        echo "CLOUD_TYPE '${CLOUD_TYPE}' not valid for IaaS"
+        exit
+    fi
+    # Add environment variables
+    echo "export K8S_IP=\"${K8S_IP}\"" >> ${ROBOT_REPORT_FOLDER}/k8s_environment.rc
+    echo "export K8S_IMAGE_NAME=\"${K8S_IMAGE_NAME}\"" >> ${ROBOT_REPORT_FOLDER}/k8s_environment.rc
+
+    # MicroK8s installation
+    install_remote_microk8s
+else
+    echo "Creating a new PaaS k8s cluster in ${CLOUD_TYPE}"
+    if [ "${CLOUD_TYPE}" == "azure" ]; then
+       create_azure_aks
+        echo "export K8S_IMAGE_NAME=\"${K8S_IMAGE_NAME}\"" >> ${ROBOT_REPORT_FOLDER}/k8s_environment.rc
+    elif [ "${CLOUD_TYPE}" == "gcp" ]; then
+       create_gcp_gke
+       get_gke_kubeconfig
+        echo "export K8S_IMAGE_NAME=\"${K8S_IMAGE_NAME}\"" >> ${ROBOT_REPORT_FOLDER}/k8s_environment.rc
+    else
+        echo "CLOUD_TYPE '${CLOUD_TYPE}' not valid for PaaS"
+    fi
+fi
+
+# Add K8S_CREDENTIALS environment variable
+echo "export K8S_CREDENTIALS=${ROBOT_REPORT_FOLDER}/kubeconfig.yaml" >> ${ROBOT_REPORT_FOLDER}/k8s_environment.rc
+echo File with new environment was created at ${ROBOT_REPORT_FOLDER}/k8s_environment.rc
+
diff --git a/cloud-scripts/create-osm-vm.sh b/cloud-scripts/create-osm-vm.sh
new file mode 100755 (executable)
index 0000000..454cb06
--- /dev/null
@@ -0,0 +1,71 @@
+#!/usr/bin/env bash
+#######################################################################################
+# Copyright ETSI Contributors and Others.
+#
+# 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.
+#######################################################################################
+
+# Create a new VM for installing OSM and its NSG on Azure. SSH key pair files ~/.ssh/id_rsa
+# and ~/.ssh/id_rsa.pub must exist. The NEW_OSM_IP variable is set with IP address.
+# To do this it reads the following environment variables:
+# - OSM_IMAGE_NAME: name of the new VM
+# - RESOURCE_GROUP: name of the resource-group where the VM will be created
+# - VNET_NAME: name of the virtual network when creating a new one or referencing an existing one
+# - VIM_MGMT_NET: name or ID of the subnet to which the VM will be connected
+# - SOURCE_IMAGE_NAME: name of operating system image used (e.g. "Canonical:0001-com-ubuntu-server-jammy:22_04-lts:latest")
+# - FLAVOR_NAME: the VM size to be created (e.g. "Standard_D4as_v4")
+# - PRIORITY: "Low", "Regular" or Spot"
+function create_azure_vm {
+    # Create the VM in resource-group
+    set -eux
+    az vm create --resource-group "${RESOURCE_GROUP}" --name "${OSM_IMAGE_NAME}" --image "${SOURCE_IMAGE_NAME}" --size "${FLAVOR_NAME}" --vnet-name "${VNET_NAME}" --subnet "${VIM_MGMT_NET}" --public-ip-address "" --admin-username ubuntu --priority "${PRIORITY}" --os-disk-size-gb 64
+    export NEW_OSM_IP=$(az vm show -d -g "${RESOURCE_GROUP}" -n "${OSM_IMAGE_NAME}" --query privateIps | tr -d \")
+
+    # Add a security group rule
+    INTERFACE_ID=$(az vm show --resource-group ${RESOURCE_GROUP} --name ${OSM_IMAGE_NAME} --query networkProfile.networkInterfaces[0].id)
+    INTERFACE_ID=${INTERFACE_ID:1:-1}
+    SECURITY_GROUP_ID=$(az network nic show --id ${INTERFACE_ID} --query networkSecurityGroup.id)
+    SECURITY_GROUP_ID=${SECURITY_GROUP_ID:1:-1}
+    SECURITY_GROUP_NAME=$(az resource show --ids ${SECURITY_GROUP_ID} --query name)
+    SECURITY_GROUP_NAME=${SECURITY_GROUP_NAME:1:-1}
+    az network nsg rule create -n osm --nsg-name ${SECURITY_GROUP_NAME} --priority 2000 -g ${RESOURCE_GROUP}  --description "NBI and Prometheus ports" --protocol TCP --destination-port-ranges 9999 9091
+}
+
+if [ -n "${1:-}" ]; then  # If there is an argument, it must be the hostname
+    export OSM_IMAGE_NAME=$1
+else
+    export OSM_IMAGE_NAME=osmtest$(date '+%Y%m%d%H%M')
+fi
+
+# Branch by CLOUD_TYPE value ("azure", "gcp")
+if [ "${CLOUD_TYPE}" == "azure" ]; then
+    # Azure VIM
+    create_azure_vm
+elif [ "${CLOUD_TYPE}" == "gcp" ]; then
+    # Google Cloud VIM
+    export OSM_IMAGE_NAME=$(echo $OSM_IMAGE_NAME | sed "s/_/-/g")
+    echo "CLOUD_TYPE '${CLOUD_TYPE}' still not supported"
+    exit
+else
+    echo "Invalid cloud type: ${CLOUD_TYPE}"
+fi
+
+# Log new environment variables
+mkdir -p ${ROBOT_REPORT_FOLDER}
+cat <<EOF > ${ROBOT_REPORT_FOLDER}/osm_environment.rc
+export CLOUD_TYPE="${CLOUD_TYPE}"
+export OSM_HOSTNAME="${NEW_OSM_IP}"
+export OSM_IMAGE_NAME="${OSM_IMAGE_NAME}"
+EOF
+echo File with new environment was created at ${ROBOT_REPORT_FOLDER}/osm_environment.rc
diff --git a/cloud-scripts/delete-k8s.sh b/cloud-scripts/delete-k8s.sh
new file mode 100755 (executable)
index 0000000..99f0153
--- /dev/null
@@ -0,0 +1,106 @@
+#!/usr/bin/env bash
+#######################################################################################
+# Copyright ETSI Contributors and Others.
+#
+# 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.
+#######################################################################################
+
+# Delete a VM and its resources (nic, disk, nsg, public IP) on Azure.
+# To do this it reads the following environment variables:
+# - K8S_NAME: name of the VM
+# - RESOURCE_GROUP: name of the resource-group where the VM is
+function delete_azure_vm {
+    set -eux
+    INTERFACE_ID=$(az vm show --resource-group ${RESOURCE_GROUP} --name ${K8S_NAME} --query networkProfile.networkInterfaces[0].id)
+    INTERFACE_ID=${INTERFACE_ID:1:-1}
+    OS_DISK_ID=$(az vm show --resource-group ${RESOURCE_GROUP} --name ${K8S_NAME} --query storageProfile.osDisk.managedDisk.id)
+    OS_DISK_ID=${OS_DISK_ID:1:-1}
+    SECURITY_GROUP_ID=$(az network nic show --id ${INTERFACE_ID} --query networkSecurityGroup.id)
+    SECURITY_GROUP_ID=${SECURITY_GROUP_ID:1:-1}
+    PUBLIC_IP_ID=$(az network nic show --id ${INTERFACE_ID} --query ipConfigurations[0].publicIpAddress.id)
+    PUBLIC_IP_ID=${PUBLIC_IP_ID:1:-1}
+    az vm delete --resource-group ${RESOURCE_GROUP} --name ${K8S_NAME} --yes
+    az network nic delete --id ${INTERFACE_ID}
+    az disk delete --id ${OS_DISK_ID} --yes
+    az network nsg delete --id ${SECURITY_GROUP_ID}
+    if [ -n "${PUBLIC_IP_ID}" ]; then
+        az network public-ip delete --id ${PUBLIC_IP_ID}
+    fi
+}
+
+# Delete an existing AKS cluster and its subnet.
+# Required the following environment variables:
+# - K8S_NAME: name of the AKS
+# - RESOURCE_GROUP: name of the resource-group where the AKS was created
+function delete_azure_aks {
+    SUBNET_ID=$(az aks show --resource-group "${RESOURCE_GROUP}" --name ${K8S_NAME} --query agentPoolProfiles[].vnetSubnetId -o tsv)
+    az aks delete -y --resource-group "${RESOURCE_GROUP}" --name "${K8S_NAME}"
+    az network vnet subnet delete --ids "${SUBNET_ID}"
+}
+
+# Delete a VM on GCP.
+# To do this it reads the following environment variables:
+# - K8S_NAME: name of the VM
+# - GCP_PROJECT: name of project where the VM is
+# - GCP_ZONE: name of the zone
+function delete_gcp_vm {
+    gcloud compute instances delete "${K8S_NAME}" --project="${GCP_PROJECT}" --zone="${GCP_ZONE}" --delete-disks all -q
+}
+
+# Delete an existing GKE cluster.
+# Required the following environment variables:
+# - K8S_NAME: name of the AKS
+# - GCP_PROJECT: name of project where the VM is
+# - GCP_ZONE: name of the zone
+function delete_gcp_gke {
+   gcloud container clusters delete "${K8S_NAME}" --project="${GCP_PROJECT}" --zone="${GCP_ZONE}" -q
+}
+
+# If there is an argument, it must be the cluster name
+if [ -n "${1:-}" ]; then
+    K8S_NAME=$1
+else
+    K8S_NAME="${K8S_IMAGE_NAME}"
+fi
+# Default USE_PAAS_K8S is "FALSE"
+if [ -z "${USE_PAAS_K8S}" ]; then
+    USE_PAAS_K8S="FALSE"
+fi
+# Branch by USE_PAAS_K8S and CLOUD_TYPE values
+if [ "${USE_PAAS_K8S}" == "FALSE" ]; then
+    # Deletes k8s cluster in a cloud's VM
+    echo "Deleting IaaS k8s cluster in ${CLOUD_TYPE}"
+    if [ "${CLOUD_TYPE}" == "azure" ]; then
+        # Azure VIM
+       delete_azure_vm
+    elif [ "${CLOUD_TYPE}" == "gcp" ]; then
+        # GCP VIM
+       delete_gcp_vm
+    else
+        echo "Invalid cloud type: ${CLOUD_TYPE}"
+    fi
+else
+    # Deletes k8s cluster as PaaS in cloud
+    if [ "${CLOUD_TYPE}" == "azure" ]; then
+        echo "Deleting PaaS k8s cluster in Azure"
+       delete_azure_aks
+    elif [ "${CLOUD_TYPE}" == "gcp" ]; then
+        echo "Deleting PaaS k8s cluster in GCP"
+       delete_gcp_gke
+    else
+        echo "Invalid cloud type: ${CLOUD_TYPE}"
+    fi
+
+fi
+
diff --git a/cloud-scripts/delete-osm-vm.sh b/cloud-scripts/delete-osm-vm.sh
new file mode 100755 (executable)
index 0000000..5328cbe
--- /dev/null
@@ -0,0 +1,66 @@
+#!/usr/bin/env bash
+#######################################################################################
+# Copyright ETSI Contributors and Others.
+#
+# 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.
+#######################################################################################
+
+# Delete a VM and its resources (nic, disk, nsg, public IP) on Azure.
+# To do this it reads the following environment variables:
+# - VM_NAME: name of the VM
+# - RESOURCE_GROUP: name of the resource-group where the VM is
+function delete_azure_vm {
+    set -eux
+    INTERFACE_ID=$(az vm show --resource-group ${RESOURCE_GROUP} --name ${VM_NAME} --query networkProfile.networkInterfaces[0].id)
+    INTERFACE_ID=${INTERFACE_ID:1:-1}
+    OS_DISK_ID=$(az vm show --resource-group ${RESOURCE_GROUP} --name ${VM_NAME} --query storageProfile.osDisk.managedDisk.id)
+    OS_DISK_ID=${OS_DISK_ID:1:-1}
+    SECURITY_GROUP_ID=$(az network nic show --id ${INTERFACE_ID} --query networkSecurityGroup.id)
+    SECURITY_GROUP_ID=${SECURITY_GROUP_ID:1:-1}
+    PUBLIC_IP_ID=$(az network nic show --id ${INTERFACE_ID} --query ipConfigurations[0].publicIpAddress.id)
+    PUBLIC_IP_ID=${PUBLIC_IP_ID:1:-1}
+    az vm delete --resource-group ${RESOURCE_GROUP} --name ${VM_NAME} --yes
+    az network nic delete --id ${INTERFACE_ID}
+    az disk delete --id ${OS_DISK_ID} --yes
+    az network nsg delete --id ${SECURITY_GROUP_ID}
+    if [ -n "${PUBLIC_IP_ID}" ]; then
+        az network public-ip delete --id ${PUBLIC_IP_ID}
+    fi
+}
+
+# Delete a VM on GCP.
+# To do this it reads the following environment variables:
+# - VM_NAME: name of the VM
+# - GCP_PROJECT: name of project where the VM is
+# - GCP_ZONE: name of the zone
+function delete_gcp_vm {
+    gcloud compute instances delete "${VM_NAME}" --project="${GCP_PROJECT}" --zone="${GCP_ZONE}" --delete-disks all -q
+}
+
+if [ -n "${1:-}" ]; then  # If there is an argument, it must be the hostname
+    VM_NAME=$1
+else
+    VM_NAME="${OSM_IMAGE_NAME}"
+fi
+
+# Branch by CLOUD_TYPE value ("azure", "gcp")
+if [ "${CLOUD_TYPE}" == "azure" ]; then
+    # Azure VIM
+    delete_azure_vm
+elif [ "${CLOUD_TYPE}" == "gcp" ]; then
+    # GCP VIM
+    delete_gcp_vm
+else
+    echo "Invalid cloud type: ${CLOUD_TYPE}"
+fi
diff --git a/cloud-scripts/remote-extract-logs.sh b/cloud-scripts/remote-extract-logs.sh
new file mode 100755 (executable)
index 0000000..b304826
--- /dev/null
@@ -0,0 +1,39 @@
+#!/usr/bin/env bash
+#######################################################################################
+# Copyright ETSI Contributors and Others.
+#
+# 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.
+#######################################################################################
+
+set -e
+
+# Extracts logs from "deployments"
+for MODULE in 'grafana' 'keystone' 'lcm' 'mon' 'nbi' 'pol' 'ro' 'ngui' 'airflow-scheduler' 'pushgateway-prometheus-pushgateway' 'webhook-translator'
+do
+    echo Saving ${MODULE} logs...
+    ssh -T -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null ubuntu@${OSM_HOSTNAME} \
+    'kubectl -n osm logs deployment/"'${MODULE}'" --all-containers=true 2>&1 | cat' > "${ROBOT_REPORT_FOLDER}"/"osm-deploy-${MODULE}".log
+done
+
+# Extracts logs from "statefulsets"
+for MODULE in 'kafka' 'mongo' 'mysql' 'prometheus' 'zookeeper' 'alertmanager'
+do
+    echo Saving ${MODULE} logs...
+    ssh -T -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null ubuntu@${OSM_HOSTNAME} \
+    'kubectl -n osm logs statefulset/"'${MODULE}'" --all-containers=true 2>&1 | cat' > "${ROBOT_REPORT_FOLDER}"/"osm-sts-${MODULE}".log
+done
+
+echo
+echo All logs saved to ${ROBOT_REPORT_FOLDER}/
+
diff --git a/cloud-scripts/remote-install-osm.sh b/cloud-scripts/remote-install-osm.sh
new file mode 100755 (executable)
index 0000000..1b91020
--- /dev/null
@@ -0,0 +1,54 @@
+#!/usr/bin/env bash
+#######################################################################################
+# Copyright ETSI Contributors and Others.
+#
+# 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.
+#######################################################################################
+
+ssh -T -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null ubuntu@"${OSM_HOSTNAME}" \
+'sudo apt-get update -y && sudo apt-get upgrade -y && sudo reboot'
+
+sleep 90
+
+# OSM installation
+INSTALLER_PARAMETERS="-R ${REPO_BASE} -t ${DOCKER_TAG} -r ${REPO_NAME} -y"
+echo "INSTALLER_URL: $INSTALLER_URL"
+echo "INSTALLER_PARAMETERS: $INSTALLER_PARAMETERS"
+ssh -T -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null ubuntu@${OSM_HOSTNAME} << EOF 2>&1
+set -eux
+wget "${INSTALLER_URL}"
+chmod +x install_osm.sh
+./install_osm.sh  ${INSTALLER_PARAMETERS} 2>&1 | tee osm_install_log.txt
+set +eux
+EOF
+
+# # Installs additional tools for telemetry
+# set +eux
+# ssh -T -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null ubuntu@${OSM_HOSTNAME} 'sudo apt-get install -y sysstat'
+# set -eux
+
+# Gets Juju password from LCM env file
+set +eux
+JUJU_PWD=$(ssh -T -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null ubuntu@${OSM_HOSTNAME} 'kubectl -n osm exec -ti deploy/lcm -- env | grep OSMLCM_VCA_SECRET | cut -d = -f 2')
+set -eux
+
+# Updates environment variables and logs them
+export JUJU_PASSWORD="${JUJU_PWD}"
+
+# Logs new/updated environment variables
+cat <<EOF >> ${ROBOT_REPORT_FOLDER}/osm_environment.rc
+export JUJU_PASSWORD="${JUJU_PWD}"
+EOF
+
+echo Environment was updated at ${ROBOT_REPORT_FOLDER}/osm_environment.rc
index 335f9de..4be5aaa 100755 (executable)
@@ -12,8 +12,6 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-# python3 -m rflint testsuites
-
 check_tabs () {
     folder="$1"
     tabs="y"
index a1bbf62..02cc023 100644 (file)
@@ -38,3 +38,7 @@ export SDNC_PASSWORD=
 export SDNC_TYPE=
 export SDNC_URL=
 
+# OCI registry variables required for tests that uses OCI artifacts
+export OCI_REGISTRY_URL=
+export OCI_REGISTRY_USER=
+export OCI_REGISTRY_PASSWORD=
\ No newline at end of file
index 79195cd..7b585e0 100644 (file)
 # See the License for the specific language governing permissions and
 # limitations under the License.
 #######################################################################################
-certifi==2023.5.7
+certifi==2023.7.22
     # via
     #   -r https://osm.etsi.org/gitweb/?p=osm/osmclient.git;a=blob_plain;f=requirements.txt;hb=master
     #   requests
-charset-normalizer==3.1.0
+charset-normalizer==3.2.0
     # via
     #   -r https://osm.etsi.org/gitweb/?p=osm/osmclient.git;a=blob_plain;f=requirements.txt;hb=master
     #   requests
-click==8.1.3
+click==8.1.7
     # via -r https://osm.etsi.org/gitweb/?p=osm/osmclient.git;a=blob_plain;f=requirements.txt;hb=master
 idna==3.4
     # via
@@ -30,7 +30,9 @@ idna==3.4
     #   requests
 jinja2==3.1.2
     # via -r https://osm.etsi.org/gitweb/?p=osm/osmclient.git;a=blob_plain;f=requirements.txt;hb=master
-markupsafe==2.1.2
+jsonpath-ng==1.6.0
+    # via -r https://osm.etsi.org/gitweb/?p=osm/osmclient.git;a=blob_plain;f=requirements.txt;hb=master
+markupsafe==2.1.3
     # via
     #   -r https://osm.etsi.org/gitweb/?p=osm/osmclient.git;a=blob_plain;f=requirements.txt;hb=master
     #   jinja2
@@ -38,17 +40,19 @@ osmclient @ git+https://osm.etsi.org/gerrit/osm/osmclient.git@master
     # via -r requirements-dev.in
 packaging==23.1
     # via -r https://osm.etsi.org/gitweb/?p=osm/osmclient.git;a=blob_plain;f=requirements.txt;hb=master
-prettytable==3.7.0
-    # via -r https://osm.etsi.org/gitweb/?p=osm/osmclient.git;a=blob_plain;f=requirements.txt;hb=master
-pycurl==7.45.2
+ply==3.11
+    # via
+    #   -r https://osm.etsi.org/gitweb/?p=osm/osmclient.git;a=blob_plain;f=requirements.txt;hb=master
+    #   jsonpath-ng
+prettytable==3.9.0
     # via -r https://osm.etsi.org/gitweb/?p=osm/osmclient.git;a=blob_plain;f=requirements.txt;hb=master
 python-magic==0.4.27
     # via -r https://osm.etsi.org/gitweb/?p=osm/osmclient.git;a=blob_plain;f=requirements.txt;hb=master
-pyyaml==5.4.1
+pyyaml==6.0.1
     # via -r https://osm.etsi.org/gitweb/?p=osm/osmclient.git;a=blob_plain;f=requirements.txt;hb=master
-requests==2.30.0
+requests==2.31.0
     # via -r https://osm.etsi.org/gitweb/?p=osm/osmclient.git;a=blob_plain;f=requirements.txt;hb=master
-urllib3==2.0.2
+urllib3==2.0.5
     # via
     #   -r https://osm.etsi.org/gitweb/?p=osm/osmclient.git;a=blob_plain;f=requirements.txt;hb=master
     #   requests
index 9dbfc17..1c47f66 100644 (file)
 # limitations under the License.
 ##
 bitarray
-charm-tools
 haikunator
 pyangbind
 python-openstackclient
-pyyaml<6
+pyyaml>6
 regex
 requests
 robotframework
index 0e1f6c1..060326f 100644 (file)
 #######################################################################################
 appdirs==1.4.4
     # via openstacksdk
-argcomplete==3.0.8
+argcomplete==3.1.2
     # via yq
-async-generator==1.10
-    # via trio
 attrs==23.1.0
     # via
     #   cmd2
     #   jsonschema
     #   outcome
+    #   referencing
     #   trio
 autopage==0.5.1
     # via cliff
 bcrypt==4.0.1
     # via paramiko
-bitarray==2.7.3
-    # via
-    #   -r requirements.in
-    #   pyangbind
-blessings==1.7
-    # via charm-tools
-certifi==2023.5.7
+bitarray==2.8.1
+    # via -r requirements.in
+certifi==2023.7.22
     # via
     #   requests
     #   selenium
@@ -44,25 +39,19 @@ cffi==1.15.1
     # via
     #   cryptography
     #   pynacl
-charm-tools==3.0.6
-    # via -r requirements.in
-charset-normalizer==3.1.0
+charset-normalizer==3.2.0
     # via requests
-cheetah3==3.2.6.post1
-    # via charm-tools
 cliff==4.3.0
     # via
     #   osc-lib
     #   python-openstackclient
 cmd2==2.4.3
     # via cliff
-colander==1.8.3
-    # via charm-tools
-cryptography==40.0.2
+cryptography==41.0.4
     # via
     #   openstacksdk
     #   paramiko
-    #   secretstorage
+    #   python-openstackclient
 debtcollector==2.5.0
     # via
     #   oslo-config
@@ -71,23 +60,16 @@ debtcollector==2.5.0
 decorator==5.1.1
     # via
     #   dogpile-cache
-    #   jsonpath-ng
     #   jsonpath-rw
     #   openstacksdk
-dict2colander==0.2
-    # via charm-tools
-distlib==0.3.6
-    # via virtualenv
-dogpile-cache==1.2.0
+dogpile-cache==1.2.2
     # via openstacksdk
 enum34==1.1.10
     # via pyangbind
-exceptiongroup==1.1.1
+exceptiongroup==1.1.3
     # via
     #   trio
     #   trio-websocket
-filelock==3.12.0
-    # via virtualenv
 h11==0.14.0
     # via wsproto
 haikunator==2.1.0
@@ -96,61 +78,47 @@ idna==3.4
     # via
     #   requests
     #   trio
-importlib-metadata==6.6.0
-    # via
-    #   cliff
-    #   keyring
-iso8601==1.1.0
+importlib-metadata==6.8.0
+    # via cliff
+iso8601==2.0.0
     # via
-    #   colander
     #   keystoneauth1
     #   openstacksdk
     #   oslo-utils
     #   python-novaclient
     #   python-openstackclient
-jaraco-classes==3.2.3
-    # via keyring
-jeepney==0.8.0
-    # via
-    #   keyring
-    #   secretstorage
 jmespath==1.0.1
     # via openstacksdk
-jsonpatch==1.32
+jsonpatch==1.33
     # via openstacksdk
-jsonpath-ng==1.5.3
+jsonpath-ng==1.6.0
     # via robotframework-jsonlibrary
 jsonpath-rw==1.4.0
     # via jsonpath-rw-ext
 jsonpath-rw-ext==1.2.2
     # via robotframework-jsonvalidator
-jsonpointer==2.3
+jsonpointer==2.4
     # via jsonpatch
-jsonschema==4.17.3
+jsonschema==4.19.1
     # via
-    #   charm-tools
     #   robotframework-jsonlibrary
     #   robotframework-jsonvalidator
-jujubundlelib==0.5.7
-    # via charm-tools
-keyring==23.13.1
-    # via charm-tools
-keystoneauth1==5.1.2
+jsonschema-specifications==2023.7.1
+    # via jsonschema
+keystoneauth1==5.3.0
     # via
     #   openstacksdk
     #   osc-lib
     #   python-cinderclient
     #   python-keystoneclient
     #   python-novaclient
-lxml==4.9.2
+lxml==4.9.3
     # via
     #   pyang
     #   pyangbind
-more-itertools==9.1.0
-    # via jaraco-classes
-msgpack==1.0.5
+msgpack==1.0.7
     # via oslo-serialization
-netaddr==0.8.0
+netaddr==0.9.0
     # via
     #   oslo-config
     #   oslo-utils
@@ -160,7 +128,7 @@ netifaces==0.11.0
     #   oslo-utils
 objectpath==0.6.1
     # via robotframework-jsonvalidator
-openstacksdk==1.1.0
+openstacksdk==1.5.0
     # via
     #   osc-lib
     #   python-openstackclient
@@ -168,11 +136,11 @@ os-service-types==1.7.0
     # via
     #   keystoneauth1
     #   openstacksdk
-osc-lib==2.8.0
+osc-lib==2.8.1
     # via python-openstackclient
-oslo-config==9.1.1
+oslo-config==9.2.0
     # via python-keystoneclient
-oslo-i18n==6.0.0
+oslo-i18n==6.1.0
     # via
     #   osc-lib
     #   oslo-config
@@ -181,11 +149,11 @@ oslo-i18n==6.0.0
     #   python-keystoneclient
     #   python-novaclient
     #   python-openstackclient
-oslo-serialization==5.1.1
+oslo-serialization==5.2.0
     # via
     #   python-keystoneclient
     #   python-novaclient
-oslo-utils==6.1.0
+oslo-utils==6.2.1
     # via
     #   osc-lib
     #   oslo-serialization
@@ -193,26 +161,16 @@ oslo-utils==6.1.0
     #   python-keystoneclient
     #   python-novaclient
     #   python-openstackclient
-otherstuf==1.1.0
-    # via charm-tools
 outcome==1.2.0
     # via trio
 packaging==23.1
     # via
     #   oslo-utils
     #   python-keystoneclient
-paramiko==3.1.0
+paramiko==3.3.1
     # via
     #   robotframework-sshlibrary
     #   scp
-parse==1.19.0
-    # via stuf
-path==16.6.0
-    # via path-py
-path-py==12.5.0
-    # via charm-tools
-pathspec==0.10.3
-    # via charm-tools
 pbr==5.11.1
     # via
     #   jsonpath-rw-ext
@@ -227,20 +185,18 @@ pbr==5.11.1
     #   python-novaclient
     #   python-openstackclient
     #   stevedore
-platformdirs==3.5.0
-    # via virtualenv
 ply==3.11
     # via
     #   jsonpath-ng
     #   jsonpath-rw
-prettytable==3.7.0
+prettytable==3.9.0
     # via
     #   cliff
     #   python-cinderclient
     #   python-novaclient
 pyang==2.5.3
     # via pyangbind
-pyangbind==0.8.1
+pyangbind==0.8.3.post1
     # via -r requirements.in
 pycparser==2.21
     # via cffi
@@ -248,44 +204,43 @@ pyjsonselect==0.2.2
     # via robotframework-jsonvalidator
 pynacl==1.5.0
     # via paramiko
-pyparsing==3.0.9
+pyparsing==3.1.1
     # via oslo-utils
 pyperclip==1.8.2
     # via cmd2
-pyrsistent==0.19.3
-    # via jsonschema
 pysocks==1.7.1
     # via urllib3
-python-cinderclient==9.3.0
+python-cinderclient==9.4.0
     # via python-openstackclient
-python-keystoneclient==5.1.0
+python-keystoneclient==5.2.0
     # via python-openstackclient
-python-novaclient==18.3.0
+python-novaclient==18.4.0
     # via python-openstackclient
-python-openstackclient==6.2.0
+python-openstackclient==6.3.0
     # via -r requirements.in
-pytz==2023.3
+pytz==2023.3.post1
     # via
     #   oslo-serialization
     #   oslo-utils
-pyyaml==5.4.1
+pyyaml==6.0.1
     # via
     #   -r requirements.in
-    #   charm-tools
     #   cliff
-    #   jujubundlelib
     #   openstacksdk
     #   oslo-config
     #   robotframework-yamllibrary
     #   yq
-regex==2023.5.5
+referencing==0.30.2
+    # via
+    #   jsonschema
+    #   jsonschema-specifications
+regex==2023.8.8
     # via
     #   -r requirements.in
     #   pyangbind
-requests==2.30.0
+requests==2.31.0
     # via
     #   -r requirements.in
-    #   charm-tools
     #   keystoneauth1
     #   oslo-config
     #   python-cinderclient
@@ -293,11 +248,9 @@ requests==2.30.0
     #   robotframework-requests
 requestsexceptions==1.4.0
     # via openstacksdk
-requirements-parser==0.5.0
-    # via charm-tools
 rfc3986==2.0.0
     # via oslo-config
-robotframework==6.0.2
+robotframework==6.1.1
     # via
     #   -r requirements.in
     #   robotframework-jsonlibrary
@@ -309,43 +262,36 @@ robotframework-jsonlibrary==0.5
     # via -r requirements.in
 robotframework-jsonvalidator==2.0.0
     # via -r requirements.in
-robotframework-pythonlibcore==4.1.2
+robotframework-pythonlibcore==4.2.0
     # via robotframework-seleniumlibrary
-robotframework-requests==0.9.4
+robotframework-requests==0.9.5
     # via -r requirements.in
-robotframework-seleniumlibrary==6.1.0
+robotframework-seleniumlibrary==6.1.2
     # via -r requirements.in
 robotframework-sshlibrary==3.8.0
     # via -r requirements.in
 robotframework-yamllibrary==0.2.8
     # via -r requirements.in
-ruamel-yaml==0.17.26
-    # via charm-tools
-ruamel-yaml-clib==0.2.7
-    # via ruamel-yaml
+rpds-py==0.10.3
+    # via
+    #   jsonschema
+    #   referencing
 scp==0.14.5
     # via robotframework-sshlibrary
-secretstorage==3.3.3
-    # via
-    #   charm-tools
-    #   keyring
-selenium==4.9.1
+selenium==4.13.0
     # via robotframework-seleniumlibrary
 simplejson==3.19.1
     # via osc-lib
 six==1.16.0
     # via
-    #   blessings
-    #   jsonpath-ng
     #   jsonpath-rw
-    #   keystoneauth1
     #   pyangbind
     #   python-keystoneclient
 sniffio==1.3.0
     # via trio
 sortedcontainers==2.4.0
     # via trio
-stevedore==5.0.0
+stevedore==5.1.0
     # via
     #   cliff
     #   dogpile-cache
@@ -356,30 +302,26 @@ stevedore==5.0.0
     #   python-keystoneclient
     #   python-novaclient
     #   python-openstackclient
-stuf==0.9.16
-    # via otherstuf
-tomlkit==0.11.8
+tomlkit==0.12.1
     # via yq
-translationstring==1.4
-    # via colander
-trio==0.22.0
+trio==0.22.2
     # via
     #   selenium
     #   trio-websocket
-trio-websocket==0.10.2
+trio-websocket==0.11.1
     # via selenium
-types-setuptools==67.7.0.2
-    # via requirements-parser
-urllib3[socks]==2.0.2
+typing-extensions==4.8.0
+    # via dogpile-cache
+tzdata==2023.3
+    # via
+    #   oslo-serialization
+    #   oslo-utils
+urllib3[socks]==2.0.5
     # via
     #   requests
     #   selenium
 verboselogs==1.7
     # via -r requirements.in
-vergit==1.0.2
-    # via charm-tools
-virtualenv==20.23.0
-    # via charm-tools
 wcwidth==0.2.6
     # via
     #   cmd2
@@ -390,11 +332,7 @@ wsproto==1.2.0
     # via trio-websocket
 xmltodict==0.13.0
     # via yq
-yq==3.2.2
+yq==3.2.3
     # via -r requirements.in
-zipp==3.15.0
+zipp==3.17.0
     # via importlib-metadata
-
-# The following packages are considered to be unsafe in a requirements file:
-# pip
-# setuptools
diff --git a/robot-systest/lib/connectivity_lib.resource b/robot-systest/lib/connectivity_lib.resource
new file mode 100644 (file)
index 0000000..e91aedd
--- /dev/null
@@ -0,0 +1,41 @@
+*** Comments ***
+#   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.
+
+
+*** Settings ***
+Documentation   Library providing keywords for testing connectivity to hosts via ping.
+Library   OperatingSystem
+
+
+*** Variables ***
+${SUCCESS_RETURN_CODE}   0
+${CONNECTIVITY_POL_TIME}   5sec
+${CONNECTIVITY_MAX_WAIT_TIME}   30sec
+
+
+*** Keywords ***
+Test Ping Host
+    [Documentation]   Run Ping
+    ...               Parameters:
+    ...                  host: IP or name of the host
+    ...               Execution example:
+    ...                  Ping Test   \${host}
+    [Arguments]   ${host}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   ping -c 2 -W 1 ${host}
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+
+Test Connectivity
+    [Documentation]   Ping a host several times during ${CONNECTIVITY_MAX_WAIT_TIME} until it succeeds or raises a timeout.
+    [Arguments]   ${host}
+    Wait Until Keyword Succeeds   ${CONNECTIVITY_MAX_WAIT_TIME}   ${CONNECTIVITY_POL_TIME}   Test Ping Host   ${host}
diff --git a/robot-systest/lib/connectivity_lib.robot b/robot-systest/lib/connectivity_lib.robot
deleted file mode 100644 (file)
index 79381e4..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-#   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.
-
-*** Variables ***
-${success_return_code}   0
-${connectivity_pol_time}   5sec
-${connectivity_max_wait_time}   30sec
-
-*** Keywords ***
-Test Ping Host
-    [Documentation]   Run Ping
-    ...               Parameters:
-    ...                  host: IP or name of the host
-    ...               Execution example:
-    ...                  Ping Test   \${host}
-
-    [Arguments]   ${host}
-
-    ${rc}   ${stdout}=   Run and Return RC and Output   ping -c 2 -W 1 ${host}
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-
-Test Connectivity
-    [Arguments]   ${host}
-
-    WAIT UNTIL KEYWORD SUCCEEDS   ${connectivity_max_wait_time}   ${connectivity_pol_time}   Test Ping Host   ${host}
diff --git a/robot-systest/lib/juju_lib.resource b/robot-systest/lib/juju_lib.resource
new file mode 100644 (file)
index 0000000..3d02901
--- /dev/null
@@ -0,0 +1,76 @@
+*** Comments ***
+#   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.
+
+
+*** Settings ***
+Documentation   Library providing keywords to read objects from Juju using juju client.
+Library   String
+Resource   ssh_lib.resource
+
+
+*** Variables ***
+${SUCCESS_RETURN_CODE}   0
+
+
+*** Keywords ***
+Get Scale Number
+    [Documentation]   Get from Juju the number of units (scale) of a juju application and return it.
+    [Arguments]   ${endpoint}   ${username}   ${password}   ${privatekey}   ${application_name}   ${model_name}
+    Should Not Be Empty   ${application_name}   ${model_name}
+    ${host}=   Remove String Using Regexp   ${endpoint}   :([0-9]+)$
+    ${stdout}=   Execute Remote Command Check Rc Return Output   ${host}   ${username}   ${password}   ${privatekey}   juju show-status ${application_name} --format yaml -m ${model_name} | grep scale | awk -F ': ' '{print $2}'
+    Log   ${stdout}
+    RETURN   ${stdout}
+
+Get Model Name
+    [Documentation]   Get from Juju the model from a KDU name and a NS id.
+    [Arguments]   ${endpoint}   ${username}   ${password}   ${privatekey}   ${ns_id}   ${kdu_name}
+    Should Not Be Empty   ${ns_id}   ${kdu_name}
+    ${host}=   Remove String Using Regexp   ${endpoint}   :([0-9]+)$
+    ${stdout}=   Execute Remote Command Check Rc Return Output   ${host}   ${username}   ${password}   ${privatekey}   juju models | grep -i ${kdu_name} | grep -i ${ns_id} | cut -f1 -d " "
+    Log   ${stdout}
+    ${model_name}=   Set Variable   ${kdu_name}-${ns_id}
+    Should Be Equal As Strings   ${model_name}   ${stdout}
+    RETURN   ${stdout}
+
+Get Application Name VDU Level Charm
+    [Documentation]   Get from Juju the application name matching a model and a VDU profile id passed as arguments. The application name must contain the EE passed as argument.
+    [Arguments]   ${endpoint}   ${username}   ${password}   ${privatekey}   ${model_name}   ${vdu_profile_id}   ${ee_name}
+    Should Not Be Empty   ${model_name}
+    ${host}=   Remove String Using Regexp   ${endpoint}   :([0-9]+)$
+    ${stdout}=   Execute Remote Command Check Rc Return Output   ${host}   ${username}   ${password}   ${privatekey}   juju status -m ${model_name} | grep "\\-vdu" | grep -v "*" | grep -i ${vdu_profile_id} | cut -f1 -d " "
+    Log   ${stdout}
+    Should Not Be Empty   ${stdout}
+    Should Contain   ${stdout}   ${ee_name}
+    RETURN   ${stdout}
+
+Get Application Name NS Level Charm
+    [Documentation]   Get from Juju the application name matching a model and a NS charm passed as arguments.
+    [Arguments]   ${endpoint}   ${username}   ${password}   ${privatekey}   ${model_name}   ${charm_name}
+    Should Not Be Empty   ${model_name}
+    ${host}=   Remove String Using Regexp   ${endpoint}   :([0-9]+)$
+    ${stdout}=   Execute Remote Command Check Rc Return Output   ${host}   ${username}   ${password}   ${privatekey}   juju status -m ${model_name} | grep "\\-ns" | grep -v "*" | grep -i ${charm_name} | cut -f1 -d " "
+    Log   ${stdout}
+    Should Not Be Empty   ${stdout}
+    RETURN   ${stdout}
+
+Get Application Name VNF Level Charm
+    [Documentation]   Get from Juju the application name matching a model and a VNF profile id passed as arguments. The application name must contain the EE passed as argument.
+    [Arguments]   ${endpoint}   ${username}   ${password}   ${privatekey}   ${model_name}   ${vnf_profile_id}   ${ee_name}
+    Should Not Be Empty   ${model_name}
+    ${host}=   Remove String Using Regexp   ${endpoint}   :([0-9]+)$
+    ${stdout}=   Execute Remote Command Check Rc Return Output   ${host}   ${username}   ${password}   ${privatekey}   juju status -m ${model_name} | grep "\\-vnf" | grep -v "*" | grep -i ${vnf_profile_id} | cut -f1 -d " "
+    Log   ${stdout}
+    Should Not Be Empty   ${stdout}
+    Should Contain   ${stdout}   ${ee_name}
+    RETURN   ${stdout}
diff --git a/robot-systest/lib/juju_lib.robot b/robot-systest/lib/juju_lib.robot
deleted file mode 100644 (file)
index 45208a8..0000000
+++ /dev/null
@@ -1,68 +0,0 @@
-#   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.
-
-*** Variables ***
-${success_return_code}   0
-
-
-*** Keywords ***
-Get Scale Number
-    [Arguments]   ${endpoint}   ${username}   ${password}   ${privatekey}   ${application_name}   ${model_name}
-
-    Should Not Be Empty   ${application_name}   ${model_name}
-    ${host}=   Remove String Using Regexp   ${endpoint}   :([0-9]+)$
-    ${stdout}=   Execute Remote Command Check Rc Return Output   ${host}   ${username}   ${password}   ${privatekey}   juju show-status ${application_name} --format yaml -m ${model_name} | grep scale | awk -F ': ' '{print $2}'
-    Log   ${stdout}
-    [Return]   ${stdout}
-
-Get Model Name
-    [Arguments]   ${endpoint}   ${username}   ${password}   ${privatekey}   ${ns_id}   ${kdu_name}
-
-    Should Not Be Empty   ${ns_id}   ${kdu_name}
-    ${host}=   Remove String Using Regexp   ${endpoint}   :([0-9]+)$
-    ${stdout}=   Execute Remote Command Check Rc Return Output   ${host}   ${username}   ${password}   ${privatekey}   juju models | grep -i ${kdu_name} | grep -i ${ns_id} | cut -f1 -d " "
-    Log   ${stdout}
-    ${model_name}=   Set Variable   ${kdu_name}-${ns_id}
-    Should Be Equal As Strings   ${model_name}   ${stdout}
-    [Return]   ${stdout}
-
-Get Application Name VDU Level Charm
-    [Arguments]   ${endpoint}   ${username}   ${password}   ${privatekey}   ${model_name}   ${vdu_profile_id}   ${ee_name}
-
-    Should Not Be Empty   ${model_name}
-    ${host}=   Remove String Using Regexp   ${endpoint}   :([0-9]+)$
-    ${stdout}=   Execute Remote Command Check Rc Return Output   ${host}   ${username}   ${password}   ${privatekey}   juju status -m ${model_name} | grep "\\-vdu" | grep -v "*" | grep -i ${vdu_profile_id} | cut -f1 -d " "
-    Log   ${stdout}
-    Should Not Be Empty   ${stdout}
-    Should Contain   ${stdout}   ${ee_name}
-    [Return]   ${stdout}
-
-Get Application Name NS Level Charm
-    [Arguments]   ${endpoint}   ${username}   ${password}   ${privatekey}   ${model_name}   ${charm_name}
-
-    Should Not Be Empty   ${model_name}
-    ${host}=   Remove String Using Regexp   ${endpoint}   :([0-9]+)$
-    ${stdout}=   Execute Remote Command Check Rc Return Output   ${host}   ${username}   ${password}   ${privatekey}   juju status -m ${model_name} | grep "\\-ns" | grep -v "*" | grep -i ${charm_name} | cut -f1 -d " "
-    Log   ${stdout}
-    Should Not Be Empty   ${stdout}
-    [Return]   ${stdout}
-
-Get Application Name VNF Level Charm
-    [Arguments]   ${endpoint}   ${username}   ${password}   ${privatekey}   ${model_name}   ${vnf_profile_id}   ${ee_name}
-
-    Should Not Be Empty   ${model_name}
-    ${host}=   Remove String Using Regexp   ${endpoint}   :([0-9]+)$
-    ${stdout}=   Execute Remote Command Check Rc Return Output   ${host}   ${username}   ${password}   ${privatekey}   juju status -m ${model_name} | grep "\\-vnf" | grep -v "*" | grep -i ${vnf_profile_id} | cut -f1 -d " "
-    Log   ${stdout}
-    Should Not Be Empty   ${stdout}
-    Should Contain   ${stdout}   ${ee_name}
-    [Return]   ${stdout}
\ No newline at end of file
diff --git a/robot-systest/lib/k8scluster_lib.resource b/robot-systest/lib/k8scluster_lib.resource
new file mode 100644 (file)
index 0000000..dc94046
--- /dev/null
@@ -0,0 +1,89 @@
+*** Comments ***
+# Copyright 2020 Canonical Ltd.
+#
+#   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.
+
+
+*** Settings ***
+Documentation   Library providing keywords for CRUD operations over Kubernetes clusters with OSM client.
+Library   OperatingSystem
+
+
+*** Variables ***
+${SUCCESS_RETURN_CODE}   0
+${K8SCLUSTER_LAUNCH_MAX_WAIT_TIME}   6min
+${K8SCLUSTER_LAUNCH_POL_TIME}   30sec
+${K8SCLUSTER_DELETE_MAX_WAIT_TIME}   2min
+${K8SCLUSTER_DELETE_POL_TIME}   15sec
+
+
+*** Keywords ***
+Create K8s Cluster
+    [Documentation]   Register a Kubernetes cluster in OSM using the name, version and credentials passed as arguments.
+    [Arguments]   ${k8scluster_creds}   ${k8scluster_version}   ${k8scluster_vim}   ${k8scluster_net}   ${k8scluster_name}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm k8scluster-add --creds ${k8scluster_creds} --version ${k8scluster_version} --vim ${k8scluster_vim} --k8s-nets '{"net1": "${k8scluster_net}"}' ${k8scluster_name} --description "Robot cluster"
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    Wait Until Keyword Succeeds   ${K8SCLUSTER_LAUNCH_MAX_WAIT_TIME}   ${K8SCLUSTER_LAUNCH_POL_TIME}   Check For K8s Cluster To Be Ready   ${k8scluster_name}
+    RETURN   ${stdout}
+
+Delete K8s Cluster
+    [Documentation]   Unregister/delete a Kubernetes cluster from OSM.
+    [Arguments]   ${k8scluster_name}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm k8scluster-delete ${k8scluster_name}
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    Wait Until Keyword Succeeds   ${K8SCLUSTER_DELETE_MAX_WAIT_TIME}   ${K8SCLUSTER_DELETE_POL_TIME}   Check For K8s Cluster To Be Deleted   ${k8scluster_name}
+
+Get K8s Cluster
+    [Documentation]   Get the list of Kubernetes clusters in OSM, and return it.
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm k8scluster-list
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    Log   ${stdout}
+    RETURN   ${stdout}
+
+Check For K8s Cluster
+    [Documentation]   Check if a Kubernetes cluster identified by name exists in OSM, and return it.
+    [Arguments]   ${k8scluster_name}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm k8scluster-list --filter name="${k8scluster_name}"
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    RETURN   ${stdout}
+
+Check For K8s Cluster To Be Deleted
+    [Documentation]   Check if a Kubernetes cluster identified by name is not present in OSM.
+    [Arguments]   ${k8scluster_name}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm k8scluster-list --filter name="${k8scluster_name}" | awk '{print $2}' | grep ${k8scluster_name}
+    Log   ${rc},${stdout}
+    Should Be Empty   ${stdout}
+
+Check For K8s Cluster To Be Ready
+    [Documentation]   Check if a Kubernetes cluster registered in OSM is ready (the state must be ENABLED or DEGRADED).
+    [Arguments]   ${k8scluster_name}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm k8scluster-list --filter name="${k8scluster_name}" --filter _admin.operationalState="ENABLED,DEGRADED"
+    Log   ${rc},${stdout}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   echo "${stdout}" | awk '{print $2}' | grep ${k8scluster_name}
+    Log   ${rc},${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    Should Be Equal As Strings   ${stdout}   ${k8scluster_name}
+
+Check For K8s Cluster To Be Enabled
+    [Documentation]   Check if the state of Kubernetes cluster registered in OSM is ENABLED.
+    [Arguments]   ${k8scluster_name}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm k8scluster-show ${k8scluster_name}
+    Log   ${rc},${stdout}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm k8scluster-list --filter name="${k8scluster_name}" --filter _admin.operationalState="ENABLED"
+    Log   ${rc},${stdout}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   echo "${stdout}" | awk '{print $2}' | grep ${k8scluster_name}
+    Log   ${rc},${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    Should Be Equal As Strings   ${stdout}   ${k8scluster_name}
diff --git a/robot-systest/lib/k8scluster_lib.robot b/robot-systest/lib/k8scluster_lib.robot
deleted file mode 100644 (file)
index 8f642a3..0000000
+++ /dev/null
@@ -1,71 +0,0 @@
-# Copyright 2020 Canonical Ltd.
-#
-#   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.
-
-*** Variables ***
-${success_return_code}   0
-${k8scluster_launch_max_wait_time}   6min
-${k8scluster_launch_pol_time}   30sec
-${k8scluster_delete_max_wait_time}   2min
-${k8scluster_delete_pol_time}   15sec
-
-*** Keywords ***
-Create K8s Cluster
-    [Arguments]   ${k8scluster_creds}   ${k8scluster_version}   ${k8scluster_vim}   ${k8scluster_net}   ${k8scluster_name}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm k8scluster-add --creds ${k8scluster_creds} --version ${k8scluster_version} --vim ${k8scluster_vim} --k8s-nets '{"net1": "${k8scluster_net}"}' ${k8scluster_name} --description "Robot cluster"
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    WAIT UNTIL KEYWORD SUCCEEDS   ${k8scluster_launch_max_wait_time}   ${k8scluster_launch_pol_time}   Check For K8s Cluster To Be Ready   ${k8scluster_name}
-    Check For K8s Cluster To Be Enabled   ${k8scluster_name}
-    [Return]   ${stdout}
-
-Delete K8s Cluster
-    [Arguments]   ${k8scluster_name}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm k8scluster-delete ${k8scluster_name}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    WAIT UNTIL KEYWORD SUCCEEDS   ${k8scluster_delete_max_wait_time}   ${k8scluster_delete_pol_time}   Check For K8s Cluster To Be Deleted   ${k8scluster_name}
-
-Get K8s Cluster
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm k8scluster-list
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    Log   ${stdout}
-    [Return]   ${stdout}
-
-Check for K8s Cluster
-    [Arguments]   ${k8scluster_name}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm k8scluster-list --filter name="${k8scluster_name}"
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    [Return]   ${stdout}
-
-Check For K8s Cluster To Be Deleted
-    [Arguments]   ${k8scluster_name}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm k8scluster-list --filter name="${k8scluster_name}" | awk '{print $2}' | grep ${k8scluster_name}
-    Should Be Empty   ${stdout}
-
-Check For K8s Cluster To Be Ready
-    [Arguments]   ${k8scluster_name}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm k8scluster-list --filter name="${k8scluster_name}" --filter _admin.operationalState="ENABLED,DEGRADED"
-    Log   ${stdout}
-    ${rc}   ${stdout}=   Run and Return RC and Output   echo "${stdout}" | awk '{print $2}' | grep ${k8scluster_name}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    Should Be Equal As Strings   ${stdout}   ${k8scluster_name}
-
-Check For K8s Cluster To Be Enabled
-    [Arguments]   ${k8scluster_name}
-    ${rc2}   ${stdout2}=   Run and Return RC and Output   osm k8scluster-show ${k8scluster_name}
-    Log   ${stdout2}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm k8scluster-list --filter name="${k8scluster_name}" --filter _admin.operationalState="ENABLED"
-    Log   ${stdout}
-    ${rc}   ${stdout}=   Run and Return RC and Output   echo "${stdout}" | awk '{print $2}' | grep ${k8scluster_name}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    Should Be Equal As Strings   ${stdout}   ${k8scluster_name}
diff --git a/robot-systest/lib/ns_lib.resource b/robot-systest/lib/ns_lib.resource
new file mode 100644 (file)
index 0000000..ab763e1
--- /dev/null
@@ -0,0 +1,229 @@
+*** Comments ***
+#   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.
+
+
+*** Settings ***
+Documentation   Library to deploy and delete NS, and run operations on them.
+
+Library   Collections
+Library   DateTime
+Library   OperatingSystem
+Library   String
+
+
+*** Variables ***
+${SUCCESS_RETURN_CODE}   0
+${NS_LAUNCH_POL_TIME}   30sec
+${NS_DELETE_POL_TIME}   15sec
+${VIM_TIMEOUT_MULTIPLIER}   %{OSM_VIM_MULTIPLIER_TIMEOUT=1.0}
+
+
+*** Keywords ***
+Create Network Service
+    [Documentation]   Launch the instantation of a NS and verify in a loop that the NS instance is successfully created in a given time, and return the NS instance id.
+    [Arguments]   ${nsd}   ${vim_name}   ${ns_name}   ${ns_config}   ${publickey}   ${ns_launch_max_wait_time}=5min   ${config_file}=${EMPTY}
+    ${ns_launch_max_wait_time}=   Convert Time   ${ns_launch_max_wait_time}   result_format=number
+    ${ns_launch_max_wait_time}=   Evaluate   ${ns_launch_max_wait_time} * ${VIM_TIMEOUT_MULTIPLIER}
+    Log   ${ns_launch_max_wait_time}
+    ${config_attr}=   Set Variable If   '${ns_config}'!='${EMPTY}'   --config '${ns_config}'   ${EMPTY}
+    ${sshkeys_attr}=   Set Variable If   '${publickey}'!='${EMPTY}'   --ssh_keys ${publickey}   ${EMPTY}
+    ${config_file_attr}=   Set Variable If   '${config_file}'!='${EMPTY}'   --config_file '${config_file}'   ${EMPTY}
+    ${ns_id}=   Instantiate Network Service   ${ns_name}   ${nsd}   ${vim_name}   ${config_attr} ${sshkeys_attr} ${config_file_attr}
+    Log   ${ns_id}
+    Wait Until Keyword Succeeds   ${ns_launch_max_wait_time}   ${NS_LAUNCH_POL_TIME}   Check For NS Instance To Configured   ${ns_name}
+    Check For NS Instance For Failure   ${ns_name}
+    RETURN   ${ns_id}
+
+Instantiate Network Service
+    [Documentation]   Launch the instantation of a NS, and return the NS instance id.
+    [Arguments]   ${ns_name}   ${nsd}   ${vim_name}   ${ns_extra_args}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm ns-create --ns_name ${ns_name} --nsd_name ${nsd} --vim_account ${vim_name} ${ns_extra_args}
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    RETURN   ${stdout}
+
+Get Vnf Management Ip Address
+    [Documentation]   Get the mgmt IP address of a member VNF in a NS instance, and return it.
+    [Arguments]   ${ns_id}   ${vnf_member_index}
+    Should Not Be Empty   ${ns_id}
+    Should Not Be Empty   ${vnf_member_index}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm vnf-list --filter member-vnf-index-ref=${vnf_member_index} | grep ${ns_id} | awk '{print $14}' 2>&1
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    RETURN   ${stdout}
+
+Get Vnf Id
+    [Documentation]   Get the VNF instance ID of a member VNF in a NS instance, and return it.
+    [Arguments]   ${ns_id}   ${vnf_member_index}
+    Should Not Be Empty   ${ns_id}
+    Should Not Be Empty   ${vnf_member_index}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm vnf-list --filter member-vnf-index-ref=${vnf_member_index} | grep ${ns_id} | awk '{print $2}' 2>&1
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    RETURN   ${stdout}
+
+Get Ns Id
+    [Documentation]   Get the NS instance ID from a NS instance name passed as argument, and return it.
+    [Arguments]   ${ns_name}
+    Should Not Be Empty   ${ns_name}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm ns-list | grep ${ns_name} | awk '{print $4}' 2>&1
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    Should Not Be Empty   ${stdout}
+    RETURN   ${stdout}
+
+Get Ns List
+    [Documentation]   Get the list of NS instances and return it.
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm ns-list 2>&1
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    RETURN   ${stdout}
+
+Get Ns Vnf List
+    [Documentation]   Get the list of VNF instances of a given NS instance id, and return it.
+    [Arguments]   ${ns_id}
+    Should Not Be Empty   ${ns_id}
+    @{vnf_list_string}=   Run And Return Rc And Output   osm vnf-list --ns ${ns_id} | grep ${ns_id} | awk '{print $2}' 2>&1
+    # Returns a String of vnf_id and needs to be converted into a list
+    @{vnf_list}=   Split String   ${vnf_list_string}[1]
+    Log List   ${vnf_list}
+    RETURN   @{vnf_list}
+
+Get Ns Ip List
+    [Documentation]   Obtain the list of IP addresses of all VM in a NS, and return it.
+    [Arguments]   @{vnf_list}
+    Should Not Be Empty   @{vnf_list}
+    @{temp_list}=   Create List
+    FOR   ${vnf_id}   IN   @{vnf_list}
+        Log   ${vnf_id}
+        @{vnf_ip_list}=   Get Vnf Ip List   ${vnf_id}
+        @{temp_list}=   Combine Lists   ${temp_list}   ${vnf_ip_list}
+    END
+    Should Not Be Empty   ${temp_list}
+    RETURN   @{temp_list}
+
+Get Vnf Ip List
+    [Documentation]   Obtain the list of IP addresses of all VM in a VNF, and return it.
+    [Arguments]   ${vnf_id}
+    Should Not Be Empty   ${vnf_id}
+    @{vnf_ip_list_string}=   Run And Return Rc And Output   osm vnf-list --filter id=${vnf_id} | grep -o '[0-9]\\{1,3\\}\\.[0-9]\\{1,3\\}\\.[0-9]\\{1,3\\}\\.[0-9]\\{1,3\\}' | sort -t: -u -k1,1 2>&1
+    # returns a string of ip addresses and needs to be converted into a list
+    Should Not Be Empty   ${vnf_ip_list_string}[1]
+    @{vnf_ip_list}=   Split String   ${vnf_ip_list_string}[1]
+    Log Many   ${vnf_ip_list}
+    Should Not Be Empty   ${vnf_ip_list}
+    RETURN   @{vnf_ip_list}
+
+Check For Ns Instance To Configured
+    [Documentation]   Check if a given NS instance has completed the instantiation, no matter if it succeeded (the status should be READY or BROKEN).
+    [Arguments]   ${ns_name}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   openstack server list
+    Log   ${rc},${stdout}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm ns-list --filter name="${ns_name}"
+    Log   ${rc},${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    Should Contain Any   ${stdout}   READY   BROKEN
+
+Check For NS Instance For Failure
+    [Documentation]   Check if a given NS instance has not failed in the instantiation (the status should not be BROKEN).
+    [Arguments]   ${ns_name}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   openstack server list
+    Log   ${rc},${stdout}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm ns-list --filter name="${ns_name}"
+    Log   ${rc},${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    Should Not Contain   ${stdout}   BROKEN
+
+Check For NS Instance To Be Deleted
+    [Documentation]   Check if a given NS instance is not present in OSM.
+    [Arguments]   ${ns}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   openstack server list
+    Log   ${rc},${stdout}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm ns-list | awk '{print $2}' | grep ${ns}
+    Log   ${rc},${stdout}
+    Should Not Be Equal As Strings   ${stdout}   ${ns}
+
+Delete NS
+    [Documentation]   Delete a NS instance.
+    [Arguments]   ${ns}   ${ns_delete_max_wait_time}=4min
+    ${ns_delete_max_wait_time}=   Convert Time   ${ns_delete_max_wait_time}   result_format=number
+    ${ns_delete_max_wait_time}=   Evaluate   ${ns_delete_max_wait_time} * ${VIM_TIMEOUT_MULTIPLIER}
+    Log   ${ns_delete_max_wait_time}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm ns-delete ${ns}
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    Wait Until Keyword Succeeds   ${ns_delete_max_wait_time}   ${NS_DELETE_POL_TIME}   Check For NS Instance To Be Deleted   ${ns}
+
+Get Ns Vnfr Ids
+    [Documentation]   Return a list with the IDs of the VNF records of a NS instance.
+    [Arguments]   ${ns_id}
+    Should Not Be Empty   ${ns_id}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm vnf-list --ns ${ns_id} | grep ${ns_id} | awk '{print $2}' 2>&1
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}   msg=${stdout}   values=False
+    @{vdur}=   Split String   ${stdout}
+    RETURN   @{vdur}
+
+Get Vnf Vdur Names
+    [Documentation]   Return a list with the names of the VDU records of a VNF instance.
+    [Arguments]   ${vnf_id}
+    Should Not Be Empty   ${vnf_id}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm vnf-show ${vnf_id} --literal | yq -r .vdur[].name
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}   msg=${stdout}   values=False
+    @{vdur}=   Split String   ${stdout}
+    RETURN   @{vdur}
+
+Get Vnf Kdu Replica Count
+    [Documentation]   Return the number of KDU replicas (empty if none) of a VNF instance.
+    [Arguments]   ${vnf_id}   ${kdu_name}
+    Should Not Be Empty   ${vnf_id}
+    Should Not Be Empty   ${kdu_name}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm vnf-show ${vnf_id} --kdu ${kdu_name} | yq -r .config.replicaCount
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}   msg=${stdout}   values=False
+    ${return}=   Set Variable If   '${stdout}' == 'null'   ${EMPTY}   ${stdout}
+    RETURN   ${return}
+
+Get Application Names
+    [Documentation]   Return the list of the application of a VNF instance.
+    [Arguments]   ${ns_name}
+    Should Not Be Empty   ${ns_name}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm ns-show ${ns_name} --literal | yq -r ._admin.deployed.VCA[].application
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}   msg=${stdout}   values=False
+    @{app_names}=   Split String   ${stdout}
+    RETURN   ${app_names}
+
+Get VDU Affinity Group Name
+    [Documentation]   Return the affinity group name for a NF
+    [Arguments]   ${ns_name}   ${vnf_id}   ${vdur_id}
+    ${rc}   ${affinity_group_id}=   Run And Return Rc And Output   osm vnf-show ${vnf_id} --literal | yq '.vdur[] | select(.id == "'${vdur_id}'")' | yq -r '."affinity-or-anti-affinity-group-id"[0]' 2>&1
+    Log   ${affinity_group_id}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}   msg=${affinity_group_id}   values=False
+    ${rc}   ${affinity_group_name}=   Run And Return Rc And Output   osm ns-show ${ns_name} --literal | yq '."affinity-or-anti-affinity-group"[] | select(.id == "'${affinity_group_id}'")' | yq -r '.name' 2>&1
+    Log   ${affinity_group_name}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}   msg=${affinity_group_name}   values=False
+    RETURN   ${affinity_group_name}
+
+Get Dual Ip
+    [Documentation]   Get dual ip from the ns list
+    [Arguments]   ${ns_id}
+    Should Not Be Empty   ${ns_id}
+    ${rc}   ${stdout}=   Run And Return RC And Output   osm ns-show ${ns_id} --literal | grep -A2 ip-address | grep -v "ip-address:" | awk '{print $2}' | tr -d ',-'
+    Log   ${rc},${stdout}
+    RETURN   ${stdout}
+
+Get NSD Id From The NS
+    [Documentation]   Get the nsd id from the ns
+    [Arguments]   ${ns_id}
+    Should Not Be Empty   ${ns_id}
+    ${stdout}=   Run   osm ns-show ${ns_id} --literal | grep nsd-id | awk '{print $2}'
+    Log   ${stdout}
+    RETURN   ${stdout}
diff --git a/robot-systest/lib/ns_lib.robot b/robot-systest/lib/ns_lib.robot
deleted file mode 100644 (file)
index 36ecd57..0000000
+++ /dev/null
@@ -1,395 +0,0 @@
-#   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.
-
-*** Settings ***
-Documentation   Library to deploy and delete NS, and run operations on them.
-
-Library   DateTime
-
-
-*** Variables ***
-${success_return_code}   0
-${ns_launch_pol_time}   30sec
-${ns_delete_pol_time}   15sec
-${ns_action_max_wait_time}   1min
-${ns_action_pol_time}   15sec
-${vnf_scale_pol_time}   15sec
-${healing_pol_time}   15sec
-${vim_timeout_multiplier}   %{OSM_VIM_MULTIPLIER_TIMEOUT=1.0}
-
-
-*** Keywords ***
-Create Network Service
-    [Arguments]   ${nsd}   ${vim_name}   ${ns_name}   ${ns_config}   ${publickey}   ${ns_launch_max_wait_time}=5min   ${config_file}=${EMPTY}
-
-    ${ns_launch_max_wait_time}=   Convert Time   ${ns_launch_max_wait_time}   result_format=number
-    ${ns_launch_max_wait_time}=   Evaluate   ${ns_launch_max_wait_time} * ${vim_timeout_multiplier}
-    Log   ${ns_launch_max_wait_time}
-    ${config_attr}   Set Variable If   '${ns_config}'!='${EMPTY}'   --config '${ns_config}'   \
-    ${sshkeys_attr}   Set Variable If   '${publickey}'!='${EMPTY}'   --ssh_keys ${publickey}   \
-    ${config_file_attr}   Set Variable If   '${config_file}'!='${EMPTY}'   --config_file '${config_file}'   \
-
-    ${ns_id}=   Instantiate Network Service   ${ns_name}   ${nsd}   ${vim_name}   ${config_attr} ${sshkeys_attr} ${config_file_attr}
-    Log   ${ns_id}
-
-    WAIT UNTIL KEYWORD SUCCEEDS   ${ns_launch_max_wait_time}   ${ns_launch_pol_time}   Check For NS Instance To Configured   ${ns_name}
-    Check For NS Instance For Failure   ${ns_name}
-    [Return]   ${ns_id}
-
-
-Instantiate Network Service
-    [Arguments]   ${ns_name}   ${nsd}   ${vim_name}   ${ns_extra_args}
-
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm ns-create --ns_name ${ns_name} --nsd_name ${nsd} --vim_account ${vim_name} ${ns_extra_args}
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    [Return]   ${stdout}
-
-
-Update Network Service
-    [Arguments]   ${ns_id}   ${update_type}   ${ns_update_config}   ${ns_update_timeout}
-
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm ns-update ${ns_id} --updatetype ${update_type} --config ${ns_update_config} --timeout ${ns_update_timeout} --wait
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    [Return]   ${stdout}
-
-
-Get Vnf Management Ip Address
-    [Arguments]   ${ns_id}   ${vnf_member_index}
-
-    Should Not Be Empty   ${ns_id}
-    Should Not Be Empty   ${vnf_member_index}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm vnf-list --filter member-vnf-index-ref=${vnf_member_index} | grep ${ns_id} | awk '{print $14}' 2>&1
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    [Return]   ${stdout}
-
-
-Get Vnf Id
-    [Arguments]   ${ns_id}   ${vnf_member_index}
-
-    Should Not Be Empty   ${ns_id}
-    Should Not Be Empty   ${vnf_member_index}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm vnf-list --filter member-vnf-index-ref=${vnf_member_index} | grep ${ns_id} | awk '{print $2}' 2>&1
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    [Return]   ${stdout}
-
-
-Get Ns Id
-    [Arguments]   ${ns_name}
-
-    Should Not Be Empty   ${ns_name}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm ns-list | grep ${ns_name} | awk '{print $4}' 2>&1
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    Should Not Be Empty   ${stdout}
-    [Return]   ${stdout}
-
-
-Get Ns List
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm ns-list 2>&1
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    [Return]   ${stdout}
-
-
-Get Ns Vnf List
-    [Arguments]   ${ns_id}
-
-    Should Not Be Empty   ${ns_id}
-    @{vnf_list_string}=   Run and Return RC and Output   osm vnf-list | grep ${ns_id} | awk '{print $2}' 2>&1
-    # Returns a String of vnf_id and needs to be converted into a list
-    @{vnf_list} =   Split String   ${vnf_list_string}[1]
-    Log List   ${vnf_list}
-    [Return]   @{vnf_list}
-
-
-Get Ns Ip List
-    [Arguments]   @{vnf_list}
-
-    should not be empty   @{vnf_list}
-    @{temp_list}=   Create List
-    FOR   ${vnf_id}   IN   @{vnf_list}
-        Log   ${vnf_id}
-        @{vnf_ip_list}   Get Vnf Ip List   ${vnf_id}
-        @{temp_list}=   Combine Lists   ${temp_list}   ${vnf_ip_list}
-    END
-    should not be empty   ${temp_list}
-    [return]   @{temp_list}
-
-
-Get Vnf Ip List
-    [arguments]   ${vnf_id}
-
-    should not be empty   ${vnf_id}
-    @{vnf_ip_list_string}=   run and return rc and output   osm vnf-list --filter id=${vnf_id} | grep -o '[0-9]\\{1,3\\}\\.[0-9]\\{1,3\\}\\.[0-9]\\{1,3\\}\\.[0-9]\\{1,3\\}' | sort -t: -u -k1,1 2>&1
-    # returns a string of ip addresses and needs to be converted into a list
-    should not be empty   ${vnf_ip_list_string}[1]
-    @{vnf_ip_list} =   split string   ${vnf_ip_list_string}[1]
-    Log Many   ${vnf_ip_list}
-    should not be empty   ${vnf_ip_list}
-    [return]   @{vnf_ip_list}
-
-
-Check For Ns Instance To Configured
-    [arguments]   ${ns_name}
-
-    ${rc}   ${stdout}=   Run and Return RC and Output   openstack server list
-    Log   ${stdout}
-    ${rc}   ${stdout}=   run and return rc and output   osm ns-list --filter name="${ns_name}"
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    Should Contain Any   ${stdout}   READY   BROKEN
-
-Check For NS Instance For Failure
-    [Arguments]   ${ns_name}
-
-    ${rc}   ${stdout}=   Run and Return RC and Output   openstack server list
-    Log   ${stdout}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm ns-list --filter name="${ns_name}"
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    Should Not Contain   ${stdout}   BROKEN
-
-Check For NS Instance To Be Deleted
-    [Arguments]   ${ns}
-
-    ${rc}   ${stdout}=   Run and Return RC and Output   openstack server list
-    Log   ${stdout}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm ns-list | awk '{print $2}' | grep ${ns}
-    Should Not Be Equal As Strings   ${stdout}   ${ns}
-
-Delete NS
-    [Documentation]   Delete ns
-    [Arguments]   ${ns}   ${ns_delete_max_wait_time}=4min
-
-    ${ns_delete_max_wait_time}=   Convert Time   ${ns_delete_max_wait_time}   result_format=number
-    ${ns_delete_max_wait_time}=   Evaluate   ${ns_delete_max_wait_time} * ${vim_timeout_multiplier}
-    Log   ${ns_delete_max_wait_time}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm ns-delete ${ns}
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-
-    WAIT UNTIL KEYWORD SUCCEEDS   ${ns_delete_max_wait_time}   ${ns_delete_pol_time}   Check For NS Instance To Be Deleted   ${ns}
-
-Execute NS Action
-    [Documentation]   Execute an action over the desired NS.
-    ...               Parameters are given to this function in key=value format (one argument per key/value pair).
-    ...               Return the ID of the operation associated to the executed action.
-    ...               Examples of execution:
-    ...                   \${ns_op_id}=   Execute NS Action   \${ns_name}   \${ns_action}   \${vnf_member_index}
-    ...                   \${ns_op_id}=   Execute NS Action   \${ns_name}   \${ns_action}   \${vnf_member_index}   \${param1}=\${value1}   \${param2}=\${value2}
-
-    [Arguments]   ${ns_name}   ${ns_action}   ${vnf_member_index}   @{action_params}
-
-    ${params}=   Set Variable   ${EMPTY}
-    FOR   ${param}   IN   @{action_params}
-        ${match}   ${param_name}   ${param_value} =   Should Match Regexp   ${param}   (.+)=(.+)   msg=Syntax error in parameters
-        ${params}=   Catenate   SEPARATOR=   ${params}   "${param_name}":"${param_value}",
-    END
-    ${osm_ns_action_command}=   Set Variable   osm ns-action --action_name ${ns_action} --vnf_name ${vnf_member_index}
-    ${osm_ns_action_command}=   Run Keyword If   '${params}'!='${EMPTY}'   Catenate   ${osm_ns_action_command}   --params '{${params}}'
-    ...   ELSE   Set Variable   ${osm_ns_action_command}
-    ${osm_ns_action_command}=   Catenate   ${osm_ns_action_command}   ${ns_name}
-    ${rc}   ${stdout}=   Run and Return RC and Output   ${osm_ns_action_command}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}   msg=${stdout}   values=False
-    Wait Until Keyword Succeeds   ${ns_action_max_wait_time}   ${ns_action_pol_time}   Check For NS Operation Ended   ${stdout}
-    Check For NS Operation Completed   ${stdout}
-    [Return]   ${stdout}
-
-
-Execute NS K8s Action
-    [Documentation]   Execute an action over the desired K8s NS.
-    ...               Parameters are given to this function in key=value format (one argument per key/value pair).
-    ...               Return the ID of the operation associated to the executed action.
-    ...               Examples of execution:
-    ...                   \${ns_op_id}=   Execute NS Action   \${ns_name}   \${ns_action}   \${vnf_member_index}
-    ...                   \${ns_op_id}=   Execute NS Action   \${ns_name}   \${ns_action}   \${vnf_member_index}   \${param1}=\${value1}   \${param2}=\${value2}
-
-    [Arguments]   ${ns_name}   ${ns_action}   ${vnf_member_index}   ${kdu_name}   @{action_params}
-
-    ${params}=   Set Variable   ${EMPTY}
-    FOR   ${param}   IN   @{action_params}
-        ${match}   ${param_name}   ${param_value} =   Should Match Regexp   ${param}   (.+)=(.+)   msg=Syntax error in parameters
-        ${params}=   Catenate   SEPARATOR=   ${params}   "${param_name}":"${param_value}",
-    END
-    ${osm_ns_action_command}=   Set Variable   osm ns-action --action_name ${ns_action} --vnf_name ${vnf_member_index} --kdu_name ${kdu_name}
-    ${osm_ns_action_command}=   Run Keyword If   '${params}'!='${EMPTY}'   Catenate   ${osm_ns_action_command}   --params '{${params}}'
-    ...   ELSE   Set Variable   ${osm_ns_action_command}
-    ${osm_ns_action_command}=   Catenate   ${osm_ns_action_command}   ${ns_name}
-    ${rc}   ${stdout}=   Run and Return RC and Output   ${osm_ns_action_command}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}   msg=${stdout}   values=False
-    Wait Until Keyword Succeeds   ${ns_action_max_wait_time}   ${ns_action_pol_time}   Check For NS Operation Ended   ${stdout}
-    Check For NS Operation Completed   ${stdout}
-    [Return]   ${stdout}
-
-
-Execute Manual VNF Scale
-    [Documentation]   Execute a manual VNF Scale action.
-    ...               The parameter 'scale_type' must be SCALE_IN or SCALE_OUT.
-    ...               Return the ID of the operation associated to the executed scale action.
-
-    [Arguments]   ${ns_name}   ${vnf_member_index}   ${scaling_group}   ${scale_type}   ${vnf_scale_max_wait_time}=2min
-
-    ${vnf_scale_max_wait_time}=   Convert Time   ${vnf_scale_max_wait_time}   result_format=number
-    ${vnf_scale_max_wait_time}=   Evaluate   ${vnf_scale_max_wait_time} * ${vim_timeout_multiplier}
-    Should Contain Any   ${scale_type}   SCALE_IN   SCALE_OUT   msg=Unknown scale type: ${scale_type}   values=False
-    ${osm_vnf_scale_command}=   Set Variable   osm vnf-scale --scaling-group ${scaling_group}
-    ${osm_vnf_scale_command}=   Run Keyword If   '${scale_type}'=='SCALE_IN'   Catenate   ${osm_vnf_scale_command}   --scale-in
-    ...   ELSE   Catenate   ${osm_vnf_scale_command}   --scale-out
-    ${osm_vnf_scale_command}=   Catenate   ${osm_vnf_scale_command}   ${ns_name}   ${vnf_member_index}
-    ${rc}   ${stdout}=   Run and Return RC and Output   ${osm_vnf_scale_command}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}   msg=${stdout}   values=False
-    Wait Until Keyword Succeeds   ${vnf_scale_max_wait_time}   ${vnf_scale_pol_time}   Check For NS Operation Ended   ${stdout}
-    Check For NS Operation Completed   ${stdout}
-    [Return]   ${stdout}
-
-
-Heal Network Service
-    [Documentation]   Execute healing operation over one NS.
-    ...               Return the ID of the operation associated to the executed healing action.
-
-    [Arguments]   ${ns_name}   ${params}   ${healing_max_wait_time}=10m
-
-    Should Not Be Empty   ${ns_name}
-    Should Not Be Empty   ${params}
-    ${healing_max_wait_time}=   Convert Time   ${healing_max_wait_time}   result_format=number
-    ${healing_max_wait_time}=   Evaluate   ${healing_max_wait_time} * ${vim_timeout_multiplier}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm ns-heal ${ns_name} ${params}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}   msg=${stdout}   values=False
-    Wait Until Keyword Succeeds   ${healing_max_wait_time}   ${healing_pol_time}   Check For NS Operation Ended   ${stdout}
-    Check For NS Operation Completed   ${stdout}
-    [Return]   ${stdout}
-
-
-Get Operations List
-    [Arguments]   ${ns_name}
-
-    Should Not Be Empty   ${ns_name}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm ns-op-list ${ns_name}
-    Log   ${stdout}
-    Log   ${rc}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-
-
-Check For NS Operation Completed
-    [Documentation]   Check wheter the status of the desired operation is "COMPLETED" or not.
-
-    [Arguments]   ${ns_operation_id}
-
-    Should Not Be Empty   ${ns_operation_id}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm ns-op-show ${ns_operation_id} --literal | yq .operationState | tr -d \\"
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    Should Contain   ${stdout}   COMPLETED   msg=The ns-action with id ${ns_operation_id} was not completed   values=False
-
-
-Check For NS Operation Failed
-    [Documentation]   Check wheter the status of the desired operation is "FAILED" or not.
-
-    [Arguments]   ${ns_operation_id}
-
-    Should Not Be Empty   ${ns_operation_id}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm ns-op-show ${ns_operation_id} --literal | yq .operationState | tr -d \\"
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    Should Contain   ${stdout}   FAILED   msg=Timeout waiting for ns-action with id ${ns_operation_id}   values=False
-
-
-Check For NS Operation Ended
-    [Documentation]   Check wheter the status of the desired operation is "FAILED" or "COMPLETED".
-
-    [Arguments]   ${ns_operation_id}
-
-    Should Not Be Empty   ${ns_operation_id}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm ns-op-show ${ns_operation_id} --literal | yq .operationState | tr -d \\"
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    Should Contain Any   ${stdout}   FAILED   COMPLETED   msg=Timeout waiting for ns-action with id ${ns_operation_id}   values=False
-
-
-Get Ns Vnfr Ids
-    [Documentation]   Return a list with the IDs of the VNF records of a NS instance.
-
-    [Arguments]   ${ns_id}
-
-    Should Not Be Empty   ${ns_id}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm vnf-list | grep ${ns_id} | awk '{print $2}' 2>&1
-    Should Be Equal As Integers   ${rc}   ${success_return_code}   msg=${stdout}   values=False
-    @{vdur} =   Split String   ${stdout}
-    [Return]   @{vdur}
-
-
-Get Vnf Vdur Names
-    [Documentation]   Return a list with the names of the VDU records of a VNF instance.
-
-    [Arguments]   ${vnf_id}
-
-    Should Not Be Empty   ${vnf_id}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm vnf-show ${vnf_id} --literal | yq .vdur[].name | tr -d \\"
-    Should Be Equal As Integers   ${rc}   ${success_return_code}   msg=${stdout}   values=False
-    @{vdur} =   Split String   ${stdout}
-    [Return]   @{vdur}
-
-
-Get Vnf Kdu Replica Count
-    [Documentation]   Return the number of KDU replicas (empty if none) of a VNF instance.
-
-    [Arguments]   ${vnf_id}   ${kdu_name}
-
-    Should Not Be Empty   ${vnf_id}
-    Should Not Be Empty   ${kdu_name}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm vnf-show ${vnf_id} --kdu ${kdu_name} | yq .config.replicaCount | tr -d \\"
-    Should Be Equal As Integers   ${rc}   ${success_return_code}   msg=${stdout}   values=False
-    ${return} =   Set Variable If   '${stdout}' == 'null'   ${EMPTY}   ${stdout}
-    [Return]   ${return}
-
-
-Get Application Names
-    [Documentation]   Return the list of the application of a VNF instance.
-
-    [Arguments]   ${ns_name}
-
-    Should Not Be Empty   ${ns_name}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm ns-show ${ns_name} --literal | yq ._admin.deployed.VCA[].application | tr -d \\"
-    Should Be Equal As Integers   ${rc}   ${success_return_code}   msg=${stdout}   values=False
-    @{app_names} =   Split String   ${stdout}
-    [Return]   ${app_names}
-
-
-Get VDU Affinity Group Name
-    [Documentation]   Return the affinity group name for a NF
-
-    [Arguments]   ${ns_name}   ${vnf_id}   ${vdur_id}
-
-    ${rc}   ${affinity_group_id}=   Run and Return RC and Output   osm vnf-show ${vnf_id} --literal | yq '.vdur[] | select(.id == "'${vdur_id}'")' | yq '."affinity-or-anti-affinity-group-id"[0]' | tr -d \\" 2>&1
-    Log   ${affinity_group_id}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}   msg=${affinity_group_id}   values=False
-    ${rc}   ${affinity_group_name}=   Run and Return RC and Output   osm ns-show ${ns_name} --literal | yq '."affinity-or-anti-affinity-group"[] | select(.id == "'${affinity_group_id}'")' | yq '.name' | tr -d \\" 2>&1
-    Log   ${affinity_group_name}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}   msg=${affinity_group_name}   values=False
-    [Return]   ${affinity_group_name}
-
-Get Operations By Type
-    [Documentation]   Keyword to get the operation by type
-
-    [Arguments]   ${ns_id}   ${type}
-
-    Should Not Be Empty   ${ns_id}
-    Should Not Be Empty   ${type}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm ns-op-list ${ns_id} | grep ${type} | awk '{print $2}' 2>&1
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    Should Not Be Empty   ${stdout}
-    [Return]   ${stdout}
diff --git a/robot-systest/lib/ns_operation_lib.resource b/robot-systest/lib/ns_operation_lib.resource
new file mode 100644 (file)
index 0000000..71be6bf
--- /dev/null
@@ -0,0 +1,198 @@
+*** Comments ***
+#   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.
+
+
+*** Settings ***
+Documentation   Library to deploy and delete NS, and run operations on them.
+
+Library   Collections
+Library   DateTime
+Library   OperatingSystem
+Library   String
+
+
+*** Variables ***
+${SUCCESS_RETURN_CODE}   0
+${NS_ACTION_MAX_WAIT_TIME}   1min
+${NS_ACTION_POL_TIME}   15sec
+${VNF_SCALE_POL_TIME}   15sec
+${HEALING_POL_TIME}   15sec
+${VIM_TIMEOUT_MULTIPLIER}   %{OSM_VIM_MULTIPLIER_TIMEOUT=1.0}
+
+
+*** Keywords ***
+Update Network Service
+    [Documentation]   Run an update operation over a NS instance, and return the operation id.
+    [Arguments]   ${ns_id}   ${update_type}   ${ns_update_config}   ${ns_update_timeout}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm ns-update ${ns_id} --updatetype ${update_type} --config ${ns_update_config} --timeout ${ns_update_timeout} --wait
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    RETURN   ${stdout}
+
+Execute NS Action
+    [Documentation]   Execute an action over the desired NS.
+    ...               Parameters are given to this function in key=value format (one argument per key/value pair).
+    ...               Return the ID of the operation associated to the executed action.
+    ...               Examples of execution:
+    ...                   \${ns_op_id}=   Execute NS Action   \${ns_name}   \${ns_action}   \${vnf_member_index}
+    ...                   \${ns_op_id}=   Execute NS Action   \${ns_name}   \${ns_action}   \${vnf_member_index}   \${param1}=\${value1}   \${param2}=\${value2}
+
+    [Arguments]   ${ns_name}   ${ns_action}   ${vnf_member_index}   @{action_params}
+    ${params}=   Set Variable   ${EMPTY}
+    FOR   ${param}   IN   @{action_params}
+        ${match}   ${param_name}   ${param_value}=   Should Match Regexp   ${param}   (.+)=(.+)   msg=Syntax error in parameters
+        Log   ${match},${param_name},${param_value}
+        ${params}=   Catenate   SEPARATOR=   ${params}   "${param_name}":"${param_value}",
+    END
+    ${osm_ns_action_command}=   Set Variable   osm ns-action --action_name ${ns_action} --vnf_name ${vnf_member_index}
+    IF   '${params}' != '${EMPTY}'
+        ${osm_ns_action_command}=   Catenate   ${osm_ns_action_command}   --params '{${params}}'
+    ELSE
+        ${osm_ns_action_command}=   Set Variable   ${osm_ns_action_command}
+    END
+    ${osm_ns_action_command}=   Catenate   ${osm_ns_action_command}   ${ns_name}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   ${osm_ns_action_command}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}   msg=${stdout}   values=False
+    Wait Until Keyword Succeeds   ${NS_ACTION_MAX_WAIT_TIME}   ${NS_ACTION_POL_TIME}   Check For NS Operation Ended   ${stdout}
+    Check For NS Operation Completed   ${stdout}
+    RETURN   ${stdout}
+
+Execute NS K8s Action
+    [Documentation]   Execute an action over the desired K8s NS.
+    ...               Parameters are given to this function in key=value format (one argument per key/value pair).
+    ...               Return the ID of the operation associated to the executed action.
+    ...               Examples of execution:
+    ...                   \${ns_op_id}=   Execute NS Action   \${ns_name}   \${ns_action}   \${vnf_member_index}
+    ...                   \${ns_op_id}=   Execute NS Action   \${ns_name}   \${ns_action}   \${vnf_member_index}   \${param1}=\${value1}   \${param2}=\${value2}
+
+    [Arguments]   ${ns_name}   ${ns_action}   ${vnf_member_index}   ${kdu_name}   @{action_params}
+
+    ${params}=   Set Variable   ${EMPTY}
+    FOR   ${param}   IN   @{action_params}
+        ${match}   ${param_name}   ${param_value}=   Should Match Regexp   ${param}   (.+)=(.+)   msg=Syntax error in parameters
+        Log   ${match},${param_name},${param_value}
+        ${params}=   Catenate   SEPARATOR=   ${params}   "${param_name}":"${param_value}",
+    END
+    ${osm_ns_action_command}=   Set Variable   osm ns-action --action_name ${ns_action} --vnf_name ${vnf_member_index} --kdu_name ${kdu_name}
+    IF   '${params}' != '${EMPTY}'
+        ${osm_ns_action_command}=   Catenate   ${osm_ns_action_command}   --params '{${params}}'
+    ELSE
+        ${osm_ns_action_command}=   Set Variable   ${osm_ns_action_command}
+    END
+    ${osm_ns_action_command}=   Catenate   ${osm_ns_action_command}   ${ns_name}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   ${osm_ns_action_command}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}   msg=${stdout}   values=False
+    Wait Until Keyword Succeeds   ${NS_ACTION_MAX_WAIT_TIME}   ${NS_ACTION_POL_TIME}   Check For NS Operation Ended   ${stdout}
+    Check For NS Operation Completed   ${stdout}
+    RETURN   ${stdout}
+
+Execute Manual VNF Scale
+    [Documentation]   Execute a manual VNF Scale action.
+    ...               The parameter 'scale_type' must be SCALE_IN or SCALE_OUT.
+    ...               Return the ID of the operation associated to the executed scale action.
+    [Arguments]   ${ns_name}   ${vnf_member_index}   ${scaling_group}   ${scale_type}   ${vnf_scale_max_wait_time}=2min
+    ${vnf_scale_max_wait_time}=   Convert Time   ${vnf_scale_max_wait_time}   result_format=number
+    ${vnf_scale_max_wait_time}=   Evaluate   ${vnf_scale_max_wait_time} * ${VIM_TIMEOUT_MULTIPLIER}
+    Should Contain Any   ${scale_type}   SCALE_IN   SCALE_OUT   msg=Unknown scale type: ${scale_type}   values=False
+    ${osm_vnf_scale_command}=   Set Variable   osm vnf-scale --scaling-group ${scaling_group}
+    IF   '${scale_type}'=='SCALE_IN'
+        ${osm_vnf_scale_command}=   Catenate   ${osm_vnf_scale_command}   --scale-in
+    ELSE
+        ${osm_vnf_scale_command}=   Catenate   ${osm_vnf_scale_command}   --scale-out
+    END
+    ${osm_vnf_scale_command}=   Catenate   ${osm_vnf_scale_command}   ${ns_name}   ${vnf_member_index}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   ${osm_vnf_scale_command}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}   msg=${stdout}   values=False
+    Wait Until Keyword Succeeds   ${vnf_scale_max_wait_time}   ${VNF_SCALE_POL_TIME}   Check For NS Operation Ended   ${stdout}
+    Check For NS Operation Completed   ${stdout}
+    RETURN   ${stdout}
+
+Heal Network Service
+    [Documentation]   Execute healing operation over one NS.
+    ...               Return the ID of the operation associated to the executed healing action.
+    [Arguments]   ${ns_name}   ${params}   ${healing_max_wait_time}=10m
+    Should Not Be Empty   ${ns_name}
+    Should Not Be Empty   ${params}
+    ${healing_max_wait_time}=   Convert Time   ${healing_max_wait_time}   result_format=number
+    ${healing_max_wait_time}=   Evaluate   ${healing_max_wait_time} * ${VIM_TIMEOUT_MULTIPLIER}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm ns-heal ${ns_name} ${params}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}   msg=${stdout}   values=False
+    Wait Until Keyword Succeeds   ${healing_max_wait_time}   ${HEALING_POL_TIME}   Check For NS Operation Ended   ${stdout}
+    Check For NS Operation Completed   ${stdout}
+    RETURN   ${stdout}
+
+Get Operations List
+    [Documentation]   Get the list of operations of a given NS instance.
+    [Arguments]   ${ns_name}
+    Should Not Be Empty   ${ns_name}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm ns-op-list ${ns_name}
+    Log   ${stdout}
+    Log   ${rc}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+
+Check For NS Operation Completed
+    [Documentation]   Check wheter the status of the desired operation is "COMPLETED" or not.
+    [Arguments]   ${ns_operation_id}
+    Should Not Be Empty   ${ns_operation_id}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm ns-op-show ${ns_operation_id} --literal | yq -r .operationState
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    Should Contain   ${stdout}   COMPLETED   msg=The ns-action with id ${ns_operation_id} was not completed   values=False
+
+Check For NS Operation Failed
+    [Documentation]   Check wheter the status of the desired operation is "FAILED" or not.
+    [Arguments]   ${ns_operation_id}
+    Should Not Be Empty   ${ns_operation_id}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm ns-op-show ${ns_operation_id} --literal | yq -r .operationState
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    Should Contain   ${stdout}   FAILED   msg=Timeout waiting for ns-action with id ${ns_operation_id}   values=False
+
+Check For NS Operation Ended
+    [Documentation]   Check wheter the status of the desired operation is "FAILED" or "COMPLETED".
+    [Arguments]   ${ns_operation_id}
+    Should Not Be Empty   ${ns_operation_id}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm ns-op-show ${ns_operation_id} --literal | yq -r .operationState
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    Should Contain Any   ${stdout}   FAILED   COMPLETED   msg=Timeout waiting for ns-action with id ${ns_operation_id}   values=False
+
+Check For NS Operation Cancelled
+    [Documentation]   Check whether the operation was cancelled or not.
+    [Arguments]   ${ns_operation_id}
+    Should Not Be Empty   ${ns_operation_id}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm ns-op-show ${ns_operation_id} --literal | yq -r '.operationState, .isCancelPending'
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    Should Contain   ${stdout}   FAILED_TEMP\nfalse   msg=Timeout waiting for ns-action with id ${ns_operation_id}   values=False
+
+Get Operations By Type
+    [Documentation]   Keyword to get the operation by type
+    [Arguments]   ${ns_id}   ${type}
+    Should Not Be Empty   ${ns_id}
+    Should Not Be Empty   ${type}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm ns-op-list ${ns_id} | grep ${type} | awk '{print $2}' 2>&1
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    Should Not Be Empty   ${stdout}
+    RETURN   ${stdout}
+
+Cancel Operation By Id
+    [Documentation]   Cancels an ongoing operation by operation ID
+    [Arguments]   ${op_id}   ${cancel_mode}=GRACEFUL
+
+    Should Not Be Empty   ${op_id}
+    ${rc}   ${stdout}=   Run And Return RC And Output   osm ns-op-cancel ${op_id} --cancel_mode ${cancel_mode} --wait
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${success_return_code}
+    RETURN   ${stdout}
diff --git a/robot-systest/lib/nsd_lib.resource b/robot-systest/lib/nsd_lib.resource
new file mode 100644 (file)
index 0000000..0821b1f
--- /dev/null
@@ -0,0 +1,70 @@
+*** Comments ***
+# Copyright 2019 Tech Mahindra Limited
+#
+# 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.
+
+
+*** Settings ***
+Documentation   Library providing keywords for CRUD operations over NSD/NSpkg with OSM client.
+
+Library   OperatingSystem
+Library   String
+
+
+*** Variables ***
+${SUCCESS_RETURN_CODE}   0
+${NSD_DELETE_MAX_WAIT_TIME}   1min
+${NSD_DELETE_POL_TIME}   15sec
+
+
+*** Keywords ***
+Get NSDs List
+    [Documentation]   Get the list of NS packages and log it.
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm nspkg-list
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+
+Create NSD
+    [Documentation]   Upload a NS package to OSM and return the id.
+    [Arguments]   ${nsd_pkg}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm nspkg-create ${nsd_pkg}
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    ${lines}=   Get Line Count   ${stdout}
+    ${last}=   Evaluate   ${lines} - 1
+    ${id}=   Get Line   ${stdout}   ${last}
+    RETURN   ${id}
+
+Delete NSD
+    [Documentation]   Delete a NS package from OSM.
+    [Arguments]   ${nsd_id}
+    ${rc}   ${stdout}=   Run Keyword And Continue On Failure   Run And Return Rc And Output   osm nspkg-delete ${nsd_id}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    Log   ${stdout}
+    Wait Until Keyword Succeeds   ${NSD_DELETE_MAX_WAIT_TIME}   ${NSD_DELETE_POL_TIME}   Check For NSD   ${nsd_id}
+
+Check For NSD
+    [Documentation]   Check that a NS package exists in OSM.
+    [Arguments]   ${nsd_id}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm nspkg-list | awk '{print $2}' | grep ${nsd_id}
+    Log   ${rc},${stdout}
+    Should Not Be Equal As Strings   ${stdout}   ${nsd_id}
+
+Get NSD Ip
+    [Documentation]   To get the Ip from the Nsd
+    [Arguments]   ${nsd_id}
+    ${stdout}=   Run   osm nsd-show ${nsd_id} --literal | grep -A2 ip-address | grep -v "ip-address:" | awk '{print $2}' | tr -d ',-'
+    Log   ${stdout}
+    RETURN   ${stdout}
diff --git a/robot-systest/lib/nsd_lib.robot b/robot-systest/lib/nsd_lib.robot
deleted file mode 100644 (file)
index 40132d7..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-# -*- coding: utf-8 -*-
-
-##
-# Copyright 2019 Tech Mahindra Limited
-#
-# 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.
-##
-
-## Change log:
-# 1. Feature 7829: Jayant Madavi, Mrityunjay Yadav : MY00514913@techmahindra.com : 06-sep-2019
-##
-
-*** Settings ***
-Library   String
-
-
-*** Variables ***
-${success_return_code}   0
-${delete_max_wait_time}   1min
-${delete_pol_time}   15sec
-
-
-*** Keywords ***
-Get NSDs List
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm nspkg-list
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-
-
-Create NSD
-    [Arguments]   ${nsd_pkg}
-
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm nspkg-create ${nsd_pkg}
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    ${lines}=   Get Line Count   ${stdout}
-    ${last}=   Evaluate   ${lines} - 1
-    ${id}=   Get Line   ${stdout}   ${last}
-    [Return]   ${id}
-
-
-Delete NSD
-    [Arguments]   ${nsd_id}
-
-    ${rc}   ${stdout}=   Run Keyword And Continue On Failure   Run and Return RC and Output   osm nspkg-delete ${nsd_id}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    Log   ${stdout}
-    WAIT UNTIL KEYWORD SUCCEEDS   ${delete_max_wait_time}   ${delete_pol_time}   Check For NSD   ${nsd_id}
-
-
-Check For NSD
-    [Arguments]   ${nsd_id}
-
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm nspkg-list | awk '{print $2}' | grep ${nsd_id}
-    Should Not Be Equal As Strings   ${stdout}   ${nsd_id}
diff --git a/robot-systest/lib/nsi_lib.resource b/robot-systest/lib/nsi_lib.resource
new file mode 100644 (file)
index 0000000..74c67a6
--- /dev/null
@@ -0,0 +1,186 @@
+*** Comments ***
+#   Copyright 2020 Atos
+#
+#   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.
+
+
+*** Settings ***
+Documentation   Library providing keywords for CRUD operations over Network Slice Instances with OSM client.
+
+Library   Collections
+Library   OperatingSystem
+Library   DateTime
+Library   String
+
+Resource   ns_lib.resource
+
+
+*** Variables ***
+${SUCCESS_RETURN_CODE}   0
+${SLICE_LAUNCH_POL_TIME}   30sec
+${SLICE_DELETE_POL_TIME}   15sec
+${VIM_TIMEOUT_MULTIPLIER}   %{OSM_VIM_MULTIPLIER_TIMEOUT=1.0}
+
+
+*** Keywords ***
+Create Network Slice
+    [Documentation]   Instantiates a NST and returns an instantiation id (nsi), verifying the slice is successfully instantiated
+    ...               Parameters:
+    ...                  nst: Name of the slice template
+    ...                  vim_name: Name of the VIM entry already in OSM
+    ...                  slice_name: Name of the slice instance
+    ...                  slice_config: Extra parameters that might require the slice instantiation i.e. configuration attributes
+    ...                  publickey: SSH public key of the local machine
+    ...               Execution example:
+    ...                  \${nsi}=   Create Network Slice   \${nst}   \${vim_name}   \${slice_name}   \${slice_config}   \${publickey}
+    [Arguments]   ${nst}   ${vim_name}   ${slice_name}   ${slice_config}   ${publickey}   ${slice_launch_max_wait_time}=6min   ${config_file}=${EMPTY}
+    ${slice_launch_max_wait_time}=   Convert Time   ${slice_launch_max_wait_time}   result_format=number
+    ${slice_launch_max_wait_time}=   Evaluate   ${slice_launch_max_wait_time} * ${VIM_TIMEOUT_MULTIPLIER}
+    ${config_attr}=   Set Variable If   "${slice_config}" != "${EMPTY}"   --config '${slice_config}'   ${EMPTY}
+    ${sshkeys_attr}=   Set Variable If   "${publickey}" != "${EMPTY}"   --ssh_keys ${publickey}   ${EMPTY}
+    ${config_file_attr}=   Set Variable If   "${config_file}" != "${EMPTY}"   --config_file '${config_file}'   ${EMPTY}
+    ${nsi_id}=   Instantiate Network Slice   ${slice_name}   ${nst}   ${vim_name}   ${config_attr} ${config_file_attr}   ${sshkeys_attr}
+    Log   ${nsi_id}
+    Wait Until Keyword Succeeds   ${slice_launch_max_wait_time}   ${SLICE_LAUNCH_POL_TIME}   Check For Network Slice Instance To Configured   ${slice_name}
+    Check For Network Slice Instance For Failure   ${slice_name}
+    RETURN   ${nsi_id}
+
+Instantiate Network Slice
+    [Documentation]   Instantiates a NST and returns an instantiation id (nsi)
+    ...               Parameters:
+    ...                  slice_name: Name of the slice instance
+    ...                  nst: Name of the slice template
+    ...                  vim_name: Name of the VIM entry already in OSM
+    ...                  slice_extra_args: Extra parameters that might require the slice instantiation i.e. configuration attributes
+    ...               Execution example:
+    ...                  \${nsi}=   Instantiate Network Slice   \${slice_name}   \${nst}   \${vim_name}   \${config_attr}
+    [Arguments]   ${slice_name}   ${nst}   ${vim_name}   ${slice_extra_args}   ${sshkeys_attr}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm nsi-create --nsi_name ${slice_name} --nst_name ${nst} --vim_account ${vim_name} ${sshkeys_attr} ${slice_extra_args}
+    Log   ${rc},${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    RETURN   ${stdout}
+
+Get Slice Ns List
+    [Documentation]   Retrieves the list of NS in a slice
+    ...               Parameters:
+    ...                  slice_name: Name of the slice instance
+    ...               Execution example:
+    ...                  \@{slice_ns_list}=   Get Slice Ns List   \${slice_name}
+    [Arguments]   ${slice_name}
+    Should Not Be Empty   ${slice_name}
+    @{ns_list_string}=   Run And Return Rc And Output   osm ns-list | grep ${slice_name} | awk '{print $4}' 2>&1
+    # Returns a String of ns_id and needs to be converted into a list
+    @{ns_list}=   Split String   ${ns_list_string}[1]
+    Log List   ${ns_list}
+    RETURN   @{ns_list}
+
+Get Slice Ns List Except One
+    [Documentation]   Retrieves the list of NS in a slice removing one from the list. This is done to save time in the tests, avoiding one VNF to ping itself.
+    ...               Parameters:
+    ...                  slice_name: Name of the slice instance
+    ...                  exception_ns: Name of the ns that will not appear in the final list
+    ...               Execution example:
+    ...                  \@{slice_ns_list}=   Get Slice Ns List Except One   \${slice_name}   \${exception_ns}
+    [Arguments]   ${slice_name}   ${exception_ns}
+    Should Not Be Empty   ${slice_name}
+    Should Not Be Empty   ${exception_ns}
+    @{ns_list_string}=   Run And Return Rc And Output   osm ns-list | grep ${slice_name} | awk '!/${exception_ns}/' | awk '{print $4}' 2>&1
+    # Returns a String of ns_id and needs to be converted into a list
+    @{ns_list}=   Split String   ${ns_list_string}[1]
+    Log List   ${ns_list}
+    RETURN   @{ns_list}
+
+Get Slice Ns Count
+    [Documentation]   Returns the count of all the NS in a slice
+    ...               Parameters:
+    ...                  slice_name: Name of the slice instance
+    ...               Execution example:
+    ...                  \${slice_ns_count}=   Get Slice Ns Count   \${slice_name}
+    [Arguments]   ${slice_name}
+    Should Not Be Empty   ${slice_name}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm ns-list | grep ${slice_name} | wc -l 2>&1
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    RETURN   ${stdout}
+
+Get Slice Vnf Ip Addresses
+    [Documentation]   Retrieves the list of IP addresses that belong to each of the VNFs in the slice
+    ...               Parameters:
+    ...                  slice_name: Name of the slice instance
+    ...               Execution example:
+    ...                  \@{slice_ip_address_list}=   Get Slice Vnf Ip Addresses   \${slice_name}
+    [Arguments]   ${slice_name}
+    # Get all the ns_id in the slice
+    @{slice_ns_list}=   Get Slice Ns List   ${slice_name}
+    Log Many   @{slice_ns_list}
+    @{temp_list}=   Create List
+    # For each ns_id in the list, get all the vnf_id and their IP addresses
+    FOR   ${ns_id}   IN   @{slice_ns_list}
+        Log   ${ns_id}
+        @{vnf_id_list}=   Get Ns Vnf List   ${ns_id}
+        # For each vnf_id in the list, get all its IP addresses
+        @{ns_ip_list}=   Get Ns Ip List   @{vnf_id_list}
+        @{temp_list}=   Combine Lists   ${temp_list}   ${ns_ip_list}
+    END
+    Log List   ${temp_list}
+    RETURN   @{temp_list}
+
+Check For Network Slice Instance To Configured
+    [Documentation]   Verify the slice has been instantiated
+    ...               Parameters:
+    ...                  slice_name: Name of the slice instance
+    ...               Execution example:
+    ...                  Check For Network Slice Instance To Configured   \${slice_name}
+    [Arguments]   ${slice_name}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm nsi-list --filter name="${slice_name}"
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    Should Contain Any   ${stdout}   READY   BROKEN   configured
+
+Check For Network Slice Instance For Failure
+    [Documentation]   Verify the slice instance is not in failure
+    ...               Parameters:
+    ...                  slice_name: Name of the slice instance
+    ...               Execution example:
+    ...                  Check For Network Slice Instance For Failure   \${slice_name}
+    [Arguments]   ${slice_name}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm nsi-list --filter name="${slice_name}"
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    Should Not Contain   ${stdout}   failed
+
+Delete NSI
+    [Documentation]   Delete Network Slice Instance (NSI)
+    ...               Parameters:
+    ...                  slice_name: Name of the slice instance
+    ...                  slice_delete_max_wait_time: Delete operation timeout
+    ...               Execution example:
+    ...                  Delete NST   \${slice_name}
+    [Arguments]   ${slice_name}   ${slice_delete_max_wait_time}=4min
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm nsi-delete ${slice_name}
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    ${slice_delete_max_wait_time}=   Convert Time   ${slice_delete_max_wait_time}   result_format=number
+    ${slice_delete_max_wait_time}=   Evaluate   ${slice_delete_max_wait_time} * ${VIM_TIMEOUT_MULTIPLIER}
+    Wait Until Keyword Succeeds   ${slice_delete_max_wait_time}   ${SLICE_DELETE_POL_TIME}   Check For Network Slice Instance To Be Deleted   ${slice_name}
+
+Check For Network Slice Instance To Be Deleted
+    [Documentation]   Verify the slice instance is not present
+    ...               Parameters:
+    ...                  slice_name: Name of the slice instance
+    ...               Execution example:
+    ...                  Check For Network Slice Instance   \${slice_name}
+    [Arguments]   ${slice_name}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm nsi-list | awk '{print $2}' | grep ${slice_name}
+    Log   ${rc},${stdout}
+    Should Not Be Equal As Strings   ${stdout}   ${slice_name}
diff --git a/robot-systest/lib/nsi_lib.robot b/robot-systest/lib/nsi_lib.robot
deleted file mode 100644 (file)
index 1b88396..0000000
+++ /dev/null
@@ -1,212 +0,0 @@
-#   Copyright 2020 Atos
-#
-#   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.
-
-*** Settings ***
-Library   Collections
-
-
-*** Variables ***
-${success_return_code}   0
-${slice_launch_pol_time}   30sec
-${slice_delete_pol_time}   15sec
-${vim_timeout_multiplier}   %{OSM_VIM_MULTIPLIER_TIMEOUT=1.0}
-
-
-*** Keywords ***
-
-Create Network Slice
-    [Documentation]   Instantiates a NST and returns an instantiation id (nsi), verifying the slice is successfully instantiated
-    ...               Parameters:
-    ...                  nst: Name of the slice template
-    ...                  vim_name: Name of the VIM entry already in OSM
-    ...                  slice_name: Name of the slice instance
-    ...                  slice_config: Extra parameters that might require the slice instantiation i.e. configuration attributes
-    ...                  publickey: SSH public key of the local machine
-    ...               Execution example:
-    ...                  \${nsi}=   Create Network Slice   \${nst}   \${vim_name}   \${slice_name}   \${slice_config}   \${publickey}
-
-    [Arguments]   ${nst}   ${vim_name}   ${slice_name}   ${slice_config}   ${publickey}   ${slice_launch_max_wait_time}=6min   ${config_file}=${EMPTY}
-
-    ${slice_launch_max_wait_time}=   Convert Time   ${slice_launch_max_wait_time}   result_format=number
-    ${slice_launch_max_wait_time}=   Evaluate   ${slice_launch_max_wait_time} * ${vim_timeout_multiplier}
-    ${config_attr}   Set Variable If   '${slice_config}'!='${EMPTY}'   --config '${slice_config}'   \
-    ${sshkeys_attr}   Set Variable If   '${publickey}'!='${EMPTY}'   --ssh_keys ${publickey}   \
-    ${config_file_attr}   Set Variable If   '${config_file}'!='${EMPTY}'   --config_file '${config_file}'   \
-
-    ${nsi_id}=   Instantiate Network Slice   ${slice_name}   ${nst}   ${vim_name}   ${config_attr} ${config_file_attr}   ${sshkeys_attr}
-    Log   ${nsi_id}
-
-    WAIT UNTIL KEYWORD SUCCEEDS   ${slice_launch_max_wait_time}   ${slice_launch_pol_time}   Check For Network Slice Instance To Configured   ${slice_name}
-    Check For Network Slice Instance For Failure   ${slice_name}
-    [Return]   ${nsi_id}
-
-
-Instantiate Network Slice
-    [Documentation]   Instantiates a NST and returns an instantiation id (nsi)
-    ...               Parameters:
-    ...                  slice_name: Name of the slice instance
-    ...                  nst: Name of the slice template
-    ...                  vim_name: Name of the VIM entry already in OSM
-    ...                  slice_extra_args: Extra parameters that might require the slice instantiation i.e. configuration attributes
-    ...               Execution example:
-    ...                  \${nsi}=   Instantiate Network Slice   \${slice_name}   \${nst}   \${vim_name}   \${config_attr}
-
-    [Arguments]   ${slice_name}   ${nst}   ${vim_name}   ${slice_extra_args}   ${sshkeys_attr}
-
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm nsi-create --nsi_name ${slice_name} --nst_name ${nst} --vim_account ${vim_name} ${sshkeys_attr} ${slice_extra_args}
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    [Return]   ${stdout}
-
-
-Get Slice Ns List
-    [Documentation]   Retrieves the list of NS in a slice
-    ...               Parameters:
-    ...                  slice_name: Name of the slice instance
-    ...               Execution example:
-    ...                  \@{slice_ns_list}=   Get Slice Ns List   \${slice_name}
-
-    [Arguments]   ${slice_name}
-
-    Should Not Be Empty   ${slice_name}
-    @{ns_list_string}=   Run and Return RC and Output   osm ns-list | grep ${slice_name} | awk '{print $4}' 2>&1
-    # Returns a String of ns_id and needs to be converted into a list
-    @{ns_list} =   Split String   ${ns_list_string}[1]
-    Log List   ${ns_list}
-    [Return]   @{ns_list}
-
-
-Get Slice Ns List Except One
-    [Documentation]   Retrieves the list of NS in a slice removing one from the list. This is done to save time in the tests, avoiding one VNF to ping itself.
-    ...               Parameters:
-    ...                  slice_name: Name of the slice instance
-    ...                  exception_ns: Name of the ns that will not appear in the final list
-    ...               Execution example:
-    ...                  \@{slice_ns_list}=   Get Slice Ns List Except One   \${slice_name}   \${exception_ns}
-
-    [Arguments]   ${slice_name}   ${exception_ns}
-
-    Should Not Be Empty   ${slice_name}
-    Should Not Be Empty   ${exception_ns}
-
-    @{ns_list_string}=   Run and Return RC and Output   osm ns-list | grep ${slice_name} | awk '!/${exception_ns}/' | awk '{print $4}' 2>&1
-    # Returns a String of ns_id and needs to be converted into a list
-    @{ns_list} =   Split String   ${ns_list_string}[1]
-    Log List   ${ns_list}
-    [Return]   @{ns_list}
-
-
-Get Slice Ns Count
-    [Documentation]   Returns the count of all the NS in a slice
-    ...               Parameters:
-    ...                  slice_name: Name of the slice instance
-    ...               Execution example:
-    ...                  \${slice_ns_count}=   Get Slice Ns Count   \${slice_name}
-
-    [Arguments]   ${slice_name}
-
-    Should Not Be Empty   ${slice_name}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm ns-list | grep ${slice_name} | wc -l 2>&1
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    [Return]   ${stdout}
-
-
-Get Slice Vnf Ip Addresses
-    [Documentation]   Retrieves the list of IP addresses that belong to each of the VNFs in the slice
-    ...               Parameters:
-    ...                  slice_name: Name of the slice instance
-    ...               Execution example:
-    ...                  \@{slice_ip_address_list}=   Get Slice Vnf Ip Addresses   \${slice_name}
-
-    [Arguments]   ${slice_name}
-
-    # Get all the ns_id in the slice
-    @{slice_ns_list}   Get Slice Ns List   ${slice_name}
-    Log Many   @{slice_ns_list}
-    @{temp_list}=   Create List
-    # For each ns_id in the list, get all the vnf_id and their IP addresses
-    FOR   ${ns_id}   IN   @{slice_ns_list}
-        Log   ${ns_id}
-        @{vnf_id_list}   Get Ns Vnf List   ${ns_id}
-        # For each vnf_id in the list, get all its IP addresses
-        @{ns_ip_list}   Get Ns Ip List   @{vnf_id_list}
-        @{temp_list}=   Combine Lists   ${temp_list}   ${ns_ip_list}
-    END
-    Log List   ${temp_list}
-    [Return]   @{temp_list}
-
-
-Check For Network Slice Instance To Configured
-    [Documentation]   Verify the slice has been instantiated
-    ...               Parameters:
-    ...                  slice_name: Name of the slice instance
-    ...               Execution example:
-    ...                  Check For Network Slice Instance To Configured   \${slice_name}
-
-    [Arguments]   ${slice_name}
-
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm nsi-list --filter name="${slice_name}"
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    Should Contain Any   ${stdout}   READY   BROKEN   configured
-
-
-Check For Network Slice Instance For Failure
-    [Documentation]   Verify the slice instance is not in failure
-    ...               Parameters:
-    ...                  slice_name: Name of the slice instance
-    ...               Execution example:
-    ...                  Check For Network Slice Instance For Failure   \${slice_name}
-
-    [Arguments]   ${slice_name}
-
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm nsi-list --filter name="${slice_name}"
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    Should Not Contain   ${stdout}   failed
-
-
-Delete NSI
-    [Documentation]   Delete Network Slice Instance (NSI)
-    ...               Parameters:
-    ...                  slice_name: Name of the slice instance
-    ...                  slice_delete_max_wait_time: Delete operation timeout
-    ...               Execution example:
-    ...                  Delete NST   \${slice_name}
-
-    [Arguments]   ${slice_name}   ${slice_delete_max_wait_time}=4min
-
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm nsi-delete ${slice_name}
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-
-    ${slice_delete_max_wait_time}=   Convert Time   ${slice_delete_max_wait_time}   result_format=number
-    ${slice_delete_max_wait_time}=   Evaluate   ${slice_delete_max_wait_time} * ${vim_timeout_multiplier}
-    WAIT UNTIL KEYWORD SUCCEEDS   ${slice_delete_max_wait_time}   ${slice_delete_pol_time}   Check For Network Slice Instance To Be Deleted   ${slice_name}
-
-
-Check For Network Slice Instance To Be Deleted
-    [Documentation]   Verify the slice instance is not present
-    ...               Parameters:
-    ...                  slice_name: Name of the slice instance
-    ...               Execution example:
-    ...                  Check For Network Slice Instance   \${slice_name}
-
-    [Arguments]   ${slice_name}
-
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm nsi-list | awk '{print $2}' | grep ${slice_name}
-    Should Not Be Equal As Strings   ${stdout}   ${slice_name}
-
-
diff --git a/robot-systest/lib/nst_lib.resource b/robot-systest/lib/nst_lib.resource
new file mode 100644 (file)
index 0000000..0bb2e1b
--- /dev/null
@@ -0,0 +1,57 @@
+*** Comments ***
+#   Copyright 2020 Atos
+#
+#   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.
+
+
+*** Settings ***
+Documentation   Library providing keywords for CRUD operations over Network Slice Templates with OSM client.
+Library   OperatingSystem
+
+
+*** Variables ***
+${SUCCESS_RETURN_CODE}   0
+${NST_DELETE_MAX_WAIT_TIME}   1min
+${NST_DELETE_POL_TIME}   15sec
+
+
+*** Keywords ***
+Get NST List
+    [Documentation]   Get the list of Network Slice Templates (NST) and log it.
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm netslice-template-list
+    Log   ${stdout}
+    Log   ${rc}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+
+Create NST
+    [Documentation]   Upload a Network Slice Template (NST) to OSM and return the id.
+    [Arguments]   ${nst}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm netslice-template-create ${nst}
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    RETURN   ${stdout}
+
+Delete NST
+    [Documentation]   Delete a Network Slice Template (NST) from OSM.
+    [Arguments]   ${nst_id}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm netslice-template-delete ${nst_id}
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    Wait Until Keyword Succeeds   ${NST_DELETE_MAX_WAIT_TIME}   ${NST_DELETE_POL_TIME}   Check For NST   ${nst_id}
+
+Check For NST
+    [Documentation]   Check that a Network Slice Template (NST) exists in OSM.
+    [Arguments]   ${nst_id}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm netslice-template-list | awk '{print $2}' | grep ${nst_id}
+    Log   ${rc},${stdout}
+    Should Not Be Equal As Strings   ${stdout}   ${nst_id}
diff --git a/robot-systest/lib/nst_lib.robot b/robot-systest/lib/nst_lib.robot
deleted file mode 100644 (file)
index 6fac729..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-#   Copyright 2020 Atos
-#
-#   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.
-
-*** Variables ***
-${success_return_code}   0
-${ns_launch_max_wait_time}   5min
-${ns_launch_pol_time}   30sec
-${ns_delete_max_wait_time}   1min
-${ns_delete_pol_time}   15sec
-
-*** Keywords ***
-Get NST List
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm netslice-template-list
-    Log   ${stdout}
-    Log   ${rc}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-
-
-Create NST
-    [Arguments]   ${nst}
-
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm netslice-template-create ${nst}
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    [Return]   ${stdout}
-
-
-Delete NST
-    [Arguments]   ${nst_id}
-
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm netslice-template-delete ${nst_id}
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    WAIT UNTIL KEYWORD SUCCEEDS   ${delete_max_wait_time}   ${delete_pol_time}   Check For NST   ${nst_id}
-
-
-Check For NST
-    [Arguments]   ${nst_id}
-
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm netslice-template-list | awk '{print $2}' | grep ${nst_id}
-    Should Not Be Equal As Strings   ${stdout}   ${nst_id}
-
diff --git a/robot-systest/lib/openstack_lib.resource b/robot-systest/lib/openstack_lib.resource
new file mode 100644 (file)
index 0000000..3ad237b
--- /dev/null
@@ -0,0 +1,207 @@
+*** Comments ***
+#   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.
+
+
+*** Settings ***
+Documentation   Library providing keywords to interact with Openstack with openstack client.
+
+Library   OperatingSystem
+Library   String
+
+Resource   ns_lib.resource
+Resource   vnf_lib.resource
+
+
+*** Variables ***
+${SUCCESS_RETURN_CODE}   0
+
+
+*** Keywords ***
+Get Server Flavor ID
+    [Documentation]   Get from Openstack the flavor id of a server/VM passed as argument.
+    [Arguments]   ${server_id}
+    Should Not Be Empty   ${server_id}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   openstack server show ${server_id} | grep flavor | awk 'NR>1{print $1}' RS='(' FS=')'
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    RETURN   ${stdout}
+
+Get Flavor Properties
+    [Documentation]   Get from Openstack the properties of a flavor passed as argument.
+    [Arguments]   ${flavor_id}
+    Should Not Be Empty   ${flavor_id}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   openstack flavor show ${flavor_id} | grep properties | awk -F '|' '{print $3}'
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    RETURN   ${stdout}
+
+Check NS Servers In VIM
+    [Documentation]   Check if the number of servers in Openstack by filtering by NS name is as expected.
+    [Arguments]   ${ns_name}   ${number}
+    Should Not Be Empty   ${ns_name}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   openstack server list | grep ${ns_name} | awk '{print $4}'
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    @{servers}=   Split String   ${stdout}
+    ${n_servers}=   Get Length   ${servers}
+    Should Be Equal As Integers   ${number}   ${n_servers}
+
+Check If Volume Bootable
+    [Documentation]   Check the volume properties and return whether it is bootable or not.
+    [Arguments]   ${volume_id}
+    Should Not Be Empty   ${volume_id}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   openstack volume show ${volume_id} | grep bootable | awk '{print $4}'
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    RETURN   ${stdout}
+
+Get Project Quota
+    [Documentation]   Get a field (ram, cores, ports, etc.) from quota in current project.
+    [Arguments]   ${field}
+    Should Not Be Empty   ${field}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   openstack quota show -f yaml | yq '.[] | select(.Resource=="${field}") | .Limit'
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    RETURN   ${stdout}
+
+Get Server Property
+    [Documentation]   Get a field (flavor, image, volumes_attached, etc.) from a server.
+    [Arguments]   ${server_id}   ${field}
+    Should Not Be Empty   ${server_id}
+    Should Not Be Empty   ${field}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   openstack server show ${server_id} -c ${field} -f value
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    RETURN   ${stdout}
+
+Check VM In Server Group
+    [Documentation]   Check if a given server is included in an Openstack server group
+    [Arguments]   ${server_id}   ${server_group_name}
+    Should Not Be Empty   ${server_group_name}
+    Should Not Be Empty   ${server_id}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   openstack server group show ${server_group_name} -c members -f value
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    Should Contain   ${stdout}   ${server_id}
+
+Set Volume Id
+    [Documentation]   Sets the root volume ID and ordinary volume ID by checking bootable property of volumes
+    [Arguments]   ${volume_match}   ${index}
+    Should Not Be Empty   ${volume_match}   ${index}
+    ${bootable}=   Check If Volume Bootable   ${volume_match}[${index}]
+    IF   '${bootable}'=='true'
+        Set Suite Variable   ${ROOT_VOL_ID}   ${volume_match}[${index}]
+        IF   not ${index}
+            Set Suite Variable   ${ORDINARY_VOL_ID}   ${volume_match}[1]
+        ELSE
+            Set Suite Variable   ${ORDINARY_VOL_ID}   ${volume_match}[0]
+        END
+    END
+
+Get Persistent Volumes Attached To Vm
+    [Documentation]   Sets the root volume ID and ordinary volume ID by checking bootable property of volumes
+    [Arguments]   ${ns_id}
+    Variable Should Exist   ${ns_id}   msg=NS is not available
+    ${vnfs_list}=   Get Ns Vnf List   ${ns_id}
+    ${vim_id}=   Get VNF VIM ID   ${vnfs_list}[0]
+    ${volumes_attached}=   Get Server Property   ${vim_id}   volumes_attached
+    Log   ${volumes_attached}
+    ${stdout}=   Get Regexp Matches   ${volumes_attached}   '([0-9a-f\-]+)'   1
+    Log   ${stdout}
+    RETURN   ${stdout}
+
+Check If Volume Exists
+    [Documentation]   Checks if a volume id exists
+    [Arguments]   ${volume_id}
+    Should Not Be Empty   ${volume_id}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   openstack volume list | grep ${volume_id} | wc -l
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    RETURN   ${stdout}
+
+Delete Volume
+    [Documentation]   Delete a volume by its identifier
+    [Arguments]   ${volume_id}
+    Should Not Be Empty   ${volume_id}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   openstack volume delete ${volume_id}
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    RETURN   ${stdout}
+
+Get Subnet
+    [Documentation]   Get subnet information in JSON format
+    [Arguments]   ${subnet_id}
+    Should Not Be Empty   ${subnet_id}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   openstack subnet show ${subnet_id} -f json
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    RETURN   ${stdout}
+
+Stop Server
+    [Documentation]   Stop a server
+    [Arguments]   ${server_id}
+    Should Not Be Empty   ${server_id}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   openstack server stop ${server_id}
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    RETURN   ${stdout}
+
+Halt Server
+    [Documentation]   Reset a server
+    [Arguments]   ${server_id}
+    Should Not Be Empty   ${server_id}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   openstack server set --state error ${server_id}
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    RETURN   ${stdout}
+
+Delete Server
+    [Documentation]   Delete a server
+    [Arguments]   ${server_id}
+    Should Not Be Empty   ${server_id}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   openstack server delete ${server_id}
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    RETURN   ${stdout}
+
+Create Flavor
+    [Documentation]   Create a Flavor
+    [Arguments]   ${flavor_name}   ${cpu}=1   ${ram}=1024   ${disk}=10
+    Should Not Be Empty   ${flavor_name}
+    ${rc}   ${flavor_id}=   Run And Return Rc And Output   openstack flavor create ${flavor_name} --ram ${ram} --disk ${disk} --vcpus ${cpu} -c id -f value
+    Log   ${flavor_id}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    RETURN   ${flavor_id}
+
+Delete Flavor
+    [Documentation]   Delete a Flavor
+    [Arguments]   ${flavor_id}
+    Should Not Be Empty   ${flavor_id}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   openstack flavor delete ${flavor_id}
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    RETURN   ${stdout}
+
+Openstack Server List
+    [Documentation]   Get the openstack server list
+    [Arguments]   ${ns_name}
+    ${result}=   Run And Return Rc And Output   openstack server list | grep ${ns_name} | awk 'index($0, "ipv6=") {gsub(/,$/, ""); gsub("ipv6=", ""); print $8, $9}'
+    ${rc}=   Get From List   ${result}   0
+    ${Ip}=   Get From List   ${result}   1
+    Log   ${Ip}
+    Should Be Equal As Integers   ${rc}   ${success_return_code}
+    RETURN   ${Ip}
+
+Source Openrc Command
+    [Documentation]   Keyword to source openstack tenant
+    Write   source openrc
diff --git a/robot-systest/lib/openstack_lib.robot b/robot-systest/lib/openstack_lib.robot
deleted file mode 100644 (file)
index bdf49aa..0000000
+++ /dev/null
@@ -1,213 +0,0 @@
-#   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.
-
-*** Variables ***
-${success_return_code}   0
-
-
-*** Keywords ***
-Get Server Flavor ID
-    [Arguments]   ${server_id}
-
-    Should Not Be Empty   ${server_id}
-    ${rc}   ${stdout}=   Run and Return RC and Output   openstack server show ${server_id} | grep flavor | awk 'NR>1{print $1}' RS='(' FS=')'
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    [Return]   ${stdout}
-
-
-Get Flavor Properties
-    [Arguments]   ${flavor_id}
-
-    Should Not Be Empty   ${flavor_id}
-    ${rc}   ${stdout}=   Run and Return RC and Output   openstack flavor show ${flavor_id} | grep properties | awk -F '|' '{print $3}'
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    [Return]   ${stdout}
-
-
-Check NS Servers In VIM
-    [Documentation]   Check if the number of servers in Openstack by filtering by NS name is as expected.
-    [Arguments]   ${ns_name}   ${number}
-
-    Should Not Be Empty   ${ns_name}
-    ${rc}   ${stdout}=   Run and Return RC and Output   openstack server list | grep ${ns_name} | awk '{print $4}'
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    @{servers} =   Split String   ${stdout}
-    ${n_servers}=   Get Length   ${servers}
-    Should Be Equal As Integers   ${number}   ${n_servers}
-
-
-Check If Volume Bootable
-    [Documentation]   Check the volume properties and return whether it is bootable or not.
-    [Arguments]   ${volume_id}
-
-    Should Not Be Empty   ${volume_id}
-    ${rc}   ${stdout}=   Run and Return RC and Output   openstack volume show ${volume_id} | grep bootable | awk '{print $4}'
-    log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    [Return]   ${stdout}
-
-
-Get Project Quota
-    [Documentation]   Get a field (ram, cores, ports, etc.) from quota in current project.
-    [Arguments]   ${field}
-
-    Should Not Be Empty   ${field}
-    ${rc}   ${stdout}=   Run and Return RC and Output   openstack quota show -f yaml | yq '.[] | select(.Resource=="${field}") | .Limit'
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    [Return]   ${stdout}
-
-
-Get Server Property
-    [Documentation]   Get a field (flavor, image, volumes_attached, etc.) from a server.
-    [Arguments]   ${server_id}   ${field}
-
-    Should Not Be Empty   ${server_id}
-    Should Not Be Empty   ${field}
-    ${rc}   ${stdout}=   Run and Return RC and Output   openstack server show ${server_id} -c ${field} -f value
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    [Return]   ${stdout}
-
-
-Check VM In Server Group
-    [Documentation]   Check if a given server is included in an Openstack server group
-    [Arguments]   ${server_id}   ${server_group_name}
-
-    Should Not Be Empty   ${server_group_name}
-    Should Not Be Empty   ${server_id}
-    ${rc}   ${stdout}=   Run and Return RC and Output   openstack server group show ${server_group_name} -c members -f value
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    Should Contain   ${stdout}   ${server_id}
-
-
-Set Volume Id
-    [Documentation]   Sets the root volume ID and ordinary volume ID by checking bootable property of volumes
-    [Arguments]   ${volume_match}   ${index}
-
-    Should Not Be Empty   ${volume_match}   ${index}
-    ${bootable}=   Check If Volume Bootable   ${volume_match}[${index}]
-    Set Suite Variable   ${bootable}
-    IF   '${bootable}'=='true'
-        Set Suite Variable   ${root_vol_id}   ${volume_match}[${index}]
-        IF   ${index}==0
-            Set Suite Variable   ${ordinary_vol_id}   ${volume_match}[1]
-        ELSE
-            Set Suite Variable   ${ordinary_vol_id}   ${volume_match}[0]
-        END
-    END
-
-
-Get Persistent Volumes Attached To Vm
-    [Documentation]   Sets the root volume ID and ordinary volume ID by checking bootable property of volumes
-    [Arguments]   ${ns_id}
-
-    Variable Should Exist   ${ns_id}   msg=NS is not available
-    ${vnfs_list}=   Get Ns Vnf List   ${ns_id}
-    ${vim_id}=   Get VNF VIM ID   ${vnfs_list}[0]
-    ${volumes_attached}=   Get Server Property   ${vim_id}   volumes_attached
-    log   ${volumes_attached}
-    ${stdout}=   Get Regexp Matches   ${volumes_attached}   '([0-9a-f\-]+)'   1
-    log   ${stdout}
-    [Return]   ${stdout}
-
-
-Check If Volume Exists
-    [Documentation]   Checks if a volume id exists
-    [Arguments]   ${volume_id}
-
-    Should Not Be Empty   ${volume_id}
-    ${rc}   ${stdout}=   Run and Return RC and Output   openstack volume list | grep ${volume_id} | wc -l
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    [Return]   ${stdout}
-
-
-Delete Volume
-    [Documentation]   Delete a volume by its identifier
-    [Arguments]   ${volume_id}
-
-    Should Not Be Empty   ${volume_id}
-    ${rc}   ${stdout}=   Run and Return RC and Output   openstack volume delete ${volume_id}
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    [Return]   ${stdout}
-
-
-Get Subnet
-    [Documentation]   Get subnet information in JSON format
-    [Arguments]   ${subnet_id}
-
-    Should Not Be Empty   ${subnet_id}
-    ${rc}   ${stdout}=   Run and Return RC and Output   openstack subnet show ${subnet_id} -f json
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    [Return]   ${stdout}
-
-
-Stop Server
-    [Documentation]   Stop a server
-    [Arguments]   ${server_id}
-
-    Should Not Be Empty   ${server_id}
-    ${rc}   ${stdout}=   Run and Return RC and Output   openstack server stop ${server_id}
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    [Return]   ${stdout}
-
-
-Halt Server
-    [Documentation]   Reset a server
-    [Arguments]   ${server_id}
-
-    Should Not Be Empty   ${server_id}
-    ${rc}   ${stdout}=   Run and Return RC and Output   openstack server set --state error ${server_id}
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    [Return]   ${stdout}
-
-
-Delete Server
-    [Documentation]   Delete a server
-    [Arguments]   ${server_id}
-
-    Should Not Be Empty   ${server_id}
-    ${rc}   ${stdout}=   Run and Return RC and Output   openstack server delete ${server_id}
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    [Return]   ${stdout}
-
-
-Create Flavor
-    [Documentation]   Create a Flavor
-    [Arguments]   ${flavor_name}   ${cpu}=1   ${ram}=1024   ${disk}=10
-
-    Should Not Be Empty   ${flavor_name}
-    ${rc}   ${flavor_id}=   Run and Return RC and Output   openstack flavor create ${flavor_name} --ram ${ram} --disk ${disk} --vcpus ${cpu} -f yaml | yq '.id' | tr -d \\"
-    Log   ${flavor_id}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    [Return]   ${flavor_id}
-
-
-Delete Flavor
-    [Documentation]   Delete a Flavor
-    [Arguments]   ${flavor_id}
-
-    Should Not Be Empty   ${flavor_id}
-    ${rc}   ${stdout}=   Run and Return RC and Output   openstack flavor delete ${flavor_id}
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    [Return]   ${stdout}
diff --git a/robot-systest/lib/package_lib.resource b/robot-systest/lib/package_lib.resource
new file mode 100644 (file)
index 0000000..b563463
--- /dev/null
@@ -0,0 +1,67 @@
+*** Comments ***
+# Copyright ETSI Contributors and Others.
+#
+# 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.
+
+
+*** Settings ***
+Documentation   Library providing keywords for building, validating and uploading tar.gz NS and VNF package files with OSM client.
+Library   String
+Library   OperatingSystem
+
+
+*** Variables ***
+${SUCCESS_RETURN_CODE}   0
+
+
+*** Keywords ***
+Upload Package
+    [Documentation]   Onboards ("creates") a NF Package into OSM.
+    ...               - Parameters:
+    ...                 - pkg: Name (and location) of the NF Package
+    [Arguments]   ${pkg}
+    # Proceeds with the onboarding with the appropriate arguments
+    ${rc}   ${stdout}=   Run And Return Rc And Output   tar -czf ${pkg}.tar.gz -C ${pkg} .
+    Log   ${rc},${stdout}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm upload-package ${pkg}.tar.gz
+    Log   ${rc},${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    RETURN   ${stdout}
+
+Delete Package
+    [Documentation]   Delete a tar.gz package passed as argument from the filesystem.
+    [Arguments]   ${pkg}
+    # Proceeds with the onboarding with the appropriate arguments
+    ${rc}   ${stdout}=   Run And Return Rc And Output   rm ${pkg}.tar.gz
+    Log   ${rc},${stdout}
+
+Package Build
+    [Documentation]   Build the package NS, VNF given the package_folder
+    [Arguments]   ${pkg_folder}   ${skip_charm_build}=${EMPTY}
+    ${skip_charm}=   Set Variable If   "${skip_charm_build}" != "${EMPTY}"   "--skip-charm-build"   ${EMPTY}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm package-build ${pkg_folder} ${skip_charm}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    Should Contain   ${stdout}   Package created
+    ${package}=   Get Line   ${stdout}   -1
+    RETURN   ${package}
+
+Package Validate
+    [Documentation]   Validate descriptors given a base directory
+    [Arguments]   ${pkg_folder}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm package-validate ${pkg_folder} | awk -F\| '$2 !~ /-/ && $4 ~ /OK|ERROR/ {print $4}'
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    Should Contain   ${stdout}   'OK'
+    ${package}=   Get Line   ${stdout}   -1
+    RETURN   ${package}
diff --git a/robot-systest/lib/package_lib.robot b/robot-systest/lib/package_lib.robot
deleted file mode 100644 (file)
index a9d3804..0000000
+++ /dev/null
@@ -1,79 +0,0 @@
-# -*- coding: utf-8 -*-
-
-##
-# Copyright ETSI Contributors and Others.
-#
-# 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.
-##
-
-*** Settings ***
-Library   String
-Library   OperatingSystem
-
-
-*** Variables ***
-${success_return_code}   0
-${delete_max_wait_time}   1min
-${delete_pol_time}   15sec
-
-
-*** Keywords ***
-Upload Package
-    [Documentation]   Onboards ("creates") a NF Package into OSM.
-    ...               - Parameters:
-    ...                 - pkg: Name (and location) of the NF Package
-
-    [Arguments]   ${pkg}
-
-    # Proceedes with the onboarding with the appropriate arguments
-    ${rc}   ${stdout}=   Run and Return RC and Output   tar -czf ${pkg}.tar.gz -C ${pkg} .
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm upload-package ${pkg}.tar.gz
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    [Return]   ${stdout}
-
-
-Delete Package
-    [Arguments]   ${pkg}
-
-    # Proceedes with the onboarding with the appropriate arguments
-    ${rc}   ${stdout}=   Run and Return RC and Output   rm ${pkg}.tar.gz
-
-
-Package Build
-    [Documentation]   Build the package NS, VNF given the package_folder
-
-    [Arguments]   ${pkg_folder}   ${skip_charm_build}=${EMPTY}
-
-    ${skip_charm}   Set Variable If   '${skip_charm_build}'!='${EMPTY}'   --skip-charm-build   \
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm package-build ${pkg_folder} ${skip_charm}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    Should Contain   ${stdout}   Package created
-    ${package}=   Get Line   ${stdout}   -1
-
-    [Return]   ${package}
-
-
-Package Validate
-    [Documentation]   Validate descriptors given a base directory
-
-    [Arguments]   ${pkg_folder}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm package-validate ${pkg_folder} | awk -F\| '$2 !~ /-/ && $4 ~ /OK|ERROR/ {print $4}'
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    Should Contain   ${stdout}   'OK'
-    ${package}=   Get Line   ${stdout}   -1
-
-    [Return]   ${package}
-
diff --git a/robot-systest/lib/project_lib.resource b/robot-systest/lib/project_lib.resource
new file mode 100644 (file)
index 0000000..a46ee61
--- /dev/null
@@ -0,0 +1,125 @@
+*** Comments ***
+#   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.
+
+
+*** Settings ***
+Documentation   Library providing keywords for CRUD operations over projects with OSM client.
+Library   OperatingSystem
+
+
+*** Variables ***
+${SUCCESS_RETURN_CODE}   0
+
+
+*** Keywords ***
+Create Project
+    [Documentation]   Create a project in OSM with the name passed as argument, and return the project id.
+    [Arguments]   ${project_name}
+    Should Not Be Empty   ${project_name}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm project-create ${project_name}
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    RETURN   ${stdout}
+
+Create Project With Quotas
+    [Documentation]   Create a project in OSM with the name and quotas passed as arguments, and return the project id.
+    [Arguments]   ${project_name}   ${project_quotas}
+    Should Not Be Empty   ${project_name}
+    Should Not Be Empty   ${project_quotas}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm project-create ${project_name} --quotas ${project_quotas}
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    RETURN   ${stdout}
+
+Get Project Quotas
+    [Documentation]   Get from OSM a specific quota parameter from the project passed as argument.
+    [Arguments]   ${project_name}   ${quotas_name}
+    Should Not Be Empty   ${project_name}
+    Should Not Be Empty   ${quotas_name}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm project-show ${project_name} | grep '${quotas_name}' | awk -F ',|: ' '{print $2}' | awk '{print $1}'
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    RETURN   ${stdout}
+
+Update Project Quotas
+    [Documentation]   Update in OSM the quotas of a project with the new quotas passed as arguments.
+    [Arguments]   ${project_name}   ${project_quotas}
+    Should Not Be Empty   ${project_name}
+    Should Not Be Empty   ${project_quotas}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm project-update ${project_name} --quotas ${project_quotas}
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+
+Update Project Name
+    [Documentation]   Update in OSM the name of a project with the new name passed as argument.
+    [Arguments]   ${project_name}   ${new_name}
+    Should Not Be Empty   ${project_name}
+    Should Not Be Empty   ${new_name}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm project-update ${project_name} --name ${new_name}
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+
+Check If User Is Assigned To Project
+    [Documentation]   Check in OSM if a user exists in a project passed as argument.
+    [Arguments]   ${user_name}   ${project_name}
+    Should Not Be Empty   ${user_name}
+    Should Not Be Empty   ${project_name}
+    ${rc}   ${stdout}=   Run And Return RC And Output   osm user-show ${user_name} | grep "project_name" | grep "${project_name}"
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+
+Create VNFD In Project
+    [Documentation]   Onboards a VNF package into an OSM project.
+    ...                 Extra parameters (such as 'override') are given to this function in name=value format. These parameters will be appended to the 'osm vnfpkg-create' command with the next syntax: --param_name=param_value
+    [Arguments]   ${project_name}   ${vnfd_pkg}   ${project_user}   ${user_password}   @{optional_parameters}
+    Should Not Be Empty   ${project_name}
+    Should Not Be Empty   ${vnfd_pkg}
+    Should Not Be Empty   ${project_user}
+    Should Not Be Empty   ${user_password}
+    ${osm_pkg_create_command}=   Set Variable   osm --project ${project_name} --user ${project_user} --password ${user_password} vnfpkg-create ${vnfd_pkg}
+    FOR   ${param}   IN   @{optional_parameters}
+        ${match}   ${param_name}   ${param_value}=   Should Match Regexp   ${param}   (.+)=(.+)   msg=Syntax error in optional parameters
+        Log   ${match},${param_name},${param_value}
+        ${osm_pkg_create_command}=   Catenate   ${osm_pkg_create_command}   --${param_name}=${param_value}
+    END
+    ${rc}   ${stdout}=   Run And Return Rc And Output   ${osm_pkg_create_command}
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    RETURN   ${stdout}
+
+Delete VNFD In Project
+    [Documentation]   Deletes a VNF package from an OSM project.
+    [Arguments]   ${project_name}   ${vnfd_pkg}   ${project_user}   ${user_password}
+    Should Not Be Empty   ${project_name}
+    Should Not Be Empty   ${vnfd_pkg}
+    Should Not Be Empty   ${project_user}
+    Should Not Be Empty   ${user_password}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm --project ${project_name} --user ${project_user} --password ${user_password} vnfpkg-delete ${vnfd_pkg}
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+
+Remove User From Project
+    [Documentation]   Remove a specific user from a specific project in OSM.
+    [Arguments]   ${user_name}   ${project_name}
+    Should Not Be Empty   ${user_name}
+    Should Not Be Empty   ${project_name}
+    ${rc}   ${stdout}=   Run And Return RC And Output   osm user-update ${user_name} --remove-project ${project_name}
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+
+Delete Project
+    [Documentation]   Delete from OSM the project passed as argument.
+    [Arguments]   ${project_name}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm project-delete ${project_name}
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
diff --git a/robot-systest/lib/project_lib.robot b/robot-systest/lib/project_lib.robot
deleted file mode 100644 (file)
index 35366e2..0000000
+++ /dev/null
@@ -1,130 +0,0 @@
-#   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.
-
-*** Variables ***
-${success_return_code}   0
-
-
-*** Keywords ***
-Create Project
-    [Arguments]   ${project_name}
-
-    Should Not Be Empty   ${project_name}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm project-create ${project_name}
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    [Return]   ${stdout}
-
-
-Create Project With Quotas
-    [Arguments]   ${project_name}   ${project_quotas}
-
-    Should Not Be Empty   ${project_name}
-    Should Not Be Empty   ${project_quotas}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm project-create ${project_name} --quotas ${project_quotas}
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    [Return]   ${stdout}
-
-
-Get Project Quotas
-    [Arguments]   ${project_name}   ${quotas_name}
-
-    Should Not Be Empty   ${project_name}
-    Should Not Be Empty   ${quotas_name}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm project-show ${project_name} | grep '${quotas_name}' | awk -F ',|: ' '{print $2}' | awk '{print $1}'
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    [Return]   ${stdout}
-
-
-Update Project Quotas
-    [Arguments]   ${project_name}   ${project_quotas}
-
-    Should Not Be Empty   ${project_name}
-    Should Not Be Empty   ${project_quotas}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm project-update ${project_name} --quotas ${project_quotas}
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-
-
-Update Project Name
-    [Arguments]   ${project_name}   ${new_name}
-
-    Should Not Be Empty   ${project_name}
-    Should Not Be Empty   ${new_name}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm project-update ${project_name} --name ${new_name}
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-
-
-Check If User Is Assigned To Project
-    [Arguments]   ${user_name}   ${project_name}
-
-    Should Not Be Empty   ${user_name}
-    Should Not Be Empty   ${project_name}
-    ${rc}   ${stdout}=   Run And Return RC And Output   osm user-show ${user_name} | grep "project_name" | grep "${project_name}"
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-
-
-Create VNFD In Project
-    [Documentation]   Onboards a VNFD package into an OSM project.
-    ...                 Extra parameters (such as 'override') are given to this function in name=value format. These parameters will be appended to the 'osm vnfpkg-create' command with the next syntax: --param_name=param_value
-
-    [Arguments]   ${project_name}   ${vnfd_pkg}   ${project_user}   ${user_password}   @{optional_parameters}
-
-    Should Not Be Empty   ${project_name}
-    Should Not Be Empty   ${vnfd_pkg}
-    Should Not Be Empty   ${project_user}
-    Should Not Be Empty   ${user_password}
-
-    ${osm_pkg_create_command}=   Set Variable   osm --project ${project_name} --user ${project_user} --password ${user_password} vnfpkg-create ${vnfd_pkg}
-    FOR   ${param}   IN   @{optional_parameters}
-        ${match}   ${param_name}   ${param_value} =   Should Match Regexp   ${param}   (.+)=(.+)   msg=Syntax error in optional parameters
-        ${osm_pkg_create_command}=   Catenate   ${osm_pkg_create_command}   --${param_name}=${param_value}
-    END
-
-    ${rc}   ${stdout}=   Run and Return RC and Output   ${osm_pkg_create_command}
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    [Return]   ${stdout}
-
-
-Delete VNFD In Project
-    [Arguments]   ${project_name}   ${vnfd_pkg}   ${project_user}   ${user_password}
-
-    Should Not Be Empty   ${project_name}
-    Should Not Be Empty   ${vnfd_pkg}
-    Should Not Be Empty   ${project_user}
-    Should Not Be Empty   ${user_password}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm --project ${project_name} --user ${project_user} --password ${user_password} vnfpkg-delete ${vnfd_pkg}
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-
-
-Remove User From Project
-    [Arguments]   ${user_name}   ${project_name}
-
-    Should Not Be Empty   ${user_name}
-    Should Not Be Empty   ${project_name}
-    ${rc}   ${stdout}=   Run And Return RC And Output   osm user-update ${user_name} --remove-project ${project_name}
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-
-
-Delete Project
-    [Arguments]   ${project_name}
-
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm project-delete ${project_name}
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
diff --git a/robot-systest/lib/prometheus_lib.resource b/robot-systest/lib/prometheus_lib.resource
new file mode 100644 (file)
index 0000000..be3c120
--- /dev/null
@@ -0,0 +1,77 @@
+*** Comments ***
+#   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.
+
+
+*** Settings ***
+Documentation   Library to obtain metrics from Prometheus.
+
+Library   String
+Library   Collections
+Library   OperatingSystem
+Library   RequestsLibrary
+
+
+*** Variables ***
+${TIMEOUT}   30
+${MAX_RETRIES}   1
+${PROMETHEUS_HOST}   %{PROMETHEUS_HOSTNAME=UNKNOWN}
+${PROMETHEUS_PORT}   %{PROMETHEUS_PORT=9090}
+${PROMETHEUS_USER}   %{PROMETHEUS_USER=""}
+${PROMETHEUS_PASSWORD}   %{PROMETHEUS_PASSWORD=""}
+
+
+*** Keywords ***
+Set Testsuite Prometheus Variables
+    [Documentation]   Set Testsuite Prometheus Variables to be used in subsequent test cases
+
+    IF   ${PROMETHEUS_HOST} == 'UNKNOWN'
+        ${local_prometheus_host}=   Get Environment Variable   OSM_HOSTNAME
+        Set Suite Variable   ${PROMETHEUS_HOST}   ${local_prometheus_host}
+        Set Suite Variable   ${PROMETHEUS_HOST}   9091
+    END
+    Log   ${PROMETHEUS_PORT}
+    Log   ${PROMETHEUS_HOST}
+    Log   ${PROMETHEUS_USER}
+    Log   ${PROMETHEUS_PASSWORD}
+
+Get Metric
+    [Documentation]   Get the instant value of a metric from Prometheus using multiple filter parameters.
+    ...                 The filter parameters are given to this function in key=value format (one argument per key/value pair).
+    ...                 Fails if the metric is not found or has multiple values.
+    ...                 Examples of execution:
+    ...                     \${metric}=   Get Metric   \${prometheus_ip}   \${prometheus_port}   ${prometheus_password}   \${metric}
+    ...                     \${metric}=   Get Metric   \${prometheus_ip}   \${prometheus_port}   ${prometheus_password}   \${metric}   \${param1}=\${value1}   \${param2}=\${value2}
+    [Arguments]   ${prometheus_ip}   ${prometheus_port}   ${prometheus_user}   ${prometheus_password}   ${metric}   @{filter_parameters}
+    ${filter}=   Set Variable   ${EMPTY}
+    FOR   ${param}   IN   @{filter_parameters}
+        ${match}   ${param_name}   ${param_value}=   Should Match Regexp   ${param}   (.+)=(.+)   msg=Syntax error in filter parameters
+        Log   ${match},${param_name},${param_value}
+        ${filter}=   Catenate   SEPARATOR=   ${filter}   ${param_name}="${param_value}",
+    END
+    ${resp}=   Execute Prometheus Instant Query   ${prometheus_ip}   ${prometheus_port}   ${prometheus_user}   ${prometheus_password}   query=${metric}{${filter}}
+    ${result_list}=   Convert To List   ${resp["data"]["result"]}
+    ${results}=   Get Length   ${result_list}
+    Should Not Be Equal As Numbers   0   ${results}   msg=Metric ${metric} not found   values=false
+    Should Be Equal As Integers   1   ${results}   msg=Metric ${metric} with multiple values   values=false
+    RETURN   ${result_list[0]["value"][1]}
+
+Execute Prometheus Instant Query
+    [Documentation]   Execute a Prometheus Instant Query using HTTP API.
+    ...                 Return an inline json with the result of the query.
+    ...                 The requested URL is the next: http://\${prometheus_ip}:\${prometheus_port}/api/v1/query?\${querystring}
+    [Arguments]   ${prometheus_ip}   ${prometheus_port}   ${prometheus_user}   ${prometheus_password}   ${querystring}
+    ${auth}=   IF   '${prometheus_password}' != '${EMPTY}'   Create List   ${prometheus_user}   ${prometheus_password}   ELSE   Set Variable   None
+    Create Session   prometheus   http://${prometheus_ip}:${prometheus_port}   timeout=${TIMEOUT}   max_retries=${MAX_RETRIES}   verify=false   auth=${auth}
+    ${resp}=   GET On Session   prometheus   /api/v1/query?${querystring}   timeout=${TIMEOUT}
+    Status Should Be   200   ${resp}
+    RETURN   ${resp.json()}
diff --git a/robot-systest/lib/prometheus_lib.robot b/robot-systest/lib/prometheus_lib.robot
deleted file mode 100644 (file)
index 5fdda49..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-#   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.
-
-*** Settings ***
-Documentation   Library to obtain metrics from Prometheus.
-
-Library   String
-Library   Collections
-Library   RequestsLibrary
-
-
-*** Variables ***
-${timeout}   30
-${max_retries}   1
-
-
-*** Keywords ***
-Get Metric
-    [Documentation]   Get the instant value of a metric from Prometheus using multiple filter parameters.
-    ...                 The filter parameters are given to this function in key=value format (one argument per key/value pair).
-    ...                 Fails if the metric is not found or has multiple values.
-    ...                 Examples of execution:
-    ...                     \${metric}=   Get Metric   \${prometheus_ip}   \${prometheus_port}   ${prometheus_password}   \${metric}
-    ...                     \${metric}=   Get Metric   \${prometheus_ip}   \${prometheus_port}   ${prometheus_password}   \${metric}   \${param1}=\${value1}   \${param2}=\${value2}
-
-    [Arguments]   ${prometheus_ip}   ${prometheus_port}   ${prometheus_user}   ${prometheus_password}   ${metric}   @{filter_parameters}
-
-    ${filter}=   Set Variable   ${EMPTY}
-    FOR   ${param}   IN   @{filter_parameters}
-        ${match}   ${param_name}   ${param_value} =   Should Match Regexp   ${param}   (.+)=(.+)   msg=Syntax error in filter parameters
-        ${filter}=   Catenate   SEPARATOR=   ${filter}   ${param_name}="${param_value}",
-    END
-    ${resp}=   Execute Prometheus Instant Query   ${prometheus_host}   ${prometheus_port}   ${prometheus_user}   ${prometheus_password}   query=${metric}{${filter}}
-    ${result_list}=   Convert To List   ${resp["data"]["result"]}
-    ${results}=   Get Length   ${result_list}
-    Should Not Be Equal As Numbers   0   ${results}   msg=Metric ${metric} not found   values=false
-    Should Be Equal As Integers   1   ${results}   msg=Metric ${metric} with multiple values   values=false
-    [Return]   ${result_list[0]["value"][1]}
-
-
-Execute Prometheus Instant Query
-    [Documentation]   Execute a Prometheus Instant Query using HTTP API.
-    ...                 Return an inline json with the result of the query.
-    ...                 The requested URL is the next: http://\${prometheus_ip}:\${prometheus_port}/api/v1/query?\${querystring}
-
-    [Arguments]   ${prometheus_ip}   ${prometheus_port}   ${prometheus_user}   ${prometheus_password}   ${querystring}
-    ${auth}=   IF   '${prometheus_password}'!='${EMPTY}'   Create List   ${prometheus_user}   ${prometheus_password}   ELSE   Set Variable   None
-    Create Session   prometheus   http://${prometheus_ip}:${prometheus_port}   timeout=${timeout}   max_retries=${max_retries}   verify=false   auth=${auth}
-    ${resp}=   GET On Session   prometheus   /api/v1/query?${querystring}   timeout=${timeout}
-    Status Should Be   200   ${resp}
-    [Return]   ${resp.json()}
diff --git a/robot-systest/lib/repo_lib.resource b/robot-systest/lib/repo_lib.resource
new file mode 100644 (file)
index 0000000..a339255
--- /dev/null
@@ -0,0 +1,59 @@
+*** Comments ***
+#   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.
+
+
+*** Settings ***
+Documentation   Library to deploy and delete OSM repos.
+
+Library   OperatingSystem
+
+Resource   ../lib/nsd_lib.resource
+
+
+*** Variables ***
+${SUCCESS_RETURN_CODE}   0
+${REPO_DELETE_MAX_WAIT_TIME}   1min
+${REPO_DELETE_POL_TIME}   15sec
+
+
+*** Keywords ***
+Get Repos List
+    [Documentation]   Get the list of repos and log it.
+    ${rc}   ${stdout}=   Run And Return RC And Output   osm repo-list
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+
+Create Repo
+    [Documentation]   Create a repository in OSM with the name and options passed as arguments, and return the repo id.
+    [Arguments]   ${repo_name}   ${repo_uri}   ${repo_type}   ${user}   ${password}   ${additional_options}=""
+    ${user_attr}=   Set Variable If   '${user}'!='${EMPTY}'   --user ${user}   \
+    ${password_attr}=   Set Variable If   '${password}'!='${EMPTY}'   --password ${password}   \
+    ${rc}   ${stdout}=   Run And Return RC And Output   osm repo-add --type ${repo_type} ${user_attr} ${password_attr} ${additional_options} ${repo_name} ${repo_uri}
+    Log   ${rc},${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    RETURN   ${stdout}
+
+Delete Repo
+    [Documentation]   Delete from OSM the repo passed as argument.
+    [Arguments]   ${repo_id}
+    ${rc}   ${stdout}=   Run Keyword And Continue On Failure   Run And Return RC And Output   osm repo-delete ${repo_id}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    Log   ${stdout}
+    WAIT UNTIL KEYWORD SUCCEEDS   ${REPO_DELETE_MAX_WAIT_TIME}   ${REPO_DELETE_POL_TIME}   Check For NSD   ${repo_id}
+
+Check For Repo
+    [Documentation]   Check that a repository exists in OSM.
+    [Arguments]   ${repo_id}
+    ${rc}   ${stdout}=   Run And Return RC And Output   osm repo-list | awk '{print $2}' | grep ${repo_id}
+    Log   ${rc},${stdout}
+    Should Not Be Equal As Strings   ${stdout}   ${repo_id}
diff --git a/robot-systest/lib/rest_lib.resource b/robot-systest/lib/rest_lib.resource
new file mode 100644 (file)
index 0000000..82c95d2
--- /dev/null
@@ -0,0 +1,109 @@
+*** Comments ***
+#   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
+
+
+*** Settings ***
+Documentation   Library with sol003 keywords and variables .
+
+Library   String
+Library   OperatingSystem
+Library   RequestsLibrary
+Library   JsonValidator
+Library   yaml
+Library   JSONLibrary
+
+Resource   ../lib/vim_lib.resource
+
+
+*** Variables ***
+@{SUCCESS_STATUS_CODE_LIST}   200   201   202   204
+${AUTH_TOKEN_URI}   /osm/admin/v1/tokens
+${REST_API_HOST}   ${EMPTY}
+${OSM_USER}   %{OSM_USER=admin}
+${OSM_PASSWORD}   %{OSM_PASSWORD=admin}
+${OSM_PROJECT}   %{OSM_PROJECT=admin}
+
+
+*** Keywords ***
+Get Auth Token
+    [Documentation]   Send a REST POST message to OSM to get an authentication token,
+    ...               and store the authentication token in a suite variable to be used later on.
+    Set REST API Host
+    Create Session   osmhit   ${REST_API_HOST}   disable_warnings=1
+    &{headers}=   Create Dictionary   Content-Type=application/json   Accept=application/json
+    &{data}=   Create Dictionary   username=${OSM_USER}   password=${OSM_PASSWORD}   project-id=${OSM_PROJECT}
+    ${resp}=   Post On Session   osmhit   ${AUTH_TOKEN_URI}   json=${data}   headers=${headers}
+    Log   ${resp}
+    Pass Execution If   ${resp.status_code} in ${SUCCESS_STATUS_CODE_LIST}   Get Auth Token completed
+    Set Suite Variable   ${TOKEN_STATUS_CODE}   ${resp.status_code}
+    ${access_token}=   Get Value From Json   ${resp.json()}   $..id
+    Set Test Variable   ${ACCESS_TOKEN}   ${access_token[0]}
+    Set Test Variable   ${TOKEN_RESPONSE}   ${resp}
+    Sleep   2s
+
+Set Dockerized Host
+    [Documentation]   Set the suite variable REST_API_HOST to be used in this library and the testsuites using it.
+    ...               This method must be used if the tests are run from a container in the same K8s cluster where OSM is running.
+    [Arguments]   ${env_host}
+    Set Suite Variable   ${REST_API_HOST}   https://${env_host}
+
+Set Standalone Host
+    [Documentation]   Set a suite variable REST_API_HOST to be used in this library and the testsuites using it.
+    ...               This method must be used if the tests are run from any place outside the K8s cluster where OSM is running.
+    [Arguments]   ${env_host}
+    Set Suite Variable   ${REST_API_HOST}   https://${env_host}:9999
+
+Read Directory
+    [Documentation]   Read Current Directory and return it
+    ${Directory}=   Replace String   ${CURDIR}   lib   resources
+    ${json_path}=   Set Variable   ${Directory}
+    RETURN   ${json_path}
+
+Post Api Request
+    [Documentation]   Send to OSM a POST API message to OSM to the given uri with the given json data,
+    ...               and save response and status code in suite variables to be used later on.
+    [Arguments]   ${PostApi}   ${json_data}
+    Create Session   APISession   ${REST_API_HOST}
+    &{headers}=   Create Dictionary   Content-Type=application/json   Accept=application/json   Authorization=Bearer ${ACCESS_TOKEN}
+    ${request_response}=   Post On Session   APISession   ${PostApi}   json=${json_data}   headers=${headers}
+    Set Suite Variable   ${REQUEST_RESPONSE}   ${request_response}
+    ${response_statuscode}=   Convert To String   ${request_response.status_code}
+    Set Suite Variable   ${RESPONSE_STATUSCODE}   ${response_statuscode}
+
+Set REST API Host
+    [Documentation]   Set the REST_API_HOST suite variable from OSM_HOSTNAME env variable
+    ${nbi_host}=   Get Environment Variable   OSM_HOSTNAME
+    ${passed}=   Run Keyword And Return Status   Should Contain   ${nbi_host}   :
+    IF   ${passed}
+        Set Dockerized Host   ${nbi_host}
+    ELSE
+        Set Standalone Host   ${nbi_host}
+    END
+
+Get ID
+    [Documentation]   Examine a REQUEST_RESPONSE dictionary as JSON and return the requested key passed as argument.
+    [Arguments]   ${Key}
+    Pass Execution If   ${REQUEST_RESPONSE.status_code} in ${SUCCESS_STATUS_CODE_LIST}   Get Auth Token completed
+    ${id}=   Get Value From Json   ${REQUEST_RESPONSE.json()}   $..${Key}
+    RETURN   ${id[0]}
+
+Get Api Request
+    [Documentation]   Send to OSM a GET API message to OSM to the given uri,
+    ...               and save response and status code in suite variables to be used later on.
+    [Arguments]   ${uri}
+    Create Session   Session   ${REST_API_HOST}
+    &{headers}=   Create Dictionary   Content-Type=application/json   Accept=application/json   Authorization=Bearer ${ACCESS_TOKEN}
+    ${request_response}=   Get On Session   Session   ${uri}   headers=${headers}
+    Set Suite Variable   ${REQUEST_RESPONSE}   ${request_response}
+    ${response_statuscode}=   Convert To String   ${request_response.status_code}
+    Set Suite Variable   ${RESPONSE_STATUSCODE}   ${response_statuscode}
diff --git a/robot-systest/lib/role_lib.resource b/robot-systest/lib/role_lib.resource
new file mode 100644 (file)
index 0000000..1ba3a2d
--- /dev/null
@@ -0,0 +1,73 @@
+*** Comments ***
+#   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.
+
+
+*** Settings ***
+Documentation   Library providing keywords for CRUD operations over roles with OSM client.
+Library   OperatingSystem
+
+
+*** Variables ***
+${SUCCESS_RETURN_CODE}   0
+
+
+*** Keywords ***
+Create Role
+    [Documentation]   Create a role in OSM with the name passed as argument, and return the role id.
+    [Arguments]   ${role_name}
+    Should Not Be Empty   ${role_name}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm role-create ${role_name}
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    RETURN   ${stdout}
+
+Update Role
+    [Documentation]   Update a role in OSM.
+    ...                 The extra parameters (like '--add') are given to this function in name=value format. These parameters will be appended to the 'osm role-update' command with the next syntax: --param_name=param_value
+    ...                 Example of execution:
+    ...                     Update Role   \${role_name}   add='vims: true'
+    [Arguments]   ${role_name}   @{optional_parameters}
+    ${osm_update_command}=   Set Variable   osm role-update ${role_name}
+    FOR   ${param}   IN   @{optional_parameters}
+        ${match}   ${param_name}   ${param_value}=   Should Match Regexp   ${param}   (.+)=(.+)   msg=Syntax error in optional parameters
+        Log   ${match},${param_name},${param_value}
+        ${osm_update_command}=   Catenate   ${osm_update_command}   --${param_name}=${param_value}
+    END
+    ${rc}   ${stdout}=   Run And Return Rc And Output   ${osm_update_command}
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+
+Check If Role Exists
+    [Documentation]   Check if a role exists in OSM.
+    [Arguments]   ${role_name}
+    Should Not Be Empty   ${role_name}
+    ${rc}   ${stdout}=   Run And Return RC And Output   osm role-list | awk 'NR>3 {print $2}' | grep "${role_name}"
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+
+Check If User Has Role
+    [Documentation]   Check if a user has a role in a specific project in OSM.
+    [Arguments]   ${user_name}   ${role_name}   ${project_name}
+    Should Not Be Empty   ${user_name}
+    Should Not Be Empty   ${role_name}
+    Should Not Be Empty   ${project_name}
+    ${rc}   ${stdout}=   Run And Return RC And Output   osm user-show ${user_name} | grep -B1 "role_name" | grep -B1 "${role_name}" | grep "project_name" | grep "${project_name}"
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+
+Delete Role
+    [Documentation]   Delete from OSM the role passed as argument.
+    [Arguments]   ${role_name}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm role-delete ${role_name}
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
diff --git a/robot-systest/lib/role_lib.robot b/robot-systest/lib/role_lib.robot
deleted file mode 100644 (file)
index 984b69a..0000000
+++ /dev/null
@@ -1,71 +0,0 @@
-#   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.
-
-*** Variables ***
-${success_return_code}   0
-
-
-*** Keywords ***
-Create Role
-    [Arguments]   ${role_name}
-
-    Should Not Be Empty   ${role_name}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm role-create ${role_name}
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    [Return]   ${stdout}
-
-
-Update Role
-    [Documentation]   Updates a role in OSM.
-    ...                 The extra parameters (like '--add') are given to this function in name=value format. These parameters will be appended to the 'osm role-update' command with the next syntax: --param_name=param_value
-    ...                 Example of execution:
-    ...                     Update Role   \${role_name}   add='vims: true'
-
-    [Arguments]   ${role_name}   @{optional_parameters}
-
-    ${osm_update_command}=   Set Variable   osm role-update ${role_name}
-    FOR   ${param}   IN   @{optional_parameters}
-        ${match}   ${param_name}   ${param_value} =   Should Match Regexp   ${param}   (.+)=(.+)   msg=Syntax error in optional parameters
-        ${osm_update_command}=   Catenate   ${osm_update_command}   --${param_name}=${param_value}
-    END
-    ${rc}   ${stdout}=   Run and Return RC and Output   ${osm_update_command}
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-
-
-Check If Role Exists
-    [Arguments]   ${role_name}
-
-    Should Not Be Empty   ${role_name}
-    ${rc}   ${stdout}=   Run And Return RC And Output   osm role-list | awk 'NR>3 {print $2}' | grep "${role_name}"
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-
-
-Check If User Has Role
-    [Arguments]   ${user_name}   ${role_name}   ${project_name}
-
-    Should Not Be Empty   ${user_name}
-    Should Not Be Empty   ${role_name}
-    Should Not Be Empty   ${project_name}
-    ${rc}   ${stdout}=   Run And Return RC And Output   osm user-show ${user_name} | grep -B1 "role_name" | grep -B1 "${role_name}" | grep "project_name" | grep "${project_name}"
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-
-
-Delete Role
-    [Arguments]   ${role_name}
-
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm role-delete ${role_name}
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
diff --git a/robot-systest/lib/sdnc_lib.resource b/robot-systest/lib/sdnc_lib.resource
new file mode 100644 (file)
index 0000000..c9cd8c7
--- /dev/null
@@ -0,0 +1,97 @@
+*** Comments ***
+#   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.
+
+
+*** Settings ***
+Documentation   Library to manage SDNCs.
+
+Library   String
+Library   Collections
+Library   OperatingSystem
+
+Resource   ../lib/prometheus_lib.resource
+
+
+*** Variables ***
+${SUCCESS_RETURN_CODE}   0
+${SDNC_DELETE_MAX_WAIT_TIME}   1min
+${SDNC_DELETE_POL_TIME}   15sec
+${SDNC_STATUS_MAX_WAIT_TIME}   6min
+${SDNC_STATUS_POL_TIME}   1min
+
+
+*** Keywords ***
+Create SDNC
+    [Documentation]   Register an SDN Controller in OSM.
+    ...                 The optional parameters (such as 'switch_dpid' or 'ip-address') are given to this function in name=value format. These parameters will be appended to the 'osm sdnc-create' command with the next syntax: --param_name=param_value
+    ...                 Returns the ID of the created SDNC Target.
+    ...                 Example of execution:
+    ...                     \${sdnc_id}=   Create SDNC   \${sdnc_name}   \${sdnc_user}   \${sdnc_password}   \${sdnc_url}   \${sdnc_type}   switch_dpid='{...}'
+    [Arguments]   ${sdnc_name}   ${sdnc_user}   ${sdnc_password}   ${sdnc_url}   ${sdnc_type}   @{optional_parameters}
+    ${osm_sdnc_create_command}=   Set Variable   osm sdnc-create --name ${sdnc_name} --user ${sdnc_user} --password ${sdnc_password} --url ${sdnc_url} --type ${sdnc_type}
+    FOR   ${param}   IN   @{optional_parameters}
+        ${match}   ${param_name}   ${param_value}=   Should Match Regexp   ${param}   (.+)=(.+)   msg=Syntax error in optional parameters
+        Log   ${match},${param_name},${param_value}
+        ${osm_sdnc_create_command}=   Catenate   ${osm_sdnc_create_command}   --${param_name}=${param_value}
+    END
+    ${rc}   ${stdout}=   Run And Return Rc And Output   ${osm_sdnc_create_command}
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    RETURN   ${stdout}
+
+Check For SDNC To Be Deleted
+    [Documentation]   Check if an SDN controller identified by name is not present in OSM.
+    [Arguments]   ${sdnc_name}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm sdnc-list | awk '{print $2}' | grep ${sdnc_name}
+    Log   ${rc},${stdout}
+    Should Not Be Equal As Strings   ${stdout}   ${sdnc_name}
+
+Delete SDNC
+    [Documentation]   Unregister/delete from OSM an SDN controller identified by name.
+    [Arguments]   ${sdnc_name}
+    ${rc}   ${stdout}=   Run Keyword And Continue On Failure   Run And Return Rc And Output   osm sdnc-delete ${sdnc_name}
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}   msg=${stdout}   values=False
+    Wait Until Keyword Succeeds   ${SDNC_DELETE_MAX_WAIT_TIME}   ${SDNC_DELETE_POL_TIME}   Check For SDNC To Be Deleted   ${sdnc_name}
+
+Get SDNC List
+    [Documentation]   Get the list of SDN controllers from OSM and log it.
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm sdnc-list
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+
+Check For SDNC
+    [Documentation]   Check if an SDN Controller identified by name or id exists in OSM and is enabled.
+    [Arguments]   ${sdnc_id}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm sdnc-show ${sdnc_id} | grep -io ENABLED
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+
+Check For SDNC Status
+    [Documentation]   Check in a loop if the value of the metric osm_sdnc_status in Prometheus for the SDN controller is 1 (reachable).
+    [Arguments]   ${sdnc_id}   ${prometheus_host}   ${prometheus_port}   ${prometheus_user}   ${prometheus_password}
+    Wait Until Keyword Succeeds   ${SDNC_STATUS_MAX_WAIT_TIME}   ${SDNC_STATUS_POL_TIME}   Check If SDNC Is Available   ${sdnc_id}   ${prometheus_host}   ${prometheus_port}   ${prometheus_user}   ${prometheus_password}
+
+Get SDNC ID
+    [Documentation]   Check if an SDN controller identified by name exists in OSM, and return the id.
+    [Arguments]   ${sdnc_name}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm sdnc-list | grep " ${sdnc_name} " | awk '{print $4}'
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    Should Not Be Equal As Strings   ${stdout}   ${EMPTY}   msg=SDNC '${sdnc_name}' not found   values=false
+    RETURN   ${stdout}
+
+Check If SDNC Is Available
+    [Documentation]   Check if the value of the metric osm_sdnc_status in Prometheus for the SDN controller is 1 (reachable).
+    [Arguments]   ${sdnc_id}   ${prometheus_host}   ${prometheus_port}   ${prometheus_user}   ${prometheus_password}
+    ${metric}=   Get Metric   ${prometheus_host}   ${prometheus_port}   ${prometheus_user}   ${prometheus_password}   osm_sdnc_status   sdnc_id=${sdnc_id}
+    Should Be Equal As Integers   ${metric}   1   msg=SDNC '${sdnc_id}' is not active   values=false
diff --git a/robot-systest/lib/sdnc_lib.robot b/robot-systest/lib/sdnc_lib.robot
deleted file mode 100644 (file)
index a897675..0000000
+++ /dev/null
@@ -1,101 +0,0 @@
-#   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.
-
-*** Settings ***
-Documentation   Library to manage SDNCs.
-
-Library   String
-Library   Collections
-Library   OperatingSystem
-
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/prometheus_lib.robot
-
-
-*** Variables ***
-${success_return_code}   0
-${delete_max_wait_time}   1min
-${delete_pol_time}   15sec
-${sdnc_status_max_wait_time}   6min
-${sdnc_status_pol_time}   1min
-
-
-*** Keywords ***
-Create SDNC
-    [Documentation]   Creates an SDNC in OSM.
-    ...                 The optional parameters (such as 'switch_dpid' or 'ip-address') are given to this function in name=value format. These parameters will be appended to the 'osm sdnc-create' command with the next syntax: --param_name=param_value
-    ...                 Returns the ID of the created SDNC Target.
-    ...                 Example of execution:
-    ...                     \${sdnc_id}=   Create SDNC   \${sdnc_name}   \${sdnc_user}   \${sdnc_password}   \${sdnc_url}   \${sdnc_type}   switch_dpid='{...}'
-
-    [Arguments]   ${sdnc_name}   ${sdnc_user}   ${sdnc_password}   ${sdnc_url}   ${sdnc_type}   @{optional_parameters}
-
-    ${osm_sdnc_create_command}=   Set Variable   osm sdnc-create --name ${sdnc_name} --user ${sdnc_user} --password ${sdnc_password} --url ${sdnc_url} --type ${sdnc_type}
-    FOR   ${param}   IN   @{optional_parameters}
-        ${match}   ${param_name}   ${param_value} =   Should Match Regexp   ${param}   (.+)=(.+)   msg=Syntax error in optional parameters
-        ${osm_sdnc_create_command}=   Catenate   ${osm_sdnc_create_command}   --${param_name}=${param_value}
-    END
-    ${rc}   ${stdout}=   Run and Return RC and Output   ${osm_sdnc_create_command}
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    [Return]   ${stdout}
-
-
-Check for SDNC To Be Deleted
-    [Arguments]   ${sdnc_name}
-
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm sdnc-list | awk '{print $2}' | grep ${sdnc_name}
-    Should Not Be Equal As Strings   ${stdout}   ${sdnc_name}
-
-
-Delete SDNC
-    [Arguments]   ${sdnc_name}
-
-    ${rc}   ${stdout}=   Run Keyword And Continue On Failure   Run and Return RC and Output   osm sdnc-delete ${sdnc_name}
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}   msg=${stdout}   values=False
-    Wait Until Keyword Succeeds   ${delete_max_wait_time}   ${delete_pol_time}   Check for SDNC To Be Deleted   ${sdnc_name}
-
-
-Get SDNC List
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm sdnc-list
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-
-
-Check for SDNC
-    [Arguments]   ${sdnc_id}
-
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm sdnc-show ${sdnc_id} | grep -io ENABLED
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-
-
-Check for SDNC Status
-    [Arguments]   ${sdnc_id}   ${prometheus_host}   ${prometheus_port}   ${prometheus_user}   ${prometheus_password}
-
-    Wait Until Keyword Succeeds   ${sdnc_status_max_wait_time}   ${sdnc_status_pol_time}   Check If SDNC Is Available   ${sdnc_id}   ${prometheus_host}   ${prometheus_port}   ${prometheus_user}   ${prometheus_password}
-
-
-Get SDNC ID
-    [Arguments]   ${sdnc_name}
-
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm sdnc-list | grep " ${sdnc_name} " | awk '{print $4}'
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    Should Not Be Equal As Strings   ${stdout}   ${EMPTY}   msg=SDNC '${sdnc_name}' not found   values=false
-    [Return]   ${stdout}
-
-
-Check If SDNC Is Available
-    [Arguments]   ${sdnc_id}   ${prometheus_host}   ${prometheus_port}   ${prometheus_user}   ${prometheus_password}
-
-    ${metric}=   Get Metric   ${prometheus_host}   ${prometheus_port}   ${prometheus_user}   ${prometheus_password}   osm_sdnc_status   sdnc_id=${sdnc_id}
-    Should Be Equal As Integers   ${metric}   1   msg=SDNC '${sdnc_id}' is not active   values=false
diff --git a/robot-systest/lib/sol003_common_lib.robot b/robot-systest/lib/sol003_common_lib.robot
deleted file mode 100644 (file)
index d233498..0000000
+++ /dev/null
@@ -1,103 +0,0 @@
-#   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
-
-*** Settings ***
-Documentation   Library with sol003 keywords and variables .
-
-Library   RequestsLibrary
-Library   JsonValidator
-Library   yaml
-Library   JSONLibrary
-Library   String
-Library   OperatingSystem
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/vim_lib.robot
-Variables   %{ROBOT_DEVOPS_FOLDER}/resources/sol003_01-vnf_lifecycle_management.py
-
-*** Variables ***
-@{success_status_code_list}   200   201   202   204
-${descriptor_content_type_gzip}   application/gzip
-${auth_token_uri}   /osm/admin/v1/tokens
-${HOST}   ${EMPTY}
-${vnf_instance_uri}   /osm/vnflcm/v1/vnf_instances
-${vnf_instantiate_uri}   /osm/vnflcm/v1/vnf_instances
-${vnf_instance_lcm_ops}   /osm/vnflcm/v1/vnf_lcm_op_occs
-
-*** Keywords ***
-Get Auth Token
-    [Tags]   auth_token
-    Get Hostname
-    Create Session   osmhit   ${HOST}   disable_warnings=1
-    &{headers}   Create Dictionary   Content-Type=application/json   Accept=application/json
-    &{data}   Create Dictionary   username=${osm_user}   password=${osm_password}   project-id=${osm_project}
-    ${resp}=   Post On Session   osmhit   ${auth_token_uri}   json=${data}   headers=${headers}
-    Log   ${resp}
-    Pass Execution If   ${resp.status_code} in ${success_status_code_list}   Get Auth Token completed
-    Set Suite Variable   ${token_status_code}   ${resp.status_code}
-    ${access_token}=   Get Value From Json   ${resp.json()}   $..id
-    Set Test Variable   ${access_token}   ${access_token[0]}
-    Set Test Variable   ${token_response}   ${resp}
-    sleep   2s
-
-Set Dockerized Host
-    [Arguments]   ${env_host}
-    Set Suite Variable   ${HOST}   https://${env_host}
-
-Set Standalone Host
-    [Arguments]   ${env_host}
-    Set Suite Variable   ${HOST}   https://${env_host}:9999
-
-Read Directory
-    [Documentation]   To Read Current Direct ory
-    ${Directory}=   Replace String   ${CURDIR}   lib   resources/
-    ${json_path}=   Set Variable   ${Directory}
-    [Return]   ${JsonPath}
-
-Post Api Request
-    [Arguments]   ${PostApi}
-    [Documentation]   Keword to Post API Request
-    Create Session   APISession   ${HOST}
-    &{headers}   Create Dictionary   Content-Type=application/json   Accept=application/json   Authorization=Bearer ${access_token}
-    ${request_response}=   Post On Session   APISession   ${PostApi}   json=${updated_json_obj}   headers=${headers}
-    Set Suite Variable   ${request_response}
-    ${response_statuscode}   Convert To String   ${request_response.status_code}
-    Set Suite Variable   ${response_statuscode}
-
-Get HostName
-    [Documentation]   Keyword to get the default osm Hostname
-    ${nbi_host}=   Get Environment Variable   OSM_HOSTNAME
-    ${passed}=   Run Keyword And Return Status   Should Contain   ${nbi_host}   :
-    Run Keyword If   ${passed}   Set Dockerized Host   ${nbi_host}
-    ...    ELSE   Set Standalone Host   ${nbi_host}
-
-Get ID
-    [Arguments]   ${Key}
-    Pass Execution If   ${request_response.status_code} in ${success_status_code_list}   Get Auth Token completed
-    ${id}=   Get Value From Json   ${request_response.json()}   $..${Key}
-    Set Suite Variable   ${value}   ${id[0]}
-    [Return]   ${value}
-
-Update Json Value
-    [Arguments]   ${JsonInput}   ${key}
-    ${json_path}=   Read Directory
-    ${json_obj}=   Load JSON From File   ${json_path}/${JsonInput}
-    ${updated_json_obj}=   JSONLibrary.Update Value To Json   ${json_obj}   $..${key}   ${created_vim_account_id}
-    Set Suite Variable   ${updated_json_obj}
-
-Get Api Request
-    [Arguments]   ${uri}
-    [Documentation]   Keyword to Get API Request
-    Create Session   Session   ${HOST}
-    &{headers}   Create Dictionary   Content-Type=application/json   Accept=application/json   Authorization=Bearer ${access_token}
-    ${request_response}=   Get On Session   Session   ${uri}   headers=${Headers}
-    Set Suite Variable   ${request_response}
-    ${response_statuscode}   Convert To String   ${request_response.status_code}
-    Set Suite Variable   ${response_statuscode}
diff --git a/robot-systest/lib/ssh_lib.resource b/robot-systest/lib/ssh_lib.resource
new file mode 100644 (file)
index 0000000..15d48a6
--- /dev/null
@@ -0,0 +1,102 @@
+*** Comments ***
+#   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.
+
+
+*** Settings ***
+Documentation   Library providing keywords to interact with NF via SSH.
+Library   SSHLibrary
+
+
+*** Keywords ***
+Test SSH Connection
+    [Documentation]   Test the SSH connection to the host with the user and credentials passed as arguments.
+    [Arguments]   ${host}   ${username}   ${password}   ${privatekey}
+    Open Connection   ${host}
+    IF   "${password}" != "${EMPTY}"
+        Login   ${username}   ${password}
+    ELSE
+        Login With Public Key   ${username}   ${privatekey}
+    END
+    Execute Command   hostname
+    Close All Connections
+
+Check If Remote File Exists
+    [Documentation]   Check via SSH if a file exists in in the remote host, using the user and credentials passed as arguments.
+    [Arguments]   ${host}   ${username}   ${password}   ${privatekey}   ${file}
+    Open Connection   ${host}
+    IF   "${password}" != "${EMPTY}"
+        Login   ${username}   ${password}
+    ELSE
+        Login With Public Key   ${username}   ${privatekey}
+    END
+    ${rc}=   Execute Command   ls ${file} >& /dev/null   return_stdout=False   return_rc=True
+    Close All Connections
+    Should Be Equal As Integers   ${rc}   0
+
+Check If Remote Folder Exists
+    [Documentation]   Check via SSH if a folder exists in in the remote host, using the user and credentials passed as arguments.
+    [Arguments]   ${host}   ${username}   ${password}   ${privatekey}   ${folder}
+    Open Connection   ${host}
+    IF   "${password}" != "${EMPTY}"
+        Login   ${username}   ${password}
+    ELSE
+        Login With Public Key   ${username}   ${privatekey}
+    END
+    ${output}=   Execute Command   ls -d ${folder}
+    Close All Connections
+    Should Be Equal As Strings   ${output}   ${folder}
+
+Get Remote File Content
+    [Documentation]   Get via SSH the content of a remote file and return it.
+    [Arguments]   ${host}   ${username}   ${password}   ${privatekey}   ${file}
+    Open Connection   ${host}
+    IF   "${password}" != "${EMPTY}"
+        Login   ${username}   ${password}
+    ELSE
+        Login With Public Key   ${username}   ${privatekey}
+    END
+    ${output}=   Execute Command   cat ${file}
+    Close All Connections
+    RETURN   ${output}
+
+Ping Many
+    [Documentation]   Connect via SSH to a remote host and test ping to a list of IP addresses, passed as argument.
+    [Arguments]   ${host}   ${username}   ${password}   ${privatekey}   @{ip_list}
+    Open Connection   ${host}
+    IF   "${password}" != "${EMPTY}"
+        Login   ${username}   ${password}
+    ELSE
+        Login With Public Key   ${username}   ${privatekey}
+    END
+    FOR   ${ip}   IN   @{ip_list}
+        ${result}=   Execute Command   ping -c 5 -W 1 ${ip} > /dev/null && echo OK   shell=True
+        Log   ${result}
+        Should Contain   ${result}   OK
+    END
+    Close All Connections
+
+Execute Remote Command Check Rc Return Output
+    [Documentation]   Execute via SSH a command in a remote host and, if the command succeeds, return the output.
+    [Arguments]   ${host}   ${username}   ${password}   ${privatekey}   ${command}
+    Open Connection   ${host}
+    IF   "${password}" != "${EMPTY}"
+        Login   ${username}   ${password}
+    ELSE
+        Login With Public Key   ${username}   ${privatekey}
+    END
+    ${stdout}   ${rc}=   Execute Command   ${command}   return_rc=True   return_stdout=True
+    Log   ${rc}
+    Log   ${stdout}
+    Close All Connections
+    Should Be Equal As Integers   ${rc}   0
+    RETURN   ${stdout}
diff --git a/robot-systest/lib/ssh_lib.robot b/robot-systest/lib/ssh_lib.robot
deleted file mode 100644 (file)
index 3e3c00b..0000000
+++ /dev/null
@@ -1,79 +0,0 @@
-#   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.
-
-*** Keywords ***
-Test SSH Connection
-    [Arguments]   ${host}   ${username}   ${password}   ${privatekey}
-
-    Open Connection   ${host}
-    Run Keyword If   '${password}'!='${EMPTY}'   Login   ${username}   ${password}
-    ...   ELSE   Login With Public Key   ${username}   ${privatekey}
-    Execute Command   hostname
-    Close All Connections
-
-Check If remote File Exists
-    [Arguments]   ${host}   ${username}   ${password}   ${privatekey}   ${file}
-
-    Open Connection   ${host}
-    Run Keyword If   '${password}'!='${EMPTY}'   Login   ${username}   ${password}
-    ...   ELSE   Login With Public Key   ${username}   ${privatekey}
-    ${rc}=   Execute Command   ls ${file} >& /dev/null   return_stdout=False   return_rc=True
-    Close All Connections
-    Should Be Equal As Integers   ${rc}   0
-
-Check If Remote Folder Exists
-    [Arguments]   ${host}   ${username}   ${password}   ${privatekey}   ${folder}
-
-    Open Connection   ${host}
-    Run Keyword If   '${password}'!='${EMPTY}'   Login   ${username}   ${password}
-    ...   ELSE   Login With Public Key   ${username}   ${privatekey}
-    ${output}=   Execute Command   ls -d ${folder}
-    Close All Connections
-    Should Be Equal As Strings   ${output}   ${folder}
-
-Get Remote File Content
-    [Arguments]   ${host}   ${username}   ${password}   ${privatekey}   ${file}
-
-    Open Connection   ${host}
-    Run Keyword If   '${password}'!='${EMPTY}'   Login   ${username}   ${password}
-    ...   ELSE   Login With Public Key   ${username}   ${privatekey}
-    ${output}=   Execute Command   cat ${file}
-    Close All Connections
-    [Return]   ${output}
-
-Ping Many
-    [Arguments]   ${host}   ${username}   ${password}   ${privatekey}   @{ip_list}
-
-    Open Connection   ${host}
-    Run Keyword If   '${password}'!='${EMPTY}'   Login   ${username}   ${password}
-    ...   ELSE   Login With Public Key   ${username}   ${privatekey}
-    FOR   ${ip}   IN   @{ip_list}
-        ${result}=   Execute Command   ping -c 5 -W 1 ${ip} > /dev/null && echo OK   shell=True
-        Log   ${result}
-        Should Contain   ${result}   OK
-    END
-    Close All Connections
-
-
-Execute Remote Command Check Rc Return Output
-    [Arguments]   ${host}   ${username}   ${password}   ${privatekey}   ${command}
-
-    Open Connection   ${host}
-    Run Keyword If   '${password}'!='${EMPTY}'   Login   ${username}   ${password}
-    ...   ELSE   Login With Public Key   ${username}   ${privatekey}
-    ${stdout}   ${rc}=   Execute Command   ${command}   return_rc=True   return_stdout=True
-    Log   ${rc}
-    Log   ${stdout}
-    Close All Connections
-    Should Be Equal As Integers   ${rc}   0
-    [Return]   ${stdout}
-
diff --git a/robot-systest/lib/user_lib.resource b/robot-systest/lib/user_lib.resource
new file mode 100644 (file)
index 0000000..8dd7601
--- /dev/null
@@ -0,0 +1,68 @@
+*** Comments ***
+#   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.
+
+
+*** Settings ***
+Documentation   Library providing keywords for CRUD operations over Network Slice Templates with OSM client.
+Library   OperatingSystem
+
+
+*** Variables ***
+${SUCCESS_RETURN_CODE}   0
+
+
+*** Keywords ***
+Create User
+    [Documentation]   Create a user in OSM with the name and password passed as arguments, and return the user id.
+    [Arguments]   ${user_name}   ${user_password}
+    Should Not Be Empty   ${user_name}
+    Should Not Be Empty   ${user_password}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm user-create ${user_name} --password ${user_password}
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    RETURN   ${stdout}
+
+Update User Password
+    [Documentation]   Update the password of a user in OSM.
+    [Arguments]   ${user_name}   ${user_password}   ${user_new_password}
+    Should Not Be Empty   ${user_name}
+    Should Not Be Empty   ${user_password}
+    Should Not Be Empty   ${user_new_password}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm user-update ${user_name} --current-password ${user_password} --new-password ${user_new_password}
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+
+Update User Role
+    [Documentation]   Update the role of a user in a project in OSM.
+    [Arguments]   ${user_name}   ${project_name}   ${role_name}
+    Should Not Be Empty   ${user_name}
+    Should Not Be Empty   ${project_name}
+    Should Not Be Empty   ${role_name}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm user-update --add-project-role '${project_name},${role_name}' ${user_name}
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+
+Check If User Exists
+    [Documentation]   Check if a user exists in OSM.
+    [Arguments]   ${user_name}
+    Should Not Be Empty   ${user_name}
+    ${rc}   ${stdout}=   Run And Return RC And Output   osm user-list | awk 'NR>3 {print $2}' | grep "${user_name}"
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+
+Delete User
+    [Documentation]   Delete from OSM the user passed as argument.
+    [Arguments]   ${user_name}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm user-delete ${user_name}
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
diff --git a/robot-systest/lib/user_lib.robot b/robot-systest/lib/user_lib.robot
deleted file mode 100644 (file)
index b786a9f..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-#   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.
-
-*** Variables ***
-${success_return_code}   0
-
-
-*** Keywords ***
-Create User
-    [Arguments]   ${user_name}   ${user_password}
-
-    Should Not Be Empty   ${user_name}
-    Should Not Be Empty   ${user_password}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm user-create ${user_name} --password ${user_password}
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    [Return]   ${stdout}
-
-
-Update User Role
-    [Arguments]   ${user_name}   ${project_name}   ${role_name}
-
-    Should Not Be Empty   ${user_name}
-    Should Not Be Empty   ${project_name}
-    Should Not Be Empty   ${role_name}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm user-update --add-project-role '${project_name},${role_name}' ${user_name}
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-
-
-Check If User Exists
-    [Arguments]   ${user_name}
-
-    Should Not Be Empty   ${user_name}
-    ${rc}   ${stdout}=   Run And Return RC And Output   osm user-list | awk 'NR>3 {print $2}' | grep "${user_name}"
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-
-
-Delete User
-    [Arguments]   ${user_name}
-
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm user-delete ${user_name}
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
diff --git a/robot-systest/lib/vim_lib.resource b/robot-systest/lib/vim_lib.resource
new file mode 100644 (file)
index 0000000..e46f632
--- /dev/null
@@ -0,0 +1,116 @@
+*** Comments ***
+#   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.
+
+
+*** Settings ***
+Documentation   Library to manage VIM Targets.
+
+Library   String
+Library   Collections
+Library   OperatingSystem
+
+Resource   ../lib/prometheus_lib.resource
+
+
+*** Variables ***
+${SUCCESS_RETURN_CODE}   0
+${VIM_DELETE_MAX_WAIT_TIME}   1min
+${VIM_DELETE_POL_TIME}   15sec
+${VIM_STATUS_MAX_WAIT_TIME}   3min
+${VIM_STATUS_POL_TIME}   15sec
+${VIM_OPSTATE_MAX_WAIT_TIME}   40sec
+${VIM_OPSTATE_POL_TIME}   10sec
+
+
+*** Keywords ***
+Create VIM Target
+    [Documentation]   Register a VIM account in OSM and return the id.
+    ...                 The optional parameters (such as 'config' or 'sdn_controller') are given to this function in name=value format. These parameters will be appended to the 'osm vim-create' command with the next syntax: --param_name=param_value
+    ...                 Return the ID of the created VIM Target.
+    ...                 Example of execution:
+    ...                     \${vim_account_id}=   Create VIM Target   \${vim_name}   \${vim_user}   \${vim_password}   \${vim_auth_url}   \${vim_tenant}   \${vim_account_type}   config='{...}'
+    [Arguments]   ${vim_name}   ${vim_user}   ${vim_password}   ${vim_auth_url}   ${vim_tenant}   ${vim_account_type}   @{optional_parameters}
+    ${osm_vim_create_command}=   Set Variable   osm vim-create --name ${vim_name} --user ${vim_user} --password ${vim_password} --auth_url ${vim_auth_url} --tenant ${vim_tenant} --account_type ${vim_account_type}
+    FOR   ${param}   IN   @{optional_parameters}
+        ${match}   ${param_name}   ${param_value}=   Should Match Regexp   ${param}   (.+)=(.+)   msg=Syntax error in optional parameters
+        Log   ${match},${param_name},${param_value}
+        ${osm_vim_create_command}=   Catenate   ${osm_vim_create_command}   --${param_name}=${param_value}
+    END
+    ${rc}   ${stdout}=   Run And Return Rc And Output   ${osm_vim_create_command}
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    RETURN   ${stdout}
+
+Delete VIM Target
+    [Documentation]   Unregister/delete a VIM account from OSM.
+    [Arguments]   ${vim_name}
+    ${rc}   ${stdout}=   Run Keyword And Continue On Failure   Run And Return Rc And Output   osm vim-delete ${vim_name}
+    Log   ${rc},${stdout}
+    Wait Until Keyword Succeeds   ${VIM_DELETE_MAX_WAIT_TIME}   ${VIM_DELETE_POL_TIME}   Check For VIM Target   ${vim_name}
+
+Get VIM Targets
+    [Documentation]   Get the list of VIM accounts in OSM.
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm vim-list
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+
+Check For VIM Target
+    [Documentation]   Check if a VIM account has been registered in OSM.
+    [Arguments]   ${vim_name}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm vim-list | awk '{print $2}' | grep ${vim_name}
+    Log   ${rc},${stdout}
+    Should Not Be Equal As Strings   ${stdout}   ${vim_name}
+
+Check For VIM Target Metric
+    [Documentation]   Check in a loop if the metric of osm_vim_status is present in Prometheus for the VIM account in OSM.
+    [Arguments]   ${vim_name}   ${prometheus_host}   ${prometheus_port}   ${prometheus_user}   ${prometheus_password}
+    ${vim_account_id}=   Get VIM Target ID   ${vim_name}
+    Wait Until Keyword Succeeds   ${VIM_STATUS_MAX_WAIT_TIME}   ${VIM_STATUS_POL_TIME}   Check If VIM Target Has Metric   ${vim_account_id}   ${prometheus_host}   ${prometheus_port}   ${prometheus_user}   ${prometheus_password}
+
+Check For VIM Target Status
+    [Documentation]   Check in a loop if the value of the metric osm_vim_status in Prometheus for the VIM account is 1 (reachable).
+    [Arguments]   ${vim_name}   ${prometheus_host}   ${prometheus_port}   ${prometheus_user}   ${prometheus_password}
+    ${vim_account_id}=   Get VIM Target ID   ${vim_name}
+    Wait Until Keyword Succeeds   ${VIM_STATUS_MAX_WAIT_TIME}   ${VIM_STATUS_POL_TIME}   Check If VIM Target Is Available   ${vim_account_id}   ${prometheus_host}   ${prometheus_port}   ${prometheus_user}   ${prometheus_password}
+
+Get VIM Target ID
+    [Documentation]   Get from OSM the VIM account id associated to the VIM account name passed as parameter.
+    [Arguments]   ${vim_name}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm vim-list | grep " ${vim_name} " | awk '{print $4}'
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    Should Not Be Equal As Strings   ${stdout}   ${EMPTY}   msg=VIM Target '${vim_name}' not found   values=false
+    RETURN   ${stdout}
+
+Check VIM Target Operational State
+    [Documentation]   Check if the VIM account in OSM is enabled.
+    [Arguments]   ${vim_name}
+    Wait Until Keyword Succeeds   ${VIM_OPSTATE_MAX_WAIT_TIME}   ${VIM_OPSTATE_POL_TIME}   Check If VIM Target Is Enabled   ${vim_name}
+
+Check If VIM Target Is Enabled
+    [Documentation]   Check if the VIM account passed as argument is enabled in OSM (meaning that the RO could reach the VIM account).
+    [Arguments]   ${vim_name}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm vim-list | grep " ${vim_name} " | awk '{print $6}'
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    Should Be Equal As Strings   ${stdout}   ENABLED   msg=VIM Target '${vim_name}' is not enabled   values=false
+
+Check If VIM Target Is Available
+    [Documentation]   Check if the value of the metric osm_vim_status in Prometheus for the VIM account is 1 (reachable).
+    [Arguments]   ${vim_account_id}   ${prometheus_host}   ${prometheus_port}   ${prometheus_user}   ${prometheus_password}
+    ${metric}=   Get Metric   ${prometheus_host}   ${prometheus_port}   ${prometheus_user}   ${prometheus_password}   osm_vim_status   vim_account_id=${vim_account_id}
+    Should Be Equal As Integers   ${metric}   1   msg=VIM Target '${vim_account_id}' is not active   values=false
+
+Check If VIM Target Has Metric
+    [Documentation]   Check if the metric of osm_vim_status is present in Prometheus for the VIM account in OSM.
+    [Arguments]   ${vim_account_id}   ${prometheus_host}   ${prometheus_port}   ${prometheus_user}   ${prometheus_password}
+    ${metric}=   Get Metric   ${prometheus_host}   ${prometheus_port}   ${prometheus_user}   ${prometheus_password}   osm_vim_status   vim_account_id=${vim_account_id}
+    Should Be True   ${metric} <2   msg=VIM Target '${vim_account_id}' has no metric
diff --git a/robot-systest/lib/vim_lib.robot b/robot-systest/lib/vim_lib.robot
deleted file mode 100644 (file)
index c1eaf91..0000000
+++ /dev/null
@@ -1,123 +0,0 @@
-#   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.
-
-*** Settings ***
-Documentation   Library to manage VIM Targets.
-
-Library   String
-Library   Collections
-Library   OperatingSystem
-
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/prometheus_lib.robot
-
-
-*** Variables ***
-${success_return_code}   0
-${delete_max_wait_time}   1min
-${delete_pol_time}   15sec
-${vim_status_max_wait_time}   3min
-${vim_status_pol_time}   15sec
-${vim_opstate_max_wait_time}   40sec
-${vim_opstate_pol_time}   10sec
-
-
-*** Keywords ***
-Create VIM Target
-    [Documentation]   Create a VIM Target in OSM.
-    ...                 The optional parameters (such as 'config' or 'sdn_controller') are given to this function in name=value format. These parameters will be appended to the 'osm vim-create' command with the next syntax: --param_name=param_value
-    ...                 Return the ID of the created VIM Target.
-    ...                 Example of execution:
-    ...                     \${vim_account_id}=   Create VIM Target   \${vim_name}   \${vim_user}   \${vim_password}   \${vim_auth_url}   \${vim_tenant}   \${vim_account_type}   config='{...}'
-
-    [Arguments]   ${vim_name}   ${vim_user}   ${vim_password}   ${vim_auth_url}   ${vim_tenant}   ${vim_account_type}   @{optional_parameters}
-
-    ${osm_vim_create_command}=   Set Variable   osm vim-create --name ${vim_name} --user ${vim_user} --password ${vim_password} --auth_url ${vim_auth_url} --tenant ${vim_tenant} --account_type ${vim_account_type}
-    FOR   ${param}   IN   @{optional_parameters}
-        ${match}   ${param_name}   ${param_value} =   Should Match Regexp   ${param}   (.+)=(.+)   msg=Syntax error in optional parameters
-        ${osm_vim_create_command}=   Catenate   ${osm_vim_create_command}   --${param_name}=${param_value}
-    END
-    ${rc}   ${stdout}=   Run and Return RC and Output   ${osm_vim_create_command}
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    [Return]   ${stdout}
-
-
-Delete VIM Target
-    [Arguments]   ${vim_name}
-
-    ${rc}   ${stdout}=   Run Keyword And Continue On Failure   Run and Return RC and Output   osm vim-delete ${vim_name}
-    Log   ${stdout}
-    Wait Until Keyword Succeeds   ${delete_max_wait_time}   ${delete_pol_time}   Check for VIM Target   ${vim_name}
-
-
-Get VIM Targets
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm vim-list
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-
-
-Check for VIM Target
-    [Arguments]   ${vim_name}
-
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm vim-list | awk '{print $2}' | grep ${vim_name}
-    Should Not Be Equal As Strings   ${stdout}   ${vim_name}
-
-
-Check for VIM Target Metric
-    [Arguments]   ${vim_name}   ${prometheus_host}   ${prometheus_port}   ${prometheus_user}   ${prometheus_password}
-
-    ${vim_account_id}=   Get VIM Target ID   ${vim_name}
-    Wait Until Keyword Succeeds   ${vim_status_max_wait_time}   ${vim_status_pol_time}   Check If VIM Target Has Metric   ${vim_account_id}   ${prometheus_host}   ${prometheus_port}   ${prometheus_user}   ${prometheus_password}
-
-
-Check for VIM Target Status
-    [Arguments]   ${vim_name}   ${prometheus_host}   ${prometheus_port}   ${prometheus_user}   ${prometheus_password}
-
-    ${vim_account_id}=   Get VIM Target ID   ${vim_name}
-    Wait Until Keyword Succeeds   ${vim_status_max_wait_time}   ${vim_status_pol_time}   Check If VIM Target Is Available   ${vim_account_id}   ${prometheus_host}   ${prometheus_port}   ${prometheus_user}   ${prometheus_password}
-
-
-Get VIM Target ID
-    [Arguments]   ${vim_name}
-
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm vim-list | grep " ${vim_name} " | awk '{print $4}'
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    Should Not Be Equal As Strings   ${stdout}   ${EMPTY}   msg=VIM Target '${vim_name}' not found   values=false
-    [Return]   ${stdout}
-
-
-Check VIM Target Operational State
-    [Arguments]   ${vim_name}
-
-    Wait Until Keyword Succeeds   ${vim_opstate_max_wait_time}   ${vim_opstate_pol_time}   Check If VIM Target Is Enabled   ${vim_name}
-
-
-Check If VIM Target Is Enabled
-    [Arguments]   ${vim_name}
-
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm vim-list | grep " ${vim_name} " | awk '{print $6}'
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    Should Be Equal As Strings   ${stdout}   ENABLED   msg=VIM Target '${vim_name}' is not enabled   values=false
-
-
-Check If VIM Target Is Available
-    [Arguments]   ${vim_account_id}   ${prometheus_host}   ${prometheus_port}   ${prometheus_user}   ${prometheus_password}
-
-    ${metric}=   Get Metric   ${prometheus_host}   ${prometheus_port}   ${prometheus_user}   ${prometheus_password}   osm_vim_status   vim_account_id=${vim_account_id}
-    Should Be Equal As Integers   ${metric}   1   msg=VIM Target '${vim_account_id}' is not active   values=false
-
-
-Check If VIM Target Has Metric
-    [Arguments]   ${vim_account_id}   ${prometheus_host}   ${prometheus_port}   ${prometheus_user}   ${prometheus_password}
-
-    ${metric}=   Get Metric   ${prometheus_host}   ${prometheus_port}   ${prometheus_user}   ${prometheus_password}   osm_vim_status   vim_account_id=${vim_account_id}
-    Should Be True   ${metric} <2   msg=VIM Target '${vim_account_id}' has no metric
diff --git a/robot-systest/lib/vnf_lib.resource b/robot-systest/lib/vnf_lib.resource
new file mode 100644 (file)
index 0000000..2700135
--- /dev/null
@@ -0,0 +1,77 @@
+*** Comments ***
+#   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.
+
+
+*** Settings ***
+Documentation   Library providing keywords for CRUD operations over VNF instances with OSM client.
+Library   OperatingSystem
+Library   String
+
+
+*** Variables ***
+${SUCCESS_RETURN_CODE}   0
+
+
+*** Keywords ***
+Get Vnf List
+    [Documentation]   Get the list of VNF instances and return it.
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm vnf-list 2>&1
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    RETURN   ${stdout}
+
+Get VNF VIM ID
+    [Documentation]   Get the identifier of the first VDU of a VNF instance. Useful to get the id when a VNF has a single VDU.
+    [Arguments]   ${vnf_id}
+    Should Not Be Empty   ${vnf_id}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm vnf-show ${vnf_id} --literal | yq -r '.vdur[]."vim-id"'
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    RETURN   ${stdout}
+
+Get VDU List From VNF
+    [Documentation]   Return a list of the VDU instance ids of a VNF instance
+    [Arguments]   ${vnf_id}
+    Should Not Be Empty   ${vnf_id}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm vnf-show ${vnf_id} --literal | yq '.vdur[].id'
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}   msg=${stdout}   values=False
+    @{vdur_ids}=   Split String   ${stdout}
+    RETURN   @{vdur_ids}
+
+Get VDU VIM Id
+    [Documentation]   Return the VIM VM ID for a VDU
+    [Arguments]   ${vnf_id}   ${vdur_id}
+    Should Not Be Empty   ${vnf_id}
+    ${rc}   ${vm_vim_id}=   Run And Return Rc And Output   osm vnf-show ${vnf_id} --literal | yq '.vdur[] | select(.id == "'${vdur_id}'")' | yq -r '."vim-id"'
+    Log   ${vm_vim_id}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}   msg=${vm_vim_id}   values=False
+    RETURN   ${vm_vim_id}
+
+Get Vnf Vdur IPs
+    [Documentation]   Return a list with the IP addresses of the VDU records of a VNF instance.
+    [Arguments]   ${vnf_id}
+    Should Not Be Empty   ${vnf_id}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm vnf-show ${vnf_id} --literal | yq -r '.vdur[].interfaces[]."ip-address"'
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}   msg=${stdout}   values=False
+    @{ip}=   Split String   ${stdout}
+    RETURN   @{ip}
+
+Get Vdu Attribute
+    [Documentation]   Return an attribute from VDU records selected by count_index of a VNF instance.
+    [Arguments]   ${vnf_id}   ${attribute}   ${count_index}=0
+    Should Not Be Empty   ${vnf_id}
+    Should Not Be Empty   ${attribute}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm vnf-show ${vnf_id} --literal | yq '.vdur[] | select(."count-index" == ${count_index})' | yq -r '."${attribute}"'
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}   msg=${stdout}   values=False
+    RETURN   ${stdout}
diff --git a/robot-systest/lib/vnf_lib.robot b/robot-systest/lib/vnf_lib.robot
deleted file mode 100644 (file)
index b3d4aa7..0000000
+++ /dev/null
@@ -1,81 +0,0 @@
-#   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.
-
-*** Variables ***
-${success_return_code}   0
-
-
-*** Keywords ***
-Get Vnf List
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm vnf-list 2>&1
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    [Return]   ${stdout}
-
-
-Get VNF VIM ID
-    [Arguments]   ${vnf_id}
-
-    Should Not Be Empty   ${vnf_id}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm vnf-show ${vnf_id} --literal | grep vim-id | awk '{print $2}'
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    [Return]   ${stdout}
-
-
-Get VDU list from VNF
-    [Documentation]   Return a list of the VDUr ids for a VNF
-
-    [Arguments]   ${vnf_id}
-
-    Should Not Be Empty   ${vnf_id}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm vnf-show ${vnf_id} --literal | yq '.vdur[].id'
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}   msg=${stdout}   values=False
-    @{vdur_ids}=   Split String   ${stdout}
-    [Return]   @{vdur_ids}
-
-
-Get VDU VIM Id
-    [Documentation]   Return the VIM VM ID for a VDU
-
-    [Arguments]   ${vnf_id}   ${vdur_id}
-
-    Should Not Be Empty   ${vnf_id}
-    ${rc}   ${vm_vim_id}=   Run and Return RC and Output   osm vnf-show ${vnf_id} --literal | yq '.vdur[] | select(.id == "'${vdur_id}'")' | yq '."vim-id"' | tr -d \\"
-    Log   ${vm_vim_id}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}   msg=${vm_vim_id}   values=False
-    [Return]   ${vm_vim_id}
-
-
-Get Vnf Vdur IPs
-    [Documentation]   Return a list with the IP addresses of the VDU records of a VNF instance.
-
-    [Arguments]   ${vnf_id}
-
-    Should Not Be Empty   ${vnf_id}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm vnf-show ${vnf_id} --literal | yq '.vdur[].interfaces[]."ip-address"' | tr -d \\"
-    Should Be Equal As Integers   ${rc}   ${success_return_code}   msg=${stdout}   values=False
-    @{ip} =   Split String   ${stdout}
-    [Return]   @{ip}
-
-
-Get Vdu Attribute
-    [Documentation]   Return an attribute from VDU records selected by count_index of a VNF instance.
-
-    [Arguments]   ${vnf_id}   ${attribute}   ${count_index}=0
-
-    Should Not Be Empty   ${vnf_id}
-    Should Not Be Empty   ${attribute}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm vnf-show ${vnf_id} --literal | yq '.vdur[] | select(."count-index" == ${count_index})' | yq '."${attribute}"' | tr -d \\"
-    Should Be Equal As Integers   ${rc}   ${success_return_code}   msg=${stdout}   values=False
-    [Return]   ${stdout}
diff --git a/robot-systest/lib/vnfd_lib.resource b/robot-systest/lib/vnfd_lib.resource
new file mode 100644 (file)
index 0000000..2e4e2a6
--- /dev/null
@@ -0,0 +1,134 @@
+*** Comments ***
+# Copyright 2019 Tech Mahindra Limited
+#
+# 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.
+
+
+*** Settings ***
+Documentation   Library providing keywords for CRUD operations over VNFD / VNF packages with OSM client.
+Library   OperatingSystem
+Library   String
+
+
+*** Variables ***
+${SUCCESS_RETURN_CODE}   0
+${FAILURE_RETURN_CODE}   1
+${VNFD_DELETE_MAX_WAIT_TIME}   1min
+${VNFD_DELETE_POL_TIME}   15sec
+
+
+*** Keywords ***
+Get VNFDs List
+    [Documentation]   Get the list of VNF packages and log it.
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm vnfpkg-list
+    Log   ${stdout}
+    Log   ${rc}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+
+Create VNFD
+    [Documentation]   Onboards ("creates") a NF Package into OSM.
+    ...               - Parameters:
+    ...                 - vnfd_pkg: Name (and location) of the NF Package
+    ...                 - overrides (optional): String with options to override the EPA and/or interface properties of the Package.
+    ...                                        This is very useful to allow to deploy e.g. non-EPA packages in EPA VIMs (or vice-versa).
+    ...                                        Valid strings are the same as in the command. E.g.:
+    ...                                        - `--override-epa`: adds EPA attributes to all VDUs.
+    ...                                        - `--override-nonepa`: removes all EPA attributes from all VDUs.
+    ...                                        - `--override-paravirt`: converts all interfaces to `PARAVIRT`. This one can be combined with
+    ...                                           the others above (e.g. '--override-nonepa --override-paravirt').
+    ...               - Relevant environment variables:
+    ...                  - OVERRIDES: If the environment variable "OVERRIDES" exists, it prevails over the value in the argument.
+    ...                               This is often more convenient to enforce the same behaviour for every test run in a given VIM.
+    [Arguments]   ${vnfd_pkg}   ${overrides}=${EMPTY}
+    # If env variable "OVERRIDES" exists, it prevails over the value in the argument
+    ${overrides}=   Get Environment Variable   OVERRIDES   default=${overrides}
+    # Proceeds with the onboarding with the appropriate arguments
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm vnfpkg-create ${overrides} ${vnfd_pkg}
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    ${lines}=   Get Line Count   ${stdout}
+    ${last}=   Evaluate   ${lines} - 1
+    ${id}=   Get Line   ${stdout}   ${last}
+    RETURN   ${id}
+
+Update VNFD
+    [Documentation]   Onboard ("Update") a NF Package into OSM.
+    ...               - Parameters:
+    ...                 - vnfd_pkg: Name (and location) of the NF Package
+    ...                 - vnfd_name: Name of the existing NF Package
+    [Arguments]   ${vnfd_pkg}   ${vnfd_name}
+    # Proceeds with the onboarding with the appropriate arguments
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm vnfpkg-update --content ${vnfd_pkg} ${vnfd_name}
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    ${lines}=   Get Line Count   ${stdout}
+    ${last}=   Evaluate   ${lines} - 1
+    ${id}=   Get Line   ${stdout}   ${last}
+    RETURN   ${id}
+
+Create VNFD Overriding Fields
+    [Documentation]   Onboards ("creates") a NF Package into OSM.
+    ...               - Parameters:
+    ...                 - vnfd_pkg: Name (and location) of the NF Package
+    ...                 - override_fields: String with options to override fields in descriptor, format: "key1.key2...=value[;key3...=value;...]"
+    ...                 - overrides (optional): String with options to override the EPA and/or interface properties of the Package.
+    ...                                        This is very useful to allow to deploy e.g. non-EPA packages in EPA VIMs (or vice-versa).
+    ...                                        Valid strings are the same as in the command. E.g.:
+    ...                                        - `--override-epa`: adds EPA attributes to all VDUs.
+    ...                                        - `--override-nonepa`: removes all EPA attributes from all VDUs.
+    ...                                        - `--override-paravirt`: converts all interfaces to `PARAVIRT`. This one can be combined with
+    ...                                           the others above (e.g. '--override-nonepa --override-paravirt').
+    ...               - Relevant environment variables:
+    ...                  - OVERRIDES: If the environment variable "OVERRIDES" exists, it prevails over the value in the argument.
+    ...                               This is often more convenient to enforce the same behaviour for every test run in a given VIM.
+    [Arguments]   ${vnfd_pkg}   ${override_fields}   ${overrides}=${EMPTY}
+    # If env variable "OVERRIDES" exists, it prevails over the value in the argument
+    ${overrides}=   Get Environment Variable   OVERRIDES   default=${overrides}
+    # Proceeds with the onboarding with the appropriate arguments
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm vnfpkg-create ${overrides} ${vnfd_pkg} --override '${override_fields}'
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    ${lines}=   Get Line Count   ${stdout}
+    ${last}=   Evaluate   ${lines} - 1
+    ${id}=   Get Line   ${stdout}   ${last}
+    RETURN   ${id}
+
+Delete VNFD
+    [Documentation]   Delete a VNF package from OSM.
+    [Arguments]   ${vnfd_id}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm vnfpkg-delete ${vnfd_id}
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    Wait Until Keyword Succeeds   ${VNFD_DELETE_MAX_WAIT_TIME}   ${VNFD_DELETE_POL_TIME}   Check For VNFD   ${vnfd_id}
+
+Assert Failure Delete VNFD
+    [Documentation]   Deletes a NF Package that cannot be deleted and asserts the failure
+    [Arguments]   ${vnfd_id}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm vnfpkg-delete ${vnfd_id}
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${FAILURE_RETURN_CODE}
+    Should Contain   ${stdout}   409   msg=Expected Conflict   values=False
+    Wait Until Keyword Succeeds   ${VNFD_DELETE_MAX_WAIT_TIME}   ${VNFD_DELETE_POL_TIME}   Check For VNFD   ${vnfd_id}   True
+
+Check For VNFD
+    [Documentation]   Check that a VNF package exists in OSM.
+    [Arguments]   ${vnfd_id}   ${exists}=False
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm vnfpkg-list | awk '{print $2}' | grep ${vnfd_id}
+    Log   ${rc},${stdout}
+    IF   ${exists}
+        Should Be Equal As Strings   ${stdout}   ${vnfd_id}
+    ELSE
+        Should Not Be Equal As Strings   ${stdout}   ${vnfd_id}
+    END
diff --git a/robot-systest/lib/vnfd_lib.robot b/robot-systest/lib/vnfd_lib.robot
deleted file mode 100644 (file)
index 4433a48..0000000
+++ /dev/null
@@ -1,149 +0,0 @@
-# -*- coding: utf-8 -*-
-
-##
-# Copyright 2019 Tech Mahindra Limited
-#
-# 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.
-##
-
-## Change log:
-# 1. Feature 7829: Jayant Madavi, Mrityunjay Yadav : MY00514913@techmahindra.com : 06-sep-2019
-##
-
-*** Settings ***
-Library   String
-
-
-*** Variables ***
-${success_return_code}   0
-${failure_return_code}   1
-${delete_max_wait_time}   1min
-${delete_pol_time}   15sec
-
-
-*** Keywords ***
-Get VNFDs List
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm vnfpkg-list
-    Log   ${stdout}
-    Log   ${rc}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-
-
-Create VNFD
-    [Documentation]   Onboards ("creates") a NF Package into OSM.
-    ...               - Parameters:
-    ...                 - vnfd_pkg: Name (and location) of the NF Package
-    ...                 - overrides (optional): String with options to override the EPA and/or interface properties of the Package.
-    ...                                        This is very useful to allow to deploy e.g. non-EPA packages in EPA VIMs (or vice-versa).
-    ...                                        Valid strings are the same as in the command. E.g.:
-    ...                                        - `--override-epa`: adds EPA attributes to all VDUs.
-    ...                                        - `--override-nonepa`: removes all EPA attributes from all VDUs.
-    ...                                        - `--override-paravirt`: converts all interfaces to `PARAVIRT`. This one can be combined with
-    ...                                           the others above (e.g. '--override-nonepa --override-paravirt').
-    ...               - Relevant environment variables:
-    ...                  - OVERRIDES: If the environment variable "OVERRIDES" exists, it prevails over the value in the argument.
-    ...                               This is often more convenient to enforce the same behaviour for every test run in a given VIM.
-
-    [Arguments]   ${vnfd_pkg}   ${overrides}=${EMPTY}
-
-    # If env variable "OVERRIDES" exists, it prevails over the value in the argument
-    ${overrides}=   Get Environment Variable   OVERRIDES   default=${overrides}
-
-    # Proceedes with the onboarding with the appropriate arguments
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm vnfpkg-create ${overrides} ${vnfd_pkg}
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    ${lines}=   Get Line Count   ${stdout}
-    ${last}=   Evaluate   ${lines} - 1
-    ${id}=   Get Line   ${stdout}   ${last}
-    [Return]   ${id}
-
-
-Update VNFD
-    [Documentation]   Onboards ("Updates") a NF Package into OSM.
-    ...               - Parameters:
-    ...                 - vnfd_pkg: Name (and location) of the NF Package
-    ...                 - vnfd_name: Name of the existing NF Package
-
-    [Arguments]   ${vnfd_pkg}   ${vnfd_name}
-
-    # Proceedes with the onboarding with the appropriate arguments
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm vnfpkg-update --content ${vnfd_pkg} ${vnfd_name}
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    ${lines}=   Get Line Count   ${stdout}
-    ${last}=   Evaluate   ${lines} - 1
-    ${id}=   Get Line   ${stdout}   ${last}
-    [Return]   ${id}
-
-
-Create VNFD Overriding Fields
-    [Documentation]   Onboards ("creates") a NF Package into OSM.
-    ...               - Parameters:
-    ...                 - vnfd_pkg: Name (and location) of the NF Package
-    ...                 - override_fields: String with options to override fields in descriptor, format: "key1.key2...=value[;key3...=value;...]"
-    ...                 - overrides (optional): String with options to override the EPA and/or interface properties of the Package.
-    ...                                        This is very useful to allow to deploy e.g. non-EPA packages in EPA VIMs (or vice-versa).
-    ...                                        Valid strings are the same as in the command. E.g.:
-    ...                                        - `--override-epa`: adds EPA attributes to all VDUs.
-    ...                                        - `--override-nonepa`: removes all EPA attributes from all VDUs.
-    ...                                        - `--override-paravirt`: converts all interfaces to `PARAVIRT`. This one can be combined with
-    ...                                           the others above (e.g. '--override-nonepa --override-paravirt').
-    ...               - Relevant environment variables:
-    ...                  - OVERRIDES: If the environment variable "OVERRIDES" exists, it prevails over the value in the argument.
-    ...                               This is often more convenient to enforce the same behaviour for every test run in a given VIM.
-
-    [Arguments]   ${vnfd_pkg}   ${override_fields}   ${overrides}=${EMPTY}
-
-    # If env variable "OVERRIDES" exists, it prevails over the value in the argument
-    ${overrides}=   Get Environment Variable   OVERRIDES   default=${overrides}
-
-    # Proceedes with the onboarding with the appropriate arguments
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm vnfpkg-create ${overrides} ${vnfd_pkg} --override '${override_fields}'
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    ${lines}=   Get Line Count   ${stdout}
-    ${last}=   Evaluate   ${lines} - 1
-    ${id}=   Get Line   ${stdout}   ${last}
-    [Return]   ${id}
-
-
-Delete VNFD
-    [Arguments]   ${vnfd_id}
-
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm vnfpkg-delete ${vnfd_id}
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    WAIT UNTIL KEYWORD SUCCEEDS   ${delete_max_wait_time}   ${delete_pol_time}   Check For VNFD   ${vnfd_id}
-
-
-Assert Failure Delete VNFD
-    [Documentation]   Deletes a NF Package that cannot be deleted and asserts the failure
-    [Arguments]   ${vnfd_id}
-
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm vnfpkg-delete ${vnfd_id}
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${failure_return_code}
-    Should Contain   ${stdout}   409   msg=Expected Conflict   values=False
-    WAIT UNTIL KEYWORD SUCCEEDS   ${delete_max_wait_time}   ${delete_pol_time}   Check For VNFD   ${vnfd_id}   True
-
-
-Check For VNFD
-    [Arguments]   ${vnfd_id}   ${exists}=False
-
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm vnfpkg-list | awk '{print $2}' | grep ${vnfd_id}
-    Run Keyword If   ${exists}   Should Be Equal As Strings   ${stdout}   ${vnfd_id}
-    ...   ELSE   Should Not Be Equal As Strings   ${stdout}   ${vnfd_id}
-
index 101f3d5..2e3f95b 100644 (file)
 #   limitations under the License.
 
 import os
-from pathlib import Path
 import yaml
-from common_helpers import get_prometheus_info
+from get_clouds_yaml_info import get_values_from_cloud, get_vim_values
 
 
-# Prometheus host and port
-(
-    prometheus_host,
-    prometheus_port,
-    prometheus_user,
-    prometheus_password,
-) = get_prometheus_info()
+# Variables to be used by the testsuite
+VIM_ACCOUNT_TYPE = ""
+VIM_NAME_PREFIX = ""
+VIM_USER = ""
+VIM_PASSWORD = ""
+VIM_AUTH_URL = ""
+VIM_TENANT = ""
+VIM_CONFIG = ""
 
 # VIM configuration
 cloud_type = os.environ.get("CLOUD_TYPE", "openstack")
 if cloud_type == "openstack":
     # Openstack VIM
-    vim_account_type = "openstack"
-    vim_name_prefix = "basic01"
+    VIM_ACCOUNT_TYPE = "openstack"
+    VIM_NAME_PREFIX = "basic01"
     # Get credentias from Openstack Clouds file
-    os_cloud = os.environ.get("OS_CLOUD")
-    clouds_file_paths = [
-        "./clouds.yaml",
-        str(Path.home()) + "/.config/openstack/clouds.yaml",
-        "/etc/openstack/clouds.yaml",
-    ]
-    for path in clouds_file_paths:
-        clouds_file_path = Path(path)
-        if clouds_file_path.exists():
-            break
-    if not clouds_file_path.exists():
-        raise Exception("Openstack clouds file not found")
-    with clouds_file_path.open() as clouds_file:
-        clouds = yaml.safe_load(clouds_file)
-        if os_cloud not in clouds["clouds"]:
-            raise Exception("Openstack cloud '" + os_cloud + "' not found")
-        cloud = clouds["clouds"][os_cloud]
-        if "username" not in cloud["auth"]:
-            raise Exception("Username not found in Openstack cloud '" + os_cloud + "'")
-        vim_user = cloud["auth"]["username"]
-        if "password" not in cloud["auth"]:
-            raise Exception("Password not found in Openstack cloud '" + os_cloud + "'")
-        vim_password = cloud["auth"]["password"]
-        if "auth_url" not in cloud["auth"]:
-            raise Exception("Auth url not found in Openstack cloud '" + os_cloud + "'")
-        vim_auth_url = cloud["auth"]["auth_url"]
-        if "project_name" not in cloud["auth"]:
-            raise Exception(
-                "Project name not found in Openstack cloud '" + os_cloud + "'"
-            )
-        vim_tenant = cloud["auth"]["project_name"]
-        vim_user_domain_name = (
-            cloud["auth"]["user_domain_name"]
-            if "user_domain_name" in cloud["auth"]
-            else None
-        )
-        vim_project_domain_name = (
-            cloud["auth"]["project_domain_name"]
-            if "project_domain_name" in cloud["auth"]
-            else None
-        )
-        vim_insecure = True if "verify" in cloud and not cloud["verify"] else None
-
+    cloud, os_cloud = get_values_from_cloud()
+    (
+        VIM_USER,
+        VIM_PASSWORD,
+        VIM_AUTH_URL,
+        VIM_TENANT,
+        vim_user_domain_name,
+        vim_project_domain_name,
+        vim_insecure,
+    ) = get_vim_values(cloud, os_cloud)
     # Extra config
     vim_config_dict = {}
     vim_config_dict["vim_network_name"] = os.environ.get("VIM_MGMT_NET")
@@ -83,7 +50,7 @@ if cloud_type == "openstack":
         vim_config_dict["user_domain_name"] = vim_user_domain_name
     if vim_insecure:
         vim_config_dict["insecure"] = True
-    vim_config = "'{}'".format(
+    VIM_CONFIG = "'{}'".format(
         yaml.safe_dump(vim_config_dict, default_flow_style=True, width=10000).rstrip(
             "\r\n"
         )
@@ -91,12 +58,12 @@ if cloud_type == "openstack":
 
 elif cloud_type == "azure":
     # Azure VIM
-    vim_account_type = "azure"
-    vim_name_prefix = "basic01"
-    vim_auth_url = "http://www.azure.com"
-    vim_user = os.environ.get("AZURE_CLIENT_ID")
-    vim_password = os.environ.get("AZURE_SECRET")
-    vim_tenant = os.environ.get("AZURE_TENANT")
+    VIM_ACCOUNT_TYPE = "azure"
+    VIM_NAME_PREFIX = "basic01"
+    VIM_AUTH_URL = "http://www.azure.com"
+    VIM_USER = os.environ.get("AZURE_CLIENT_ID")
+    VIM_PASSWORD = os.environ.get("AZURE_SECRET")
+    VIM_TENANT = os.environ.get("AZURE_TENANT")
 
     # Extra config
     vim_config_dict = {}
@@ -110,7 +77,7 @@ elif cloud_type == "azure":
         vim_config_dict["vnet_name"] = os.environ.get("VNET_NAME")
     if "AZURE_FLAVORS_PATTERN" in os.environ:
         vim_config_dict["flavors_pattern"] = os.environ.get("AZURE_FLAVORS_PATTERN")
-    vim_config = "'{}'".format(
+    VIM_CONFIG = "'{}'".format(
         yaml.safe_dump(vim_config_dict, default_flow_style=True, width=10000).rstrip(
             "\r\n"
         )
index b35ed87..20b7748 100644 (file)
 #   limitations under the License.
 
 import os
-from pathlib import Path
 import yaml
+from get_clouds_yaml_info import get_values_from_cloud, get_vim_values
 
-from common_helpers import get_prometheus_info
 
-
-# Prometheus host and port
-(
-    prometheus_host,
-    prometheus_port,
-    prometheus_user,
-    prometheus_password,
-) = get_prometheus_info()
-
-# VIM Configuration
-vim_account_type = "openstack"
-vim_name = "basic_08_vim_test"
+# Variables to be used by the testsuite
+VIM_ACCOUNT_TYPE = "openstack"
+VIM_NAME = "basic_08_vim_test"
+VIM_USER = ""
+VIM_PASSWORD = ""
+VIM_AUTH_URL = ""
+VIM_TENANT = ""
+VIM_CONFIG = ""
 
 # Get credentials from Openstack clouds file
-os_cloud = os.environ.get("OS_CLOUD")
-clouds_file_paths = [
-    "./clouds.yaml",
-    str(Path.home()) + "/.config/openstack/clouds.yaml",
-    "/etc/openstack/clouds.yaml",
-]
-for path in clouds_file_paths:
-    clouds_file_path = Path(path)
-    if clouds_file_path.exists():
-        break
-if not clouds_file_path.exists():
-    raise Exception("Openstack clouds file not found")
-with clouds_file_path.open() as clouds_file:
-    clouds = yaml.safe_load(clouds_file)
-    if os_cloud not in clouds["clouds"]:
-        raise Exception("Openstack cloud '" + os_cloud + "' not found")
-    cloud = clouds["clouds"][os_cloud]
-    if "username" not in cloud["auth"]:
-        raise Exception("Username not found in Openstack cloud '" + os_cloud + "'")
-    vim_user = cloud["auth"]["username"]
-    if "password" not in cloud["auth"]:
-        raise Exception("Password not found in Openstack cloud '" + os_cloud + "'")
-    vim_password = cloud["auth"]["password"]
-    if "auth_url" not in cloud["auth"]:
-        raise Exception("Auth url not found in Openstack cloud '" + os_cloud + "'")
-    vim_auth_url = cloud["auth"]["auth_url"]
-    if "project_name" not in cloud["auth"]:
-        raise Exception("Project name not found in Openstack cloud '" + os_cloud + "'")
-    vim_tenant = cloud["auth"]["project_name"]
-    vim_user_domain_name = (
-        cloud["auth"]["user_domain_name"]
-        if "user_domain_name" in cloud["auth"]
-        else None
-    )
-    vim_project_domain_name = (
-        cloud["auth"]["project_domain_name"]
-        if "project_domain_name" in cloud["auth"]
-        else None
-    )
-    vim_insecure = True if "verify" in cloud and not cloud["verify"] else None
+cloud, os_cloud = get_values_from_cloud()
+(
+    VIM_USER,
+    VIM_PASSWORD,
+    VIM_AUTH_URL,
+    VIM_TENANT,
+    vim_user_domain_name,
+    vim_project_domain_name,
+    vim_insecure,
+) = get_vim_values(cloud, os_cloud)
 
 # Extra VIM config
 vim_config_dict = {}
@@ -82,20 +47,6 @@ if vim_insecure:
     vim_config_dict["insecure"] = True
 vim_config_dict["disable_network_port_security"] = True
 vim_config_dict["management_network_name"] = os.environ.get("VIM_MGMT_NET")
-vim_config = "'{}'".format(
+VIM_CONFIG = "'{}'".format(
     yaml.safe_dump(vim_config_dict, default_flow_style=True, width=10000).rstrip("\r\n")
 )
-
-# Get ${HOME} from local machine
-home = str(Path.home())
-# NS and VNF descriptor package folder
-vnfd_pkg = "hackfest_multivdu_vnf"
-nsd_pkg = "hackfest_multivdu_ns"
-# NS and VNF descriptor id
-vnfd_name = "hackfest_multivdu-vnf"
-nsd_name = "hackfest_multivdu-ns"
-# NS instance name
-ns_name = "basic_08_disable_port_security_network_level_test"
-# SSH keys to be used
-publickey = home + "/.ssh/id_rsa.pub"
-privatekey = home + "/.ssh/id_rsa"
diff --git a/robot-systest/resources/basic_32-volume_with_different_az.py b/robot-systest/resources/basic_32-volume_with_different_az.py
new file mode 100644 (file)
index 0000000..5c0a1f6
--- /dev/null
@@ -0,0 +1,54 @@
+#   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.
+
+import os
+import yaml
+from get_clouds_yaml_info import get_values_from_cloud, get_vim_values
+
+
+# Variables to be used by the testsuite
+VIM_ACCOUNT_TYPE = "openstack"
+VIM_NAME = "basic_08_vim_test"
+VIM_USER = ""
+VIM_PASSWORD = ""
+VIM_AUTH_URL = ""
+VIM_TENANT = ""
+VIM_CONFIG = ""
+
+# VIM configuration
+cloud_type = os.environ.get("CLOUD_TYPE", "openstack")
+if cloud_type == "openstack":
+    # Openstack VIM
+    VIM_ACCOUNT_TYPE = "openstack"
+    vim_name_prefix = "basic32"
+    # Get credentias from Openstack Clouds file
+    cloud, os_cloud = get_values_from_cloud()
+    (
+        VIM_USER,
+        VIM_PASSWORD,
+        VIM_AUTH_URL,
+        VIM_TENANT,
+        vim_user_domain_name,
+        vim_project_domain_name,
+        vim_insecure,
+    ) = get_vim_values(cloud, os_cloud)
+
+    # Availability Zone config
+    vim_config_dict = {"storage_availability_zone": "storage_az"}
+    VIM_CONFIG = "'{}'".format(
+        yaml.safe_dump(vim_config_dict, default_flow_style=True, width=10000).rstrip(
+            "\r\n"
+        )
+    )
+
+else:
+    raise Exception("VIM type not supported: '" + cloud_type + "'")
diff --git a/robot-systest/resources/common_helpers.py b/robot-systest/resources/common_helpers.py
deleted file mode 100644 (file)
index 3753555..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-#   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.
-import os
-
-
-def get_prometheus_info():
-    if os.environ.get("PROMETHEUS_HOSTNAME", False):
-        prometheus_host = os.environ.get("PROMETHEUS_HOSTNAME")
-        prometheus_port = os.environ.get("PROMETHEUS_PORT", 9090)
-    else:
-        prometheus_host = os.environ.get("OSM_HOSTNAME")
-        prometheus_port = os.environ.get("PROMETHEUS_PORT", 9091)
-    prometheus_user = os.environ.get("PROMETHEUS_USER", "")
-    prometheus_password = os.environ.get("PROMETHEUS_PASSWORD", "")
-    return prometheus_host, prometheus_port, prometheus_user, prometheus_password
-
-
-def get_osm_info():
-    osm_user = os.environ.get("OSM_USER", "admin")
-    osm_password = os.environ.get("OSM_PASSWORD", "admin")
-    osm_project = os.environ.get("OSM_PROJECT", "admin")
-    return osm_user, osm_password, osm_project
diff --git a/robot-systest/resources/epa_03-crud_operations_on_sdnc_data.py b/robot-systest/resources/epa_03-crud_operations_on_sdnc_data.py
deleted file mode 100644 (file)
index c11054a..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-#   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.
-
-import os
-
-from common_helpers import get_prometheus_info
-
-
-# Prometheus host and port
-(
-    prometheus_host,
-    prometheus_port,
-    prometheus_user,
-    prometheus_password,
-) = get_prometheus_info()
-
-
-# SDNC Configuration
-sdnc_name = "epa_03"
-sdnc_user = os.environ.get("SDNC_USER")
-if not sdnc_user:
-    raise Exception("'SDNC_USER' environment variable not found")
-sdnc_password = os.environ.get("SDNC_PASSWORD")
-if not sdnc_password:
-    raise Exception("'SDNC_PASSWORD' environment variable not found")
-sdnc_url = os.environ.get("SDNC_URL")
-if not sdnc_url:
-    raise Exception("'SDNC_URL' environment variable not found")
-sdnc_type = os.environ.get("SDNC_TYPE")
-if not sdnc_type:
-    raise Exception("'SDNC_TYPE' environment variable not found")
diff --git a/robot-systest/resources/get_clouds_yaml_info.py b/robot-systest/resources/get_clouds_yaml_info.py
new file mode 100644 (file)
index 0000000..f921a8f
--- /dev/null
@@ -0,0 +1,71 @@
+#   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.
+
+import os
+from pathlib import Path
+import yaml
+
+
+def get_values_from_cloud():
+    os_cloud = os.environ.get("OS_CLOUD")
+    clouds_file_paths = [
+        "./clouds.yaml",
+        str(Path.home()) + "/.config/openstack/clouds.yaml",
+        "/etc/openstack/clouds.yaml",
+    ]
+    for path in clouds_file_paths:
+        clouds_file_path = Path(path)
+        if clouds_file_path.exists():
+            break
+    if not clouds_file_path.exists():
+        raise Exception("Openstack clouds file not found")
+    with clouds_file_path.open() as clouds_file:
+        clouds = yaml.safe_load(clouds_file)
+        if os_cloud not in clouds["clouds"]:
+            raise Exception("Openstack cloud '" + os_cloud + "' not found")
+        cloud = clouds["clouds"][os_cloud]
+    return cloud, os_cloud
+
+
+def get_vim_values(cloud, os_cloud):
+    if "username" not in cloud["auth"]:
+        raise Exception("Username not found in Openstack cloud '" + os_cloud + "'")
+    vim_user = cloud["auth"]["username"]
+    if "password" not in cloud["auth"]:
+        raise Exception("Password not found in Openstack cloud '" + os_cloud + "'")
+    vim_password = cloud["auth"]["password"]
+    if "auth_url" not in cloud["auth"]:
+        raise Exception("Auth url not found in Openstack cloud '" + os_cloud + "'")
+    vim_auth_url = cloud["auth"]["auth_url"]
+    if "project_name" not in cloud["auth"]:
+        raise Exception("Project name not found in Openstack cloud '" + os_cloud + "'")
+    vim_tenant = cloud["auth"]["project_name"]
+    vim_user_domain_name = (
+        cloud["auth"]["user_domain_name"]
+        if "user_domain_name" in cloud["auth"]
+        else None
+    )
+    vim_project_domain_name = (
+        cloud["auth"]["project_domain_name"]
+        if "project_domain_name" in cloud["auth"]
+        else None
+    )
+    vim_insecure = True if "verify" in cloud and not cloud["verify"] else None
+    return (
+        vim_user,
+        vim_password,
+        vim_auth_url,
+        vim_tenant,
+        vim_user_domain_name,
+        vim_project_domain_name,
+        vim_insecure,
+    )
diff --git a/robot-systest/resources/sa_01-vnf_with_vim_metrics_data.py b/robot-systest/resources/sa_01-vnf_with_vim_metrics_data.py
deleted file mode 100644 (file)
index a7a3456..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-#   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.
-
-from common_helpers import get_prometheus_info
-
-
-# Prometheus host and port
-(
-    prometheus_host,
-    prometheus_port,
-    prometheus_user,
-    prometheus_password,
-) = get_prometheus_info()
diff --git a/robot-systest/resources/sa_02-vnf_with_vim_metrics_and_autoscaling_data.py b/robot-systest/resources/sa_02-vnf_with_vim_metrics_and_autoscaling_data.py
deleted file mode 100644 (file)
index a7a3456..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-#   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.
-
-from common_helpers import get_prometheus_info
-
-
-# Prometheus host and port
-(
-    prometheus_host,
-    prometheus_port,
-    prometheus_user,
-    prometheus_password,
-) = get_prometheus_info()
diff --git a/robot-systest/resources/sa_07-alarms_from_sa-related_vnfs_data.py b/robot-systest/resources/sa_07-alarms_from_sa-related_vnfs_data.py
deleted file mode 100644 (file)
index a7a3456..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-#   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.
-
-from common_helpers import get_prometheus_info
-
-
-# Prometheus host and port
-(
-    prometheus_host,
-    prometheus_port,
-    prometheus_user,
-    prometheus_password,
-) = get_prometheus_info()
diff --git a/robot-systest/resources/sa_08-vnf_with_vnf_indicators_snmp_data.py b/robot-systest/resources/sa_08-vnf_with_vnf_indicators_snmp_data.py
deleted file mode 100644 (file)
index a7a3456..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-#   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.
-
-from common_helpers import get_prometheus_info
-
-
-# Prometheus host and port
-(
-    prometheus_host,
-    prometheus_port,
-    prometheus_user,
-    prometheus_password,
-) = get_prometheus_info()
diff --git a/robot-systest/resources/sol003_01-vnf_lifecycle_management.py b/robot-systest/resources/sol003_01-vnf_lifecycle_management.py
deleted file mode 100644 (file)
index a411cd2..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-#   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.
-
-from common_helpers import get_osm_info
-
-
-(osm_user, osm_password, osm_project) = get_osm_info()
diff --git a/robot-systest/resources/sol003_02-dualstack_ip_vnfm.json b/robot-systest/resources/sol003_02-dualstack_ip_vnfm.json
new file mode 100644 (file)
index 0000000..74cc2ef
--- /dev/null
@@ -0,0 +1,40 @@
+{
+   "data":[
+      {
+         "vnfdId":"hackfest_basic-vnf",
+         "vnfInstanceName":"sol003-instance",
+         "vnfInstanceDescription":"Test vnfm instance description",
+         "vimAccountId":"8dc2f11d-e08a-4ec7-920c-6b8a88bff1e5",
+         "additionalParams":{
+            "virtual-link-desc":[
+               {
+                  "id":"mgmtnet",
+                  "mgmt-network":true,
+                  "vim-network-name": "IPv6"
+               }
+            ],
+            "constituent-cpd-id":"vnf-cp0-ext",
+            "ip-address": ["2001:db8::5", "192.168.158.6"],
+            "virtual-link-profile-id":"mgmtnet"
+         }
+      },
+      {
+         "vnfName":"sol003-instance",
+         "vnfDescription":"vnf package",
+         "vnfId":"70b47595-fafa-4f63-904b-fc3ada60eebb",
+         "vimAccountId":"8dc2f11d-e08a-4ec7-920c-6b8a88bff1e5"
+      },
+      {
+         "type":"SCALE_OUT",
+         "aspectId":"vdu_autoscale",
+         "numberOfSteps":"1",
+         "additionalParams":{
+            "member-vnf-index":"1"
+         }
+      },
+      {
+         "terminationType":"GRACEFUL",
+         "gracefulTerminationTimeout":"5"
+      }
+   ]
+}
index d4d5e97..11c3e45 100755 (executable)
@@ -44,7 +44,7 @@ create_k8scluster(){
     while [ $attempts -ge 0 ] ; do
         echo -e "\n$( date '+%F_%H:%M:%S' ) Creating K8s Cluster"
 
-        osm k8scluster-add --creds ${K8S_CREDENTIALS} --version "v1" --vim ${VIM_TARGET} --k8s-nets "{\"net1\": \"${VIM_MGMT_NET}\"}" ${VIM_TARGET} --description "Robot cluster"
+        osm k8scluster-add --creds ${K8S_CREDENTIALS} --version "v1" --vim ${VIM_TARGET} --k8s-nets "{\"net1\": \"${VIM_MGMT_NET}\"}" ${VIM_TARGET} --description "Robot cluster" --skip-jujubundle
 
         STATUS=""
         i=0
@@ -104,6 +104,10 @@ create_vim(){
         echo "VIM failed to enter ENABLED state"
         exit 1
     fi
+}
+
+
+create_sdnc(){
     if [ -n "${SDNC_URL}" ]; then
         osm sdnc-create --name sdnc-osm --type ${SDNC_TYPE} --user ${SDNC_USER} --password ${SDNC_PASSWORD} --url ${SDNC_URL}
         COUNTER=0
@@ -147,6 +151,7 @@ create_vim(){
             fi
         fi
     fi
+
 }
 
 
@@ -169,6 +174,7 @@ while (( "$#" )); do
             ;;
         -c|--createvim)
             create_vim
+            # create_sdnc
             create_k8scluster
             shift 1
             ;;
@@ -228,7 +234,7 @@ if [ "$RUN_CONFORMANCE_TESTS" = true ] ; then
 fi
 
 if [[ -n "${TEST}" ]]; then
-    robot -d ${ROBOT_DEVOPS_FOLDER}/reports -i ${TEST} ${ROBOT_DEVOPS_FOLDER}/testsuite/
+    robot -d ${ROBOT_DEVOPS_FOLDER}/reports --tagstatinclude "cluster_*" -i ${TEST} ${ROBOT_DEVOPS_FOLDER}/testsuite/
 else
     echo "No test was provided. Exiting..."
 fi
index eb35010..3d2ebc6 100644 (file)
@@ -1,3 +1,4 @@
+*** Comments ***
 #   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
 #   See the License for the specific language governing permissions and
 #   limitations under the License.
 
+
 *** Settings ***
 Documentation   [BASIC-01] CRUD operations on VIM targets.
 ...             All tests will be performed over an Openstack VIM, and the credentials will be loaded from clouds.yaml file.
 
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/vim_lib.robot
+Resource   ../lib/vim_lib.resource
+Resource   ../lib/prometheus_lib.resource
+
+Variables   ../resources/basic_01-crud_operations_on_vim_targets_data.py
 
-Variables   %{ROBOT_DEVOPS_FOLDER}/resources/basic_01-crud_operations_on_vim_targets_data.py
+Test Tags   basic_01   cluster_main   daily   regression
 
-Force Tags   basic_01   cluster_main   daily   regression
+Suite Setup   Run Keyword And Ignore Error   Suite Preparation
 
 
 *** Test Cases ***
 Create VIM Target Basic
     [Documentation]   Create a VIM Target only with the mandatory parameters.
     ...               Checks the status of the VIM in Prometheus after it creation.
-
-    Pass Execution If   '${vim_account_type}' != 'openstack'   Not applicable for ${vim_account_type} VIM
+    Pass Execution If   ${VIM_ACCOUNT_TYPE} != 'openstack'   Not applicable for ${VIM_ACCOUNT_TYPE} VIM
     ${rand}=   Generate Random String   6   [NUMBERS]
-    ${vim_name}=   Catenate   SEPARATOR=_   ${vim_name_prefix}   ${rand}
-    Set Suite Variable   ${vim_name}
-    ${created_vim_account_id}=   Create VIM Target   ${vim_name}   ${vim_user}   ${vim_password}   ${vim_auth_url}   ${vim_tenant}   ${vim_account_type}
-    Set Suite Variable   ${created_vim_account_id}
-    Check VIM Target Operational State   ${vim_name}
-    ${stdout}=   Check for VIM Target Metric   ${vim_name}   ${prometheus_host}   ${prometheus_port}   ${prometheus_user}   ${prometheus_password}
-
+    ${VIM_NAME}=   Catenate   SEPARATOR=_   ${vim_name_prefix}   ${rand}
+    Set Suite Variable   ${VIM_NAME}
+    ${CREATED_VIM_ACCOUNT_ID}=   Create VIM Target   ${VIM_NAME}   ${VIM_USER}   ${VIM_PASSWORD}   ${VIM_AUTH_URL}   ${VIM_TENANT}   ${VIM_ACCOUNT_TYPE}
+    Set Suite Variable   ${CREATED_VIM_ACCOUNT_ID}
+    Check VIM Target Operational State   ${VIM_NAME}
+    ${stdout}=   Check For VIM Target Metric   ${VIM_NAME}   ${PROMETHEUS_HOST}   ${PROMETHEUS_PORT}   ${PROMETHEUS_USER}   ${PROMETHEUS_PASSWORD}
+    Log   ${stdout}
 
 Delete VIM Target By Name
     [Documentation]   Delete the VIM Target created in previous test-case by its name.
     ...               Checks whether the VIM Target was created or not before perform the deletion.
     [Tags]   cleanup
-
-    Pass Execution If   '${vim_account_type}' != 'openstack'   Not applicable for ${vim_account_type} VIM
-    ${vim_account_id}=   Get VIM Target ID   ${vim_name}
-    Should Be Equal As Strings   ${vim_account_id}   ${created_vim_account_id}
-    Delete VIM Target   ${vim_name}
-
+    Pass Execution If   ${VIM_ACCOUNT_TYPE} != 'openstack'   Not applicable for ${VIM_ACCOUNT_TYPE} VIM
+    ${vim_account_id}=   Get VIM Target ID   ${VIM_NAME}
+    Should Be Equal As Strings   ${vim_account_id}   ${CREATED_VIM_ACCOUNT_ID}
+    Delete VIM Target   ${VIM_NAME}
 
 Create VIM Target With Extra Config
     [Documentation]   Create a VIM Target using the extra parameter 'config'.
     ...               Checks the status of the VIM in Prometheus after it creation.
-
     ${rand}=   Generate Random String   6   [NUMBERS]
-    ${vim_name}=   Catenate   SEPARATOR=_   ${vim_name_prefix}   ${rand}
-    Set Suite Variable   ${vim_name}
-    ${created_vim_account_id}=   Create VIM Target   ${vim_name}   ${vim_user}   ${vim_password}   ${vim_auth_url}   ${vim_tenant}   ${vim_account_type}   config=${vim_config}
-    Set Suite Variable   ${created_vim_account_id}
-    Check VIM Target Operational State   ${vim_name}
-    Check for VIM Target Status   ${vim_name}   ${prometheus_host}   ${prometheus_port}   ${prometheus_user}   ${prometheus_password}
-
+    ${VIM_NAME}=   Catenate   SEPARATOR=_   ${vim_name_prefix}   ${rand}
+    Set Suite Variable   ${VIM_NAME}
+    ${CREATED_VIM_ACCOUNT_ID}=   Create VIM Target   ${VIM_NAME}   ${VIM_USER}   ${VIM_PASSWORD}   ${VIM_AUTH_URL}   ${VIM_TENANT}   ${VIM_ACCOUNT_TYPE}   config=${VIM_CONFIG}
+    Set Suite Variable   ${CREATED_VIM_ACCOUNT_ID}
+    Check VIM Target Operational State   ${VIM_NAME}
+    Check For VIM Target Status   ${VIM_NAME}   ${PROMETHEUS_HOST}   ${PROMETHEUS_PORT}   ${PROMETHEUS_USER}   ${PROMETHEUS_PASSWORD}
 
 Delete VIM Target By ID
     [Documentation]   Delete the VIM Target created in previous test-case by its ID.
     ...               Checks whether the VIM Target was created or not before perform the deletion.
     [Tags]   cleanup
-
-    ${vim_account_id}=   Get VIM Target ID   ${vim_name}
-    Should Be Equal As Strings   ${vim_account_id}   ${created_vim_account_id}
+    ${vim_account_id}=   Get VIM Target ID   ${VIM_NAME}
+    Should Be Equal As Strings   ${vim_account_id}   ${CREATED_VIM_ACCOUNT_ID}
     Delete VIM Target   ${vim_account_id}
 
+
+*** Keywords ***
+Suite Preparation
+    [Documentation]   Test Suite Preparation: Setting Prometheus Testsuite Variables
+    Set Testsuite Prometheus Variables
index 62994df..da8bfb7 100644 (file)
@@ -1,3 +1,4 @@
+*** Comments ***
 #   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
 #   See the License for the specific language governing permissions and
 #   limitations under the License.
 
+
 *** Settings ***
 Documentation   [BASIC-05] Instantiation parameters in cloud-init.
 
 Library   OperatingSystem
 Library   SSHLibrary
 
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/vnfd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/nsd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ns_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ssh_lib.robot
+Resource   ../lib/vnfd_lib.resource
+Resource   ../lib/nsd_lib.resource
+Resource   ../lib/ns_lib.resource
+Resource   ../lib/ssh_lib.resource
 
-Force Tags   basic_05   cluster_main   daily   regression
+Test Tags   basic_05   cluster_main   daily   regression   azure
 
 Suite Teardown   Run Keyword And Ignore Error   Suite Cleanup
 
 
 *** Variables ***
 # NS and VNF descriptor package folder and ids
-${vnfd_pkg}   ubuntu_cloudinit_vnf
-${vnfd_name}   ubuntu_cloudinit-vnf
-${nsd_pkg}   ubuntu_cloudinit_ns
-${nsd_name}   ubuntu_cloudinit-ns
+${VNFD_PKG}   ubuntu_cloudinit_vnf
+${VNFD_NAME}   ubuntu_cloudinit-vnf
+${NSD_PKG}   ubuntu_cloudinit_ns
+${NSD_NAME}   ubuntu_cloudinit-ns
 
 # NS instance name and configuration
-${ns_name}   basic_05_instantiation_params_cloud_init
-${vnf_member_index}   vnf
-${ns_config}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ], additionalParamsForVnf: [ { member-vnf-index: "${vnf_member_index}", additionalParams: { password: "${new_password}" } } ] }
+${NS_NAME}   basic_05_instantiation_params_cloud_init
+${VNF_MEMBER_INDEX}   vnf
+${NS_CONFIG}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ], additionalParamsForVnf: [ { member-vnf-index: "${VNF_MEMBER_INDEX}", additionalParams: { password: "${NEW_PASSWORD}" } } ] }
 
 # SSH user and password
-${username}   ubuntu
-${new_password}   newpassword
+${USERNAME}   ubuntu
+${NEW_PASSWORD}   newpassword
 
 
 *** Test Cases ***
 Create Cloudinit VNF Descriptor
-
-    Create VNFD   '%{PACKAGES_FOLDER}/${vnfd_pkg}'
-
+    [Documentation]   Upload VNF package for the testsuite.
+    Create VNFD   '%{PACKAGES_FOLDER}/${VNFD_PKG}'
 
 Create Cloudinit NS Descriptor
-
-    Create NSD   '%{PACKAGES_FOLDER}/${nsd_pkg}'
-
+    [Documentation]   Upload NS package for the testsuite.
+    Create NSD   '%{PACKAGES_FOLDER}/${NSD_PKG}'
 
 Instantiate Cloudinit Network Service Using Instantiation Parameters
     [Documentation]   Instantiates the NS using the instantiation parameter 'additionalParamsForVnf' to change the password of the default user.
-
-    ${id}=   Create Network Service   ${nsd_name}   %{VIM_TARGET}   ${ns_name}   ${ns_config}   ${EMPTY}
-    Set Suite Variable   ${ns_id}   ${id}
-
+    ${id}=   Create Network Service   ${NSD_NAME}   %{VIM_TARGET}   ${NS_NAME}   ${NS_CONFIG}   ${EMPTY}
+    Set Suite Variable   ${NS_ID}   ${id}
 
 Get Management Ip Addresses
-
-    ${ip_addr}   Get Vnf Management Ip Address   ${ns_id}   ${vnf_member_index}
+    [Documentation]   Retrieve VNF mgmt IP address from OSM.
+    ${ip_addr}=   Get Vnf Management Ip Address   ${NS_ID}   ${VNF_MEMBER_INDEX}
     Log   ${ip_addr}
-    Set Suite Variable   ${vnf_ip_addr}   ${ip_addr}
-
+    Set Suite Variable   ${VNF_IP_ADDR}   ${ip_addr}
 
 Test SSH Access With The New Password
     [Documentation]   Test SSH access with the new password configured via cloud-init.
-
-    Variable Should Exist   ${vnf_ip_addr}   msg=IP address of the management VNF is not available
+    Variable Should Exist   ${VNF_IP_ADDR}   msg=IP address of the management VNF is not available
     Sleep   30s   Waiting ssh daemon to be up
-    Test SSH Connection   ${vnf_ip_addr}   ${username}   ${new_password}   ${EMPTY}
-
+    Test SSH Connection   ${VNF_IP_ADDR}   ${USERNAME}   ${NEW_PASSWORD}   ${EMPTY}
 
 Delete NS Instance
+    [Documentation]   Delete NS instance.
     [Tags]   cleanup
-
-    Delete NS   ${ns_name}
-
+    Delete NS   ${NS_NAME}
 
 Delete NS Descriptor
+    [Documentation]   Delete NS package from OSM.
     [Tags]   cleanup
-
-    Delete NSD   ${nsd_name}
-
+    Delete NSD   ${NSD_NAME}
 
 Delete VNF Descriptor
+    [Documentation]   Delete VNF package from OSM.
     [Tags]   cleanup
-
-    Delete VNFD   ${vnfd_name}
+    Delete VNFD   ${VNFD_NAME}
 
 
 *** Keywords ***
 Suite Cleanup
     [Documentation]   Test Suite Cleanup: Deleting descriptors and NS instance
-
-    Run Keyword If Any Tests Failed   Delete NS   ${ns_name}
-
-    Run Keyword If Any Tests Failed   Delete NSD   ${nsd_name}
-
-    Run Keyword If Any Tests Failed   Delete VNFD   ${vnfd_name}
-
+    Run Keyword If Any Tests Failed   Delete NS   ${NS_NAME}
+    Run Keyword If Any Tests Failed   Delete NSD   ${NSD_NAME}
+    Run Keyword If Any Tests Failed   Delete VNFD   ${VNFD_NAME}
index 6b296c5..109046e 100644 (file)
@@ -1,3 +1,4 @@
+*** Comments ***
 #   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
 #   See the License for the specific language governing permissions and
 #   limitations under the License.
 
+
 *** Settings ***
 Documentation   [BASIC-06] VNF with Charm.
 
 Library   OperatingSystem
 Library   SSHLibrary
 
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/vnfd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/nsd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ns_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ssh_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/juju_lib.robot
+Resource   ../lib/vnfd_lib.resource
+Resource   ../lib/nsd_lib.resource
+Resource   ../lib/ns_lib.resource
+Resource   ../lib/ns_operation_lib.resource
+Resource   ../lib/ssh_lib.resource
+Resource   ../lib/juju_lib.resource
 
-Force Tags   basic_06   cluster_ee_config   daily   regression
+Test Tags   basic_06   cluster_ee_config   regression   azure
 
 Suite Teardown   Run Keyword And Ignore Error   Suite Cleanup
 
 
 *** Variables ***
 # NS and VNF descriptor package folder and ids
-${vnfd_pkg}   charm-packages/ha_proxy_charm_vnf
-${vnfd_name}   ha_proxy_charm-vnf
-${nsd_pkg}   charm-packages/ha_proxy_charm_ns
-${nsd_name}   ha_proxy_charm-ns
+${VNFD_PKG}   charm-packages/ha_proxy_charm_vnf
+${VNFD_NAME}   ha_proxy_charm-vnf
+${NSD_PKG}   charm-packages/ha_proxy_charm_ns
+${NSD_NAME}   ha_proxy_charm-ns
 
 # NS instance name and configuration
-${ns_name}   basic_06_charm_test
-${ns_config}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
+${NS_NAME}   basic_06_charm_test
+${NS_CONFIG}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
 
 # SSH keys and username to be used
-${publickey}   %{HOME}/.ssh/id_rsa.pub
-${privatekey}   %{HOME}/.ssh/id_rsa
-${username}   ubuntu
-${password}   ${EMPTY}
-
-${action_name}   touch
-${vnf_member_index_1}   vnf1
-${vnf_member_index_2}   vnf2
-${day_1_file_name}   /home/ubuntu/first-touch
-${day_2_file_name_1}   /home/ubuntu/mytouch1
-${day_2_file_name_2}   /home/ubuntu/mytouch2
-${ns_timeout}   15min
+${PUBLICKEY}   %{HOME}/.ssh/id_rsa.pub
+${PRIVATEKEY}   %{HOME}/.ssh/id_rsa
+${USERNAME}   ubuntu
+${PASSWORD}   ${EMPTY}
+
+${ACTION_NAME}   touch
+${VNF_MEMBER_INDEX_1}   vnf1
+${VNF_MEMBER_INDEX_2}   vnf2
+${DAY_1_FILE_NAME}   /home/ubuntu/first-touch
+${DAY_2_FILE_NAME_1}   /home/ubuntu/mytouch1
+${DAY_2_FILE_NAME_2}   /home/ubuntu/mytouch2
+${NS_TIMEOUT}   15min
 
 # VNF profile id, execution environment name to check VNF level charm naming
-${vnf_profile_id}   vnf1
-${ee_name}   simple-ee
+${VNF_PROFILE_ID}   vnf1
+${EE_NAME}   simple-ee
 
 
 *** Test Cases ***
 Create Charm VNF Descriptor
-
-    Create VNFD   '%{PACKAGES_FOLDER}/${vnfd_pkg}'
-
+    [Documentation]   Upload VNF package for the testsuite.
+    Create VNFD   '%{PACKAGES_FOLDER}/${VNFD_PKG}'
 
 Create Charm NS Descriptor
-
-    Create NSD   '%{PACKAGES_FOLDER}/${nsd_pkg}'
-
+    [Documentation]   Upload NS package for the testsuite.
+    Create NSD   '%{PACKAGES_FOLDER}/${NSD_PKG}'
 
 Instantiate Charm Network Service
-
-    ${id}=   Create Network Service   ${nsd_name}   %{VIM_TARGET}   ${ns_name}   ${ns_config}   ${publickey}   ${ns_timeout}
-    Set Suite Variable   ${ns_id}   ${id}
-    Set Suite Variable   ${model_name}   ${id}
-
+    [Documentation]   Instantiates the NS for the testsuite.
+    ${id}=   Create Network Service   ${NSD_NAME}   %{VIM_TARGET}   ${NS_NAME}   ${NS_CONFIG}   ${PUBLICKEY}   ${NS_TIMEOUT}
+    Set Suite Variable   ${NS_ID}   ${id}
+    Set Suite Variable   ${MODEL_NAME}   ${id}
 
 Check VNF Charm Application Name
-
-    ${vnf_charm_app_name}=   Get Application Name VNF Level Charm   %{OSM_HOSTNAME}   ${username}   ${password}   %{OSM_RSA_FILE}   ${model_name}   ${vnf_profile_id}   ${ee_name}
+    [Documentation]   Checks that the charm application name meets the expected length
+    ${vnf_charm_app_name}=   Get Application Name VNF Level Charm   %{OSM_HOSTNAME}   ${USERNAME}   ${PASSWORD}   %{OSM_RSA_FILE}   ${MODEL_NAME}   ${VNF_PROFILE_ID}   ${EE_NAME}
     ${length}=   Get Length   ${vnf_charm_app_name}
     Should Be True   ${length} <50
 
-
 Get Management Ip Addresses
-
-    ${ip_addr_1}   Get Vnf Management Ip Address   ${ns_id}   ${vnf_member_index_1}
+    [Documentation]   Get the mgmt IP addresses of both VNF of the NS.
+    ${ip_addr_1}=   Get Vnf Management Ip Address   ${NS_ID}   ${VNF_MEMBER_INDEX_1}
     Log   ${ip_addr_1}
-    Set Suite Variable   ${vnf_1_ip_addr}   ${ip_addr_1}
-    ${ip_addr_2}   Get Vnf Management Ip Address   ${ns_id}   ${vnf_member_index_2}
+    Set Suite Variable   ${VNF_1_IP_ADDR}   ${ip_addr_1}
+    ${ip_addr_2}=   Get Vnf Management Ip Address   ${NS_ID}   ${VNF_MEMBER_INDEX_2}
     Log   ${ip_addr_2}
-    Set Suite Variable   ${vnf_2_ip_addr}   ${ip_addr_2}
-
+    Set Suite Variable   ${VNF_2_IP_ADDR}   ${ip_addr_2}
 
 Test SSH Access
-
-    Variable Should Exist   ${vnf_1_ip_addr}   msg=IP address of the management VNF '${vnf_member_index_1}' is not available
-    Variable Should Exist   ${vnf_2_ip_addr}   msg=IP address of the management VNF '${vnf_member_index_2}' is not available
+    [Documentation]   Check that both VNF are accessible via SSH in their mgmt IP addresses.
+    Variable Should Exist   ${VNF_1_IP_ADDR}   msg=IP address of the management VNF '${VNF_MEMBER_INDEX_1}' is not available
+    Variable Should Exist   ${VNF_2_IP_ADDR}   msg=IP address of the management VNF '${VNF_MEMBER_INDEX_2}' is not available
     Sleep   30s   Waiting ssh daemon to be up
-    Test SSH Connection   ${vnf_1_ip_addr}   ${username}   ${password}   ${privatekey}
-    Test SSH Connection   ${vnf_2_ip_addr}   ${username}   ${password}   ${privatekey}
-
+    Test SSH Connection   ${VNF_1_IP_ADDR}   ${USERNAME}   ${PASSWORD}   ${PRIVATEKEY}
+    Test SSH Connection   ${VNF_2_IP_ADDR}   ${USERNAME}   ${PASSWORD}   ${PRIVATEKEY}
 
 Check Remote Files Created Via Day 1 Operations
     [Documentation]   The Charm VNF has a Day 1 operation that creates a file named ${day_1_file_name}.
     ...               This test checks whether that files have been created or not.
-
-    Check If remote File Exists   ${vnf_1_ip_addr}   ${username}   ${password}   ${privatekey}   ${day_1_file_name}
-    Check If remote File Exists   ${vnf_2_ip_addr}   ${username}   ${password}   ${privatekey}   ${day_1_file_name}
-
+    Check If Remote File Exists   ${VNF_1_IP_ADDR}   ${USERNAME}   ${PASSWORD}   ${PRIVATEKEY}   ${DAY_1_FILE_NAME}
+    Check If Remote File Exists   ${VNF_2_IP_ADDR}   ${USERNAME}   ${PASSWORD}   ${PRIVATEKEY}   ${DAY_1_FILE_NAME}
 
 Execute Day 2 Operations
     [Documentation]   Performs one Day 2 operation per VNF that creates a new file.
-
-    Variable Should Exist   ${ns_id}   msg=Network service instance is not available
-    ${ns_op_id_1}=   Execute NS Action   ${ns_name}   ${action_name}   ${vnf_member_index_1}   filename=${day_2_file_name_1}
-    ${ns_op_id_2}=   Execute NS Action   ${ns_name}   ${action_name}   ${vnf_member_index_2}   filename=${day_2_file_name_2}
-
+    Variable Should Exist   ${NS_ID}   msg=Network service instance is not available
+    ${ns_op_id_1}=   Execute NS Action   ${NS_NAME}   ${ACTION_NAME}   ${VNF_MEMBER_INDEX_1}   filename=${DAY_2_FILE_NAME_1}
+    Log   ${ns_op_id_1}
+    ${ns_op_id_2}=   Execute NS Action   ${NS_NAME}   ${ACTION_NAME}   ${VNF_MEMBER_INDEX_2}   filename=${DAY_2_FILE_NAME_2}
+    Log   ${ns_op_id_2}
 
 Check Remote Files Created Via Day 2 Operations
     [Documentation]   Check whether the files created in the previous test via Day 2 operations exist or not.
-
-    Check If remote File Exists   ${vnf_1_ip_addr}   ${username}   ${password}   ${privatekey}   ${day_2_file_name_1}
-    Check If remote File Exists   ${vnf_2_ip_addr}   ${username}   ${password}   ${privatekey}   ${day_2_file_name_2}
-
+    Check If Remote File Exists   ${VNF_1_IP_ADDR}   ${USERNAME}   ${PASSWORD}   ${PRIVATEKEY}   ${DAY_2_FILE_NAME_1}
+    Check If Remote File Exists   ${VNF_2_IP_ADDR}   ${USERNAME}   ${PASSWORD}   ${PRIVATEKEY}   ${DAY_2_FILE_NAME_2}
 
 Delete NS Instance
+    [Documentation]   Delete NS instance.
     [Tags]   cleanup
-
-    Delete NS   ${ns_name}
-
+    Delete NS   ${NS_NAME}
 
 Delete NS Descriptor
+    [Documentation]   Delete NS package from OSM.
     [Tags]   cleanup
-
-    Delete NSD   ${nsd_name}
-
+    Delete NSD   ${NSD_NAME}
 
 Delete VNF Descriptor
+    [Documentation]   Delete VNF package from OSM.
     [Tags]   cleanup
-
-    Delete VNFD   ${vnfd_name}
+    Delete VNFD   ${VNFD_NAME}
 
 
 *** Keywords ***
 Suite Cleanup
     [Documentation]   Test Suite Cleanup: Deleting descriptors and NS instance
-
-    Run Keyword If Any Tests Failed   Delete NS   ${ns_name}
-
-    Run Keyword If Any Tests Failed   Delete NSD   ${nsd_name}
-
-    Run Keyword If Any Tests Failed   Delete VNFD   ${vnfd_name}
-
+    Run Keyword If Any Tests Failed   Delete NS   ${NS_NAME}
+    Run Keyword If Any Tests Failed   Delete NSD   ${NSD_NAME}
+    Run Keyword If Any Tests Failed   Delete VNFD   ${VNFD_NAME}
index 811e659..506e2a3 100644 (file)
@@ -1,3 +1,4 @@
+*** Comments ***
 #   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
 #   See the License for the specific language governing permissions and
 #   limitations under the License.
 
+
 *** Settings ***
 Documentation   [BASIC-07] Secure key management.
 
 Library   OperatingSystem
 Library   SSHLibrary
 
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/vnfd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/nsd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ns_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ssh_lib.robot
+Resource   ../lib/vnfd_lib.resource
+Resource   ../lib/nsd_lib.resource
+Resource   ../lib/ns_lib.resource
+Resource   ../lib/ns_operation_lib.resource
+Resource   ../lib/ssh_lib.resource
 
-Force Tags   basic_07   cluster_ee_config   daily   regression   sanity
+Test Tags   basic_07   cluster_ee_config   regression   azure
 
 Suite Teardown   Run Keyword And Ignore Error   Suite Cleanup
 
 
 *** Variables ***
 # NS and VNF descriptor package folder and ids
-${vnfd_pkg}   charm-packages/nopasswd_proxy_charm_vnf
-${vnfd_name}   nopasswd_proxy_charm-vnf
-${nsd_pkg}   charm-packages/nopasswd_proxy_charm_ns
-${nsd_name}   nopasswd_proxy_charm-ns
+${VNFD_PKG}   charm-packages/nopasswd_proxy_charm_vnf
+${VNFD_NAME}   nopasswd_proxy_charm-vnf
+${NSD_PKG}   charm-packages/nopasswd_proxy_charm_ns
+${NSD_NAME}   nopasswd_proxy_charm-ns
 
 # NS instance name and configuration
-${ns_name}   basic_07_secure_key_management
-${ns_config}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
-${ns_timeout}   15min
+${NS_NAME}   basic_07_secure_key_management
+${NS_CONFIG}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
+${NS_TIMEOUT}   15min
 
 # SSH username and passwod
-${username}   ubuntu
-${password}   osm4u
+${USERNAME}   ubuntu
+${PASSWORD}   osm4u
 
-${action_name}   touch
-${vnf_member_index}   vnf1
-${day_1_file_name}   /home/ubuntu/first-touch
-${day_2_file_name}   /home/ubuntu/mytouch1
+${ACTION_NAME}   touch
+${VNF_MEMBER_INDEX}   vnf1
+${DAY_1_FILE_NAME}   /home/ubuntu/first-touch
+${DAY_2_FILE_NAME}   /home/ubuntu/mytouch1
 
 
 *** Test Cases ***
 Create Nopasswd Charm VNF Descriptor
+    [Documentation]   Upload VNF package for the testsuite.
     [Tags]   prepare
-    Create VNFD   '%{PACKAGES_FOLDER}/${vnfd_pkg}'
-
+    Create VNFD   '%{PACKAGES_FOLDER}/${VNFD_PKG}'
 
 Create Nopasswd Charm NS Descriptor
+    [Documentation]   Upload NS package for the testsuite.
     [Tags]   prepare
-    Create NSD   '%{PACKAGES_FOLDER}/${nsd_pkg}'
-
+    Create NSD   '%{PACKAGES_FOLDER}/${NSD_PKG}'
 
 Instantiate Nopasswd Charm Network Service
+    [Documentation]   Instantiate NS for the testsuite.
     [Tags]   prepare
-    ${id}=   Create Network Service   ${nsd_name}   %{VIM_TARGET}   ${ns_name}   ${ns_config}   ${EMPTY}   ${ns_timeout}
+    ${id}=   Create Network Service   ${NSD_NAME}   %{VIM_TARGET}   ${NS_NAME}   ${NS_CONFIG}   ${EMPTY}   ${NS_TIMEOUT}
+    Log   ${id}
 
 Get Ns Id
+    [Documentation]   Get NS instance id.
     [Tags]   verify
-    ${id}=   Get Ns Id   ${ns_name}
-    Set Suite Variable   ${ns_id}   ${id}
+    ${id}=   Get Ns Id   ${NS_NAME}
+    Set Suite Variable   ${NS_ID}   ${id}
 
 Get Management Ip Addresses
+    [Documentation]   Get the mgmt IP address of the VNF of the NS.
     [Tags]   verify
-    ${ip_addr}   Get Vnf Management Ip Address   ${ns_id}   ${vnf_member_index}
+    ${ip_addr}=   Get Vnf Management Ip Address   ${NS_ID}   ${VNF_MEMBER_INDEX}
     Log   ${ip_addr}
-    Set Suite Variable   ${vnf_ip_addr}   ${ip_addr}
-
+    Set Suite Variable   ${VNF_IP_ADDR}   ${ip_addr}
 
 Test SSH Access
+    [Documentation]   Check that the VNF is accessible via SSH in its mgmt IP address.
     [Tags]   verify
-    Variable Should Exist   ${vnf_ip_addr}   msg=IP address of the management VNF is not available
+    Variable Should Exist   ${VNF_IP_ADDR}   msg=IP address of the management VNF is not available
     Sleep   30s   Waiting ssh daemon to be up
-    Test SSH Connection   ${vnf_ip_addr}   ${username}   ${password}   ${EMPTY}
-
+    Test SSH Connection   ${VNF_IP_ADDR}   ${USERNAME}   ${PASSWORD}   ${EMPTY}
 
 Check Remote Files Created Via Day 1 Operations
-    [Tags]   verify
     [Documentation]   The Nopasswd VNF has a Day 1 operation that creates a file named ${day_1_file_name} and performs it without password.
     ...               This test checks whether that files have been created or not.
-
-    Check If remote File Exists   ${vnf_ip_addr}   ${username}   ${password}   ${EMPTY}   ${day_1_file_name}
-
+    [Tags]   verify
+    Check If Remote File Exists   ${VNF_IP_ADDR}   ${USERNAME}   ${PASSWORD}   ${EMPTY}   ${DAY_1_FILE_NAME}
 
 Execute Day 2 Operations
-    [Tags]   verify
     [Documentation]   Performs one Day 2 operation that creates a new file, this action is executed without password too.
-
-    Variable Should Exist   ${ns_id}   msg=Network service instance is not available
-    ${ns_op_id}=   Execute NS Action   ${ns_name}   ${action_name}   ${vnf_member_index}   filename=${day_2_file_name}
-
+    [Tags]   verify
+    Variable Should Exist   ${NS_ID}   msg=Network service instance is not available
+    ${ns_op_id}=   Execute NS Action   ${NS_NAME}   ${ACTION_NAME}   ${VNF_MEMBER_INDEX}   filename=${DAY_2_FILE_NAME}
+    Log   ${ns_op_id}
 
 Check Remote Files Created Via Day 2 Operations
-    [Tags]   verify
     [Documentation]   Check whether the file created in the previous test via Day 2 operation exists or not.
-
-    Check If remote File Exists   ${vnf_ip_addr}   ${username}   ${password}   ${EMPTY}   ${day_2_file_name}
-
+    [Tags]   verify
+    Check If Remote File Exists   ${VNF_IP_ADDR}   ${USERNAME}   ${PASSWORD}   ${EMPTY}   ${DAY_2_FILE_NAME}
 
 Delete NS Instance
+    [Documentation]   Delete NS instance.
     [Tags]   cleanup
-
-    Delete NS   ${ns_name}
-
+    Delete NS   ${NS_NAME}
 
 Delete NS Descriptor
+    [Documentation]   Delete NS package from OSM.
     [Tags]   cleanup
-
-    Delete NSD   ${nsd_name}
-
+    Delete NSD   ${NSD_NAME}
 
 Delete VNF Descriptor
+    [Documentation]   Delete VNF package from OSM.
     [Tags]   cleanup
-
-    Delete VNFD   ${vnfd_name}
+    Delete VNFD   ${VNFD_NAME}
 
 
 *** Keywords ***
 Suite Cleanup
     [Documentation]   Test Suite Cleanup: Deleting descriptors and NS instance
-
-    Run Keyword If Any Tests Failed   Delete NS   ${ns_name}
-
-    Run Keyword If Any Tests Failed   Delete NSD   ${nsd_name}
-
-    Run Keyword If Any Tests Failed   Delete VNFD   ${vnfd_name}
-
+    Run Keyword If Any Tests Failed   Delete NS   ${NS_NAME}
+    Run Keyword If Any Tests Failed   Delete NSD   ${NSD_NAME}
+    Run Keyword If Any Tests Failed   Delete VNFD   ${VNFD_NAME}
index 25164f5..cc537b2 100644 (file)
@@ -1,3 +1,4 @@
+*** Comments ***
 #   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
@@ -10,6 +11,7 @@
 #   See the License for the specific language governing permissions and
 #   limitations under the License.
 
+
 *** Settings ***
 Documentation   [BASIC-08] Disable port security at network level.
 
@@ -17,80 +19,94 @@ Library   OperatingSystem
 Library   String
 Library   Collections
 
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/vim_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/vnfd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/nsd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ns_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/prometheus_lib.robot
+Resource   ../lib/vim_lib.resource
+Resource   ../lib/vnfd_lib.resource
+Resource   ../lib/nsd_lib.resource
+Resource   ../lib/ns_lib.resource
+Resource   ../lib/prometheus_lib.resource
 
-Variables   %{ROBOT_DEVOPS_FOLDER}/resources/basic_08-disable_port_security_network_level_data.py
+Variables   ../resources/basic_08-disable_port_security_network_level_data.py
 
-Force Tags   basic_08   cluster_main   daily   regression
+Test Tags   basic_08   cluster_main   daily   regression
 
+Suite Setup   Run Keyword And Ignore Error   Suite Preparation
 Suite Teardown   Run Keyword And Ignore Error   Suite Cleanup
 
 
 *** Variables ***
-${ns_config}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
-${port_disabled_msg}   port_security_enabled: false
-
-*** Test Cases ***
-Create VIM With Port Security Disabled
+# NS and VNF descriptor package folder and ids
+${VNFD_PKG}   hackfest_multivdu_vnf
+${VNFD_NAME}   hackfest_multivdu-vnf
+${NSD_PKG}   hackfest_multivdu_ns
+${NSD_NAME}   hackfest_multivdu-ns
 
-    ${created_vim_account_id}=   Create VIM Target   ${vim_name}   ${vim_user}   ${vim_password}   ${vim_auth_url}   ${vim_tenant}   ${vim_account_type}   config=${vim_config}
-    Check for VIM Target Status   ${vim_name}   ${prometheus_host}   ${prometheus_port}   ${prometheus_user}   ${prometheus_password}
+# NS instance name and configuration
+${NS_NAME}   basic_08_disable_port_security_network_level_test
+${NS_CONFIG}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
 
-Create VNF Descriptor
+# SSH keys and username to be used
+${PUBLICKEY}   %{HOME}/.ssh/id_rsa.pub
 
-    Create VNFD   '%{PACKAGES_FOLDER}/${vnfd_pkg}'
+# Other variables
+${PORT_DISABLED_MSG}   port_security_enabled: false
 
 
-Create NS Descriptor
+*** Test Cases ***
+Create VIM With Port Security Disabled
+    [Documentation]   Register an Opentack VIM with port security disabled, so that all ports created from OSM have port security disabled
+    ...               (no firewall).
+    ${created_vim_account_id}=   Create VIM Target   ${VIM_NAME}   ${VIM_USER}   ${VIM_PASSWORD}   ${VIM_AUTH_URL}   ${VIM_TENANT}   ${VIM_ACCOUNT_TYPE}   config=${VIM_CONFIG}
+    Log   ${created_vim_account_id}
+    Check For VIM Target Status   ${VIM_NAME}   ${PROMETHEUS_HOST}   ${PROMETHEUS_PORT}   ${PROMETHEUS_USER}   ${PROMETHEUS_PASSWORD}
 
-    Create NSD   '%{PACKAGES_FOLDER}/${nsd_pkg}'
+Create VNF Descriptor
+    [Documentation]   Upload VNF package for the testsuite.
+    Create VNFD   '%{PACKAGES_FOLDER}/${VNFD_PKG}'
 
+Create NS Descriptor
+    [Documentation]   Upload NS package for the testsuite.
+    Create NSD   '%{PACKAGES_FOLDER}/${NSD_PKG}'
 
 Instantiate Network Service
-
-    ${id}=   Create Network Service   ${nsd_name}   ${vim_name}   ${ns_name}   ${ns_config}   ${publickey}
-    Set Suite Variable   ${ns_id}   ${id}
-
+    [Documentation]   Instantiate NS for the testsuite.
+    ${id}=   Create Network Service   ${NSD_NAME}   ${VIM_NAME}   ${NS_NAME}   ${NS_CONFIG}   ${PUBLICKEY}
+    Set Suite Variable   ${NS_ID}   ${id}
 
 Check Port Security Is Disabled
-
-    ${rc}   ${disabled_ports}=   Run and Return RC and Output   osm ns-show ${ns_name} --literal | grep -c '${port_disabled_msg}'
-    Run Keyword If   ${disabled_ports} <= 0   Fail   msg=Found '${disabled_ports}' matches for '${port_disabled_msg}'
-
+    [Documentation]   Check that there are ports/interfaces in the VDU of the VNF of the NS whose port security was disabled.
+    ${rc}   ${disabled_ports}=   Run And Return RC And Output   osm ns-show ${NS_NAME} --literal | grep -c '${PORT_DISABLED_MSG}'
+    Log   ${rc},${disabled_ports}
+    IF   ${disabled_ports} <= 0   Fail   msg=Found '${disabled_ports}' matches for '${PORT_DISABLED_MSG}'
 
 Delete NS Instance
+    [Documentation]   Delete NS instance.
     [Tags]   cleanup
-
-    Delete NS   ${ns_name}
-
+    Delete NS   ${NS_NAME}
 
 Delete NS Descriptor
+    [Documentation]   Delete NS package from OSM.
     [Tags]   cleanup
-
-    Delete NSD   ${nsd_name}
-
+    Delete NSD   ${NSD_NAME}
 
 Delete VNF Descriptor
+    [Documentation]   Delete VNF package from OSM.
     [Tags]   cleanup
-
-    Delete VNFD   ${vnfd_name}
-
+    Delete VNFD   ${VNFD_NAME}
 
 Delete VIM
+    [Documentation]   Delete VIM from OSM.
     [Tags]   cleanup
-
-    Delete VIM Target   ${vim_name}
+    Delete VIM Target   ${VIM_NAME}
 
 
 *** Keywords ***
+Suite Preparation
+    [Documentation]   Test Suite Preparation: Setting Prometheus Testsuite Variables
+    Set Testsuite Prometheus Variables
+
 Suite Cleanup
     [Documentation]   Test Suite Cleanup: Deleting descriptors and NS instance
-
-    Run Keyword If Any Tests Failed   Delete NS   ${ns_name}
-    Run Keyword If Any Tests Failed   Delete NSD   ${nsd_name}
-    Run Keyword If Any Tests Failed   Delete VNFD   ${vnfd_name}
-    Run Keyword If Any Tests Failed   Delete VIM Target   ${vim_name}
+    Run Keyword If Any Tests Failed   Delete NS   ${NS_NAME}
+    Run Keyword If Any Tests Failed   Delete NSD   ${NSD_NAME}
+    Run Keyword If Any Tests Failed   Delete VNFD   ${VNFD_NAME}
+    Run Keyword If Any Tests Failed   Delete VIM Target   ${VIM_NAME}
index f5cdf0f..1f76c71 100644 (file)
@@ -1,3 +1,4 @@
+*** Comments ***
 #   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
@@ -10,6 +11,7 @@
 #   See the License for the specific language governing permissions and
 #   limitations under the License.
 
+
 *** Settings ***
 Documentation   [BASIC-09] Manual VNF/VDU Scaling.
 
@@ -17,130 +19,124 @@ Library   OperatingSystem
 Library   String
 Library   Collections
 
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/vnfd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/nsd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ns_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ssh_lib.robot
+Resource   ../lib/vnfd_lib.resource
+Resource   ../lib/nsd_lib.resource
+Resource   ../lib/ns_lib.resource
+Resource   ../lib/ns_operation_lib.resource
+Resource   ../lib/ssh_lib.resource
 
-Force Tags   basic_09   cluster_main   daily   regression
+Test Tags   basic_09   cluster_main   daily   regression   azure
 
 Suite Teardown   Run Keyword And Ignore Error   Suite Cleanup
 
 
 *** Variables ***
 # NS and VNF descriptor package folder and ids
-${vnfd_pkg}   hackfest_basic_metrics_vnf
-${vnfd_name}   hackfest_basic_metrics-vnf
-${nsd_pkg}   hackfest_basic_metrics_ns
-${nsd_name}   hackfest_basic-ns-metrics
+${VNFD_PKG}   hackfest_basic_metrics_vnf
+${VNFD_NAME}   hackfest_basic_metrics-vnf
+${NSD_PKG}   hackfest_basic_metrics_ns
+${NSD_NAME}   hackfest_basic-ns-metrics
 
 # NS instance name and configuration
-${ns_name}   basic_09_manual_scaling_test
-${ns_config}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
-${scaling_group}   vdu_autoscale
-${vnf_member_index}   vnf
+${NS_NAME}   basic_09_manual_scaling_test
+${NS_CONFIG}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
+${SCALING_GROUP}   vdu_autoscale
+${VNF_MEMBER_INDEX}   vnf
 
 # SSH public key file
-${publickey}   %{HOME}/.ssh/id_rsa.pub
+${PUBLICKEY}   %{HOME}/.ssh/id_rsa.pub
 
 
 *** Test Cases ***
 Create Scaling VNF Descriptor
+    [Documentation]   Upload VNF package for the testsuite.
     [Tags]   prepare
-    Create VNFD   '%{PACKAGES_FOLDER}/${vnfd_pkg}'
-
+    Create VNFD   '%{PACKAGES_FOLDER}/${VNFD_PKG}'
 
 Create Scaling NS Descriptor
+    [Documentation]   Upload NS package for the testsuite.
     [Tags]   prepare
-    Create NSD   '%{PACKAGES_FOLDER}/${nsd_pkg}'
-
+    Create NSD   '%{PACKAGES_FOLDER}/${NSD_PKG}'
 
 Instantiate Scaling Network Service
+    [Documentation]   Instantiate NS for the testsuite.
     [Tags]   prepare
-    ${id}=   Create Network Service   ${nsd_name}   %{VIM_TARGET}   ${ns_name}   ${ns_config}   ${publickey}
+    ${id}=   Create Network Service   ${NSD_NAME}   %{VIM_TARGET}   ${NS_NAME}   ${NS_CONFIG}   ${PUBLICKEY}
+    Log   ${id}
 
 Get Ns Id
+    [Documentation]   Retrieve NS instance id to be used later on.
     [Tags]   verify
-    ${id}=   Get Ns Id   ${ns_name}
-    Set Suite Variable   ${ns_id}   ${id}
+    ${id}=   Get Ns Id   ${NS_NAME}
+    Set Suite Variable   ${NS_ID}   ${id}
 
 Get Vnf Id
+    [Documentation]   Retrieve VNF instance id to be used later on.
     [Tags]   verify
-    Variable Should Exist   ${ns_id}   msg=Network service instance is not available
-    @{vnfr_list}=   Get Ns Vnfr Ids   ${ns_id}
+    Variable Should Exist   ${NS_ID}   msg=Network service instance is not available
+    @{vnfr_list}=   Get Ns Vnfr Ids   ${NS_ID}
     Log List   ${vnfr_list}
-    Set Suite Variable   ${vnf_id}   ${vnfr_list}[0]
-
+    Set Suite Variable   ${VNF_ID}   ${vnfr_list}[0]
 
 Get Vdus Before Scale Out
+    [Documentation]   Check the number of VDUs instances before the manual scaling.
     [Tags]   verify
-    [Documentation]   Get the number of VDU records before the manual scaling.
-
-    @{vdur_list}=   Get Vnf Vdur Names   ${vnf_id}
+    @{vdur_list}=   Get Vnf Vdur Names   ${VNF_ID}
     Log List   ${vdur_list}
     ${vdurs}=   Get Length   ${vdur_list}
-    Set Suite Variable   ${initial_vdur_count}   ${vdurs}
-
+    Set Suite Variable   ${INITIAL_VDUR_COUNT}   ${vdurs}
 
 Perform Manual Vdu Scale Out
+    [Documentation]   Perform a manual scale-out operation of the VNF.
     [Tags]   verify
-    Variable Should Exist   ${ns_id}   msg=Network service instance is not available
-    ${ns_op_id}=   Execute Manual VNF Scale   ${ns_name}   ${vnf_member_index}   ${scaling_group}   SCALE_OUT
-
+    Variable Should Exist   ${NS_ID}   msg=Network service instance is not available
+    ${ns_op_id}=   Execute Manual VNF Scale   ${NS_NAME}   ${VNF_MEMBER_INDEX}   ${SCALING_GROUP}   SCALE_OUT
+    Log   ${ns_op_id}
 
 Check Vdus After Scale Out
+    [Documentation]   Check whether there is one more VDU after scaling out.
     [Tags]   verify
-    [Documentation]   Check whether there is one more VDU after scaling or not.
-
-    Variable Should Exist   ${ns_id}   msg=Network service instance is not available
-    @{vdur_list}=   Get Vnf Vdur Names   ${vnf_id}
+    Variable Should Exist   ${NS_ID}   msg=Network service instance is not available
+    @{vdur_list}=   Get Vnf Vdur Names   ${VNF_ID}
     Log List   ${vdur_list}
     ${vdurs}=   Get Length   ${vdur_list}
-    Run Keyword If   ${vdurs} != ${initial_vdur_count} + 1   Fail   msg=There is no new VDU records in the VNF after Scale Out
-
+    IF   ${vdurs} != ${INITIAL_VDUR_COUNT} + 1   Fail   msg=There is no new VDU records in the VNF after Scale Out
 
 Perform Manual Vdu Scale In
+    [Documentation]   Perform a manual scale-in operation of the VNF.
     [Tags]   verify
-    Variable Should Exist   ${ns_id}   msg=Network service instance is not available
-    ${ns_op_id}=   Execute Manual VNF Scale   ${ns_name}   ${vnf_member_index}   ${scaling_group}   SCALE_IN
-
+    Variable Should Exist   ${NS_ID}   msg=Network service instance is not available
+    ${ns_op_id}=   Execute Manual VNF Scale   ${NS_NAME}   ${VNF_MEMBER_INDEX}   ${SCALING_GROUP}   SCALE_IN
+    Log   ${ns_op_id}
 
 Check Vdus After Scaling In
+    [Documentation]   Check whether there is one less VDU after scaling in.
     [Tags]   verify
-    [Documentation]   Check whether there is one less VDU after scaling or not.
-
-    Variable Should Exist   ${ns_id}   msg=Network service instance is not available
-    @{vdur_list}=   Get Vnf Vdur Names   ${vnf_id}
+    Variable Should Exist   ${NS_ID}   msg=Network service instance is not available
+    @{vdur_list}=   Get Vnf Vdur Names   ${VNF_ID}
     Log List   ${vdur_list}
     ${vdurs}=   Get Length   ${vdur_list}
-    Run Keyword If   ${vdurs} != ${initial_vdur_count}   Fail   msg=There is the same number of VDU records in the VNF after Scale In
-
+    IF   ${vdurs} != ${INITIAL_VDUR_COUNT}   Fail   msg=There is the same number of VDU records in the VNF after Scale In
 
 Delete NS Instance
+    [Documentation]   Delete NS instance.
     [Tags]   cleanup
-
-    Delete NS   ${ns_name}
-
+    Delete NS   ${NS_NAME}
 
 Delete NS Descriptor
+    [Documentation]   Delete NS package from OSM.
     [Tags]   cleanup
-
-    Delete NSD   ${nsd_name}
-
+    Delete NSD   ${NSD_NAME}
 
 Delete VNF Descriptor
+    [Documentation]   Delete VNF package from OSM.
     [Tags]   cleanup
-
-    Delete VNFD   ${vnfd_name}
+    Delete VNFD   ${VNFD_NAME}
 
 
 *** Keywords ***
 Suite Cleanup
     [Documentation]   Test Suite Cleanup: Deleting descriptors and NS instance
-
-    Run Keyword If Any Tests Failed   Delete NS   ${ns_name}
-
-    Run Keyword If Any Tests Failed   Delete NSD   ${nsd_name}
-
-    Run Keyword If Any Tests Failed   Delete VNFD   ${vnfd_name}
-
+    Run Keyword If Any Tests Failed   Delete NS   ${NS_NAME}
+    Run Keyword If Any Tests Failed   Delete NSD   ${NSD_NAME}
+    Run Keyword If Any Tests Failed   Delete VNFD   ${VNFD_NAME}
index eeb5ba6..0704323 100644 (file)
@@ -1,3 +1,4 @@
+*** Comments ***
 #   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
 #   See the License for the specific language governing permissions and
 #   limitations under the License.
 
+
 *** Settings ***
 Documentation   [BASIC-11] Native Charms
 
 Library   OperatingSystem
 Library   SSHLibrary
 
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/vnfd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/nsd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ns_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ssh_lib.robot
+Resource   ../lib/vnfd_lib.resource
+Resource   ../lib/nsd_lib.resource
+Resource   ../lib/ns_lib.resource
+Resource   ../lib/ssh_lib.resource
 
-Force Tags   basic_11   cluster_ee_config   cluster_relations   daily   regression   sanity
+Test Tags   basic_11   cluster_ee_config   cluster_relations   regression   azure
 
 Suite Teardown   Run Keyword And Ignore Error   Suite Cleanup
 
 
 *** Variables ***
 # NS and VNF descriptor package folder and ids
-${vnfd_pkg}   charm-packages/native_charm_vnf
-${vnfd_name}   native_charm-vnf
-${nsd_pkg}   charm-packages/native_charm_ns
-${nsd_name}   native_charm-ns
+${VNFD_PKG}   charm-packages/native_charm_vnf
+${VNFD_NAME}   native_charm-vnf
+${NSD_PKG}   charm-packages/native_charm_ns
+${NSD_NAME}   native_charm-ns
 
 # NS instance name and configuration
-${ns_name}   basic_11_native_charms
-${ns_config}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
-${ns_timeout}   15min
+${NS_NAME}   basic_11_native_charms
+${NS_CONFIG}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
+${NS_TIMEOUT}   15min
 
 # SSH keys and username to be used
-${publickey}   %{HOME}/.ssh/id_rsa.pub
-${privatekey}   %{HOME}/.ssh/id_rsa
-${username}   ubuntu
-${password}   ${EMPTY}
+${PUBLICKEY}   %{HOME}/.ssh/id_rsa.pub
+${PRIVATEKEY}   %{HOME}/.ssh/id_rsa
+${USERNAME}   ubuntu
+${PASSWORD}   ${EMPTY}
 
-${action_name}   touch
-${vnf_member_index_1}   vnf1
-${vnf_member_index_2}   vnf2
-${day_1_file_name}   /home/ubuntu/first-touch
-${day_2_file_name_1}   /home/ubuntu/mytouch1
-${day_2_file_name_2}   /home/ubuntu/mytouch2
+${ACTION_NAME}   touch
+${VNF_MEMBER_INDEX_1}   vnf1
+${VNF_MEMBER_INDEX_2}   vnf2
+${DAY_1_FILE_NAME}   /home/ubuntu/first-touch
+${DAY_2_FILE_NAME_1}   /home/ubuntu/mytouch1
+${DAY_2_FILE_NAME_2}   /home/ubuntu/mytouch2
 
 
 *** Test Cases ***
 Create Charm VNF Descriptor
-
-    Create VNFD   '%{PACKAGES_FOLDER}/${vnfd_pkg}'
-
+    [Documentation]   Upload VNF package for the testsuite.
+    Create VNFD   '%{PACKAGES_FOLDER}/${VNFD_PKG}'
 
 Create Charm NS Descriptor
-
-    Create NSD   '%{PACKAGES_FOLDER}/${nsd_pkg}'
-
+    [Documentation]   Upload NS package for the testsuite.
+    Create NSD   '%{PACKAGES_FOLDER}/${NSD_PKG}'
 
 Instantiate Charm Network Service
-
-    ${id}=   Create Network Service   ${nsd_name}   %{VIM_TARGET}   ${ns_name}   ${ns_config}   ${publickey}   ${ns_timeout}
-    Set Suite Variable   ${ns_id}   ${id}
-
+    [Documentation]   Instantiate NS for the testsuite.
+    ${id}=   Create Network Service   ${NSD_NAME}   %{VIM_TARGET}   ${NS_NAME}   ${NS_CONFIG}   ${PUBLICKEY}   ${NS_TIMEOUT}
+    Set Suite Variable   ${NS_ID}   ${id}
 
 Get Management Ip Addresses
-
-    ${ip_addr_1}   Get Vnf Management Ip Address   ${ns_id}   ${vnf_member_index_1}
+    [Documentation]   Get the mgmt IP address of the two VNF of the NS.
+    ${ip_addr_1}=   Get Vnf Management Ip Address   ${NS_ID}   ${VNF_MEMBER_INDEX_1}
     Log   ${ip_addr_1}
-    Set Suite Variable   ${vnf_1_ip_addr}   ${ip_addr_1}
-    ${ip_addr_2}   Get Vnf Management Ip Address   ${ns_id}   ${vnf_member_index_2}
+    Set Suite Variable   ${VNF_1_IP_ADDR}   ${ip_addr_1}
+    ${ip_addr_2}=   Get Vnf Management Ip Address   ${NS_ID}   ${VNF_MEMBER_INDEX_2}
     Log   ${ip_addr_2}
-    Set Suite Variable   ${vnf_2_ip_addr}   ${ip_addr_2}
-
+    Set Suite Variable   ${VNF_2_IP_ADDR}   ${ip_addr_2}
 
 Test SSH Access
-
-    Variable Should Exist   ${vnf_1_ip_addr}   msg=IP address of the management VNF '${vnf_member_index_1}' is not available
-    Variable Should Exist   ${vnf_2_ip_addr}   msg=IP address of the management VNF '${vnf_member_index_2}' is not available
+    [Documentation]   Check that both VNF are accessible via SSH in their respective mgmt IP address.
+    Variable Should Exist   ${VNF_1_IP_ADDR}   msg=IP address of the management VNF '${VNF_MEMBER_INDEX_1}' is not available
+    Variable Should Exist   ${VNF_2_IP_ADDR}   msg=IP address of the management VNF '${VNF_MEMBER_INDEX_2}' is not available
     Sleep   30s   Waiting ssh daemon to be up
-    Test SSH Connection   ${vnf_1_ip_addr}   ${username}   ${password}   ${privatekey}
-    Test SSH Connection   ${vnf_2_ip_addr}   ${username}   ${password}   ${privatekey}
-
+    Test SSH Connection   ${VNF_1_IP_ADDR}   ${USERNAME}   ${PASSWORD}   ${PRIVATEKEY}
+    Test SSH Connection   ${VNF_2_IP_ADDR}   ${USERNAME}   ${PASSWORD}   ${PRIVATEKEY}
 
 Check Remote Files Created Via Day 1 Operations
     [Documentation]   The Charm VNF has a Day 1 operation that creates a file named ${day_1_file_name}.
     ...               This test checks whether that files have been created or not.
-
-    Check If remote File Exists   ${vnf_1_ip_addr}   ${username}   ${password}   ${privatekey}   ${day_1_file_name}
-    Check If remote File Exists   ${vnf_2_ip_addr}   ${username}   ${password}   ${privatekey}   ${day_1_file_name}
-
+    Check If Remote File Exists   ${VNF_1_IP_ADDR}   ${USERNAME}   ${PASSWORD}   ${PRIVATEKEY}   ${DAY_1_FILE_NAME}
+    Check If Remote File Exists   ${VNF_2_IP_ADDR}   ${USERNAME}   ${PASSWORD}   ${PRIVATEKEY}   ${DAY_1_FILE_NAME}
 
 Delete NS Instance
+    [Documentation]   Delete NS instance.
     [Tags]   cleanup
-
-    Delete NS   ${ns_name}
-
+    Delete NS   ${NS_NAME}
 
 Delete NS Descriptor
+    [Documentation]   Delete NS package from OSM.
     [Tags]   cleanup
-
-    Delete NSD   ${nsd_name}
-
+    Delete NSD   ${NSD_NAME}
 
 Delete VNF Descriptor
+    [Documentation]   Delete VNF package from OSM.
     [Tags]   cleanup
-
-    Delete VNFD   ${vnfd_name}
+    Delete VNFD   ${VNFD_NAME}
 
 
 *** Keywords ***
 Suite Cleanup
     [Documentation]   Test Suite Cleanup: Deleting descriptors and NS instance
-
-    Run Keyword If Any Tests Failed   Delete NS   ${ns_name}
-
-    Run Keyword If Any Tests Failed   Delete NSD   ${nsd_name}
-
-    Run Keyword If Any Tests Failed   Delete VNFD   ${vnfd_name}
-
+    Run Keyword If Any Tests Failed   Delete NS   ${NS_NAME}
+    Run Keyword If Any Tests Failed   Delete NSD   ${NSD_NAME}
+    Run Keyword If Any Tests Failed   Delete VNFD   ${VNFD_NAME}
index 2bde49c..ee1cb31 100644 (file)
@@ -1,3 +1,4 @@
+*** Comments ***
 #   Copyright 2020 Canonical Ltd.
 #   Licensed under the Apache License, Version 2.0 (the "License");
 #   you may not use this file except in compliance with the License.
@@ -11,6 +12,7 @@
 #   See the License for the specific language governing permissions and
 #   limitations under the License.
 
+
 *** Settings ***
 Documentation   [BASIC-12] NS Primitives
 
@@ -20,131 +22,119 @@ Library   Collections
 Library   Process
 Library   SSHLibrary
 
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/vnfd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/nsd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ns_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/package_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/juju_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ssh_lib.robot
+Resource   ../lib/vnfd_lib.resource
+Resource   ../lib/nsd_lib.resource
+Resource   ../lib/ns_lib.resource
+Resource   ../lib/package_lib.resource
+Resource   ../lib/juju_lib.resource
+Resource   ../lib/ssh_lib.resource
 
-Force Tags   basic_12   cluster_ee_config   daily   regression
+Test Tags   basic_12   cluster_ee_config   regression   azure
 
 Suite Teardown   Run Keyword And Ignore Error   Suite Cleanup
 
 
 *** Variables ***
 # NS and VNF descriptor package folder and ids
-${vnfd_pkg1}   nscharm_policy_vnf
-${vnfd_pkg2}   nscharm_user_vnf
-${vnfd_name1}   nscharm-policy-vnf
-${vnfd_name2}   nscharm-user-vnf
-${nsd_pkg}   nscharm_ns
-${new_nsd_pkg}   new_nscharm_ns
-${nsd_name}   nscharm-ns
-${nsd_file}   nscharm_nsd.yaml
+${VNFD_PKG1}   nscharm_policy_vnf
+${VNFD_PKG2}   nscharm_user_vnf
+${VNFD_NAME1}   nscharm-policy-vnf
+${VNFD_NAME2}   nscharm-user-vnf
+${NSD_PKG}   nscharm_ns
+${NEW_NSD_PKG}   new_nscharm_ns
+${NSD_NAME}   nscharm-ns
+${NSD_FILE}   nscharm_nsd.yaml
 
 # NS instance name and configuration
-${ns_name}   test_nscharm
-${ns_config}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
-${ns_timeout}   15min
+${NS_NAME}   test_nscharm
+${NS_CONFIG}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
+${NS_TIMEOUT}   15min
 
-${old_juju_password}   a5611fc6452349cc6e45705d34c501d4
-${publickey}   ${EMPTY}
-${success_return_code}   0
+${OLD_JUJU_PASSWORD}   a5611fc6452349cc6e45705d34c501d4
+${PUBLICKEY}   ${EMPTY}
+${SUCCESS_RETURN_CODE}   0
 
 # VDU profile id, execution environment name to check vdu level charm naming structure
-${vdu_profile_id}   PolicyVM
-${ee_name}   vnf-policy
+${VDU_PROFILE_ID}   PolicyVM
+${EE_NAME}   vnf-policy
 
 # # Username and SSH private key for accessing OSM host
-${privatekey}   %{OSM_RSA_FILE}
-${username}   ubuntu
-${password}   ${EMPTY}
+${PRIVATEKEY}   %{OSM_RSA_FILE}
+${USERNAME}   ubuntu
+${PASSWORD}   ${EMPTY}
 
 # Charm name to check ns level charm naming structure
-${charm_name}   ns
+${CHARM_NAME}   ns
 
 
 *** Test Cases ***
 Change Juju Password
     [Documentation]   NS package needs to be updated with the Juju credentials for your OSM installation
-
-    ${rc}   ${stdout}=   Run and Return RC and Output   cp -r '%{PACKAGES_FOLDER}/${nsd_pkg}' '%{PACKAGES_FOLDER}/${new_nsd_pkg}'
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    ${nsd_yaml}=   OperatingSystem.Get File   %{PACKAGES_FOLDER}/${new_nsd_pkg}/${nsd_file}
-    ${changed_nsd_yaml}=   Replace String   ${nsd_yaml}   ${old_juju_password}   %{JUJU_PASSWORD}
-    Create File   %{PACKAGES_FOLDER}/${new_nsd_pkg}/${nsd_file}   ${changed_nsd_yaml}
-
+    ${rc}   ${stdout}=   Run And Return RC And Output   cp -r '%{PACKAGES_FOLDER}/${NSD_PKG}' '%{PACKAGES_FOLDER}/${NEW_NSD_PKG}'
+    Log   ${rc},${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    ${nsd_yaml}=   OperatingSystem.Get File   %{PACKAGES_FOLDER}/${NEW_NSD_PKG}/${NSD_FILE}
+    ${changed_nsd_yaml}=   Replace String   ${nsd_yaml}   ${OLD_JUJU_PASSWORD}   %{JUJU_PASSWORD}
+    Create File   %{PACKAGES_FOLDER}/${NEW_NSD_PKG}/${NSD_FILE}   ${changed_nsd_yaml}
 
 Upload Vnfds
-
-    Create VNFD   '%{PACKAGES_FOLDER}/${vnfd_pkg1}'
-    Create VNFD   '%{PACKAGES_FOLDER}/${vnfd_pkg2}'
-
+    [Documentation]   Upload VNF packages for the testsuite.
+    Create VNFD   '%{PACKAGES_FOLDER}/${VNFD_PKG1}'
+    Create VNFD   '%{PACKAGES_FOLDER}/${VNFD_PKG2}'
 
 Upload Nsd
-
-    Create NSD   %{PACKAGES_FOLDER}/${new_nsd_pkg}/
-
+    [Documentation]   Upload NS package for the testsuite.
+    Create NSD   %{PACKAGES_FOLDER}/${NEW_NSD_PKG}
 
 Instantiate NS
-
-    ${id}=   Create Network Service   ${nsd_name}   %{VIM_TARGET}   ${ns_name}   ${ns_config}   ${publickey}   ns_launch_max_wait_time=${ns_timeout}
-    Set Suite Variable   ${ns_id}   ${id}
-    Set Suite Variable   ${model_name}   ${id}
-
+    [Documentation]   Instantiate NS for the testsuite.
+    ${id}=   Create Network Service   ${NSD_NAME}   %{VIM_TARGET}   ${NS_NAME}   ${NS_CONFIG}   ${PUBLICKEY}   ns_launch_max_wait_time=${NS_TIMEOUT}
+    Set Suite Variable   ${NS_ID}   ${id}
+    Set Suite Variable   ${MODEL_NAME}   ${id}
 
 Check NS Charm Application Name
-
-    ${ns_charm_app_name}=   Get Application Name NS Level Charm   %{OSM_HOSTNAME}   ${username}   ${password}   ${privatekey}   ${model_name}   ${charm_name}
+    [Documentation]   Check that the NS charm has the right length.
+    ${ns_charm_app_name}=   Get Application Name NS Level Charm   %{OSM_HOSTNAME}   ${USERNAME}   ${PASSWORD}   ${PRIVATEKEY}   ${MODEL_NAME}   ${CHARM_NAME}
     ${length}=   Get Length   ${ns_charm_app_name}
     Should Be True   ${length} <50
 
-
 Check VDU Charm Application Name
-
-    ${vdu_charm_app_name}=   Get Application Name VDU Level Charm   %{OSM_HOSTNAME}   ${username}   ${password}   ${privatekey}   ${model_name}   ${vdu_profile_id}   ${ee_name}
+    [Documentation]   Check that the VDU charm has the right length.
+    ${vdu_charm_app_name}=   Get Application Name VDU Level Charm   %{OSM_HOSTNAME}   ${USERNAME}   ${PASSWORD}   ${PRIVATEKEY}   ${MODEL_NAME}   ${VDU_PROFILE_ID}   ${EE_NAME}
     ${length}=   Get Length   ${vdu_charm_app_name}
     Should Be True   ${length} <50
 
 # TODO: Check Initial Config Primitives Status
 
 Delete NS
+    [Documentation]   Delete NS instance.
     [Tags]   cleanup
-
-    Delete NS   ${ns_name}
-
+    Delete NS   ${NS_NAME}
 
 Delete NS Descriptor
+    [Documentation]   Delete NS package from OSM.
     [Tags]   cleanup
-
-    Delete NSD   ${nsd_name}
-    Delete Temporary Descriptor Folder   '%{PACKAGES_FOLDER}/${new_nsd_pkg}'
-
+    Delete NSD   ${NSD_NAME}
+    Delete Temporary Descriptor Folder   '%{PACKAGES_FOLDER}/${NEW_NSD_PKG}'
 
 Delete VNF Descriptors
+    [Documentation]   Delete VNF package from OSM.
     [Tags]   cleanup
-
-    Delete VNFD   ${vnfd_name1}
-    Delete VNFD   ${vnfd_name2}
+    Delete VNFD   ${VNFD_NAME1}
+    Delete VNFD   ${VNFD_NAME2}
 
 
 *** Keywords ***
 Suite Cleanup
     [Documentation]   Test Suit Cleanup: Deleting Descriptor and instance
-
-    Run Keyword If Any Tests Failed   Delete NS   ${ns_name}
-    Run Keyword If Any Tests Failed   Delete NSD   ${nsd_name}
-    Run Keyword If Any Tests Failed   Delete VNFD   ${vnfd_name1}
-    Run Keyword If Any Tests Failed   Delete VNFD   ${vnfd_name2}
-    Delete Temporary Descriptor Folder   '%{PACKAGES_FOLDER}/${new_nsd_pkg}'
-
+    Run Keyword If Any Tests Failed   Delete NS   ${NS_NAME}
+    Run Keyword If Any Tests Failed   Delete NSD   ${NSD_NAME}
+    Run Keyword If Any Tests Failed   Delete VNFD   ${VNFD_NAME1}
+    Run Keyword If Any Tests Failed   Delete VNFD   ${VNFD_NAME2}
+    Delete Temporary Descriptor Folder   '%{PACKAGES_FOLDER}/${NEW_NSD_PKG}'
 
 Delete Temporary Descriptor Folder
     [Documentation]   Removes the temporary package folder created for the test
     [Arguments]   ${folder_name}
-
-    ${rc}   ${stdout}=   Run and Return RC and Output   rm -rf '${folder_name}'
-    Log   ${stdout}
-
-
+    ${rc}   ${stdout}=   Run And Return RC And Output   rm -rf '${folder_name}'
+    Log   ${rc},${stdout}
index f50f19f..a405c64 100644 (file)
@@ -1,3 +1,4 @@
+*** Comments ***
 #   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
 #   See the License for the specific language governing permissions and
 #   limitations under the License.
 
+
 *** Settings ***
 Documentation   [BASIC-13] NS Relations
 
 Library   OperatingSystem
 Library   SSHLibrary
 
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/vnfd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/nsd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ns_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ssh_lib.robot
+Resource   ../lib/vnfd_lib.resource
+Resource   ../lib/nsd_lib.resource
+Resource   ../lib/ns_lib.resource
+Resource   ../lib/ssh_lib.resource
 
-Force Tags   basic_13   cluster_ee_config   cluster_relations   daily   regression
+Test Tags   basic_13   cluster_ee_config   cluster_relations   regression   azure
 
 Suite Teardown   Run Keyword And Ignore Error   Suite Cleanup
 
 
 *** Variables ***
 # NS and VNF descriptor package folder and ids
-${vnfd_pkg1}   charm-packages/ns_relations_provides_vnf
-${vnfd_pkg2}   charm-packages/ns_relations_requires_vnf
-${vnfd_name1}   ns_relations_provides-vnf
-${vnfd_name2}   ns_relations_requires-vnf
-${nsd_pkg}   charm-packages/ns_relations_ns
-${nsd_name}   ns_relations-ns
+${VNFD_PKG1}   charm-packages/ns_relations_provides_vnf
+${VNFD_PKG2}   charm-packages/ns_relations_requires_vnf
+${VNFD_NAME1}   ns_relations_provides-vnf
+${VNFD_NAME2}   ns_relations_requires-vnf
+${NSD_PKG}   charm-packages/ns_relations_ns
+${NSD_NAME}   ns_relations-ns
 
 # NS instance name and configuration
-${ns_name}   basic_13_ns_relations_test
-${ns_config}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
-${ns_timeout}   15min
+${NS_NAME}   basic_13_ns_relations_test
+${NS_CONFIG}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
+${NS_TIMEOUT}   15min
 
 # SSH keys and username to be used
-${publickey}   %{HOME}/.ssh/id_rsa.pub
-${privatekey}   %{HOME}/.ssh/id_rsa
-${username}   ubuntu
-${password}   ${EMPTY}
+${PUBLICKEY}   %{HOME}/.ssh/id_rsa.pub
+${PRIVATEKEY}   %{HOME}/.ssh/id_rsa
+${USERNAME}   ubuntu
+${PASSWORD}   ${EMPTY}
 
-${action_name}   touch
-${vnf_member_index_1}   vnf1
-${vnf_member_index_2}   vnf2
-${day_1_file_name}   /home/ubuntu/first-touch
-${day_2_file_name_1}   /home/ubuntu/mytouch1
-${day_2_file_name_2}   /home/ubuntu/mytouch2
+${ACTION_NAME}   touch
+${VNF_MEMBER_INDEX_1}   vnf1
+${VNF_MEMBER_INDEX_2}   vnf2
+${DAY_1_FILE_NAME}   /home/ubuntu/first-touch
+${DAY_2_FILE_NAME_1}   /home/ubuntu/mytouch1
+${DAY_2_FILE_NAME_2}   /home/ubuntu/mytouch2
 
 
 *** Test Cases ***
 Create Charm VNF Descriptor Provides
-
-    Create VNFD   '%{PACKAGES_FOLDER}/${vnfd_pkg1}'
-
+    [Documentation]   Upload VNF package for the testsuite with a charm providing a relation.
+    Create VNFD   '%{PACKAGES_FOLDER}/${VNFD_PKG1}'
 
 Create Charm VNF Descriptor Requires
-
-    Create VNFD   '%{PACKAGES_FOLDER}/${vnfd_pkg2}'
-
+    [Documentation]   Upload VNF package for the testsuite with a charm requiring a relation.
+    Create VNFD   '%{PACKAGES_FOLDER}/${VNFD_PKG2}'
 
 Create Charm NS Descriptor
-
-    Create NSD   '%{PACKAGES_FOLDER}/${nsd_pkg}'
-
+    [Documentation]   Upload NS package for the testsuite.
+    Create NSD   '%{PACKAGES_FOLDER}/${NSD_PKG}'
 
 Instantiate Charm Network Service
+    [Documentation]   Instantiate NS for the testsuite.
+    ${id}=   Create Network Service   ${NSD_NAME}   %{VIM_TARGET}   ${NS_NAME}   ${NS_CONFIG}   ${PUBLICKEY}   ${NS_TIMEOUT}
+    Set Suite Variable   ${NS_ID}   ${id}
 
-    ${id}=   Create Network Service   ${nsd_name}   %{VIM_TARGET}   ${ns_name}   ${ns_config}   ${publickey}   ${ns_timeout}
-    Set Suite Variable   ${ns_id}   ${id}
-
-
-# TODO Check juju status for relations
-
+# TODO: Check juju status for relations
 
 Delete NS Instance
+    [Documentation]   Delete NS instance.
     [Tags]   cleanup
-
-    Delete NS   ${ns_name}
-
+    Delete NS   ${NS_NAME}
 
 Delete NS Descriptor
+    [Documentation]   Delete NS package from OSM.
     [Tags]   cleanup
-
-    Delete NSD   ${nsd_name}
-
+    Delete NSD   ${NSD_NAME}
 
 Delete VNF Descriptor Provides
+    [Documentation]   Delete first VNF package from OSM.
     [Tags]   cleanup
-
-    Delete VNFD   ${vnfd_name1}
-
+    Delete VNFD   ${VNFD_NAME1}
 
 Delete VNF Descriptor Requires
+    [Documentation]   Delete second VNF package from OSM.
     [Tags]   cleanup
-
-    Delete VNFD   ${vnfd_name2}
+    Delete VNFD   ${VNFD_NAME2}
 
 
 *** Keywords ***
 Suite Cleanup
     [Documentation]   Test Suite Cleanup: Deleting descriptors and NS instance
-
-    Run Keyword If Any Tests Failed   Delete NS   ${ns_name}
-
-    Run Keyword If Any Tests Failed   Delete NSD   ${nsd_name}
-
-    Run Keyword If Any Tests Failed   Delete VNFD   ${vnfd_name}
-
+    Run Keyword If Any Tests Failed   Delete NS   ${NS_NAME}
+    Run Keyword If Any Tests Failed   Delete NSD   ${NSD_NAME}
+    Run Keyword If Any Tests Failed   Delete VNFD   ${VNFD_NAME1}
+    Run Keyword If Any Tests Failed   Delete VNFD   ${VNFD_NAME2}
index dfe164a..ed4b167 100644 (file)
@@ -1,3 +1,4 @@
+*** Comments ***
 #   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
 #   See the License for the specific language governing permissions and
 #   limitations under the License.
 
+
 *** Settings ***
 Documentation   [BASIC-14] VNF Relations
 
 Library   OperatingSystem
 Library   SSHLibrary
 
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/vnfd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/nsd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ns_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ssh_lib.robot
+Resource   ../lib/vnfd_lib.resource
+Resource   ../lib/nsd_lib.resource
+Resource   ../lib/ns_lib.resource
+Resource   ../lib/ssh_lib.resource
 
-Force Tags   basic_14   cluster_ee_config   cluster_relations   daily   regression
+Test Tags   basic_14   cluster_ee_config   cluster_relations   regression   azure
 
 Suite Teardown   Run Keyword And Ignore Error   Suite Cleanup
 
 
 *** Variables ***
 # NS and VNF descriptor package folder and ids
-${vnfd_pkg}   charm-packages/vnf_relations_vnf
-${vnfd_name}   vnf_relations-vnf
-${nsd_pkg}   charm-packages/vnf_relations_ns
-${nsd_name}   vnf_relations-ns
+${VNFD_PKG}   charm-packages/vnf_relations_vnf
+${VNFD_NAME}   vnf_relations-vnf
+${NSD_PKG}   charm-packages/vnf_relations_ns
+${NSD_NAME}   vnf_relations-ns
 
 # NS instance name and configuration
-${ns_name}   basic_14_vnf_relations_test
-${ns_config}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
-${ns_timeout}   15min
+${NS_NAME}   basic_14_vnf_relations_test
+${NS_CONFIG}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
+${NS_TIMEOUT}   15min
 
 # SSH public keys file
-${publickey}   %{HOME}/.ssh/id_rsa.pub
+${PUBLICKEY}   %{HOME}/.ssh/id_rsa.pub
 
 
 *** Test Cases ***
 Create Charm VNF Descriptor
-
-    Create VNFD   '%{PACKAGES_FOLDER}/${vnfd_pkg}'
-
+    [Documentation]   Upload VNF package for the testsuite.
+    Create VNFD   '%{PACKAGES_FOLDER}/${VNFD_PKG}'
 
 Create Charm NS Descriptor
-
-    Create NSD   '%{PACKAGES_FOLDER}/${nsd_pkg}'
-
+    [Documentation]   Upload NS package for the testsuite.
+    Create NSD   '%{PACKAGES_FOLDER}/${NSD_PKG}'
 
 Instantiate Charm Network Service
+    [Documentation]   Instantiate NS for the testsuite.
+    ${id}=   Create Network Service   ${NSD_NAME}   %{VIM_TARGET}   ${NS_NAME}   ${NS_CONFIG}   ${PUBLICKEY}   ${NS_TIMEOUT}
+    Set Suite Variable   ${NS_ID}   ${id}
 
-    ${id}=   Create Network Service   ${nsd_name}   %{VIM_TARGET}   ${ns_name}   ${ns_config}   ${publickey}   ${ns_timeout}
-    Set Suite Variable   ${ns_id}   ${id}
-
-
-# TODO Check juju status for relations
-
+# TODO: Check juju status for relations
 
 Delete NS Instance
+    [Documentation]   Delete NS instance.
     [Tags]   cleanup
-
-    Delete NS   ${ns_name}
-
+    Delete NS   ${NS_NAME}
 
 Delete NS Descriptor
+    [Documentation]   Delete NS package from OSM.
     [Tags]   cleanup
+    Delete NSD   ${NSD_NAME}
 
-    Delete NSD   ${nsd_name}
-
-
-Delete VNF Descriptor Provides
+Delete VNF Descriptor
+    [Documentation]   Delete VNF package from OSM.
     [Tags]   cleanup
-
-    Delete VNFD   ${vnfd_name}
+    Delete VNFD   ${VNFD_NAME}
 
 
 *** Keywords ***
 Suite Cleanup
     [Documentation]   Test Suite Cleanup: Deleting descriptors and NS instance
-
-    Run Keyword If Any Tests Failed   Delete NS   ${ns_name}
-
-    Run Keyword If Any Tests Failed   Delete NSD   ${nsd_name}
-
-    Run Keyword If Any Tests Failed   Delete VNFD   ${vnfd_name}
-
+    Run Keyword If Any Tests Failed   Delete NS   ${NS_NAME}
+    Run Keyword If Any Tests Failed   Delete NSD   ${NSD_NAME}
+    Run Keyword If Any Tests Failed   Delete VNFD   ${VNFD_NAME}
index ce62168..4d45c77 100644 (file)
@@ -1,3 +1,4 @@
+*** Comments ***
 #   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
@@ -10,6 +11,7 @@
 #   See the License for the specific language governing permissions and
 #   limitations under the License.
 
+
 *** Settings ***
 Documentation   [BASIC-15] RBAC Configurations.
 
@@ -17,76 +19,75 @@ Library   OperatingSystem
 Library   String
 Library   Collections
 
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/user_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/project_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/role_lib.robot
+Resource   ../lib/user_lib.resource
+Resource   ../lib/project_lib.resource
+Resource   ../lib/role_lib.resource
 
-Force Tags   basic_15   cluster_main   daily   regression
+Test Tags   basic_15   cluster_main   daily   regression   azure
 
 Suite Teardown   Run Keyword And Ignore Error   Suite Cleanup
 
 
 *** Variables ***
 # User, project and roles to use
-${user_name}   basic_15_test_user
-${user_password}   basic_15_user_pass
-${user_role}   project_user
-${user_project}   admin
-${project_name}   basic_15_test_project
-${new_project_name}   basic_15_project_test
-${role_name}   test_role
-${success_return_code}   0
+${USERNAME}   basic_15_test_user
+${USER_PASSWORD}   Basic_15_user_pass
+${USER_NEW_PASSWORD}   Basic_15_new_pass
+${USER_ROLE}   project_user
+${USER_PROJECT}   admin
+${PROJECT_NAME}   basic_15_test_project
+${NEW_PROJECT_NAME}   basic_15_project_test
+${ROLE_NAME}   test_role
+${SUCCESS_RETURN_CODE}   0
 
 
 *** Test Cases ***
 Create And Validate User
-
-    Create User   ${user_name}   ${user_password}
-    Check If User Exists   ${user_name}
-
+    [Documentation]   Create a user in OSM.
+    Create User   ${USERNAME}   ${USER_PASSWORD}
+    Check If User Exists   ${USERNAME}
 
 Assign Role To User
-
-    Update User Role   ${user_name}   ${user_project}   ${user_role}
-    Check If User Is Assigned To Project   ${user_name}   ${user_project}
-    Check If User Has Role   ${user_name}   ${user_role}   ${user_project}
-
+    [Documentation]   Assign a user to a project with a role
+    Update User Role   ${USERNAME}   ${USER_PROJECT}   ${USER_ROLE}
+    Check If User Is Assigned To Project   ${USERNAME}   ${USER_PROJECT}
+    Check If User Has Role   ${USERNAME}   ${USER_ROLE}   ${USER_PROJECT}
 
 Run Action As User
-
-    ${rc}   ${stdout}=   Run And Return RC And Output   OSM_USER=${user_name} OSM_PROJECT=${user_project} OSM_PASSWORD=${user_password} osm ns-list
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-
+    [Documentation]   Update the password of the user.
+    Update User Password   ${USERNAME}   ${USER_PASSWORD}   ${USER_NEW_PASSWORD}
+    ${rc}   ${stdout}=   Run And Return RC And Output   OSM_USER=${USERNAME} OSM_PROJECT=${USER_PROJECT} OSM_PASSWORD=${USER_NEW_PASSWORD} osm ns-list
+    Log   ${rc}
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
 
 Create And Update Project
-
-    Create Project   ${project_name}
-    Update Project Name   ${project_name}   ${new_project_name}
-
+    [Documentation]   Create a project and update its name.
+    Create Project   ${PROJECT_NAME}
+    Update Project Name   ${PROJECT_NAME}   ${NEW_PROJECT_NAME}
 
 Create And Validate Role
-
-    Create Role   ${role_name}
-    Check If Role Exists   ${role_name}
-
+    [Documentation]   Create a role and check that exists in OSM.
+    Create Role   ${ROLE_NAME}
+    Check If Role Exists   ${ROLE_NAME}
 
 Update Role Information
-
-    Update Role   ${role_name}   add='vims: true'
-    Check If Role Exists   ${role_name}
-
+    [Documentation]   Update a role with a capability.
+    Update Role   ${ROLE_NAME}   add='vims: true'
+    Check If Role Exists   ${ROLE_NAME}
 
 Delete Allocated Resources
+    [Documentation]   Delete user, project and role.
     [Tags]   cleanup
-
-    Delete User   ${user_name}
-    Delete Project   ${new_project_name}
-    Delete Role   ${role_name}
+    Delete User   ${USERNAME}
+    Delete Project   ${NEW_PROJECT_NAME}
+    Delete Role   ${ROLE_NAME}
 
 
 *** Keywords ***
 Suite Cleanup
-    Run Keyword If Any Tests Failed   Run Keyword And Ignore Error   Delete User   ${user_name}
-    Run Keyword If Any Tests Failed   Run Keyword And Ignore Error   Delete Role   ${role_name}
-    Run Keyword If Any Tests Failed   Run Keyword And Ignore Error   Delete Project   ${project_name}
-    Run Keyword If Any Tests Failed   Run Keyword And Ignore Error   Delete Project   ${new_project_name}
+    [Documentation]   Test Suite Cleanup: Deleting users, roles and projects.
+    Run Keyword If Any Tests Failed   Run Keyword And Ignore Error   Delete User   ${USERNAME}
+    Run Keyword If Any Tests Failed   Run Keyword And Ignore Error   Delete Role   ${ROLE_NAME}
+    Run Keyword If Any Tests Failed   Run Keyword And Ignore Error   Delete Project   ${PROJECT_NAME}
+    Run Keyword If Any Tests Failed   Run Keyword And Ignore Error   Delete Project   ${NEW_PROJECT_NAME}
index 40053f0..7cd462e 100644 (file)
@@ -1,3 +1,4 @@
+*** Comments ***
 #   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
@@ -10,6 +11,7 @@
 #   See the License for the specific language governing permissions and
 #   limitations under the License.
 
+
 *** Settings ***
 Documentation   [BASIC-16] Advanced onboarding with override and complex scaling (3 initial instances, scaled by two).
 
@@ -17,129 +19,116 @@ Library   OperatingSystem
 Library   String
 Library   Collections
 
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/vnfd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/nsd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ns_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ssh_lib.robot
+Resource   ../lib/vnfd_lib.resource
+Resource   ../lib/nsd_lib.resource
+Resource   ../lib/ns_lib.resource
+Resource   ../lib/ns_operation_lib.resource
+Resource   ../lib/ssh_lib.resource
 
-Force Tags   basic_16   cluster_main   daily   regression
+Test Tags   basic_16   cluster_main   daily   regression   azure
 
 Suite Teardown   Run Keyword And Ignore Error   Suite Cleanup
 
 
 *** Variables ***
 # NS and VNF descriptor package folder and ids
-${vnfd_pkg}   hackfest_basic_metrics_vnf
-${vnfd_name}   hackfest_basic_metrics-vnf
-${nsd_pkg}   hackfest_basic_metrics_ns
-${nsd_name}   hackfest_basic-ns-metrics
+${VNFD_PKG}   hackfest_basic_metrics_vnf
+${VNFD_NAME}   hackfest_basic_metrics-vnf
+${NSD_PKG}   hackfest_basic_metrics_ns
+${NSD_NAME}   hackfest_basic-ns-metrics
 
 # NS instance name and configuration
-${ns_name}   basic_16
-${ns_config}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
+${NS_NAME}   basic_16
+${NS_CONFIG}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
 
 # SSH public keys file
-${publickey}   %{HOME}/.ssh/id_rsa.pub
+${PUBLICKEY}   %{HOME}/.ssh/id_rsa.pub
 
 # Initial, delta, min and max number of VDU instances
-${init_instances}   3
-${min_instances}   3
-${max_instances}   5
-${delta_instances}   2
-${scaling_group}   vdu_autoscale
-${vnf_member_index}   vnf
+${INIT_INSTANCES}   3
+${MIN_INSTANCES}   3
+${MAX_INSTANCES}   5
+${DELTA_INSTANCES}   2
+${SCALING_GROUP}   vdu_autoscale
+${VNF_MEMBER_INDEX}   vnf
 
 
 *** Test Cases ***
 Create Scaling VNF Descriptor
-
-    Create VNFD Overriding Fields   '%{PACKAGES_FOLDER}/${vnfd_pkg}'   df.0.instantiation-level.0.vdu-level.0.number-of-instances=${init_instances};df.0.vdu-profile.0.min-number-of-instances=${min_instances};df.0.vdu-profile.0.max-number-of-instances=${max_instances};df.0.scaling-aspect.0.aspect-delta-details.deltas.0.vdu-delta.0.number-of-instances=${delta_instances}
-
+    [Documentation]   Upload VNF package for the testsuite.
+    Create VNFD Overriding Fields   '%{PACKAGES_FOLDER}/${VNFD_PKG}'   df.0.instantiation-level.0.vdu-level.0.number-of-instances=${INIT_INSTANCES};df.0.vdu-profile.0.min-number-of-instances=${MIN_INSTANCES};df.0.vdu-profile.0.max-number-of-instances=${MAX_INSTANCES};df.0.scaling-aspect.0.aspect-delta-details.deltas.0.vdu-delta.0.number-of-instances=${DELTA_INSTANCES}
 
 Create Scaling NS Descriptor
-
-    Create NSD   '%{PACKAGES_FOLDER}/${nsd_pkg}'
-
+    [Documentation]   Upload NS package for the testsuite.
+    Create NSD   '%{PACKAGES_FOLDER}/${NSD_PKG}'
 
 Instantiate Scaling Network Service
-
-    ${id}=   Create Network Service   ${nsd_name}   %{VIM_TARGET}   ${ns_name}   ${ns_config}   ${publickey}
-    Set Suite Variable   ${ns_id}   ${id}
-
+    [Documentation]   Instantiate NS for the testsuite.
+    ${id}=   Create Network Service   ${NSD_NAME}   %{VIM_TARGET}   ${NS_NAME}   ${NS_CONFIG}   ${PUBLICKEY}
+    Set Suite Variable   ${NS_ID}   ${id}
 
 Get Vnf Id
-
-    Variable Should Exist   ${ns_id}   msg=Network service instance is not available
-    @{vnfr_list}=   Get Ns Vnfr Ids   ${ns_id}
+    [Documentation]   Retrieve VNF instance id to be used later on.
+    Variable Should Exist   ${NS_ID}   msg=Network service instance is not available
+    @{vnfr_list}=   Get Ns Vnfr Ids   ${NS_ID}
     Log List   ${vnfr_list}
-    Set Suite Variable   ${vnf_id}   ${vnfr_list}[0]
-
+    Set Suite Variable   ${VNF_ID}   ${vnfr_list}[0]
 
 Check Vdus Before Scale Out
     [Documentation]   Check the number of VDUs instances before the manual scaling.
-
-    @{vdur_list}=   Get Vnf Vdur Names   ${vnf_id}
+    @{vdur_list}=   Get Vnf Vdur Names   ${VNF_ID}
     Log List   ${vdur_list}
     ${vdurs}=   Get Length   ${vdur_list}
-    Set Suite Variable   ${initial_vdur_count}   ${vdurs}
-    Run Keyword If   ${init_instances} != ${initial_vdur_count}   Fail   msg=Instantiated VDUs (${initial_vdur_count}) don't match specified number in descriptor (${init_instances})
-
+    Set Suite Variable   ${INITIAL_VDUR_COUNT}   ${vdurs}
+    IF   ${INIT_INSTANCES} != ${INITIAL_VDUR_COUNT}   Fail   msg=Instantiated VDUs (${INITIAL_VDUR_COUNT}) don't match specified number in descriptor (${INIT_INSTANCES})
 
 Perform Manual Vdu Scale Out
-
-    Variable Should Exist   ${ns_id}   msg=Network service instance is not available
-    ${ns_op_id}=   Execute Manual VNF Scale   ${ns_name}   ${vnf_member_index}   ${scaling_group}   SCALE_OUT
-
+    [Documentation]   Perform a manual scale-out operation of the VNF.
+    Variable Should Exist   ${NS_ID}   msg=Network service instance is not available
+    ${ns_op_id}=   Execute Manual VNF Scale   ${NS_NAME}   ${VNF_MEMBER_INDEX}   ${SCALING_GROUP}   SCALE_OUT
+    Log   ${ns_op_id}
 
 Check Vdus After Scale Out
-    [Documentation]   Check whether there is one more VDU after scaling or not.
-
-    Variable Should Exist   ${ns_id}   msg=Network service instance is not available
-    @{vdur_list}=   Get Vnf Vdur Names   ${vnf_id}
+    [Documentation]   Check whether there is one extra VDU after scaling out.
+    Variable Should Exist   ${NS_ID}   msg=Network service instance is not available
+    @{vdur_list}=   Get Vnf Vdur Names   ${VNF_ID}
     Log List   ${vdur_list}
     ${vdurs}=   Get Length   ${vdur_list}
-    Run Keyword If   ${vdurs} != ${initial_vdur_count} + ${delta_instances}   Fail   msg=VDU instances in the VNF (${vdurs}) don't match after Scale Out (${initial_vdur_count} + ${delta_instances})
-
+    IF   ${vdurs} != ${INITIAL_VDUR_COUNT} + ${DELTA_INSTANCES}   Fail   msg=VDU instances in the VNF (${vdurs}) don't match after Scale Out (${INITIAL_VDUR_COUNT} + ${DELTA_INSTANCES})
 
 Perform Manual Vdu Scale In
-
-    Variable Should Exist   ${ns_id}   msg=Network service instance is not available
-    ${ns_op_id}=   Execute Manual VNF Scale   ${ns_name}   ${vnf_member_index}   ${scaling_group}   SCALE_IN
-
+    [Documentation]   Perform a manual scale-in operation of the VNF.
+    Variable Should Exist   ${NS_ID}   msg=Network service instance is not available
+    ${ns_op_id}=   Execute Manual VNF Scale   ${NS_NAME}   ${VNF_MEMBER_INDEX}   ${SCALING_GROUP}   SCALE_IN
+    Log   ${ns_op_id}
 
 Check Vdus After Scaling In
-    [Documentation]   Check whether there is one less VDU after scaling or not.
-
-    Variable Should Exist   ${ns_id}   msg=Network service instance is not available
-    @{vdur_list}=   Get Vnf Vdur Names   ${vnf_id}
+    [Documentation]   Check whether there is one less VDU after scaling in.
+    Variable Should Exist   ${NS_ID}   msg=Network service instance is not available
+    @{vdur_list}=   Get Vnf Vdur Names   ${VNF_ID}
     Log List   ${vdur_list}
     ${vdurs}=   Get Length   ${vdur_list}
-    Run Keyword If   ${vdurs} != ${initial_vdur_count}   Fail   msg=There is the same number of VDU records in the VNF after Scale In
-
+    IF   ${vdurs} != ${INITIAL_VDUR_COUNT}   Fail   msg=There is the same number of VDU records in the VNF after Scale In
 
 Delete NS Instance
+    [Documentation]   Delete NS intance.
     [Tags]   cleanup
-
-    Delete NS   ${ns_name}
-
+    Delete NS   ${NS_NAME}
 
 Delete NS Descriptor
+    [Documentation]   Delete NS package from OSM.
     [Tags]   cleanup
-
-    Delete NSD   ${nsd_name}
-
+    Delete NSD   ${NSD_NAME}
 
 Delete VNF Descriptor
+    [Documentation]   Delete VNF package from OSM.
     [Tags]   cleanup
-
-    Delete VNFD   ${vnfd_name}
+    Delete VNFD   ${VNFD_NAME}
 
 
 *** Keywords ***
 Suite Cleanup
     [Documentation]   Test Suite Cleanup: Deleting descriptors and NS instance
-
-    Run Keyword If Any Tests Failed   Delete NS   ${ns_name}
-    Run Keyword If Any Tests Failed   Delete NSD   ${nsd_name}
-    Run Keyword If Any Tests Failed   Delete VNFD   ${vnfd_name}
-
+    Run Keyword If Any Tests Failed   Delete NS   ${NS_NAME}
+    Run Keyword If Any Tests Failed   Delete NSD   ${NSD_NAME}
+    Run Keyword If Any Tests Failed   Delete VNFD   ${VNFD_NAME}
index 906ddd2..253665c 100644 (file)
@@ -1,3 +1,4 @@
+*** Comments ***
 #   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
@@ -10,6 +11,7 @@
 #   See the License for the specific language governing permissions and
 #   limitations under the License.
 
+
 *** Settings ***
 Documentation   [BASIC-17] Delete VNF Package Before NS Package.
 
@@ -19,55 +21,48 @@ Library   Collections
 Library   Process
 Library   SSHLibrary
 
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/vnfd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/nsd_lib.robot
+Resource   ../lib/vnfd_lib.resource
+Resource   ../lib/nsd_lib.resource
 
-Force Tags   basic_17   cluster_main   daily   regression
+Test Tags   basic_17   cluster_main   daily   regression   azure
 
 Suite Teardown   Run Keyword And Ignore Error   Suite Cleanup
 
 
 *** Variables ***
 # NS and VNF descriptor package folder and ids
-${vnfd_pkg}   hackfest_basic_vnf
-${vnfd_name}   hackfest_basic-vnf
-${nsd_pkg}   hackfest_basic_ns
-${nsd_name}   hackfest_basic-ns
+${VNFD_PKG}   hackfest_basic_vnf
+${VNFD_NAME}   hackfest_basic-vnf
+${NSD_PKG}   hackfest_basic_ns
+${NSD_NAME}   hackfest_basic-ns
 
 
 *** Test Cases ***
 Create VNF Package
-
-    Create VNFD   '%{PACKAGES_FOLDER}/${vnfd_pkg}'
-
+    [Documentation]   Upload VNF package for the testsuite.
+    Create VNFD   '%{PACKAGES_FOLDER}/${VNFD_PKG}'
 
 Create NS Package
-
-    Create NSD   '%{PACKAGES_FOLDER}/${nsd_pkg}'
-
+    [Documentation]   Upload NS package for the testsuite.
+    Create NSD   '%{PACKAGES_FOLDER}/${NSD_PKG}'
 
 Cannot Delete VNF Package
-
-    Assert Failure Delete VNFD   ${vnfd_name}
-
+    [Documentation]   Assert that the VNF package cannot be deleted without deleting the corresponding NS package using it.
+    Assert Failure Delete VNFD   ${VNFD_NAME}
 
 Delete NS Package
+    [Documentation]   Delete NS package from OSM.
     [Tags]   cleanup
-
-    Delete NSD   ${nsd_name}
-
+    Delete NSD   ${NSD_NAME}
 
 Delete VNF Package
+    [Documentation]   Delete VNF package from OSM.
     [Tags]   cleanup
-
-    Delete VNFD   ${vnfd_name}
+    Delete VNFD   ${VNFD_NAME}
 
 
 *** Keywords ***
 Suite Cleanup
     [Documentation]   Test Suit Cleanup: Deleting NS and VNF packages
-
-    Run Keyword If Any Tests Failed   Delete NSD   ${nsd_name}
-    Run Keyword If Any Tests Failed   Delete VNFD   ${vnfd_name}
-
-
+    Run Keyword If Any Tests Failed   Delete NSD   ${NSD_NAME}
+    Run Keyword If Any Tests Failed   Delete VNFD   ${VNFD_NAME}
index 9028bd0..41be581 100644 (file)
@@ -1,3 +1,4 @@
+*** Comments ***
 #   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
@@ -10,6 +11,7 @@
 #   See the License for the specific language governing permissions and
 #   limitations under the License.
 
+
 *** Settings ***
 Documentation   [BASIC-18] NS with a VLD with a virtual link profile.
 
@@ -18,187 +20,173 @@ Library   String
 Library   Collections
 Library   SSHLibrary
 
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/vnfd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/nsd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ns_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ssh_lib.robot
+Resource   ../lib/vnfd_lib.resource
+Resource   ../lib/nsd_lib.resource
+Resource   ../lib/ns_lib.resource
+Resource   ../lib/ssh_lib.resource
 
-Force Tags   basic_18   cluster_main   daily   regression
+Test Tags   basic_18   cluster_main   daily   regression
 
 Suite Teardown   Run Keyword And Ignore Error   Suite Cleanup
 
 
 *** Variables ***
 # NS and VNF descriptor package folder and ids
-${vnfd_pkg}   ubuntu_4ifaces_vnf
-${vnfd_name}   ubuntu_4ifaces-vnf
-${nsd_pkg}   ubuntu_4ifaces_ns
-${nsd_name}   ubuntu_4ifaces-ns
+${VNFD_PKG}   ubuntu_4ifaces_vnf
+${VNFD_NAME}   ubuntu_4ifaces-vnf
+${NSD_PKG}   ubuntu_4ifaces_ns
+${NSD_NAME}   ubuntu_4ifaces-ns
 
 # NS instance name and configuration
-${ns_name}   basic_18
-${ns_config}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
+${NS_NAME}   basic_18
+${NS_CONFIG}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
 
 # SSH keys and username to be used
-${publickey}   %{HOME}/.ssh/id_rsa.pub
-${privatekey}   %{HOME}/.ssh/id_rsa
-${username}   ubuntu
+${PUBLICKEY}   %{HOME}/.ssh/id_rsa.pub
+${PRIVATEKEY}   %{HOME}/.ssh/id_rsa
+${USERNAME}   ubuntu
 
 # VNFs data
-${vnf_member_index_1}   vnf1
-${vnf_member_index_2}   vnf2
-${iface1_name}   eth1
-${iface2_name}   eth2
-${iface3_name}   eth3
-${datanet1_prefix}   ^192.168.10.*
-${datanet2_prefix}   ^192.168.20.*
-${datanet3_prefix}   ^192.168.30.*
+${VNF_MEMBER_INDEX_1}   vnf1
+${VNF_MEMBER_INDEX_2}   vnf2
+${IFACE1_NAME}   eth1
+${IFACE2_NAME}   eth2
+${IFACE3_NAME}   eth3
+${DATANET1_PREFIX}   ^192.168.10.*
+${DATANET2_PREFIX}   ^192.168.20.*
+${DATANET3_PREFIX}   ^192.168.30.*
 
-${success_return_code}   0
+${SUCCESS_RETURN_CODE}   0
 
 
 *** Test Cases ***
 Create VNF Descriptor
-
-    Create VNFD   '%{PACKAGES_FOLDER}/${vnfd_pkg}'
-
+    [Documentation]   Upload VNF package for the testsuite.
+    Create VNFD   '%{PACKAGES_FOLDER}/${VNFD_PKG}'
 
 Create NS Descriptor
-
-    Create NSD   '%{PACKAGES_FOLDER}/${nsd_pkg}'
-
+    [Documentation]   Upload NS package for the testsuite.
+    Create NSD   '%{PACKAGES_FOLDER}/${NSD_PKG}'
 
 Instantiate Network Service
-
-    ${id}=   Create Network Service   ${nsd_name}   %{VIM_TARGET}   ${ns_name}   ${ns_config}   ${publickey}
-    Set Suite Variable   ${ns_id}   ${id}
-
+    [Documentation]   Instantiate NS for the testsuite.
+    ${id}=   Create Network Service   ${NSD_NAME}   %{VIM_TARGET}   ${NS_NAME}   ${NS_CONFIG}   ${PUBLICKEY}
+    Set Suite Variable   ${NS_ID}   ${id}
 
 Get Vnfs Info
-
-    Variable Should Exist   ${ns_id}   msg=Network service instance is not available
-    @{vnfr_list}=   Get Ns Vnfr Ids   ${ns_id}
+    [Documentation]   Get information from the two VNF of the Ns, specifically the VNF instance id and the mgmt IP address.
+    Variable Should Exist   ${NS_ID}   msg=Network service instance is not available
+    @{vnfr_list}=   Get Ns Vnfr Ids   ${NS_ID}
     Log List   ${vnfr_list}
-    Set Suite Variable   ${vnf_id1}   ${vnfr_list}[0]
-    Set Suite Variable   ${vnf_id2}   ${vnfr_list}[1]
-    ${ip}   Get Vnf Management Ip Address   ${ns_id}   ${vnf_member_index_1}
-    Set Suite Variable   ${vnf1_ipmgmt}   ${ip}
-    Log   ${vnf1_ipmgmt}
-    ${ip}   Get Vnf Management Ip Address   ${ns_id}   ${vnf_member_index_2}
-    Set Suite Variable   ${vnf2_ipmgmt}   ${ip}
-    Log   ${vnf2_ipmgmt}
-
+    Set Suite Variable   ${VNF_ID1}   ${vnfr_list}[0]
+    Set Suite Variable   ${VNF_ID2}   ${vnfr_list}[1]
+    ${ip}=   Get Vnf Management Ip Address   ${NS_ID}   ${VNF_MEMBER_INDEX_1}
+    Set Suite Variable   ${VNF1_IPMGMT}   ${ip}
+    Log   ${VNF1_IPMGMT}
+    ${ip}=   Get Vnf Management Ip Address   ${NS_ID}   ${VNF_MEMBER_INDEX_2}
+    Set Suite Variable   ${VNF2_IPMGMT}   ${ip}
+    Log   ${VNF2_IPMGMT}
 
 Check Vnf1 IPs
-
-    Variable Should Exist   ${vnf_id1}   msg=VNF1 is not available
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm vnf-show ${vnf_id1} --literal | yq '.vdur[0].interfaces[] | select(.name == "${iface1_name}")' | yq '."ip-address"' | tr -d \\"
-    Should Be Equal As Integers   ${rc}   ${success_return_code}   msg=${stdout}   values=False
-    Should Match Regexp   ${stdout}   ${datanet1_prefix}   msg=${stdout} doesn't match subnet's regexp ${datanet1_prefix}
-    Set Suite Variable   ${vnf1_ip1}   ${stdout}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm vnf-show ${vnf_id1} --literal | yq '.vdur[0].interfaces[] | select(.name == "${iface2_name}")' | yq '."ip-address"' | tr -d \\"
-    Should Be Equal As Integers   ${rc}   ${success_return_code}   msg=${stdout}   values=False
-    Should Match Regexp   ${stdout}   ${datanet2_prefix}   msg=${stdout} doesn't match subnet's regexp ${datanet2_prefix}
-    Set Suite Variable   ${vnf1_ip2}   ${stdout}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm vnf-show ${vnf_id1} --literal | yq '.vdur[0].interfaces[] | select(.name == "${iface3_name}")' | yq '."ip-address"' | tr -d \\"
-    Should Be Equal As Integers   ${rc}   ${success_return_code}   msg=${stdout}   values=False
-    Should Match Regexp   ${stdout}   ${datanet3_prefix}   msg=${stdout} doesn't match subnet's regexp ${datanet3_prefix}
-    Set Suite Variable   ${vnf1_ip3}   ${stdout}
-
-
+    [Documentation]   Check whether IP addresses of the first VNF in the VNF record meet the expected CIDR.
+    Variable Should Exist   ${VNF_ID1}   msg=VNF1 is not available
+    ${rc}   ${stdout}=   Run And Return RC And Output   osm vnf-show ${VNF_ID1} --literal | yq '.vdur[0].interfaces[] | select(.name == "${IFACE1_NAME}")' | yq -r '."ip-address"'
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}   msg=${stdout}   values=False
+    Should Match Regexp   ${stdout}   ${DATANET1_PREFIX}   msg=${stdout} doesn't match subnet's regexp ${DATANET1_PREFIX}
+    Set Suite Variable   ${VNF1_IP1}   ${stdout}
+    ${rc}   ${stdout}=   Run And Return RC And Output   osm vnf-show ${VNF_ID1} --literal | yq '.vdur[0].interfaces[] | select(.name == "${IFACE2_NAME}")' | yq -r '."ip-address"'
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}   msg=${stdout}   values=False
+    Should Match Regexp   ${stdout}   ${DATANET2_PREFIX}   msg=${stdout} doesn't match subnet's regexp ${DATANET2_PREFIX}
+    Set Suite Variable   ${VNF1_IP2}   ${stdout}
+    ${rc}   ${stdout}=   Run And Return RC And Output   osm vnf-show ${VNF_ID1} --literal | yq '.vdur[0].interfaces[] | select(.name == "${IFACE3_NAME}")' | yq -r '."ip-address"'
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}   msg=${stdout}   values=False
+    Should Match Regexp   ${stdout}   ${DATANET3_PREFIX}   msg=${stdout} doesn't match subnet's regexp ${DATANET3_PREFIX}
+    Set Suite Variable   ${VNF1_IP3}   ${stdout}
 
 Check Vnf2 IPs
-
-    Variable Should Exist   ${vnf_id1}   msg=VNF2 is not available
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm vnf-show ${vnf_id2} --literal | yq '.vdur[0].interfaces[] | select(.name == "${iface1_name}")' | yq '."ip-address"' | tr -d \\"
-    Should Be Equal As Integers   ${rc}   ${success_return_code}   msg=${stdout}   values=False
-    Should Match Regexp   ${stdout}   ${datanet1_prefix}   msg=${stdout} doesn't match subnet's regexp ${datanet1_prefix}
-    Set Suite Variable   ${vnf2_ip1}   ${stdout}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm vnf-show ${vnf_id2} --literal | yq '.vdur[0].interfaces[] | select(.name == "${iface2_name}")' | yq '."ip-address"' | tr -d \\"
-    Should Be Equal As Integers   ${rc}   ${success_return_code}   msg=${stdout}   values=False
-    Should Match Regexp   ${stdout}   ${datanet2_prefix}   msg=${stdout} doesn't match subnet's regexp ${datanet2_prefix}
-    Set Suite Variable   ${vnf2_ip2}   ${stdout}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm vnf-show ${vnf_id2} --literal | yq '.vdur[0].interfaces[] | select(.name == "${iface3_name}")' | yq '."ip-address"' | tr -d \\"
-    Should Be Equal As Integers   ${rc}   ${success_return_code}   msg=${stdout}   values=False
-    Should Match Regexp   ${stdout}   ${datanet3_prefix}   msg=${stdout} doesn't match subnet's regexp ${datanet3_prefix}
-    Set Suite Variable   ${vnf2_ip3}   ${stdout}
-
+    [Documentation]   Check whether IP addresses of the second VNF in the VNF record meet the expected CIDR.
+    Variable Should Exist   ${VNF_ID1}   msg=VNF2 is not available
+    ${rc}   ${stdout}=   Run And Return RC And Output   osm vnf-show ${VNF_ID2} --literal | yq '.vdur[0].interfaces[] | select(.name == "${IFACE1_NAME}")' | yq -r '."ip-address"'
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}   msg=${stdout}   values=False
+    Should Match Regexp   ${stdout}   ${DATANET1_PREFIX}   msg=${stdout} doesn't match subnet's regexp ${DATANET1_PREFIX}
+    Set Suite Variable   ${VNF2_IP1}   ${stdout}
+    ${rc}   ${stdout}=   Run And Return RC And Output   osm vnf-show ${VNF_ID2} --literal | yq '.vdur[0].interfaces[] | select(.name == "${IFACE2_NAME}")' | yq -r '."ip-address"'
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}   msg=${stdout}   values=False
+    Should Match Regexp   ${stdout}   ${DATANET2_PREFIX}   msg=${stdout} doesn't match subnet's regexp ${DATANET2_PREFIX}
+    Set Suite Variable   ${VNF2_IP2}   ${stdout}
+    ${rc}   ${stdout}=   Run And Return RC And Output   osm vnf-show ${VNF_ID2} --literal | yq '.vdur[0].interfaces[] | select(.name == "${IFACE3_NAME}")' | yq -r '."ip-address"'
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}   msg=${stdout}   values=False
+    Should Match Regexp   ${stdout}   ${DATANET3_PREFIX}   msg=${stdout} doesn't match subnet's regexp ${DATANET3_PREFIX}
+    Set Suite Variable   ${VNF2_IP3}   ${stdout}
 
 Verify Vnf1 Interfaces
-
-    Variable Should Exist   ${vnf1_ipmgmt}   msg=IP address of the data VNF '${vnf_member_index_1}' is not available
-    Variable Should Exist   ${privatekey}   msg=SSH private key not available
+    [Documentation]   Check whether IP addresses of the first VNF configured inside the VM meet the expected CIDR.
+    Variable Should Exist   ${VNF1_IPMGMT}   msg=IP address of the data VNF '${VNF_MEMBER_INDEX_1}' is not available
+    Variable Should Exist   ${PRIVATEKEY}   msg=SSH private key not available
     Sleep   10 seconds   Wait for SSH daemon to be up
-    ${stdout}=   Execute Remote Command Check Rc Return Output   ${vnf1_ipmgmt}   ${username}   ${EMPTY}   ${privatekey}   ip --brief addr show up | grep -v "^lo" | awk '{print $3}'
+    ${stdout}=   Execute Remote Command Check Rc Return Output   ${VNF1_IPMGMT}   ${USERNAME}   ${EMPTY}   ${PRIVATEKEY}   ip --brief addr show up | grep -v "^lo" | awk '{print $3}'
     Log   ${stdout}
-    @{ip} =   Split String   ${stdout}
-    Should Match Regexp   ${ip}[1]   ${datanet1_prefix}   msg=${ip}[1] doesn't match subnet's regexp ${datanet1_prefix}
-    Should Match Regexp   ${ip}[2]   ${datanet2_prefix}   msg=${ip}[2] doesn't match subnet's regexp ${datanet2_prefix}
-    Should Match Regexp   ${ip}[3]   ${datanet3_prefix}   msg=${ip}[3] doesn't match subnet's regexp ${datanet3_prefix}
-
+    @{ip}=   Split String   ${stdout}
+    Should Match Regexp   ${ip}[1]   ${DATANET1_PREFIX}   msg=${ip}[1] doesn't match subnet's regexp ${DATANET1_PREFIX}
+    Should Match Regexp   ${ip}[2]   ${DATANET2_PREFIX}   msg=${ip}[2] doesn't match subnet's regexp ${DATANET2_PREFIX}
+    Should Match Regexp   ${ip}[3]   ${DATANET3_PREFIX}   msg=${ip}[3] doesn't match subnet's regexp ${DATANET3_PREFIX}
 
 Verify Vnf2 Interfaces
-
-    Variable Should Exist   ${vnf2_ipmgmt}   msg=IP address of the data VNF '${vnf_member_index_2}' is not available
-    Variable Should Exist   ${privatekey}   msg=SSH private key not available
-    ${stdout}=   Execute Remote Command Check Rc Return Output   ${vnf2_ipmgmt}   ${username}   ${EMPTY}   ${privatekey}   ip --brief addr show up | grep -v "^lo" | awk '{print $3}'
+    [Documentation]   Check whether IP addresses of the second VNF configured inside the VM meet the expected CIDR.
+    Variable Should Exist   ${VNF2_IPMGMT}   msg=IP address of the data VNF '${VNF_MEMBER_INDEX_2}' is not available
+    Variable Should Exist   ${PRIVATEKEY}   msg=SSH private key not available
+    ${stdout}=   Execute Remote Command Check Rc Return Output   ${VNF2_IPMGMT}   ${USERNAME}   ${EMPTY}   ${PRIVATEKEY}   ip --brief addr show up | grep -v "^lo" | awk '{print $3}'
     Log   ${stdout}
-    @{ip} =   Split String   ${stdout}
-    Should Match Regexp   ${ip}[1]   ${datanet1_prefix}   msg=${ip}[1] doesn't match subnet's regexp ${datanet1_prefix}
-    Should Match Regexp   ${ip}[2]   ${datanet2_prefix}   msg=${ip}[2] doesn't match subnet's regexp ${datanet2_prefix}
-    Should Match Regexp   ${ip}[3]   ${datanet3_prefix}   msg=${ip}[3] doesn't match subnet's regexp ${datanet3_prefix}
-
+    @{ip}=   Split String   ${stdout}
+    Should Match Regexp   ${ip}[1]   ${DATANET1_PREFIX}   msg=${ip}[1] doesn't match subnet's regexp ${DATANET1_PREFIX}
+    Should Match Regexp   ${ip}[2]   ${DATANET2_PREFIX}   msg=${ip}[2] doesn't match subnet's regexp ${DATANET2_PREFIX}
+    Should Match Regexp   ${ip}[3]   ${DATANET3_PREFIX}   msg=${ip}[3] doesn't match subnet's regexp ${DATANET3_PREFIX}
 
 Ping from Vnf1 to Vnf2
-
-    Variable Should Exist   ${vnf1_ipmgmt}   msg=IP address of the data VNF '${vnf_member_index_1}' is not available
-    Variable Should Exist   ${privatekey}   msg=SSH private key not available
-    ${stdout}=   Execute Remote Command Check Rc Return Output   ${vnf1_ipmgmt}   ${username}   ${EMPTY}   ${privatekey}   ip addr ; ping -c 5 ${vnf2_ipmgmt}
+    [Documentation]   Check connectivity from the first VNF to the second VNF using ping.
+    Variable Should Exist   ${VNF1_IPMGMT}   msg=IP address of the data VNF '${VNF_MEMBER_INDEX_1}' is not available
+    Variable Should Exist   ${PRIVATEKEY}   msg=SSH private key not available
+    ${stdout}=   Execute Remote Command Check Rc Return Output   ${VNF1_IPMGMT}   ${USERNAME}   ${EMPTY}   ${PRIVATEKEY}   ip addr ; ping -c 5 ${VNF2_IPMGMT}
     Log   ${stdout}
-    ${stdout}=   Execute Remote Command Check Rc Return Output   ${vnf1_ipmgmt}   ${username}   ${EMPTY}   ${privatekey}   ping -c 5 ${vnf2_ip1}
+    ${stdout}=   Execute Remote Command Check Rc Return Output   ${VNF1_IPMGMT}   ${USERNAME}   ${EMPTY}   ${PRIVATEKEY}   ping -c 5 ${VNF2_IP1}
     Log   ${stdout}
-    ${stdout}=   Execute Remote Command Check Rc Return Output   ${vnf1_ipmgmt}   ${username}   ${EMPTY}   ${privatekey}   ping -c 5 ${vnf2_ip2}
+    ${stdout}=   Execute Remote Command Check Rc Return Output   ${VNF1_IPMGMT}   ${USERNAME}   ${EMPTY}   ${PRIVATEKEY}   ping -c 5 ${VNF2_IP2}
     Log   ${stdout}
-    ${stdout}=   Execute Remote Command Check Rc Return Output   ${vnf1_ipmgmt}   ${username}   ${EMPTY}   ${privatekey}   ping -c 5 ${vnf2_ip3}
+    ${stdout}=   Execute Remote Command Check Rc Return Output   ${VNF1_IPMGMT}   ${USERNAME}   ${EMPTY}   ${PRIVATEKEY}   ping -c 5 ${VNF2_IP3}
     Log   ${stdout}
 
-
 Ping from Vnf2 to Vnf1
-
-    Variable Should Exist   ${vnf1_ipmgmt}   msg=IP address of the data VNF '${vnf_member_index_2}' is not available
-    Variable Should Exist   ${privatekey}   msg=SSH private key not available
-    ${stdout}=   Execute Remote Command Check Rc Return Output   ${vnf2_ipmgmt}   ${username}   ${EMPTY}   ${privatekey}   ip addr ; ping -c 5 ${vnf1_ipmgmt}
+    [Documentation]   Check connectivity from the second VNF to the first VNF using ping.
+    Variable Should Exist   ${VNF1_IPMGMT}   msg=IP address of the data VNF '${VNF_MEMBER_INDEX_2}' is not available
+    Variable Should Exist   ${PRIVATEKEY}   msg=SSH private key not available
+    ${stdout}=   Execute Remote Command Check Rc Return Output   ${VNF2_IPMGMT}   ${USERNAME}   ${EMPTY}   ${PRIVATEKEY}   ip addr ; ping -c 5 ${VNF1_IPMGMT}
     Log   ${stdout}
-    ${stdout}=   Execute Remote Command Check Rc Return Output   ${vnf2_ipmgmt}   ${username}   ${EMPTY}   ${privatekey}   ip addr ; ping -c 5 ${vnf1_ip1}
+    ${stdout}=   Execute Remote Command Check Rc Return Output   ${VNF2_IPMGMT}   ${USERNAME}   ${EMPTY}   ${PRIVATEKEY}   ip addr ; ping -c 5 ${VNF1_IP1}
     Log   ${stdout}
-    ${stdout}=   Execute Remote Command Check Rc Return Output   ${vnf2_ipmgmt}   ${username}   ${EMPTY}   ${privatekey}   ip addr ; ping -c 5 ${vnf1_ip2}
+    ${stdout}=   Execute Remote Command Check Rc Return Output   ${VNF2_IPMGMT}   ${USERNAME}   ${EMPTY}   ${PRIVATEKEY}   ip addr ; ping -c 5 ${VNF1_IP2}
     Log   ${stdout}
-    ${stdout}=   Execute Remote Command Check Rc Return Output   ${vnf2_ipmgmt}   ${username}   ${EMPTY}   ${privatekey}   ip addr ; ping -c 5 ${vnf1_ip3}
+    ${stdout}=   Execute Remote Command Check Rc Return Output   ${VNF2_IPMGMT}   ${USERNAME}   ${EMPTY}   ${PRIVATEKEY}   ip addr ; ping -c 5 ${VNF1_IP3}
     Log   ${stdout}
 
-
 Delete NS Instance
+    [Documentation]   Delete NS instance.
     [Tags]   cleanup
-
-    Delete NS   ${ns_name}
-
+    Delete NS   ${NS_NAME}
 
 Delete NS Descriptor
+    [Documentation]   Delete NS package from OSM.
     [Tags]   cleanup
-
-    Delete NSD   ${nsd_name}
-
+    Delete NSD   ${NSD_NAME}
 
 Delete VNF Descriptor
+    [Documentation]   Delete VNF package from OSM.
     [Tags]   cleanup
-
-    Delete VNFD   ${vnfd_name}
+    Delete VNFD   ${VNFD_NAME}
 
 
 *** Keywords ***
 Suite Cleanup
     [Documentation]   Test Suite Cleanup: Deleting descriptors and NS instance
-
-    Run Keyword If Any Tests Failed   Delete NS   ${ns_name}
-    Run Keyword If Any Tests Failed   Delete NSD   ${nsd_name}
-    Run Keyword If Any Tests Failed   Delete VNFD   ${vnfd_name}
+    Run Keyword If Any Tests Failed   Delete NS   ${NS_NAME}
+    Run Keyword If Any Tests Failed   Delete NSD   ${NSD_NAME}
+    Run Keyword If Any Tests Failed   Delete VNFD   ${VNFD_NAME}
index 1f705cd..6d5a557 100644 (file)
@@ -1,3 +1,4 @@
+*** Comments ***
 #   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
@@ -10,6 +11,7 @@
 #   See the License for the specific language governing permissions and
 #   limitations under the License.
 
+
 *** Settings ***
 Documentation   [BASIC-19] NS with a single VNF and two VDU linked by a VLD with ip-profile.
 
@@ -18,99 +20,91 @@ Library   String
 Library   Collections
 Library   SSHLibrary
 
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/vnfd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/nsd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ns_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ssh_lib.robot
+Resource   ../lib/vnfd_lib.resource
+Resource   ../lib/nsd_lib.resource
+Resource   ../lib/ns_lib.resource
+Resource   ../lib/ssh_lib.resource
 
-Force Tags   basic_19   cluster_main   daily   regression
+Test Tags   basic_19   cluster_main   daily   regression
 
 Suite Teardown   Run Keyword And Ignore Error   Suite Cleanup
 
 
 *** Variables ***
 # NS and VNF descriptor package folder and ids
-${vnfd_pkg}   ipprofile_2vm_vnf
-${vnfd_name}   ipprofile_2vm-vnf
-${nsd_pkg}   ipprofile_2vm_ns
-${nsd_name}   ipprofile_2vm-ns
+${VNFD_PKG}   ipprofile_2vm_vnf
+${VNFD_NAME}   ipprofile_2vm-vnf
+${NSD_PKG}   ipprofile_2vm_ns
+${NSD_NAME}   ipprofile_2vm-ns
 
 # NS instance name and configuration
-${ns_name}   basic_19
-${ns_config}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
+${NS_NAME}   basic_19
+${NS_CONFIG}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
 
 # SSH keys and username to be used
-${publickey}   %{HOME}/.ssh/id_rsa.pub
-${username}   ubuntu
+${PUBLICKEY}   %{HOME}/.ssh/id_rsa.pub
+${USERNAME}   ubuntu
 
 # VNFs data
-${vnf_member_index_1}   vnf
-${internal_prefix}   ^192.168.200.*
+${VNF_MEMBER_INDEX_1}   vnf
+${INTERNAL_PREFIX}   ^192.168.200.*
 
-${success_return_code}   0
+${SUCCESS_RETURN_CODE}   0
 
 
 *** Test Cases ***
 Create VNF Descriptor
-
-    Create VNFD   '%{PACKAGES_FOLDER}/${vnfd_pkg}'
-
+    [Documentation]   Upload VNF package for the testsuite.
+    Create VNFD   '%{PACKAGES_FOLDER}/${VNFD_PKG}'
 
 Create NS Descriptor
-
-    Create NSD   '%{PACKAGES_FOLDER}/${nsd_pkg}'
-
+    [Documentation]   Upload NS package for the testsuite.
+    Create NSD   '%{PACKAGES_FOLDER}/${NSD_PKG}'
 
 Instantiate Network Service
-
-    ${id}=   Create Network Service   ${nsd_name}   %{VIM_TARGET}   ${ns_name}   ${ns_config}   ${publickey}
-    Set Suite Variable   ${ns_id}   ${id}
-
+    [Documentation]   Instantiate NS for the testsuite.
+    ${id}=   Create Network Service   ${NSD_NAME}   %{VIM_TARGET}   ${NS_NAME}   ${NS_CONFIG}   ${PUBLICKEY}
+    Set Suite Variable   ${NS_ID}   ${id}
 
 Get Vnf Info
-
-    Variable Should Exist   ${ns_id}   msg=Network service instance is not available
-    @{vnfr_list}=   Get Ns Vnfr Ids   ${ns_id}
+    [Documentation]   Get VNF information, specifically the VNF instance id and the mgmt IP address.
+    Variable Should Exist   ${NS_ID}   msg=Network service instance is not available
+    @{vnfr_list}=   Get Ns Vnfr Ids   ${NS_ID}
     Log List   ${vnfr_list}
-    Set Suite Variable   ${vnf_id}   ${vnfr_list}[0]
-    ${ip}   Get Vnf Management Ip Address   ${ns_id}   ${vnf_member_index_1}
-    Set Suite Variable   ${vnf_ipmgmt}   ${ip}
-    Log   ${vnf_ipmgmt}
-
+    Set Suite Variable   ${VNF_ID}   ${vnfr_list}[0]
+    ${ip}=   Get Vnf Management Ip Address   ${NS_ID}   ${VNF_MEMBER_INDEX_1}
+    Set Suite Variable   ${VNF_IPMGMT}   ${ip}
+    Log   ${VNF_IPMGMT}
 
 Check Vnf IPs
-
-    Variable Should Exist   ${vnf_id}   msg=VNF is not available
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm vnf-show ${vnf_id} --literal | yq '.vdur[0].interfaces[] | select(."vnf-vld-id" == "internal")' | yq '."ip-address"' | tr -d \\"
-    Should Be Equal As Integers   ${rc}   ${success_return_code}   msg=${stdout}   values=False
-    Should Match Regexp   ${stdout}   ${internal_prefix}   msg=${stdout} doesn't match subnet's regexp ${internal_prefix}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm vnf-show ${vnf_id} --literal | yq '.vdur[1].interfaces[] | select(."vnf-vld-id" == "internal")' | yq '."ip-address"' | tr -d \\"
-    Should Be Equal As Integers   ${rc}   ${success_return_code}   msg=${stdout}   values=False
-    Should Match Regexp   ${stdout}   ${internal_prefix}   msg=${stdout} doesn't match subnet's regexp ${internal_prefix}
-
+    [Documentation]   Check whether IP addresses are syntactically valid.
+    Variable Should Exist   ${VNF_ID}   msg=VNF is not available
+    ${rc}   ${stdout}=   Run And Return RC And Output   osm vnf-show ${VNF_ID} --literal | yq '.vdur[0].interfaces[] | select(."vnf-vld-id" == "internal")' | yq -r '."ip-address"'
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}   msg=${stdout}   values=False
+    Should Match Regexp   ${stdout}   ${INTERNAL_PREFIX}   msg=${stdout} doesn't match subnet's regexp ${INTERNAL_PREFIX}
+    ${rc}   ${stdout}=   Run And Return RC And Output   osm vnf-show ${VNF_ID} --literal | yq '.vdur[1].interfaces[] | select(."vnf-vld-id" == "internal")' | yq -r '."ip-address"'
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}   msg=${stdout}   values=False
+    Should Match Regexp   ${stdout}   ${INTERNAL_PREFIX}   msg=${stdout} doesn't match subnet's regexp ${INTERNAL_PREFIX}
 
 Delete NS Instance
+    [Documentation]   Delete NS instance.
     [Tags]   cleanup
-
-    Delete NS   ${ns_name}
-
+    Delete NS   ${NS_NAME}
 
 Delete NS Descriptor
+    [Documentation]   Delete NS package from OSM.
     [Tags]   cleanup
-
-    Delete NSD   ${nsd_name}
-
+    Delete NSD   ${NSD_NAME}
 
 Delete VNF Descriptor
+    [Documentation]   Delete VNF package from OSM.
     [Tags]   cleanup
-
-    Delete VNFD   ${vnfd_name}
+    Delete VNFD   ${VNFD_NAME}
 
 
 *** Keywords ***
 Suite Cleanup
     [Documentation]   Test Suite Cleanup: Deleting descriptors and NS instance
-
-    Run Keyword If Any Tests Failed   Delete NS   ${ns_name}
-    Run Keyword If Any Tests Failed   Delete NSD   ${nsd_name}
-    Run Keyword If Any Tests Failed   Delete VNFD   ${vnfd_name}
+    Run Keyword If Any Tests Failed   Delete NS   ${NS_NAME}
+    Run Keyword If Any Tests Failed   Delete NSD   ${NSD_NAME}
+    Run Keyword If Any Tests Failed   Delete VNFD   ${VNFD_NAME}
index cb3609f..60c0289 100644 (file)
@@ -1,3 +1,4 @@
+*** Comments ***
 #   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
@@ -10,6 +11,7 @@
 #   See the License for the specific language governing permissions and
 #   limitations under the License.
 
+
 *** Settings ***
 Documentation   [BASIC-20] Manual VDU Scaling to test juju applications are scaling for native charms (testing Bug-1609).
 
@@ -17,171 +19,146 @@ Library   OperatingSystem
 Library   String
 Library   Collections
 
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/vnfd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/nsd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ns_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ssh_lib.robot
+Resource   ../lib/vnfd_lib.resource
+Resource   ../lib/nsd_lib.resource
+Resource   ../lib/ns_lib.resource
+Resource   ../lib/ns_operation_lib.resource
+Resource   ../lib/ssh_lib.resource
 
-Force Tags   basic_20   cluster_main   daily   regression
+Test Tags   basic_20   cluster_main   regression   azure
 
 Suite Teardown   Run Keyword And Ignore Error   Suite Cleanup
 
 
 *** Variables ***
 # NS and VNF descriptor package folder and ids
-${vnfd_pkg}   charm-packages/native_manual_scale_charm_vnf
-${vnfd_name}   native_manual_scale_charm-vnf
-${nsd_pkg}   charm-packages/native_manual_scale_charm_ns
-${nsd_name}   native_manual_scale_charm-ns
+${VNFD_PKG}   charm-packages/native_manual_scale_charm_vnf
+${VNFD_NAME}   native_manual_scale_charm-vnf
+${NSD_PKG}   charm-packages/native_manual_scale_charm_ns
+${NSD_NAME}   native_manual_scale_charm-ns
 
 # NS instance name and configuration
-${ns_name}   basic_20_manual_vdu_scaling_test
-${ns_config}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
-${vnf_member_index}   vnf
+${NS_NAME}   basic_20_manual_vdu_scaling_test
+${NS_CONFIG}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
+${VNF_MEMBER_INDEX}   vnf
 
 # SSH public key file
-${publickey}   %{HOME}/.ssh/id_rsa.pub
+${PUBLICKEY}   %{HOME}/.ssh/id_rsa.pub
 
 # Scaling group name of VDU instances
-${scaling_group}   manual-scaling_mgmtVM
+${SCALING_GROUP}   manual-scaling_mgmtVM
+
+${SCALE_WAIT_TIME}   4min
 
-${scale_wait_time}   4min
 
 *** Test Cases ***
 Create VNF Descriptor
-
-    Create VNFD   '%{PACKAGES_FOLDER}/${vnfd_pkg}'
+    [Documentation]   Upload VNF package for the testsuite.
+    Create VNFD   '%{PACKAGES_FOLDER}/${VNFD_PKG}'
 
 Create NS Descriptor
-
-    Create NSD   '%{PACKAGES_FOLDER}/${nsd_pkg}'
-
+    [Documentation]   Upload NS package for the testsuite.
+    Create NSD   '%{PACKAGES_FOLDER}/${NSD_PKG}'
 
 Instantiate Network Service
-
-    ${id}=   Create Network Service   ${nsd_name}   %{VIM_TARGET}   ${ns_name}   ${ns_config}   ${publickey}
-    Set Suite Variable   ${ns_id}   ${id}
-
+    [Documentation]   Instantiate NS for the testsuite.
+    ${id}=   Create Network Service   ${NSD_NAME}   %{VIM_TARGET}   ${NS_NAME}   ${NS_CONFIG}   ${PUBLICKEY}
+    Set Suite Variable   ${NS_ID}   ${id}
 
 Get Vnf Id
-
-    Variable Should Exist   ${ns_id}   msg=Network service instance is not available
-    @{vnfr_list}=   Get Ns Vnfr Ids   ${ns_id}
+    [Documentation]   Retrieve VNF instance id to be used later on
+    Variable Should Exist   ${NS_ID}   msg=Network service instance is not available
+    @{vnfr_list}=   Get Ns Vnfr Ids   ${NS_ID}
     Log List   ${vnfr_list}
-    Set Suite Variable   ${vnf_id}   ${vnfr_list}[0]
-
+    Set Suite Variable   ${VNF_ID}   ${vnfr_list}[0]
 
 Get Vdus Before Scale Out
     [Documentation]   Get the number of VDU records before the manual scaling.
-
-    @{vdur_list}=   Get Vnf Vdur Names   ${vnf_id}
+    @{vdur_list}=   Get Vnf Vdur Names   ${VNF_ID}
     Log List   ${vdur_list}
     ${vdurs}=   Get Length   ${vdur_list}
-    Set Suite Variable   ${initial_vdur_count}   ${vdurs}
-
+    Set Suite Variable   ${INITIAL_VDUR_COUNT}   ${vdurs}
 
 Get Application Name Before Scale Out
     [Documentation]   Get the application names.
-
-    @{name_list}=   Get Application Names   ${ns_name}
+    @{name_list}=   Get Application Names   ${NS_NAME}
     Log List   ${name_list}
-    Set Suite Variable   ${application_list}   ${name_list}
-
+    Set Suite Variable   ${APPLICATION_LIST}   ${name_list}
 
 Check Number of Duplicated Application Name Before Scale Out
     [Documentation]   Check the application names if there are 2 application name in the application list.
-
-    ${count_duplicated}=   Get Length   ${application_list}
-    Run Keyword If   ${count_duplicated} != 2   Fail   msg=There are not 2 application name in the application list before Scale Out
-
+    ${count_duplicated}=   Get Length   ${APPLICATION_LIST}
+    IF   ${count_duplicated} != 2   Fail   msg=There are not 2 application name in the application list before Scale Out
 
 Perform Manual Vdu Scale Out
-
-    Variable Should Exist   ${ns_id}   msg=Network service instance is not available
-    ${ns_op_id}=   Execute Manual VNF Scale   ${ns_name}   ${vnf_member_index}   ${scaling_group}   SCALE_OUT   ${scale_wait_time}
-
+    [Documentation]   Perform a manual scale-out operation of the VNF.
+    Variable Should Exist   ${NS_ID}   msg=Network service instance is not available
+    ${ns_op_id}=   Execute Manual VNF Scale   ${NS_NAME}   ${VNF_MEMBER_INDEX}   ${SCALING_GROUP}   SCALE_OUT   ${SCALE_WAIT_TIME}
+    Log   ${ns_op_id}
 
 Check Vdus After Scale Out
-    [Documentation]   Check whether there is one more VDU after scaling or not.
-
-    Variable Should Exist   ${ns_id}   msg=Network service instance is not available
-    @{vdur_list}=   Get Vnf Vdur Names   ${vnf_id}
+    [Documentation]   Check whether there is one more VDU after scaling out.
+    Variable Should Exist   ${NS_ID}   msg=Network service instance is not available
+    @{vdur_list}=   Get Vnf Vdur Names   ${VNF_ID}
     Log List   ${vdur_list}
     ${vdurs}=   Get Length   ${vdur_list}
-    Run Keyword If   ${vdurs} != ${initial_vdur_count} + 1   Fail   msg=There is no new VDU records in the VNF after Scale Out
-
+    IF   ${vdurs} != ${INITIAL_VDUR_COUNT} + 1   Fail   msg=There is no new VDU records in the VNF after Scale Out
 
 Get Application Name After Scale Out
     [Documentation]   Get the application names.
-
-    @{name_list}=   Get Application Names   ${ns_name}
+    @{name_list}=   Get Application Names   ${NS_NAME}
     Log List   ${name_list}
-    Set Suite Variable   ${application_list}   ${name_list}
-
+    Set Suite Variable   ${APPLICATION_LIST}   ${name_list}
 
 Check Number of Duplicated Application Name After Scale Out
     [Documentation]   Check the application names if there are 3 application name in the application list.
-
-    ${count_duplicated}=   Get Length   ${application_list}
-    Run Keyword If   ${count_duplicated} != 3   Fail   msg=There are not 2 application name in the application list after Scale Out
-
+    ${count_duplicated}=   Get Length   ${APPLICATION_LIST}
+    IF   ${count_duplicated} != 3   Fail   msg=There are not 2 application name in the application list after Scale Out
 
 Perform Manual Vdu Scale In
-
-    Variable Should Exist   ${ns_id}   msg=Network service instance is not available
-    ${ns_op_id}=   Execute Manual VNF Scale   ${ns_name}   ${vnf_member_index}   ${scaling_group}   SCALE_IN
-
+    [Documentation]   Perform a manual scale-in operation of the VNF.
+    Variable Should Exist   ${NS_ID}   msg=Network service instance is not available
+    ${ns_op_id}=   Execute Manual VNF Scale   ${NS_NAME}   ${VNF_MEMBER_INDEX}   ${SCALING_GROUP}   SCALE_IN
+    Log   ${ns_op_id}
 
 Check Vdus After Scaling In
-    [Documentation]   Check whether there is one less VDU after scaling or not.
-
-    Variable Should Exist   ${ns_id}   msg=Network service instance is not available
-    @{vdur_list}=   Get Vnf Vdur Names   ${vnf_id}
+    [Documentation]   Check whether there is one less VDU after scaling in.
+    Variable Should Exist   ${NS_ID}   msg=Network service instance is not available
+    @{vdur_list}=   Get Vnf Vdur Names   ${VNF_ID}
     Log List   ${vdur_list}
     ${vdurs}=   Get Length   ${vdur_list}
-    Run Keyword If   ${vdurs} != ${initial_vdur_count}   Fail   msg=There is the same number of VDU records in the VNF after Scale In
-
+    IF   ${vdurs} != ${INITIAL_VDUR_COUNT}   Fail   msg=There is the same number of VDU records in the VNF after Scale In
 
 Get Application Name After Scale In
     [Documentation]   Get the application names.
-
-    @{name_list}=   Get Application Names   ${ns_name}
+    @{name_list}=   Get Application Names   ${NS_NAME}
     Log List   ${name_list}
-    Set Suite Variable   ${application_list}   ${name_list}
-
+    Set Suite Variable   ${APPLICATION_LIST}   ${name_list}
 
 Check Number of Duplicated Application Name After Scale In
     [Documentation]   Check the application names if there are 2 application name in the application list.
-
-    ${count_duplicated}=   Get Length   ${application_list}
-    Run Keyword If   ${count_duplicated} != 2   Fail   msg=There are not 2 application name in the application list after Scale In
-
+    ${count_duplicated}=   Get Length   ${APPLICATION_LIST}
+    IF   ${count_duplicated} != 2   Fail   msg=There are not 2 application name in the application list after Scale In
 
 Delete NS Instance
+    [Documentation]   Delete NS instance.
     [Tags]   cleanup
-
-    Delete NS   ${ns_name}
-
+    Delete NS   ${NS_NAME}
 
 Delete NS Descriptor
+    [Documentation]   Delete NS package from OSM.
     [Tags]   cleanup
-
-    Delete NSD   ${nsd_name}
-
+    Delete NSD   ${NSD_NAME}
 
 Delete VNF Descriptor
+    [Documentation]   Delete VNF package from OSM.
     [Tags]   cleanup
-
-    Delete VNFD   ${vnfd_name}
+    Delete VNFD   ${VNFD_NAME}
 
 
 *** Keywords ***
 Suite Cleanup
     [Documentation]   Test Suite Cleanup: Deleting descriptors and NS instance
-
-    Run Keyword If Any Tests Failed   Delete NS   ${ns_name}
-
-    Run Keyword If Any Tests Failed   Delete NSD   ${nsd_name}
-
-    Run Keyword If Any Tests Failed   Delete VNFD   ${vnfd_name}
-
+    Run Keyword If Any Tests Failed   Delete NS   ${NS_NAME}
+    Run Keyword If Any Tests Failed   Delete NSD   ${NSD_NAME}
+    Run Keyword If Any Tests Failed   Delete VNFD   ${VNFD_NAME}
index 4dbea4a..d4af7b5 100644 (file)
@@ -1,3 +1,4 @@
+*** Comments ***
 #   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
@@ -10,6 +11,7 @@
 #   See the License for the specific language governing permissions and
 #   limitations under the License.
 
+
 *** Settings ***
 Documentation   [BASIC-21] NS with only one VDU and several volumes
 
@@ -19,140 +21,138 @@ Library   Collections
 Library   Process
 Library   SSHLibrary
 
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/vnfd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/vnf_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/nsd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ns_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ssh_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/openstack_lib.robot
-
-Force Tags   basic_21   cluster_main   daily   regression
+Resource   ../lib/vnfd_lib.resource
+Resource   ../lib/vnf_lib.resource
+Resource   ../lib/nsd_lib.resource
+Resource   ../lib/ns_lib.resource
+Resource   ../lib/ssh_lib.resource
+Resource   ../lib/openstack_lib.resource
 
+Test Tags   basic_21   cluster_main   daily   regression
 
 Suite Teardown   Run Keyword And Ignore Error   Suite Cleanup
 
 
 *** Variables ***
 # NS and VNF descriptor package folder and ids
-${vnfd_pkg}   several_volumes_vnf
-${vnfd_name}   several_volumes-vnf
-${nsd_pkg}   several_volumes_ns
-${nsd_name}   several_volumes-ns
+${VNFD_PKG}   several_volumes_vnf
+${VNFD_NAME}   several_volumes-vnf
+${NSD_PKG}   several_volumes_ns
+${NSD_NAME}   several_volumes-ns
 
 # NS instance name and configuration
-${ns_name}   basic_21
-${ns_config}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
+${NS_NAME}   basic_21
+${NS_CONFIG}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
 
 # SSH keys and username to be used
-${publickey}   %{HOME}/.ssh/id_rsa.pub
-${privatekey}   %{HOME}/.ssh/id_rsa
-${username}   ubuntu
-${password}   ${EMPTY}
+${PUBLICKEY}   %{HOME}/.ssh/id_rsa.pub
+${PRIVATEKEY}   %{HOME}/.ssh/id_rsa
+${USERNAME}   ubuntu
+${PASSWORD}   ${EMPTY}
 
-${vnf_member_index}   vnf-several-volumes
-${success_return_code}   0
+${VNF_MEMBER_INDEX}   vnf-several-volumes
+${SUCCESS_RETURN_CODE}   0
 
 
 *** Test Cases ***
 Create VNF Descriptor
+    [Documentation]   Upload VNF package for the testsuite.
     [Tags]   prepare
-    Create VNFD   '%{PACKAGES_FOLDER}/${vnfd_pkg}'
-
+    Create VNFD   '%{PACKAGES_FOLDER}/${VNFD_PKG}'
 
 Create NS Descriptor
+    [Documentation]   Upload NS package for the testsuite.
     [Tags]   prepare
-    Create NSD   '%{PACKAGES_FOLDER}/${nsd_pkg}'
-
+    Create NSD   '%{PACKAGES_FOLDER}/${NSD_PKG}'
 
 Network Service Instance Test
+    [Documentation]   Instantiate NS for the testsuite.
     [Tags]   prepare
-    ${id}=   Create Network Service   ${nsd_name}   %{VIM_TARGET}   ${ns_name}   ${ns_config}   ${publickey}
-    Set Suite Variable   ${ns_id}   ${id}
+    ${id}=   Create Network Service   ${NSD_NAME}   %{VIM_TARGET}   ${NS_NAME}   ${NS_CONFIG}   ${PUBLICKEY}
+    Set Suite Variable   ${NS_ID}   ${id}
 
 Get NS Id
+    [Documentation]   Get NS identifier and stores as suite variable to be used later on.
     [Tags]   verify   cleanup
-    ${variables}   Get Variables
+    ${variables}=   Get Variables
     IF   not "\${ns_id}" in "${variables}"
-        ${id}=   Get Ns Id   ${ns_name}
-        Set Suite Variable   ${ns_id}   ${id}
+        ${id}=   Get Ns Id   ${NS_NAME}
+        Set Suite Variable   ${NS_ID}   ${id}
     END
 
 Get Volumes From VNFD
+    [Documentation]   Get from VNF descriptor the expected number of volumes in the VNF.
     [Tags]   verify
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm vnfpkg-show ${vnfd_name} --literal | yq '.vdu[0]."virtual-storage-desc" | length'
-    Should Be Equal As Integers   ${rc}   ${success_return_code}   msg=${stdout}   values=False
+    ${rc}   ${stdout}=   Run And Return RC And Output   osm vnfpkg-show ${VNFD_NAME} --literal | yq '.vdu[0]."virtual-storage-desc" | length'
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}   msg=${stdout}   values=False
     ${num_virtual_storage}=   Convert To Integer   ${stdout}
-    Set Suite Variable   ${vnf_num_volumes}   ${num_virtual_storage}
-    Log   ${vnf_num_volumes}
-
+    Set Suite Variable   ${VNF_NUM_VOLUMES}   ${num_virtual_storage}
+    Log   ${VNF_NUM_VOLUMES}
 
 Get VNF IP Address
+    [Documentation]   Get the mgmt IP address of the VNF.
     [Tags]   verify
-    Variable Should Exist   ${ns_id}   msg=NS is not available
-    ${ip_addr}=   Get Vnf Management Ip Address   ${ns_id}   ${vnf_member_index}
+    Variable Should Exist   ${NS_ID}   msg=NS is not available
+    ${ip_addr}=   Get Vnf Management Ip Address   ${NS_ID}   ${VNF_MEMBER_INDEX}
     Log   ${ip_addr}
-    Set Suite Variable   ${vnf_ip_addr}   ${ip_addr}
-
-
-#Get Persistent Volume Id
-#    [Tags]   cleanup
-#    Variable Should Exist   ${ns_id}   msg=NS is not available
-#    ${vnfs_list}=   Get Ns Vnf List   ${ns_id}
-#    ${vim_id}=   Get VNF VIM ID   ${vnfs_list}[0]
-#    ${volumes_attached}=   Get Server Property   ${vim_id}   volumes_attached
-#    ${match}=   Get Regexp Matches   ${volumes_attached}   '([0-9a-f\-]+)'   1
-#    Set Suite Variable   ${volume_id}   ${match}[0]
-
+    Set Suite Variable   ${VNF_IP_ADDR}   ${ip_addr}
+
+# Get Persistent Volume Id
+#     [Documentation]   Get VIM volume identifier of the persistent volume of the VNF.
+#     [Tags]   cleanup
+#     Variable Should Exist   ${ns_id}   msg=NS is not available
+#     ${vnfs_list}=   Get Ns Vnf List   ${ns_id}
+#     ${vim_id}=   Get VNF VIM ID   ${vnfs_list}[0]
+#     ${volumes_attached}=   Get Server Property   ${vim_id}   volumes_attached
+#     ${match}=   Get Regexp Matches   ${volumes_attached}   '([0-9a-f\-]+)'   1
+#     Set Suite Variable   ${PERSISTENT_VOLUME_ID}   ${match}[0]
 
 Check VDU disks
+    [Documentation]   Check that the number of volumes is the expected one.
     [Tags]   verify
-    Variable Should Exist   ${vnf_ip_addr}   msg=VNF is not available
+    Variable Should Exist   ${VNF_IP_ADDR}   msg=VNF is not available
     Sleep   30 seconds   Wait for SSH daemon to be up
-    ${stdout}=   Execute Remote Command Check Rc Return Output   ${vnf_ip_addr}   ${username}   ${password}   ${privatekey}   sudo lsblk -l
+    ${stdout}=   Execute Remote Command Check Rc Return Output   ${VNF_IP_ADDR}   ${USERNAME}   ${PASSWORD}   ${PRIVATEKEY}   sudo lsblk -l
     Log   ${stdout}
     ${lines}=   Get Lines Containing String   ${stdout}   disk
     ${num_lines}=   Get Line Count   ${lines}
-    Run Keyword If   ${num_lines} < ${vnf_num_volumes}   Fail   msg=Number of disks (${num_lines}) is less than specified in VDU (${vnf_num_volumes})
-
+    IF   ${num_lines} < ${VNF_NUM_VOLUMES}   Fail   msg=Number of disks (${num_lines}) is less than specified in VDU (${VNF_NUM_VOLUMES})
 
 Delete NS Instance Test
+    [Documentation]   Delete NS instance.
     [Tags]   cleanup
-    Delete NS   ${ns_name}
-
-
-#Check Persistent Volume Was Deleted
-#    [Tags]   cleanup
-#    Variable Should Exist   ${volume_id}   msg=Volume is not available
-#    ${exists}=   Check If Volume Exists   ${volume_id}
-#    Log   ${exists}
-#    IF   ${exists}==0
-#        Fail   msg=Persistent volume was deleted
-#        Set Suite Variable   ${volume_id}   ${EMPTY}}
-#    ELSE
-#        Log   Persistent volume still exists, deleting...
-#        Delete Volume   ${volume_id}
-#        Set Suite Variable   ${volume_id}   ${EMPTY}}
-#    END
-
+    Delete NS   ${NS_NAME}
+
+# Check Persistent Volume Was Deleted
+#     [Documentation]   Check that the persistent volume was deleted.
+#     [Tags]   cleanup
+#     Variable Should Exist   ${PERSISTENT_VOLUME_ID}   msg=Volume is not available
+#     ${exists}=   Check If Volume Exists   ${PERSISTENT_VOLUME_ID}
+#     Log   ${exists}
+#     IF   ${exists}==0
+#         Fail   msg=Persistent volume was deleted
+#         Set Suite Variable   ${PERSISTENT_VOLUME_ID}   ${EMPTY}}
+#     ELSE
+#         Log   Persistent volume still exists, deleting...
+#         Delete Volume   ${PERSISTENT_VOLUME_ID}
+#         Set Suite Variable   ${PERSISTENT_VOLUME_ID}   ${EMPTY}}
+#     END
 
 Delete NS Descriptor Test
+    [Documentation]   Delete NS package from OSM.
     [Tags]   cleanup
-    Delete NSD   ${nsd_name}
-
+    Delete NSD   ${NSD_NAME}
 
 Delete VNF Descriptor Test
+    [Documentation]   Delete VNF package from OSM.
     [Tags]   cleanup
-    Delete VNFD   ${vnfd_name}
+    Delete VNFD   ${VNFD_NAME}
 
 
 *** Keywords ***
 Suite Cleanup
     [Documentation]   Test Suit Cleanup: Deleting Descriptor, instance and vim
-
-    Run Keyword If Any Tests Failed   Delete NS   ${ns_name}
-
-    Run Keyword If Any Tests Failed   Delete NSD   ${nsd_name}
-
-    Run Keyword If Any Tests Failed   Delete VNFD   ${vnfd_name}
-
+    Run Keyword If Any Tests Failed   Delete NS   ${NS_NAME}
+    Run Keyword If Any Tests Failed   Delete NSD   ${NSD_NAME}
+    Run Keyword If Any Tests Failed   Delete VNFD   ${VNFD_NAME}
 #    Run Keyword If Any Tests Failed   Check Volume Was Deleted
index e1e313b..625278d 100644 (file)
@@ -1,3 +1,4 @@
+*** Comments ***
 #    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
 #    See the License for the specific language governing permissions and
 #    limitations under the License.
 
+
 *** Settings ***
 Documentation   [BASIC-22] Cross-model relations
 
 Library   OperatingSystem
 Library   SSHLibrary
 
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/vnfd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/nsd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ns_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ssh_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/k8scluster_lib.robot
+Resource   ../lib/vnfd_lib.resource
+Resource   ../lib/nsd_lib.resource
+Resource   ../lib/ns_lib.resource
+Resource   ../lib/ssh_lib.resource
+Resource   ../lib/k8scluster_lib.resource
 
-Force Tags   basic_22   cluster_ee_config   cluster_relations   daily   regression
+Test Tags   basic_22   cluster_ee_config   cluster_relations   regression
 
 Suite Teardown   Run Keyword And Ignore Error   Suite Cleanup
 
 
 *** Variables ***
 # K8s cluster name and version
-${k8scluster_name}   k8sbasic_22
-${k8scluster_version}   v1
+${K8SCLUSTER_NAME}   k8sbasic_22
+${K8SCLUSTER_VERSION}   v1
 
 # NS and VNF descriptor package folder and ids
-${vnfd_pkg_1}   charm-packages/cmr_relation_vnf
-${vnfd_pkg_2}   charm-packages/cmr_no_relation_vnf
-${nsd_pkg}   charm-packages/cmr_relation_ns
-${vnfd_name_1}   cross_model_relation-vnf
-${vnfd_name_2}   cross_model_no_relation-vnf
-${nsd_name}   cross_model_relation-ns
+${VNFD_PKG1}   charm-packages/cmr_relation_vnf
+${VNFD_PKG2}   charm-packages/cmr_no_relation_vnf
+${NSD_PKG}   charm-packages/cmr_relation_ns
+${VNFD_NAME1}   cross_model_relation-vnf
+${VNFD_NAME2}   cross_model_no_relation-vnf
+${NSD_NAME}   cross_model_relation-ns
 
 # NS instance name and configuration
-${ns_name}   basic_22
-${ns_config}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
-${ns_timeout}   15min
+${NS_NAME}   basic_22
+${NS_CONFIG}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
+${NS_TIMEOUT}   15min
 
 # SSH keys and username to be used
-${publickey}   %{HOME}/.ssh/id_rsa.pub
-${privatekey}   %{HOME}/.ssh/id_rsa
-${username}   ubuntu
-${password}   ${EMPTY}
+${PUBLICKEY}   %{HOME}/.ssh/id_rsa.pub
+${PRIVATEKEY}   %{HOME}/.ssh/id_rsa
+${USERNAME}   ubuntu
+${PASSWORD}   ${EMPTY}
 
 
 *** Test Cases ***
 Create Charm VNF Descriptor 1
-
-    Create VNFD   '%{PACKAGES_FOLDER}/${vnfd_pkg_1}'
+    [Documentation]   Upload first VNF package for the testsuite.
+    Create VNFD   '%{PACKAGES_FOLDER}/${VNFD_PKG1}'
 
 Create Charm VNF Descriptor 2
-
-    Create VNFD   '%{PACKAGES_FOLDER}/${vnfd_pkg_2}'
+    [Documentation]   Upload second VNF package for the testsuite.
+    Create VNFD   '%{PACKAGES_FOLDER}/${VNFD_PKG2}'
 
 Create Charm NS Descriptor
-
-    Create NSD   '%{PACKAGES_FOLDER}/${nsd_pkg}'
+    [Documentation]   Upload NS package for the testsuite.
+    Create NSD   '%{PACKAGES_FOLDER}/${NSD_PKG}'
 
 Add K8s Cluster To OSM
-    Create K8s Cluster   %{K8S_CREDENTIALS}   ${k8scluster_version}   %{VIM_TARGET}   %{VIM_MGMT_NET}   ${k8scluster_name}
+    [Documentation]   Register K8s cluster in OSM.
+    Create K8s Cluster   %{K8S_CREDENTIALS}   ${K8SCLUSTER_VERSION}   %{VIM_TARGET}   %{VIM_MGMT_NET}   ${K8SCLUSTER_NAME}
+    Check For K8s Cluster To Be Enabled   ${K8SCLUSTER_NAME}
 
 Instantiate Charm Network Service
+    [Documentation]   Instantiate NS for the testsuite.
+    ${id}=   Create Network Service   ${NSD_NAME}   %{VIM_TARGET}   ${NS_NAME}   ${NS_CONFIG}   ${PUBLICKEY}   ${NS_TIMEOUT}
+    Set Suite Variable   ${NS_ID}   ${id}
 
-    ${id}=   Create Network Service   ${nsd_name}   %{VIM_TARGET}   ${ns_name}   ${ns_config}   ${publickey}   ${ns_timeout}
-    Set Suite Variable   ${ns_id}   ${id}
-
-
-# TODO Check juju status for relations
-
+# TODO: Check juju status for relations
 
 Delete NS Instance
+    [Documentation]   Delete NS instance.
     [Tags]   cleanup
-
-    Delete NS   ${ns_name}
+    Delete NS   ${NS_NAME}
 
 Remove K8s Cluster from OSM
+    [Documentation]   Unregister K8s cluster from OSM.
     [Tags]   cleanup
-    Delete K8s Cluster   ${k8scluster_name}
+    Delete K8s Cluster   ${K8SCLUSTER_NAME}
 
 Delete NS Descriptor
+    [Documentation]   Delete NS package from OSM.
     [Tags]   cleanup
-
-    Delete NSD   ${nsd_name}
-
+    Delete NSD   ${NSD_NAME}
 
 Delete VNF Descriptor 1
+    [Documentation]   Delete first VNF package from OSM.
     [Tags]   cleanup
-
-    Delete VNFD   ${vnfd_name_1}
+    Delete VNFD   ${VNFD_NAME1}
 
 Delete VNF Descriptor 2
+    [Documentation]   Delete second VNF package from OSM.
     [Tags]   cleanup
-
-    Delete VNFD   ${vnfd_name_2}
+    Delete VNFD   ${VNFD_NAME2}
 
 
 *** Keywords ***
 Suite Cleanup
     [Documentation]   Test Suite Cleanup: Deleting descriptors and NS instance
-
-    Run Keyword If Any Tests Failed   Delete NS   ${ns_name}
-
-    Run Keyword If Any Tests Failed   Delete NSD   ${nsd_name}
-
-    Run Keyword If Any Tests Failed   Delete VNFD 1   ${vnfd_name_1}
-
-    Run Keyword If Any Tests Failed   Delete VNFD 2   ${vnfd_name_2}
-
+    Run Keyword If Any Tests Failed   Delete NS   ${NS_NAME}
+    Run Keyword If Any Tests Failed   Delete NSD   ${NSD_NAME}
+    Run Keyword If Any Tests Failed   Delete VNFD 1   ${VNFD_NAME1}
+    Run Keyword If Any Tests Failed   Delete VNFD 2   ${VNFD_NAME2}
index b6c7112..a45159a 100644 (file)
@@ -1,3 +1,4 @@
+*** Comments ***
 #   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
@@ -10,6 +11,7 @@
 #   See the License for the specific language governing permissions and
 #   limitations under the License.
 
+
 *** Settings ***
 Documentation   [BASIC-23] Creation and deletion of SOL004 and SOL007 packages.
 
@@ -19,55 +21,48 @@ Library   Collections
 Library   Process
 Library   SSHLibrary
 
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/vnfd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/nsd_lib.robot
+Resource   ../lib/vnfd_lib.resource
+Resource   ../lib/nsd_lib.resource
 
-Force Tags   basic_23   cluster_main   daily   regression
+Test Tags   basic_23   cluster_main   daily   regression   azure
 
 Suite Teardown   Run Keyword And Ignore Error   Suite Cleanup
 
 
 *** Variables ***
 # NS and VNF descriptor package folder and ids
-${vnfd_pkg}   sol004_hackfest_basic_vnf
-${vnfd_name}   sol004_hackfest_basic-vnf
-${nsd_pkg}   sol007_hackfest_basic_ns
-${nsd_name}   sol007_hackfest_basic-ns
+${VNFD_PKG}   sol004_hackfest_basic_vnf
+${VNFD_NAME}   sol004_hackfest_basic-vnf
+${NSD_PKG}   sol007_hackfest_basic_ns
+${NSD_NAME}   sol007_hackfest_basic-ns
 
 
 *** Test Cases ***
 Create VNF Package
-
-    Create VNFD   '%{PACKAGES_FOLDER}/${vnfd_pkg}'
-
+    [Documentation]   Upload VNF package for the testsuite.
+    Create VNFD   '%{PACKAGES_FOLDER}/${VNFD_PKG}'
 
 Create NS Package
-
-    Create NSD   '%{PACKAGES_FOLDER}/${nsd_pkg}'
-
+    [Documentation]   Upload NS package for the testsuite.
+    Create NSD   '%{PACKAGES_FOLDER}/${NSD_PKG}'
 
 Cannot Delete VNF Package
-
-    Assert Failure Delete VNFD   ${vnfd_name}
-
+    [Documentation]   Assert that the VNF package cannot be deleted before the NS package is deleted.
+    Assert Failure Delete VNFD   ${VNFD_NAME}
 
 Delete NS Package
+    [Documentation]   Delete NS package.
     [Tags]   cleanup
-
-    Delete NSD   ${nsd_name}
-
+    Delete NSD   ${NSD_NAME}
 
 Delete VNF Package
+    [Documentation]   Delete VNF package.
     [Tags]   cleanup
-
-    Delete VNFD   ${vnfd_name}
+    Delete VNFD   ${VNFD_NAME}
 
 
 *** Keywords ***
 Suite Cleanup
     [Documentation]   Test Suit Cleanup: Deleting NS and VNF packages
-
-    Run Keyword If Any Tests Failed   Delete NSD   ${nsd_name}
-    Run Keyword If Any Tests Failed   Delete VNFD   ${vnfd_name}
-
-
+    Run Keyword If Any Tests Failed   Delete NSD   ${NSD_NAME}
+    Run Keyword If Any Tests Failed   Delete VNFD   ${VNFD_NAME}
index b3b51eb..46860fb 100644 (file)
@@ -1,3 +1,4 @@
+*** Comments ***
 #   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
@@ -10,6 +11,7 @@
 #   See the License for the specific language governing permissions and
 #   limitations under the License.
 
+
 *** Settings ***
 Documentation   [BASIC-24] VNF with two VDUs belonging to an Openstack server group
 
@@ -18,93 +20,83 @@ Library   String
 Library   Collections
 Library   Process
 
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/vnfd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/nsd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ns_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/vnf_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/openstack_lib.robot
-
-Force Tags   basic_24   cluster_main   daily   regression
+Resource   ../lib/vnfd_lib.resource
+Resource   ../lib/nsd_lib.resource
+Resource   ../lib/ns_lib.resource
+Resource   ../lib/vnf_lib.resource
+Resource   ../lib/openstack_lib.resource
 
+Test Tags   basic_24   cluster_main   daily   regression
 
 Suite Teardown   Run Keyword And Ignore Error   Suite Cleanup
 
 
 *** Variables ***
 # NS and VNF descriptor package folder and ids
-${vnfd_pkg}   affinity_basic_vnf
-${vnfd_name}   affinity_basic-vnf
-${nsd_pkg}   affinity_basic_ns
-${nsd_name}   affinity_basic-ns
+${VNFD_PKG}   affinity_basic_vnf
+${VNFD_NAME}   affinity_basic-vnf
+${NSD_PKG}   affinity_basic_ns
+${NSD_NAME}   affinity_basic-ns
 
 # NS instance name and configuration
-${ns_name}   basic_24
-${ns_config}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
+${NS_NAME}   basic_24
+${NS_CONFIG}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
 
 # SSH keys and username to be used
-${publickey}   %{HOME}/.ssh/id_rsa.pub
-${privatekey}   %{HOME}/.ssh/id_rsa
-${username}   ubuntu
-${password}   ${EMPTY}
+${PUBLICKEY}   %{HOME}/.ssh/id_rsa.pub
+${PRIVATEKEY}   %{HOME}/.ssh/id_rsa
+${USERNAME}   ubuntu
+${PASSWORD}   ${EMPTY}
+
+${NS_ID}   ${EMPTY}
+${VNF_MEMBER_INDEX}   affinity-basic-1
+${SUCCESS_RETURN_CODE}   0
 
-${ns_id}   ${EMPTY}
-${vnf_member_index}   affinity-basic-1
-${success_return_code}   0
 
 *** Test Cases ***
 Create VNF Package
-
-    Create VNFD   '%{PACKAGES_FOLDER}/${vnfd_pkg}'
-
+    [Documentation]   Upload VNF package for the testsuite.
+    Create VNFD   '%{PACKAGES_FOLDER}/${VNFD_PKG}'
 
 Create NS Package
-
-    Create NSD   '%{PACKAGES_FOLDER}/${nsd_pkg}'
-
+    [Documentation]   Upload NS package for the testsuite.
+    Create NSD   '%{PACKAGES_FOLDER}/${NSD_PKG}'
 
 Network Service Instance Test
-
-    ${id}=   Create Network Service   ${nsd_name}   %{VIM_TARGET}   ${ns_name}   ${ns_config}   ${publickey}
-    Set Suite Variable   ${ns_id}   ${id}
-
+    [Documentation]   Instantiate NS for the testsuite.
+    ${id}=   Create Network Service   ${NSD_NAME}   %{VIM_TARGET}   ${NS_NAME}   ${NS_CONFIG}   ${PUBLICKEY}
+    Set Suite Variable   ${NS_ID}   ${id}
 
 Check Vnf Affinity Groups
-
-    Variable Should Exist   ${ns_id}   msg=NS is not available
-    ${vnf_id}   Get Vnf Id   ${ns_id}   ${vnf_member_index}
-    @{vdur_id_list}   Get VDU list from VNF   ${vnf_id}
+    [Documentation]   Check that all VDUs of the VNF belong to the expected affinity group.
+    Variable Should Exist   ${NS_ID}   msg=NS is not available
+    ${vnf_id}=   Get Vnf Id   ${NS_ID}   ${VNF_MEMBER_INDEX}
+    @{vdur_id_list}=   Get VDU List From VNF   ${vnf_id}
     FOR   ${vdur_id}   IN   @{vdur_id_list}
-        ${server_group_name}   Get VDU Affinity Group Name   ${ns_name}   ${vnf_id}   ${vdur_id}
-        ${vm_vim_id}   Get VDU VIM Id   ${vnf_id}   ${vdur_id}
+        ${server_group_name}=   Get VDU Affinity Group Name   ${NS_NAME}   ${vnf_id}   ${vdur_id}
+        ${vm_vim_id}=   Get VDU VIM Id   ${vnf_id}   ${vdur_id}
         Check VM In Server Group   ${vm_vim_id}   ${server_group_name}
     END
 
-
 Delete NS Instance Test
+    [Documentation]   Delete NS instance.
     [Tags]   cleanup
-
-    Delete NS   ${ns_name}
-
+    Delete NS   ${NS_NAME}
 
 Delete NS Descriptor Test
+    [Documentation]   Delete NS package from OSM.
     [Tags]   cleanup
-
-    Delete NSD   ${nsd_name}
-
+    Delete NSD   ${NSD_NAME}
 
 Delete VNF Descriptor Test
+    [Documentation]   Delete VNF package from OSM.
     [Tags]   cleanup
-
-    Delete VNFD   ${vnfd_name}
+    Delete VNFD   ${VNFD_NAME}
 
 
 *** Keywords ***
 Suite Cleanup
     [Documentation]   Test Suit Cleanup: Deleting Descriptor, instance and vim
-
-    Run Keyword If Any Tests Failed   Delete NS   ${ns_name}
-
-    Run Keyword If Any Tests Failed   Delete NSD   ${nsd_name}
-
-    Run Keyword If Any Tests Failed   Delete VNFD   ${vnfd_name}
-
+    Run Keyword If Any Tests Failed   Delete NS   ${NS_NAME}
+    Run Keyword If Any Tests Failed   Delete NSD   ${NSD_NAME}
+    Run Keyword If Any Tests Failed   Delete VNFD   ${VNFD_NAME}
index f024b64..9ae13be 100644 (file)
@@ -1,3 +1,4 @@
+*** Comments ***
 #   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
 #   See the License for the specific language governing permissions and
 #   limitations under the License.
 
+
 *** Settings ***
 Documentation   [BASIC-25] Update Charms in Running VNF Instance.
 
 Library   OperatingSystem
 Library   SSHLibrary
 
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/vnfd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/nsd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ns_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ssh_lib.robot
+Resource   ../lib/vnfd_lib.resource
+Resource   ../lib/nsd_lib.resource
+Resource   ../lib/ns_lib.resource
+Resource   ../lib/ns_operation_lib.resource
+Resource   ../lib/ssh_lib.resource
 
-Force Tags   basic_25   cluster_ee_config   daily   regression
+Test Tags   basic_25   cluster_ee_config   regression
 
 Suite Teardown   Run Keyword And Ignore Error   Suite Cleanup
 
 
 *** Variables ***
 # NS and VNF descriptor package folder and ids
-${vnfd_pkg}   charm-packages/ha_proxy_charm_vnf
-${updated_vnfd_pkg}   charm-packages/updated_vnfds/ha_proxy_charm_vnf
-${vnfd_name}   ha_proxy_charm-vnf
-${nsd_pkg}   charm-packages/ha_proxy_charm_ns
-${nsd_name}   ha_proxy_charm-ns
+${VNFD_PKG}   charm-packages/ha_proxy_charm_vnf
+${UPDATED_VNFD_PKG}   charm-packages/updated_vnfds/ha_proxy_charm_vnf
+${VNFD_NAME}   ha_proxy_charm-vnf
+${NSD_PKG}   charm-packages/ha_proxy_charm_ns
+${NSD_NAME}   ha_proxy_charm-ns
 
 # NS instance name and configuration
-${ns_name}   basic_25_charm_update_test
-${ns_config}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
+${NS_NAME}   basic_25_charm_update_test
+${NS_CONFIG}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
 
 # SSH keys and username to be used
-${publickey}   %{HOME}/.ssh/id_rsa.pub
-${privatekey}   %{HOME}/.ssh/id_rsa
-${username}   ubuntu
-${password}   ${EMPTY}
-
-${action_name}   touch
-${new_action_name}   mkdir
-${vnf_member_index}   vnf1
-${day_1_file_name}   /home/ubuntu/first-touch
-${day_2_file_name}   /home/ubuntu/mytouch1
-${day_2_folder_name}   /home/ubuntu/myfolder1
-${ns_timeout}   15min
+${PUBLICKEY}   %{HOME}/.ssh/id_rsa.pub
+${PRIVATEKEY}   %{HOME}/.ssh/id_rsa
+${USERNAME}   ubuntu
+${PASSWORD}   ${EMPTY}
+
+${ACTION_NAME}   touch
+${NEW_ACTION_NAME}   mkdir
+${VNF_MEMBER_INDEX}   vnf1
+${DAY_1_FILE_NAME}   /home/ubuntu/first-touch
+${DAY_2_FILE_NAME}   /home/ubuntu/mytouch1
+${DAY_2_FOLDER_NAME}   /home/ubuntu/myfolder1
+${NS_TIMEOUT}   15min
 
 # NS update operation configuration
-${update_type}   CHANGE_VNFPKG
-${ns_update_timeout}   500
+${UPDATE_TYPE}   CHANGE_VNFPKG
+${NS_UPDATE_TIMEOUT}   500
 
 
 *** Test Cases ***
 Create Charm VNF Descriptor
-
-    ${id}=   Create VNFD   '%{PACKAGES_FOLDER}/${vnfd_pkg}'
-    Set Suite Variable   ${vnfd_id}   ${id}
-
+    [Documentation]   Upload VNF package for the testsuite.
+    ${id}=   Create VNFD   '%{PACKAGES_FOLDER}/${VNFD_PKG}'
+    Set Suite Variable   ${VNFD_ID}   ${id}
 
 Create Charm NS Descriptor
-
-    Create NSD   '%{PACKAGES_FOLDER}/${nsd_pkg}'
-
+    [Documentation]   Upload NS package for the testsuite.
+    Create NSD   '%{PACKAGES_FOLDER}/${NSD_PKG}'
 
 Instantiate Charm Network Service
-
-    ${id}=   Create Network Service   ${nsd_name}   %{VIM_TARGET}   ${ns_name}   ${ns_config}   ${publickey}   ${ns_timeout}
-    Set Suite Variable   ${ns_id}   ${id}
-
+    [Documentation]   Instantiates the NS for the test suite.
+    ${id}=   Create Network Service   ${NSD_NAME}   %{VIM_TARGET}   ${NS_NAME}   ${NS_CONFIG}   ${PUBLICKEY}   ${NS_TIMEOUT}
+    Set Suite Variable   ${NS_ID}   ${id}
 
 Set NS Update Config
-
-    Variable Should Exist   ${ns_id}   msg=NS is not available
-    ${id}   Get Vnf Id   ${ns_id}   ${vnf_member_index}
+    [Documentation]   Prepare data for NS Update
+    Variable Should Exist   ${NS_ID}   msg=NS is not available
+    ${id}=   Get Vnf Id   ${NS_ID}   ${VNF_MEMBER_INDEX}
     Log   ${id}
-    Set Suite Variable   ${vnf_id}   ${id}
-    Set Suite Variable   ${ns_update_config}   '{changeVnfPackageData: [{vnfInstanceId: "${vnf_id}", vnfdId: "${vnfd_id}"}]}'
-
+    Set Suite Variable   ${VNF_ID}   ${id}
+    Set Suite Variable   ${NS_UPDATE_CONFIG}   '{changeVnfPackageData: [{vnfInstanceId: "${VNF_ID}", vnfdId: "${VNFD_ID}"}]}'
 
 Get Management Ip Address
-
-    ${ip_addr}   Get Vnf Management Ip Address   ${ns_id}   ${vnf_member_index}
+    [Documentation]   Get the mgmt IP address of the VNF.
+    ${ip_addr}=   Get Vnf Management Ip Address   ${NS_ID}   ${VNF_MEMBER_INDEX}
     Log   ${ip_addr}
-    Set Suite Variable   ${vnf_ip_addr}   ${ip_addr}
-
+    Set Suite Variable   ${VNF_IP_ADDR}   ${ip_addr}
 
 Test SSH Access
-
-    Variable Should Exist   ${vnf_ip_addr}   msg=IP address of the management VNF '${vnf_member_index}' is not available
+    [Documentation]   Check that the VNF is accessible via SSH in its mgmt IP address.
+    Variable Should Exist   ${VNF_IP_ADDR}   msg=IP address of the management VNF '${VNF_MEMBER_INDEX}' is not available
     Sleep   30s   Waiting ssh daemon to be up
-    Test SSH Connection   ${vnf_ip_addr}   ${username}   ${password}   ${privatekey}
-
+    Test SSH Connection   ${VNF_IP_ADDR}   ${USERNAME}   ${PASSWORD}   ${PRIVATEKEY}
 
 Check Remote Files Created Via Day 1 Operation
     [Documentation]   The Charm VNF has a Day 1 operation that creates a file named ${day_1_file_name}.
     ...               This test checks whether that files have been created or not.
-
-    Check If remote File Exists   ${vnf_ip_addr}   ${username}   ${password}   ${privatekey}   ${day_1_file_name}
-
+    Check If Remote File Exists   ${VNF_IP_ADDR}   ${USERNAME}   ${PASSWORD}   ${PRIVATEKEY}   ${DAY_1_FILE_NAME}
 
 Execute Day 2 Operation
     [Documentation]   Performs one Day 2 operation on the VNF that creates a new file.
-
-    Variable Should Exist   ${ns_id}   msg=Network service instance is not available
-    ${ns_op_id_1}=   Execute NS Action   ${ns_name}   ${action_name}   ${vnf_member_index}   filename=${day_2_file_name}
-
+    Variable Should Exist   ${NS_ID}   msg=Network service instance is not available
+    ${ns_op_id_1}=   Execute NS Action   ${NS_NAME}   ${ACTION_NAME}   ${VNF_MEMBER_INDEX}   filename=${DAY_2_FILE_NAME}
+    Log   ${ns_op_id_1}
 
 Check Remote File Created Via Day 2 Operation
     [Documentation]   Check whether the file created in the previous test via Day 2 operations exist or not.
-
-    Check If remote File Exists   ${vnf_ip_addr}   ${username}   ${password}   ${privatekey}   ${day_2_file_name}
-
+    Check If Remote File Exists   ${VNF_IP_ADDR}   ${USERNAME}   ${PASSWORD}   ${PRIVATEKEY}   ${DAY_2_FILE_NAME}
 
 Update VNFD Package
     [Documentation]   Updates the VNFD by using new VNFD package which includes the Charm
     ...               which has new day2 operation.
-
-    Update VNFD   '%{PACKAGES_FOLDER}/${updated_vnfd_pkg}'   ${vnfd_name}
-
+    Update VNFD   '%{PACKAGES_FOLDER}/${UPDATED_VNFD_PKG}'   ${VNFD_NAME}
 
 Update Running VNF Instance
     [Documentation]   Updates the running VNF instance by using new VNFD package.
     ...               As the VNFD has an updated charm, this operation will trigger the upgrade of existing charm
     ...               for the specific VNF.
-
-    Update Network Service   ${ns_id}   ${update_type}   ${ns_update_config}   ${ns_update_timeout}
-
+    Update Network Service   ${NS_ID}   ${UPDATE_TYPE}   ${NS_UPDATE_CONFIG}   ${NS_UPDATE_TIMEOUT}
 
 Execute Day 2 Operation on Upgraded Charm
     [Documentation]   Performs one Day 2 operation on the updated VNF that creates a new folder.
-
-    Variable Should Exist   ${ns_id}   msg=Network service instance is not available
-    ${ns_op_id_2}=   Execute NS Action   ${ns_name}   ${new_action_name}   ${vnf_member_index}   foldername=${day_2_folder_name}
-
+    Variable Should Exist   ${NS_ID}   msg=Network service instance is not available
+    ${ns_op_id_2}=   Execute NS Action   ${NS_NAME}   ${NEW_ACTION_NAME}   ${VNF_MEMBER_INDEX}   foldername=${DAY_2_FOLDER_NAME}
+    Log   ${ns_op_id_2}
 
 Check Remote Folder Created Via Day 2 Operation
     [Documentation]   Check whether the folder created in the previous test via Day 2 operations exist or not.
-
-    Check If remote Folder Exists   ${vnf_ip_addr}   ${username}   ${password}   ${privatekey}   ${day_2_folder_name}
-
+    Check If Remote Folder Exists   ${VNF_IP_ADDR}   ${USERNAME}   ${PASSWORD}   ${PRIVATEKEY}   ${DAY_2_FOLDER_NAME}
 
 Delete NS Instance
+    [Documentation]   Delete NS instance.
     [Tags]   cleanup
-
-    Delete NS   ${ns_name}
-
+    Delete NS   ${NS_NAME}
 
 Delete NS Descriptor
+    [Documentation]   Delete NS package from OSM.
     [Tags]   cleanup
-
-    Delete NSD   ${nsd_name}
-
+    Delete NSD   ${NSD_NAME}
 
 Delete VNF Descriptor
+    [Documentation]   Delete VNF package from OSM.
     [Tags]   cleanup
-
-    Delete VNFD   ${vnfd_name}
+    Delete VNFD   ${VNFD_NAME}
 
 
 *** Keywords ***
 Suite Cleanup
     [Documentation]   Test Suite Cleanup: Deleting descriptors and NS instance
-
-    Run Keyword If Any Tests Failed   Delete NS   ${ns_name}
-
-    Run Keyword If Any Tests Failed   Delete NSD   ${nsd_name}
-
-    Run Keyword If Any Tests Failed   Delete VNFD   ${vnfd_name}
-
+    Run Keyword If Any Tests Failed   Delete NS   ${NS_NAME}
+    Run Keyword If Any Tests Failed   Delete NSD   ${NSD_NAME}
+    Run Keyword If Any Tests Failed   Delete VNFD   ${VNFD_NAME}
index 952de04..1a6f94f 100644 (file)
@@ -1,3 +1,4 @@
+*** Comments ***
 #   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
 #   See the License for the specific language governing permissions and
 #   limitations under the License.
 
+
 *** Settings ***
 Documentation   [BASIC-26] Secure connection to helm execution environments.
 
 Library   OperatingSystem
 Library   SSHLibrary
 
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/vnfd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/nsd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ns_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ssh_lib.robot
+Resource   ../lib/vnfd_lib.resource
+Resource   ../lib/nsd_lib.resource
+Resource   ../lib/ns_lib.resource
+Resource   ../lib/ssh_lib.resource
 
-Force Tags   basic_26   cluster_ee_config   daily   regression
+Test Tags   basic_26   cluster_ee_config   regression
 
 Suite Teardown   Run Keyword And Ignore Error   Suite Cleanup
 
 
 *** Variables ***
 # NS and VNF descriptor package folder and ids
-${vnfd_pkg}   simple_ee_vnf
-${vnfd_name}   simple_ee-vnf
-${nsd_pkg}   simple_ee_ns
-${nsd_name}   simple_ee-ns
+${VNFD_PKG}   simple_ee_vnf
+${VNFD_NAME}   simple_ee-vnf
+${NSD_PKG}   simple_ee_ns
+${NSD_NAME}   simple_ee-ns
 
 # NS instance name and configuration
-${ns_name}   basic_26_secure_helm_ee_test
-${ns_config}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
+${NS_NAME}   basic_26_secure_helm_ee_test
+${NS_CONFIG}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
+${NS_TIMEOUT}   5min
+
+# SSH keys and username to be used to connect to the VNF
+${USERNAME}   ubuntu
+${PASSWORD}   ${EMPTY}
+${PUBLICKEY}   %{HOME}/.ssh/id_rsa.pub
+${PRIVATEKEY}   %{HOME}/.ssh/id_rsa
 
-# SSH keys and username to be used
-${publickey}   %{HOME}/.ssh/id_rsa.pub
-${privatekey}   %{OSM_RSA_FILE}
-${username}   ubuntu
-${password}   ${EMPTY}
+# SSH keys and username to be used to connect to OSM VM
+${OSM_HOST}   %{OSM_HOSTNAME}
+${OSM_USERNAME}   ubuntu
+${OSM_PASSWORD}   ${EMPTY}
+${OSM_PRIVATEKEY}   %{OSM_RSA_FILE}
 
-${action_name}   touch
-${new_action_name}   mkdir
-${vnf_member_index}   simple
-${day_1_file_name}   /home/ubuntu/first-touch
-${ns_timeout}   15min
+# Variables related to day1 and day2
+${ACTION_NAME}   touch
+${NEW_ACTION_NAME}   mkdir
+${VNF_MEMBER_INDEX}   simple
+${DAY_1_FILE_NAME}   /home/ubuntu/first-touch
 
-${host}   %{OSM_HOSTNAME}
-${username}   ubuntu
 
 *** Test Cases ***
 Create VNF Descriptor
-
-    ${id}=   Create VNFD   '%{PACKAGES_FOLDER}/${vnfd_pkg}'
-    Set Suite Variable   ${vnfd_id}   ${id}
-
+    [Documentation]   Upload VNF package for the testsuite.
+    ${id}=   Create VNFD   '%{PACKAGES_FOLDER}/${VNFD_PKG}'
+    Set Suite Variable   ${VNFD_ID}   ${id}
 
 Create NS Descriptor
-
-    Create NSD   '%{PACKAGES_FOLDER}/${nsd_pkg}'
-
+    [Documentation]   Upload NS package for the testsuite.
+    Create NSD   '%{PACKAGES_FOLDER}/${NSD_PKG}'
 
 Instantiate Network Service
-
-    ${id}=   Create Network Service   ${nsd_name}   %{VIM_TARGET}   ${ns_name}   ${ns_config}   ${publickey}   ${ns_timeout}
-    Set Suite Variable   ${ns_id}   ${id}
-
+    [Documentation]   Instantiate NS for the testsuite.
+    ${id}=   Create Network Service   ${NSD_NAME}   %{VIM_TARGET}   ${NS_NAME}   ${NS_CONFIG}   ${PUBLICKEY}   ${NS_TIMEOUT}
+    Set Suite Variable   ${NS_ID}   ${id}
 
 Get Management Ip Address
-
-    ${ip_addr}   Get Vnf Management Ip Address   ${ns_id}   ${vnf_member_index}
+    [Documentation]   Get the mgmt IP address of the VNF of the NS.
+    ${ip_addr}=   Get Vnf Management Ip Address   ${NS_ID}   ${VNF_MEMBER_INDEX}
     Log   ${ip_addr}
-    Set Suite Variable   ${vnf_ip_addr}   ${ip_addr}
-
+    Set Suite Variable   ${VNF_IP_ADDR}   ${ip_addr}
 
 Test SSH Access
-
-    Variable Should Exist   ${vnf_ip_addr}   msg=IP address of the management VNF '${vnf_member_index}' is not available
+    [Documentation]   Check that the VNF is accessible via SSH in its mgmt IP address.
+    Variable Should Exist   ${VNF_IP_ADDR}   msg=IP address of the management VNF '${VNF_MEMBER_INDEX}' is not available
     Sleep   30s   Waiting ssh daemon to be up
-    Test SSH Connection   ${vnf_ip_addr}   ${username}   ${password}   ${privatekey}
-
+    Test SSH Connection   ${VNF_IP_ADDR}   ${USERNAME}   ${PASSWORD}   ${PRIVATEKEY}
 
 Check Remote File Created Via Day 1 Operation
     [Documentation]   Check whether the file created in the previous test via Day 1 operations exist or not.
-
-    Check If remote File Exists   ${vnf_ip_addr}   ${username}   ${password}   ${privatekey}   ${day_1_file_name}
-
+    Check If Remote File Exists   ${VNF_IP_ADDR}   ${USERNAME}   ${PASSWORD}   ${PRIVATEKEY}   ${DAY_1_FILE_NAME}
 
 Get data from EE pod
-
-    Open Connection   ${host}
-    Login With Public Key   ${username}   keyfile=${privatekey}
-    ${pod}=   Execute Remote Command Check Rc Return Output   ${host}   ${username}   ${password}   ${privatekey}   kubectl get pod -n ${ns_id} --no-headers -o custom-columns=":metadata.name"
-    ${svc}=   Execute Remote Command Check Rc Return Output   ${host}   ${username}   ${password}   ${privatekey}   kubectl get svc -n ${ns_id} -l app.kubernetes.io/name=eechart -o jsonpath='{.items[0].spec.clusterIP}'
-    Set Suite Variable   ${pod_name}   ${pod}
-    Set Suite Variable   ${svc_ip}   ${svc}
-
+    [Documentation]   Retrieve pod name and service IP address of the helm-based EE running in OSM cluster and store as suite variables to be used later on.
+    Open Connection   ${OSM_HOST}
+    Login With Public Key   ${OSM_USERNAME}   keyfile=${OSM_PRIVATEKEY}
+    ${pod}=   Execute Remote Command Check Rc Return Output   ${OSM_HOST}   ${OSM_USERNAME}   ${OSM_PASSWORD}   ${OSM_PRIVATEKEY}   kubectl get pod -n ${NS_ID} --no-headers -o custom-columns=":metadata.name"
+    ${svc}=   Execute Remote Command Check Rc Return Output   ${OSM_HOST}   ${OSM_USERNAME}   ${OSM_PASSWORD}   ${OSM_PRIVATEKEY}   kubectl get svc -n ${NS_ID} -l app.kubernetes.io/name=eechart -o jsonpath='{.items[0].spec.clusterIP}'
+    Set Suite Variable   ${POD_NAME}   ${pod}
+    Set Suite Variable   ${SVC_IP}   ${svc}
 
 Fail when trying to access gRPC server without TLS
-
-    ${command} =   Catenate   python3 osm_ee/frontend_client.py ${svc_ip} 50050 sleep
-    ${result}=   Execute Remote Command Check Rc Return Output   ${host}   ${username}   ${password}   ${privatekey}   kubectl exec -it -n ${ns_id} ${pod_name} -- ${command}
+    [Documentation]   Assert failure when accessing the EE without TLS.
+    ${command}=   Catenate   python3 osm_ee/frontend_client.py ${SVC_IP} 50050 sleep
+    ${result}=   Execute Remote Command Check Rc Return Output   ${OSM_HOST}   ${OSM_USERNAME}   ${OSM_PASSWORD}   ${OSM_PRIVATEKEY}   kubectl exec -it -n ${NS_ID} ${POD_NAME} -- ${command}
     Should Contain   ${result}   Connection lost
 
-
 Delete NS Instance
+    [Documentation]   Delete NS instance.
     [Tags]   cleanup
-
-    Delete NS   ${ns_name}
-
+    Delete NS   ${NS_NAME}
 
 Delete NS Descriptor
+    [Documentation]   Delete NS package from OSM.
     [Tags]   cleanup
-
-    Delete NSD   ${nsd_name}
-
+    Delete NSD   ${NSD_NAME}
 
 Delete VNF Descriptor
+    [Documentation]   Delete VNF package from OSM.
     [Tags]   cleanup
-
-    Delete VNFD   ${vnfd_name}
+    Delete VNFD   ${VNFD_NAME}
 
 
 *** Keywords ***
 Suite Cleanup
     [Documentation]   Test Suite Cleanup: Deleting descriptors and NS instance
-
-    Run Keyword If Any Tests Failed   Delete NS   ${ns_name}
-
-    Run Keyword If Any Tests Failed   Delete NSD   ${nsd_name}
-
-    Run Keyword If Any Tests Failed   Delete VNFD   ${vnfd_name}
-
+    Run Keyword If Any Tests Failed   Delete NS   ${NS_NAME}
+    Run Keyword If Any Tests Failed   Delete NSD   ${NSD_NAME}
+    Run Keyword If Any Tests Failed   Delete VNFD   ${VNFD_NAME}
index ba0b5e2..2acb2cb 100644 (file)
@@ -1,3 +1,4 @@
+*** Comments ***
 #   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
 #   See the License for the specific language governing permissions and
 #   limitations under the License.
 
+
 *** Settings ***
 Documentation   [BASIC-27] Update Helm EE in Running VNF Instance.
 
 Library   OperatingSystem
 Library   SSHLibrary
 
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/vnfd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/nsd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ns_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ssh_lib.robot
+Resource   ../lib/vnfd_lib.resource
+Resource   ../lib/nsd_lib.resource
+Resource   ../lib/ns_lib.resource
+Resource   ../lib/ns_operation_lib.resource
+Resource   ../lib/ssh_lib.resource
 
-Force Tags   basic_27   cluster_ee_config   daily   regression
+Test Tags   basic_27   cluster_ee_config   daily   regression
 
 Suite Teardown   Run Keyword And Ignore Error   Suite Cleanup
 
 
 *** Variables ***
 # NS and VNF descriptor package folder and ids
-${vnfd_pkg}   simple_ee_vnf
-${updated_vnfd_pkg}   updated_simple_ee_vnf
-${vnfd_name}   simple_ee-vnf
-${nsd_pkg}   simple_ee_ns
-${nsd_name}   simple_ee-ns
+${VNFD_PKG}   simple_ee_vnf
+${UPDATED_VNFD_PKG}   updated_simple_ee_vnf
+${VNFD_NAME}   simple_ee-vnf
+${NSD_PKG}   simple_ee_ns
+${NSD_NAME}   simple_ee-ns
 
 # NS instance name and configuration
-${ns_name}   basic_27_helm_ee_update_test
-${ns_config}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
+${NS_NAME}   basic_27_helm_ee_update_test
+${NS_CONFIG}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
 
 # SSH keys and username to be used
-${publickey}   %{HOME}/.ssh/id_rsa.pub
-${privatekey}   %{HOME}/.ssh/id_rsa
-${username}   ubuntu
-${password}   ${EMPTY}
-
-${action_name}   touch
-${new_action_name}   mkdir
-${vnf_member_index}   simple
-${day_1_file_name}   /home/ubuntu/first-touch
-${day_2_file_name}   /home/ubuntu/mytouch1
-${day_2_folder_name}   /home/ubuntu/myfolder1
-${ns_timeout}   15min
+${PUBLICKEY}   %{HOME}/.ssh/id_rsa.pub
+${PRIVATEKEY}   %{HOME}/.ssh/id_rsa
+${USERNAME}   ubuntu
+${PASSWORD}   ${EMPTY}
+
+${ACTION_NAME}   touch
+${NEW_ACTION_NAME}   mkdir
+${VNF_MEMBER_INDEX}   simple
+${DAY_1_FILE_NAME}   /home/ubuntu/first-touch
+${DAY_2_FILE_NAME}   /home/ubuntu/mytouch1
+${DAY_2_FOLDER_NAME}   /home/ubuntu/myfolder1
+${NS_TIMEOUT}   15min
 
 # NS update operation configuration
-${update_type}   CHANGE_VNFPKG
-${ns_update_timeout}   500
+${UPDATE_TYPE}   CHANGE_VNFPKG
+${NS_UPDATE_TIMEOUT}   500
 
 
 *** Test Cases ***
 Create VNF Descriptor
-
-    ${id}=   Create VNFD   '%{PACKAGES_FOLDER}/${vnfd_pkg}'
-    Set Suite Variable   ${vnfd_id}   ${id}
-
+    [Documentation]   Upload VNF package for the testsuite.
+    ${id}=   Create VNFD   '%{PACKAGES_FOLDER}/${VNFD_PKG}'
+    Set Suite Variable   ${VNFD_ID}   ${id}
 
 Create NS Descriptor
-
-    Create NSD   '%{PACKAGES_FOLDER}/${nsd_pkg}'
-
+    [Documentation]   Upload NS package for the testsuite.
+    Create NSD   '%{PACKAGES_FOLDER}/${NSD_PKG}'
 
 Instantiate Network Service
-
-    ${id}=   Create Network Service   ${nsd_name}   %{VIM_TARGET}   ${ns_name}   ${ns_config}   ${publickey}   ${ns_timeout}
-    Set Suite Variable   ${ns_id}   ${id}
-
+    [Documentation]   Instantiate NS for the testsuite.
+    ${id}=   Create Network Service   ${NSD_NAME}   %{VIM_TARGET}   ${NS_NAME}   ${NS_CONFIG}   ${PUBLICKEY}   ${NS_TIMEOUT}
+    Set Suite Variable   ${NS_ID}   ${id}
 
 Set NS Update Config
-
-    Variable Should Exist   ${ns_id}   msg=NS is not available
-    ${id}   Get Vnf Id   ${ns_id}   ${vnf_member_index}
+    [Documentation]   Prepare NS update config dictionary to update the NS.
+    Variable Should Exist   ${NS_ID}   msg=NS is not available
+    ${id}=   Get Vnf Id   ${NS_ID}   ${VNF_MEMBER_INDEX}
     Log   ${id}
-    Set Suite Variable   ${vnf_id}   ${id}
-    Set Suite Variable   ${ns_update_config}   '{changeVnfPackageData: [{vnfInstanceId: "${vnf_id}", vnfdId: "${vnfd_id}"}]}'
-
+    Set Suite Variable   ${VNF_ID}   ${id}
+    Set Suite Variable   ${NS_UPDATE_CONFIG}   '{changeVnfPackageData: [{vnfInstanceId: "${VNF_ID}", vnfdId: "${VNFD_ID}"}]}'
 
 Get Management Ip Address
-
-    ${ip_addr}   Get Vnf Management Ip Address   ${ns_id}   ${vnf_member_index}
+    [Documentation]   Get VNF mgmt IP address from the NS.
+    ${ip_addr}=   Get Vnf Management Ip Address   ${NS_ID}   ${VNF_MEMBER_INDEX}
     Log   ${ip_addr}
-    Set Suite Variable   ${vnf_ip_addr}   ${ip_addr}
-
+    Set Suite Variable   ${VNF_IP_ADDR}   ${ip_addr}
 
 Test SSH Access
-
-    Variable Should Exist   ${vnf_ip_addr}   msg=IP address of the management VNF '${vnf_member_index}' is not available
+    [Documentation]   Test SSH access to the VNF mgmt IP address.
+    Variable Should Exist   ${VNF_IP_ADDR}   msg=IP address of the management VNF '${VNF_MEMBER_INDEX}' is not available
     Sleep   30s   Waiting ssh daemon to be up
-    Test SSH Connection   ${vnf_ip_addr}   ${username}   ${password}   ${privatekey}
-
+    Test SSH Connection   ${VNF_IP_ADDR}   ${USERNAME}   ${PASSWORD}   ${PRIVATEKEY}
 
 Check Remote Files Created Via Day 1 Operation
     [Documentation]   The VNF has a Day 1 operation that creates a file named ${day_1_file_name}.
     ...               This test checks whether that files have been created or not.
-
-    Check If remote File Exists   ${vnf_ip_addr}   ${username}   ${password}   ${privatekey}   ${day_1_file_name}
-
+    Check If Remote File Exists   ${VNF_IP_ADDR}   ${USERNAME}   ${PASSWORD}   ${PRIVATEKEY}   ${DAY_1_FILE_NAME}
 
 Execute Day 2 Operation
     [Documentation]   Performs one Day 2 operation on the VNF that creates a new file.
-
-    Variable Should Exist   ${ns_id}   msg=Network service instance is not available
-    ${ns_op_id_1}=   Execute NS Action   ${ns_name}   ${action_name}   ${vnf_member_index}   file-path=${day_2_file_name}
-
+    Variable Should Exist   ${NS_ID}   msg=Network service instance is not available
+    ${ns_op_id_1}=   Execute NS Action   ${NS_NAME}   ${ACTION_NAME}   ${VNF_MEMBER_INDEX}   file-path=${DAY_2_FILE_NAME}
+    Log   ${ns_op_id_1}
 
 Check Remote File Created Via Day 2 Operation
     [Documentation]   Check whether the file created in the previous test via Day 2 operations exist or not.
-
-    Check If remote File Exists   ${vnf_ip_addr}   ${username}   ${password}   ${privatekey}   ${day_2_file_name}
-
+    Check If Remote File Exists   ${VNF_IP_ADDR}   ${USERNAME}   ${PASSWORD}   ${PRIVATEKEY}   ${DAY_2_FILE_NAME}
 
 Update VNFD Package
     [Documentation]   Updates the VNFD by using new VNFD package which includes the EE
     ...               which has new day2 operation.
-
-    Update VNFD   '%{PACKAGES_FOLDER}/${updated_vnfd_pkg}'   ${vnfd_name}
-
+    Update VNFD   '%{PACKAGES_FOLDER}/${UPDATED_VNFD_PKG}'   ${VNFD_NAME}
 
 Update Running VNF Instance
     [Documentation]   Updates the running VNF instance by using new VNFD package.
     ...               As the VNFD has an updated Helm EE, this operation will trigger the upgrade of existing Helm EE
     ...               for the specific VNF.
-
-    Update Network Service   ${ns_id}   ${update_type}   ${ns_update_config}   ${ns_update_timeout}
-
+    Update Network Service   ${NS_ID}   ${UPDATE_TYPE}   ${NS_UPDATE_CONFIG}   ${NS_UPDATE_TIMEOUT}
 
 Execute Day 2 Operation on Upgraded Helm EE
     [Documentation]   Performs one Day 2 operation on the updated VNF that creates a new folder.
-
-    Variable Should Exist   ${ns_id}   msg=Network service instance is not available
-    ${ns_op_id_2}=   Execute NS Action   ${ns_name}   ${new_action_name}   ${vnf_member_index}   foldername=${day_2_folder_name}
-
+    Variable Should Exist   ${NS_ID}   msg=Network service instance is not available
+    ${ns_op_id_2}=   Execute NS Action   ${NS_NAME}   ${NEW_ACTION_NAME}   ${VNF_MEMBER_INDEX}   foldername=${DAY_2_FOLDER_NAME}
+    Log   ${ns_op_id_2}
 
 Check Remote Folder Created Via Day 2 Operation
     [Documentation]   Check whether the folder created in the previous test via Day 2 operations exist or not.
-
-    Check If remote Folder Exists   ${vnf_ip_addr}   ${username}   ${password}   ${privatekey}   ${day_2_folder_name}
-
+    Check If Remote Folder Exists   ${VNF_IP_ADDR}   ${USERNAME}   ${PASSWORD}   ${PRIVATEKEY}   ${DAY_2_FOLDER_NAME}
 
 Delete NS Instance
+    [Documentation]   Delete NS instance.
     [Tags]   cleanup
-
-    Delete NS   ${ns_name}
-
+    Delete NS   ${NS_NAME}
 
 Delete NS Descriptor
+    [Documentation]   Delete NS package from OSM.
     [Tags]   cleanup
-
-    Delete NSD   ${nsd_name}
-
+    Delete NSD   ${NSD_NAME}
 
 Delete VNF Descriptor
+    [Documentation]   Delete VNF package from OSM.
     [Tags]   cleanup
-
-    Delete VNFD   ${vnfd_name}
+    Delete VNFD   ${VNFD_NAME}
 
 
 *** Keywords ***
 Suite Cleanup
     [Documentation]   Test Suite Cleanup: Deleting descriptors and NS instance
-
-    Run Keyword If Any Tests Failed   Delete NS   ${ns_name}
-
-    Run Keyword If Any Tests Failed   Delete NSD   ${nsd_name}
-
-    Run Keyword If Any Tests Failed   Delete VNFD   ${vnfd_name}
-
+    Run Keyword If Any Tests Failed   Delete NS   ${NS_NAME}
+    Run Keyword If Any Tests Failed   Delete NSD   ${NSD_NAME}
+    Run Keyword If Any Tests Failed   Delete VNFD   ${VNFD_NAME}
index 0391ac7..9e6837d 100644 (file)
@@ -1,3 +1,4 @@
+*** Comments ***
 #   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
@@ -10,6 +11,7 @@
 #   See the License for the specific language governing permissions and
 #   limitations under the License.
 
+
 *** Settings ***
 Documentation   [BASIC-28] NS with one VDU which has 2 persistent volumes with keep flag
 
@@ -19,159 +21,160 @@ Library   Collections
 Library   Process
 Library   SSHLibrary
 
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/vnfd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/vnf_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/nsd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ns_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ssh_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/openstack_lib.robot
-
-Force Tags   basic_28   cluster_main   daily
+Resource   ../lib/vnfd_lib.resource
+Resource   ../lib/vnf_lib.resource
+Resource   ../lib/nsd_lib.resource
+Resource   ../lib/ns_lib.resource
+Resource   ../lib/ssh_lib.resource
+Resource   ../lib/openstack_lib.resource
 
+Test Tags   basic_28   cluster_main   daily   regression
 
 Suite Teardown   Run Keyword And Ignore Error   Suite Cleanup
 
 
 *** Variables ***
 # NS and VNF descriptor package folder and ids
-${vnfd_pkg}   keep_persistent_volume_vnf
-${vnfd_name}   keep_persistent-volumes-vnf
-${nsd_pkg}   keep_persistent_volume_ns
-${nsd_name}   persistent_volumes-ns
+${VNFD_PKG}   keep_persistent_volume_vnf
+${VNFD_NAME}   keep_persistent-volumes-vnf
+${NSD_PKG}   keep_persistent_volume_ns
+${NSD_NAME}   persistent_volumes-ns
 
 # NS instance name and configuration
-${ns_name}   basic_28
-${ns_config}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
+${NS_NAME}   basic_28
+${NS_CONFIG}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
 
 # SSH keys and username to be used
-${publickey}   %{HOME}/.ssh/id_rsa.pub
-${privatekey}   %{HOME}/.ssh/id_rsa
-${username}   ubuntu
-${password}   ${EMPTY}
+${PUBLICKEY}   %{HOME}/.ssh/id_rsa.pub
+${PRIVATEKEY}   %{HOME}/.ssh/id_rsa
+${USERNAME}   ubuntu
+${PASSWORD}   ${EMPTY}
 
-${vnf_member_index}   vnf-persistent-volumes
-${vdu_id}   keep-persistent-vol-VM
-${root_disk}   root-volume
-${ordinary_disk}   persistent-volume
-${success_return_code}   0
+${VNF_MEMBER_INDEX}   vnf-persistent-volumes
+${VDU_ID}   keep-persistent-vol-VM
+${ROOT_DISK}   root-volume
+${ORDINARY_DISK}   persistent-volume
+${SUCCESS_RETURN_CODE}   0
 
 
 *** Test Cases ***
 Create VNF Descriptor
-    Create VNFD   '%{PACKAGES_FOLDER}/${vnfd_pkg}'
-
+    [Documentation]   Upload VNF package for the testsuite.
+    Create VNFD   '%{PACKAGES_FOLDER}/${VNFD_PKG}'
 
 Create NS Descriptor
-    Create NSD   '%{PACKAGES_FOLDER}/${nsd_pkg}'
-
+    [Documentation]   Upload NS package for the testsuite.
+    Create NSD   '%{PACKAGES_FOLDER}/${NSD_PKG}'
 
 Network Service Instance Test
-    ${id}=   Create Network Service   ${nsd_name}   %{VIM_TARGET}   ${ns_name}   ${ns_config}   ${publickey}
-    Set Suite Variable   ${ns_id}   ${id}
-
+    [Documentation]   Instantiate NS for the testsuite.
+    ${id}=   Create Network Service   ${NSD_NAME}   %{VIM_TARGET}   ${NS_NAME}   ${NS_CONFIG}   ${PUBLICKEY}
+    Set Suite Variable   ${NS_ID}   ${id}
 
 Check Persistent Volume Counts
-    Variable Should Exist   ${ns_id}   msg=NS is not available
-    ${volume_match}=   Get Persistent Volumes Attached To Vm   ${ns_id}
-    Set Suite Variable   ${volume_match}
-    ${volume_counts}=   Get Length   ${volume_match}
-    Set Suite Variable   ${volume_counts}
-    Run Keyword If   ${volume_counts} != 2   Fail   msg=There were not 2 volumes attached to VM
-
+    [Documentation]   Check that the number of persistent volumes attached to VM in the NS meet the expected number (2).
+    Variable Should Exist   ${NS_ID}   msg=NS is not available
+    ${VOLUME_MATCH}=   Get Persistent Volumes Attached To Vm   ${NS_ID}
+    Set Suite Variable   ${VOLUME_MATCH}
+    ${VOLUME_COUNTS}=   Get Length   ${VOLUME_MATCH}
+    Set Suite Variable   ${VOLUME_COUNTS}
+    IF   ${VOLUME_COUNTS} != 2   Fail   msg=There were not 2 volumes attached to VM
 
 Set Persistent Volume Ids
-    Variable Should Exist   ${volume_match}   msg=NS is not available
-    Set Volume Id   ${volume_match}   0
-    Set Volume Id   ${volume_match}   1
-
+    [Documentation]   Get the identifiers of the persistent volumes attached to VM in the NS and store in suite variables ROOT_VOL_ID and ORDINARY_VOL_ID.
+    Variable Should Exist   ${VOLUME_MATCH}   msg=NS is not available
+    Set Volume Id   ${VOLUME_MATCH}   0
+    Set Volume Id   ${VOLUME_MATCH}   1
 
 Delete NS Instance Test
-    [Tags]   cleanup
-    Delete NS   ${ns_name}
-
+    [Documentation]   Delete NS instance.
+    Delete NS   ${NS_NAME}
 
 Check Persistent Root Volume in VIM after NS Deleted
-    Variable Should Exist   ${root_vol_id}   msg=Root volume is not available
-    ${root_vol_exists}=   Check If Volume Exists   ${root_vol_id}
-    log   ${root_vol_exists}
-    IF   ${root_vol_exists}==0
-        Fail   msg=Persistent root volume was deleted
-        Set Suite Variable   ${root_vol_id}   ${EMPTY}
+    [Documentation]   Check that the persistent root volume requested to be kept is present after deleting NS instance.
+    Variable Should Exist   ${ROOT_VOL_ID}   msg=Root volume is not available
+    ${root_vol_exists}=   Check If Volume Exists   ${ROOT_VOL_ID}
+    Log   ${root_vol_exists}
+    IF   ${root_vol_exists}
+        Log   Persistent root volume still exists
     ELSE
-        log   Persistent root volume still exists
+        Fail   msg=Persistent root volume was deleted
+        Set Suite Variable   ${ROOT_VOL_ID}   ${EMPTY}
     END
 
-
 Check Persistent Ordinary Volume in VIM after NS Deleted
-    Variable Should Exist   ${ordinary_vol_id}   msg=Ordinary persistent volume is not available
-    ${ordinary_vol_exists}=   Check If Volume Exists   ${ordinary_vol_id}
-    log   ${ordinary_vol_exists}
-    IF   ${ordinary_vol_exists}==0
-        Fail   msg=Persistent ordinary volume was deleted
-        Set Suite Variable   ${ordinary_vol_id}   ${EMPTY}
+    [Documentation]   Check that the persistent ordinary volume requested to be kept is present after deleting NS instance.
+    Variable Should Exist   ${ORDINARY_VOL_ID}   msg=Ordinary persistent volume is not available
+    ${ordinary_vol_exists}=   Check If Volume Exists   ${ORDINARY_VOL_ID}
+    Log   ${ordinary_vol_exists}
+    IF   ${ordinary_vol_exists}
+        Log   Persistent ordinary volume still exists
     ELSE
-        log   Persistent ordinary volume still exists
+        Fail   msg=Persistent ordinary volume was deleted
+        Set Suite Variable   ${ORDINARY_VOL_ID}   ${EMPTY}
     END
 
-
 Prepare Ns Config With Volume Id
-    Set Suite Variable   ${ns_config_with_vim_id}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ], vnf: [ {member-vnf-index: ${vnf_member_index}, vdu: [ {id: ${vdu_id}, volume: [{"name": ${root_disk}, vim-volume-id: ${root_vol_id}}, {"name": ${ordinary_disk}, vim-volume-id: ${ordinary_vol_id}}] } ] } ] }
-
+    [Documentation]   Generate NS instantiation parameters to be used in next NS instance,
+    ...               using the persistent volumes that were kept previously.
+    Set Suite Variable   ${NS_CONFIG_WITH_VIM_ID}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ], vnf: [ {member-vnf-index: ${VNF_MEMBER_INDEX}, vdu: [ {id: ${VDU_ID}, volume: [{"name": ${ROOT_DISK}, vim-volume-id: ${ROOT_VOL_ID}}, {"name": ${ORDINARY_DISK}, vim-volume-id: ${ORDINARY_VOL_ID}}] } ] } ] }
 
 Network Service Instance With Existing Volumes Test
-    ${id}=   Create Network Service   ${nsd_name}   %{VIM_TARGET}   ${ns_name}   ${ns_config_with_vim_id}   ${publickey}
-    Set Suite Variable   ${ns_id}   ${id}
-
+    [Documentation]   Instantiate NS for the testsuite again. The persistent volumes passed as instantiation parameters should be used.
+    ${id}=   Create Network Service   ${NSD_NAME}   %{VIM_TARGET}   ${NS_NAME}   ${NS_CONFIG_WITH_VIM_ID}   ${PUBLICKEY}
+    Set Suite Variable   ${NS_ID}   ${id}
 
 Verify the Attachment Of Existing Persistent Volumes
-    Set Suite Variable   ${prev_root_vol_id}   ${root_vol_id}
-    Set Suite Variable   ${prev_ordinary_vol_id}   ${ordinary_vol_id}
-    ${volume_match}=   Get Persistent Volumes Attached To Vm   ${ns_id}
-    Set Suite Variable   ${volume_match}
-    Set Volume Id   ${volume_match}   0
-    Set Volume Id   ${volume_match}   1
-    Should Be Equal As Strings   ${root_vol_id}   ${prev_root_vol_id}   msg=Existing root volume is not attached to server
-    Should Be Equal As Strings   ${ordinary_vol_id}   ${prev_ordinary_vol_id}   msg=Existing ordinary volume is not attached to server
-
+    [Documentation]   Get the identifiers of the persistent volumes attached to VM in the second NS instance and verify that they are the same
+    ...               of the first NS instance.
+    Set Suite Variable   ${PREV_ROOT_VOL_ID}   ${ROOT_VOL_ID}
+    Set Suite Variable   ${PREV_ORDINARY_VOL_ID}   ${ORDINARY_VOL_ID}
+    ${volume_match}=   Get Persistent Volumes Attached To Vm   ${NS_ID}
+    Set Suite Variable   ${VOLUME_MATCH}
+    Set Volume Id   ${VOLUME_MATCH}   0
+    Set Volume Id   ${VOLUME_MATCH}   1
+    Should Be Equal As Strings   ${ROOT_VOL_ID}   ${PREV_ROOT_VOL_ID}   msg=Existing root volume is not attached to server
+    Should Be Equal As Strings   ${ORDINARY_VOL_ID}   ${PREV_ORDINARY_VOL_ID}   msg=Existing ordinary volume is not attached to server
 
 Delete NS Instance With Existing Volumes Test
+    [Documentation]   Delete NS instance.
     [Tags]   cleanup
-    Delete NS   ${ns_name}
-
+    Delete NS   ${NS_NAME}
 
 Check Existence of Persistent Volumes
-    Variable Should Exist   ${root_vol_id}   msg=Volume is not available
-    Variable Should Exist   ${ordinary_vol_id}   msg=Volume is not available
-    ${root_vol_exists}=   Check If Volume Exists   ${root_vol_id}
-    Run Keyword If   ${root_vol_exists} == 0   Fail   msg=Existing root volume is deleted
-    ${ordinary_vol_exists}=   Check If Volume Exists   ${ordinary_vol_id}
-    Run Keyword If   ${ordinary_vol_exists} == 0   Fail   msg=Existing ordinary volume is deleted
-
+    [Documentation]   Check that the persistent volumes exist after deleting the NS.
+    Variable Should Exist   ${ROOT_VOL_ID}   msg=Volume is not available
+    Variable Should Exist   ${ORDINARY_VOL_ID}   msg=Volume is not available
+    ${root_vol_exists}=   Check If Volume Exists   ${ROOT_VOL_ID}
+    IF   not ${root_vol_exists}   Fail   msg=Existing root volume is deleted
+    ${ordinary_vol_exists}=   Check If Volume Exists   ${ORDINARY_VOL_ID}
+    IF   not ${ordinary_vol_exists}   Fail   msg=Existing ordinary volume is deleted
 
 Delete Persistent Volumes
-    [Tags]   cleanup
-    Delete Volume   ${root_vol_id}
-    Delete Volume   ${ordinary_vol_id}
-
+    [Documentation]   Delete persistent volumes.
+    Clean Persistent Volumes
 
 Delete NS Descriptor Test
+    [Documentation]   Delete NS package from OSM.
     [Tags]   cleanup
-    Delete NSD   ${nsd_name}
-
+    Delete NSD   ${NSD_NAME}
 
 Delete VNF Descriptor Test
+    [Documentation]   Delete VNF package from OSM.
     [Tags]   cleanup
-    Delete VNFD   ${vnfd_name}
+    Delete VNFD   ${VNFD_NAME}
 
 
 *** Keywords ***
 Suite Cleanup
     [Documentation]   Test Suit Cleanup: Deleting Descriptor, instance and vim
+    Run Keyword If Any Tests Failed   Delete NS   ${NS_NAME}
+    Run Keyword If Any Tests Failed   Delete NSD   ${NSD_NAME}
+    Run Keyword If Any Tests Failed   Delete VNFD   ${VNFD_NAME}
+    Run Keyword If Any Tests Failed   Clean Persistent Volumes
 
-    Run Keyword If Any Tests Failed   Delete NS   ${ns_name}
-
-    Run Keyword If Any Tests Failed   Delete NSD   ${nsd_name}
-
-    Run Keyword If Any Tests Failed   Delete VNFD   ${vnfd_name}
-
-    Run Keyword If Any Tests Failed   Delete Persistent Volumes
+Clean Persistent Volumes
+    [Documentation]   Delete root and ordinary volumes.
+    [Tags]   cleanup
+    Delete Volume   ${ROOT_VOL_ID}
+    Delete Volume   ${ORDINARY_VOL_ID}
index d47e12a..3f477a7 100644 (file)
@@ -1,3 +1,4 @@
+*** Comments ***
 #   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
@@ -10,6 +11,7 @@
 #   See the License for the specific language governing permissions and
 #   limitations under the License.
 
+
 *** Settings ***
 Documentation   [BASIC-29] NS with a single VNF and two VDU linked by a VLD with ipv6-profile.
 
@@ -19,112 +21,105 @@ Library   Collections
 Library   SSHLibrary
 Library   JSONLibrary
 
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/vnf_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/vnfd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/nsd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ns_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ssh_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/openstack_lib.robot
+Resource   ../lib/vnf_lib.resource
+Resource   ../lib/vnfd_lib.resource
+Resource   ../lib/nsd_lib.resource
+Resource   ../lib/ns_lib.resource
+Resource   ../lib/ssh_lib.resource
+Resource   ../lib/openstack_lib.resource
 
-Force Tags   basic_29   cluster_main   daily
+Test Tags   basic_29   cluster_main   daily   regression
 
 Suite Teardown   Run Keyword And Ignore Error   Suite Cleanup
 
 
 *** Variables ***
 # NS and VNF descriptor package folder and ids
-${vnfd_pkg}   ipv6profile_2vm_vnf
-${vnfd_name}   ipv6profile_2vm-vnf
-${nsd_pkg}   ipv6profile_2vm_ns
-${nsd_name}   ipv6profile_2vm-ns
+${VNFD_PKG}   ipv6profile_2vm_vnf
+${VNFD_NAME}   ipv6profile_2vm-vnf
+${NSD_PKG}   ipv6profile_2vm_ns
+${NSD_NAME}   ipv6profile_2vm-ns
 
 # NS instance name and configuration
-${ns_name}   basic_29
-${ns_config}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
+${NS_NAME}   basic_29
+${NS_CONFIG}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
 
 # SSH keys and username to be used
-${publickey}   %{HOME}/.ssh/id_rsa.pub
-${username}   ubuntu
+${PUBLICKEY}   %{HOME}/.ssh/id_rsa.pub
+${USERNAME}   ubuntu
 
 # VNFs data
-${vnf_member_index_1}   vnf
-${internal_prefix}   ^2001:db8::*
+${VNF_MEMBER_INDEX_1}   vnf
+${INTERNAL_PREFIX}   ^2001:db8::*
 
-${success_return_code}   0
+${SUCCESS_RETURN_CODE}   0
 
 
 *** Test Cases ***
 Create VNF Descriptor
-
-    Create VNFD   '%{PACKAGES_FOLDER}/${vnfd_pkg}'
-
+    [Documentation]   Upload VNF package for the testsuite.
+    Create VNFD   '%{PACKAGES_FOLDER}/${VNFD_PKG}'
 
 Create NS Descriptor
-
-    Create NSD   '%{PACKAGES_FOLDER}/${nsd_pkg}'
-
+    [Documentation]   Upload NS package for the testsuite.
+    Create NSD   '%{PACKAGES_FOLDER}/${NSD_PKG}'
 
 Instantiate Network Service
-
-    ${id}=   Create Network Service   ${nsd_name}   %{VIM_TARGET}   ${ns_name}   ${ns_config}   ${publickey}
-    Set Suite Variable   ${ns_id}   ${id}
-
+    [Documentation]   Instantiate NS for the testsuite.
+    ${id}=   Create Network Service   ${NSD_NAME}   %{VIM_TARGET}   ${NS_NAME}   ${NS_CONFIG}   ${PUBLICKEY}
+    Set Suite Variable   ${NS_ID}   ${id}
 
 Get Vnf Info
-
-    Variable Should Exist   ${ns_id}   msg=Network service instance is not available
-    @{vnfr_list}=   Get Ns Vnfr Ids   ${ns_id}
+    [Documentation]   Get VNF information, specifically VNF instance id and mgmt IP address.
+    Variable Should Exist   ${NS_ID}   msg=Network service instance is not available
+    @{vnfr_list}=   Get Ns Vnfr Ids   ${NS_ID}
     Log List   ${vnfr_list}
-    Set Suite Variable   ${vnf_id}   ${vnfr_list}[0]
-    ${ip}   Get Vnf Management Ip Address   ${ns_id}   ${vnf_member_index_1}
-    Set Suite Variable   ${vnf_ipmgmt}   ${ip}
-    Log   ${vnf_ipmgmt}
-
+    Set Suite Variable   ${VNF_ID}   ${vnfr_list}[0]
+    ${ip}=   Get Vnf Management Ip Address   ${NS_ID}   ${VNF_MEMBER_INDEX_1}
+    Set Suite Variable   ${VNF_IPMGMT}   ${ip}
+    Log   ${VNF_IPMGMT}
 
 Check Vnf IPs
-
-    Variable Should Exist   ${vnf_id}   msg=VNF is not available
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm vnf-show ${vnf_id} --literal | yq '.vdur[0].interfaces[] | select(."vnf-vld-id" == "internal")' | yq '."ip-address"' | tr -d \\"
-    Should Be Equal As Integers   ${rc}   ${success_return_code}   msg=${stdout}   values=False
-    Should Match Regexp   ${stdout}   ${internal_prefix}   msg=${stdout} doesn't match subnet's regexp ${internal_prefix}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm vnf-show ${vnf_id} --literal | yq '.vdur[1].interfaces[] | select(."vnf-vld-id" == "internal")' | yq '."ip-address"' | tr -d \\"
-    Should Be Equal As Integers   ${rc}   ${success_return_code}   msg=${stdout}   values=False
-    Should Match Regexp   ${stdout}   ${internal_prefix}   msg=${stdout} doesn't match subnet's regexp ${internal_prefix}
-
-Check that ipv6 address_mode and ra_mode are set
-
-    ${rc}   ${vim_info}=   Run and Return RC and Output   osm vnf-show ${vnf_id} --literal | yq '.vdur[] | select(."count-index" == 0)' | yq '.vim_info[].interfaces[].vim_info' | tr -d \\"
+    [Documentation]   Check whether IP addresses are syntactically valid.
+    Variable Should Exist   ${VNF_ID}   msg=VNF is not available
+    ${rc}   ${stdout}=   Run And Return RC And Output   osm vnf-show ${VNF_ID} --literal | yq '.vdur[0].interfaces[] | select(."vnf-vld-id" == "internal")' | yq -r '."ip-address"'
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}   msg=${stdout}   values=False
+    Should Match Regexp   ${stdout}   ${INTERNAL_PREFIX}   msg=${stdout} doesn't match subnet's regexp ${INTERNAL_PREFIX}
+    ${rc}   ${stdout}=   Run And Return RC And Output   osm vnf-show ${VNF_ID} --literal | yq '.vdur[1].interfaces[] | select(."vnf-vld-id" == "internal")' | yq -r '."ip-address"'
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}   msg=${stdout}   values=False
+    Should Match Regexp   ${stdout}   ${INTERNAL_PREFIX}   msg=${stdout} doesn't match subnet's regexp ${INTERNAL_PREFIX}
+
+Check That Ipv6 Address_mode And Ra_mode Are Set
+    [Documentation]   Check that IPv6 address mode and RA mode are set and equal to dhcpv6-stateful.
+    ${rc}   ${vim_info}=   Run And Return RC And Output   osm vnf-show ${VNF_ID} --literal | yq '.vdur[] | select(."count-index" == 0)' | yq -r '.vim_info[].interfaces[].vim_info'
+    Log   ${rc},${vim_info}
     ${subnet_id}=   Get Regexp Matches   ${vim_info}   {ip_address: '2001:db8::.*', subnet_id: ([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})}   1
     ${subnet_info}=   Get Subnet   ${subnet_id}[0]
-    ${json_object}=   Convert String to JSON   ${subnet_info}
+    ${json_object}=   Convert String To JSON   ${subnet_info}
     ${address_mode}=   Get From Dictionary   ${json_object}   ipv6_address_mode
     ${ra_mode}=   Get From Dictionary   ${json_object}   ipv6_ra_mode
     Should Be Equal   ${address_mode}   dhcpv6-stateful   msg=ipv6_address_mode does not equals to dhcpv6-stateful
     Should Be Equal   ${ra_mode}   dhcpv6-stateful   msg=ipv6_ra_mode does not equals to dhcpv6-stateful
 
-
 Delete NS Instance
+    [Documentation]   Delete NS instance.
     [Tags]   cleanup
-
-    Delete NS   ${ns_name}
-
+    Delete NS   ${NS_NAME}
 
 Delete NS Descriptor
+    [Documentation]   Delete NS package from OSM.
     [Tags]   cleanup
-
-    Delete NSD   ${nsd_name}
-
+    Delete NSD   ${NSD_NAME}
 
 Delete VNF Descriptor
+    [Documentation]   Delete VNF package from OSM.
     [Tags]   cleanup
-
-    Delete VNFD   ${vnfd_name}
+    Delete VNFD   ${VNFD_NAME}
 
 
 *** Keywords ***
 Suite Cleanup
     [Documentation]   Test Suite Cleanup: Deleting descriptors and NS instance
-
-    Run Keyword If Any Tests Failed   Delete NS   ${ns_name}
-    Run Keyword If Any Tests Failed   Delete NSD   ${nsd_name}
-    Run Keyword If Any Tests Failed   Delete VNFD   ${vnfd_name}
+    Run Keyword If Any Tests Failed   Delete NS   ${NS_NAME}
+    Run Keyword If Any Tests Failed   Delete NSD   ${NSD_NAME}
+    Run Keyword If Any Tests Failed   Delete VNFD   ${VNFD_NAME}
index ee60b39..8b2e16c 100644 (file)
@@ -1,3 +1,4 @@
+*** Comments ***
 #   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
@@ -10,6 +11,7 @@
 #   See the License for the specific language governing permissions and
 #   limitations under the License.
 
+
 *** Settings ***
 Documentation   [BASIC-30] NS with a single VNF and two VDU linked by a VLD with ipv6-profile.
 
@@ -19,148 +21,138 @@ Library   Collections
 Library   SSHLibrary
 Library   JSONLibrary
 
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/vnf_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/vnfd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/nsd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ns_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ssh_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/openstack_lib.robot
+Resource   ../lib/vnf_lib.resource
+Resource   ../lib/vnfd_lib.resource
+Resource   ../lib/nsd_lib.resource
+Resource   ../lib/ns_lib.resource
+Resource   ../lib/ssh_lib.resource
+Resource   ../lib/openstack_lib.resource
 
-Force Tags   basic_30   cluster_main   daily
+Test Tags   basic_30   cluster_main   daily   regression
 
 Suite Teardown   Run Keyword And Ignore Error   Suite Cleanup
 
 
 *** Variables ***
 # NS and VNF descriptor package folder and ids
-${vnfd_pkg}   ubuntu_4ifaces_vnf
-${vnfd_name}   ubuntu_4ifaces-vnf
-${nsd_pkg}   ubuntu_4ifaces_ipv6_ns
-${nsd_name}   ubuntu_4ifaces-ipv6-ns
+${VNFD_PKG}   ubuntu_4ifaces_vnf
+${VNFD_NAME}   ubuntu_4ifaces-vnf
+${NSD_PKG}   ubuntu_4ifaces_ipv6_ns
+${NSD_NAME}   ubuntu_4ifaces-ipv6-ns
 
 # NS instance name and configuration
-${ns_name}   basic_30
-${ns_config}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
+${NS_NAME}   basic_30
+${NS_CONFIG}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
 
 # SSH keys and username to be used
-${publickey}   %{HOME}/.ssh/id_rsa.pub
-${privatekey}   %{HOME}/.ssh/id_rsa
-${username}   ubuntu
+${PUBLICKEY}   %{HOME}/.ssh/id_rsa.pub
+${PRIVATEKEY}   %{HOME}/.ssh/id_rsa
+${USERNAME}   ubuntu
 
 # VNFs data
-${vnf_member_index_1}   vnf1
-${vnf_member_index_2}   vnf2
-${iface1_name}   eth1
-${datanet1_prefix}   ^2001:db8::*
+${VNF_MEMBER_INDEX_1}   vnf1
+${VNF_MEMBER_INDEX_2}   vnf2
+${IFACE1_NAME}   eth1
+${DATANET1_PREFIX}   ^2001:db8::*
 
-${success_return_code}   0
+${SUCCESS_RETURN_CODE}   0
 
 
 *** Test Cases ***
 Create VNF Descriptor
-
-    Create VNFD   '%{PACKAGES_FOLDER}/${vnfd_pkg}'
-
+    [Documentation]   Upload VNF package for the testsuite.
+    Create VNFD   '%{PACKAGES_FOLDER}/${VNFD_PKG}'
 
 Create NS Descriptor
-
-    Create NSD   '%{PACKAGES_FOLDER}/${nsd_pkg}'
-
+    [Documentation]   Upload NS package for the testsuite.
+    Create NSD   '%{PACKAGES_FOLDER}/${NSD_PKG}'
 
 Instantiate Network Service
-
-    ${id}=   Create Network Service   ${nsd_name}   %{VIM_TARGET}   ${ns_name}   ${ns_config}   ${publickey}
-    Set Suite Variable   ${ns_id}   ${id}
-
+    [Documentation]   Instantiate NS for the testsuite.
+    ${id}=   Create Network Service   ${NSD_NAME}   %{VIM_TARGET}   ${NS_NAME}   ${NS_CONFIG}   ${PUBLICKEY}
+    Set Suite Variable   ${NS_ID}   ${id}
 
 Get Vnfs Info
-
-    Variable Should Exist   ${ns_id}   msg=Network service instance is not available
-    @{vnfr_list}=   Get Ns Vnfr Ids   ${ns_id}
+    [Documentation]   Get information from the two VNF of the NS, specifically VNF instance id and mgmt IP address.
+    Variable Should Exist   ${NS_ID}   msg=Network service instance is not available
+    @{vnfr_list}=   Get Ns Vnfr Ids   ${NS_ID}
     Log List   ${vnfr_list}
-    Set Suite Variable   ${vnf_id1}   ${vnfr_list}[0]
-    Set Suite Variable   ${vnf_id2}   ${vnfr_list}[1]
-    ${ip}   Get Vnf Management Ip Address   ${ns_id}   ${vnf_member_index_1}
-    Set Suite Variable   ${vnf1_ipmgmt}   ${ip}
-    Log   ${vnf1_ipmgmt}
-    ${ip}   Get Vnf Management Ip Address   ${ns_id}   ${vnf_member_index_2}
-    Set Suite Variable   ${vnf2_ipmgmt}   ${ip}
-    Log   ${vnf2_ipmgmt}
-
+    Set Suite Variable   ${VNF_ID1}   ${vnfr_list}[0]
+    Set Suite Variable   ${VNF_ID2}   ${vnfr_list}[1]
+    ${ip}=   Get Vnf Management Ip Address   ${NS_ID}   ${VNF_MEMBER_INDEX_1}
+    Set Suite Variable   ${VNF1_IPMGMT}   ${ip}
+    Log   ${VNF1_IPMGMT}
+    ${ip}=   Get Vnf Management Ip Address   ${NS_ID}   ${VNF_MEMBER_INDEX_2}
+    Set Suite Variable   ${VNF2_IPMGMT}   ${ip}
+    Log   ${VNF2_IPMGMT}
 
 Check Vnf1 IPs
-
-    Variable Should Exist   ${vnf_id1}   msg=VNF1 is not available
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm vnf-show ${vnf_id1} --literal | yq '.vdur[0].interfaces[] | select(.name == "${iface1_name}")' | yq '."ip-address"' | tr -d \\"
-    Should Be Equal As Integers   ${rc}   ${success_return_code}   msg=${stdout}   values=False
-    Should Match Regexp   ${stdout}   ${datanet1_prefix}   msg=${stdout} doesn't match subnet's regexp ${datanet1_prefix}
-    Set Suite Variable   ${vnf1_ip1}   ${stdout}
-
+    [Documentation]   Check whether IP addresses of the first VNF in the VNF record meet the expected CIDR.
+    Variable Should Exist   ${VNF_ID1}   msg=VNF1 is not available
+    ${rc}   ${stdout}=   Run And Return RC And Output   osm vnf-show ${VNF_ID1} --literal | yq '.vdur[0].interfaces[] | select(.name == "${IFACE1_NAME}")' | yq -r '."ip-address"'
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}   msg=${stdout}   values=False
+    Should Match Regexp   ${stdout}   ${DATANET1_PREFIX}   msg=${stdout} doesn't match subnet's regexp ${DATANET1_PREFIX}
+    Set Suite Variable   ${VNF1_IP1}   ${stdout}
 
 Check Vnf2 IPs
-
-    Variable Should Exist   ${vnf_id2}   msg=VNF2 is not available
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm vnf-show ${vnf_id2} --literal | yq '.vdur[0].interfaces[] | select(.name == "${iface1_name}")' | yq '."ip-address"' | tr -d \\"
-    Should Be Equal As Integers   ${rc}   ${success_return_code}   msg=${stdout}   values=False
-    Should Match Regexp   ${stdout}   ${datanet1_prefix}   msg=${stdout} doesn't match subnet's regexp ${datanet1_prefix}
-    Set Suite Variable   ${vnf2_ip1}   ${stdout}
-
+    [Documentation]   Check whether IP addresses of the second VNF in the VNF record meet the expected CIDR.
+    Variable Should Exist   ${VNF_ID2}   msg=VNF2 is not available
+    ${rc}   ${stdout}=   Run And Return RC And Output   osm vnf-show ${VNF_ID2} --literal | yq '.vdur[0].interfaces[] | select(.name == "${IFACE1_NAME}")' | yq -r '."ip-address"'
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}   msg=${stdout}   values=False
+    Should Match Regexp   ${stdout}   ${DATANET1_PREFIX}   msg=${stdout} doesn't match subnet's regexp ${DATANET1_PREFIX}
+    Set Suite Variable   ${VNF2_IP1}   ${stdout}
 
 Verify Vnf1 Interfaces
-
-    Variable Should Exist   ${vnf1_ipmgmt}   msg=IP address of the data VNF '${vnf_member_index_1}' is not available
-    Variable Should Exist   ${privatekey}   msg=SSH private key not available
+    [Documentation]   Check whether IP addresses of the first VNF configured inside the VM meet the expected CIDR.
+    Variable Should Exist   ${VNF1_IPMGMT}   msg=IP address of the data VNF '${VNF_MEMBER_INDEX_1}' is not available
+    Variable Should Exist   ${PRIVATEKEY}   msg=SSH private key not available
     Sleep   120 seconds   Wait for SSH daemon to be up
-    ${stdout}=   Execute Remote Command Check Rc Return Output   ${vnf1_ipmgmt}   ${username}   ${EMPTY}   ${privatekey}   sudo dhclient -6 ens4 ; ip --brief addr show up | grep -v "^lo" | awk '{print $3}'
+    ${stdout}=   Execute Remote Command Check Rc Return Output   ${VNF1_IPMGMT}   ${USERNAME}   ${EMPTY}   ${PRIVATEKEY}   sudo dhclient -6 ens4 ; ip --brief addr show up | grep -v "^lo" | awk '{print $3}'
     Log   ${stdout}
-    @{ip} =   Split String   ${stdout}
-    Should Match Regexp   ${ip}[1]   ${datanet1_prefix}   msg=${ip}[1] doesn't match subnet's regexp ${datanet1_prefix}
-
+    @{ip}=   Split String   ${stdout}
+    Should Match Regexp   ${ip}[1]   ${DATANET1_PREFIX}   msg=${ip}[1] doesn't match subnet's regexp ${DATANET1_PREFIX}
 
 Verify Vnf2 Interfaces
-
-    Variable Should Exist   ${vnf2_ipmgmt}   msg=IP address of the data VNF '${vnf_member_index_2}' is not available
-    Variable Should Exist   ${privatekey}   msg=SSH private key not available
-    ${stdout}=   Execute Remote Command Check Rc Return Output   ${vnf2_ipmgmt}   ${username}   ${EMPTY}   ${privatekey}   sudo dhclient -6 ens4 ; ip --brief addr show up | grep -v "^lo" | awk '{print $3}'
+    [Documentation]   Check whether IP addresses of the second VNF configured inside the VM meet the expected CIDR.
+    Variable Should Exist   ${VNF2_IPMGMT}   msg=IP address of the data VNF '${VNF_MEMBER_INDEX_2}' is not available
+    Variable Should Exist   ${PRIVATEKEY}   msg=SSH private key not available
+    ${stdout}=   Execute Remote Command Check Rc Return Output   ${VNF2_IPMGMT}   ${USERNAME}   ${EMPTY}   ${PRIVATEKEY}   sudo dhclient -6 ens4 ; ip --brief addr show up | grep -v "^lo" | awk '{print $3}'
     Log   ${stdout}
-    @{ip} =   Split String   ${stdout}
-    Should Match Regexp   ${ip}[1]   ${datanet1_prefix}   msg=${ip}[1] doesn't match subnet's regexp ${datanet1_prefix}
-
+    @{ip}=   Split String   ${stdout}
+    Should Match Regexp   ${ip}[1]   ${DATANET1_PREFIX}   msg=${ip}[1] doesn't match subnet's regexp ${DATANET1_PREFIX}
 
 Check that ipv6 address_mode and ra_mode are set
-
-    ${rc}   ${vim_info}=   Run and Return RC and Output   osm vnf-show ${vnf_id1} --literal | yq '.vdur[] | select(."count-index" == 0)' | yq '.vim_info[].interfaces[].vim_info' | tr -d \\"
+    [Documentation]   Check that IPv6 address mode and RA mode are set and equal to dhcpv6-stateful.
+    ${rc}   ${vim_info}=   Run And Return RC And Output   osm vnf-show ${VNF_ID1} --literal | yq '.vdur[] | select(."count-index" == 0)' | yq -r '.vim_info[].interfaces[].vim_info'
+    Log   ${rc},${vim_info}
     ${subnet_id}=   Get Regexp Matches   ${vim_info}   {ip_address: '2001:db8::.*', subnet_id: ([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})}   1
     ${subnet_info}=   Get Subnet   ${subnet_id}[0]
-    ${json_object}=   Convert String to JSON   ${subnet_info}
+    ${json_object}=   Convert String To JSON   ${subnet_info}
     ${address_mode}=   Get From Dictionary   ${json_object}   ipv6_address_mode
     ${ra_mode}=   Get From Dictionary   ${json_object}   ipv6_ra_mode
     Should Be Equal   ${address_mode}   dhcpv6-stateful   msg=ipv6_address_mode does not equal dhcpv6-stateful
     Should Be Equal   ${ra_mode}   dhcpv6-stateful   msg=ipv6_ra_mode does not equal dhcpv6-stateful
 
-
 Delete NS Instance
+    [Documentation]   Delete NS instance.
     [Tags]   cleanup
-
-    Delete NS   ${ns_name}
-
+    Delete NS   ${NS_NAME}
 
 Delete NS Descriptor
+    [Documentation]   Delete NS package from OSM.
     [Tags]   cleanup
-
-    Delete NSD   ${nsd_name}
-
+    Delete NSD   ${NSD_NAME}
 
 Delete VNF Descriptor
+    [Documentation]   Delete VNF package from OSM.
     [Tags]   cleanup
-
-    Delete VNFD   ${vnfd_name}
+    Delete VNFD   ${VNFD_NAME}
 
 
 *** Keywords ***
 Suite Cleanup
     [Documentation]   Test Suite Cleanup: Deleting descriptors and NS instance
 
-    Run Keyword If Any Tests Failed   Delete NS   ${ns_name}
-    Run Keyword If Any Tests Failed   Delete NSD   ${nsd_name}
-    Run Keyword If Any Tests Failed   Delete VNFD   ${vnfd_name}
+    Run Keyword If Any Tests Failed   Delete NS   ${NS_NAME}
+    Run Keyword If Any Tests Failed   Delete NSD   ${NSD_NAME}
+    Run Keyword If Any Tests Failed   Delete VNFD   ${VNFD_NAME}
index f8fe60f..7cc6de1 100644 (file)
@@ -1,3 +1,4 @@
+*** Comments ***
 #   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
@@ -10,6 +11,7 @@
 #   See the License for the specific language governing permissions and
 #   limitations under the License.
 
+
 *** Settings ***
 Documentation   [BASIC-31] Basic NS with two multi-VDU VNF
 
@@ -19,107 +21,106 @@ Library   Collections
 Library   Process
 Library   SSHLibrary
 
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/vnfd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/nsd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ns_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/connectivity_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ssh_lib.robot
+Resource   ../lib/vnfd_lib.resource
+Resource   ../lib/nsd_lib.resource
+Resource   ../lib/ns_lib.resource
+Resource   ../lib/connectivity_lib.resource
+Resource   ../lib/ssh_lib.resource
 
-Force Tags   basic_31   cluster_main   daily
+Test Tags   basic_31   cluster_main   daily   regression
 
 Suite Teardown   Run Keyword And Ignore Error   Suite Cleanup
 
 
 *** Variables ***
 # NS and VNF descriptor package folder and ids
-${vnfd_pkg}   multivdu_multiattach_vnf
-${vnfd_name}   multivdu_multiattach-vnf
-${nsd_pkg}   multivdu_multiattach_ns
-${nsd_name}   multivdu_multiattach-ns
+${VNFD_PKG}   multivdu_multiattach_vnf
+${VNFD_NAME}   multivdu_multiattach-vnf
+${NSD_PKG}   multivdu_multiattach_ns
+${NSD_NAME}   multivdu_multiattach-ns
 
 # NS instance name and configuration
-${ns_name}   multivdu_multiattach
-${ns_config}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
+${NS_NAME}   multivdu_multiattach
+${NS_CONFIG}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
 
 # SSH keys and username to be used
-${publickey}   %{HOME}/.ssh/id_rsa.pub
-${privatekey}   %{HOME}/.ssh/id_rsa
-${username}   ubuntu
-${password}   ${EMPTY}
+${VDU0_USERNAME}   ubuntu
+${VDU0_PASSWORD}   ${EMPTY}
+${VDU0_PUBLICKEY}   %{HOME}/.ssh/id_rsa.pub
+${VDU0_PRIVATEKEY}   %{HOME}/.ssh/id_rsa
+${VDU1_USERNAME}   ubuntu
+${VDU1_PASSWORD}   osmpass
+${VDU1_PUBLICKEY}   ${EMPTY}
+${VDU1_PRIVATEKEY}   ${EMPTY}
 
-${ns_id}   ${EMPTY}
-${vnf_member_index}   vnf
-${vnf_ip_addr}   ${EMPTY}
-${wait_guard_for_vm_boot}   50s
+${NS_ID}   ${EMPTY}
+${VNF_MEMBER_INDEX}   vnf
+${VNF_IP_ADDR}   ${EMPTY}
+${WAIT_GUARD_FOR_VM_BOOT}   50s
 
 
 *** Test Cases ***
-Create Hackfest multivdu VNF Descriptor
-
-    Create VNFD   '%{PACKAGES_FOLDER}/${vnfd_pkg}'
-
-
-Create Hackfest Multivdu NS Descriptor
-
-    Create NSD   '%{PACKAGES_FOLDER}/${nsd_pkg}'
+Create Multiattach VNF Descriptor
+    [Documentation]   Upload VNF package for the testsuite.
+    Create VNFD   '%{PACKAGES_FOLDER}/${VNFD_PKG}'
 
+Create Multiattach NS Descriptor
+    [Documentation]   Upload NS package for the testsuite.
+    Create NSD   '%{PACKAGES_FOLDER}/${NSD_PKG}'
 
 Network Service Instance Test
-
-    ${status}   ${message}=   Run Keyword And Ignore Error   Variable Should Exist   ${publickey}
-        Run Keyword If   "${status}" == "FAIL"   Set Global Variable   ${publickey}   ${EMPTY}
-    ${id}=   Create Network Service   ${nsd_name}   %{VIM_TARGET}   ${ns_name}   ${ns_config}   ${publickey}
-    Set Suite Variable   ${ns_id}   ${id}
-    Sleep   ${wait_guard_for_vm_boot}   Waiting for VM's daemons to be up and running
-
+    [Documentation]   Instantiate NS for the testsuite.
+    ${status}   ${message}=   Run Keyword And Ignore Error   Variable Should Exist   ${VDU0_PUBLICKEY}
+    Log   ${status}
+    Log   ${message}
+    IF   "${status}" == "FAIL"   Set Global Variable   ${VDU0_PUBLICKEY}   ${EMPTY}
+    ${id}=   Create Network Service   ${NSD_NAME}   %{VIM_TARGET}   ${NS_NAME}   ${NS_CONFIG}   ${VDU0_PUBLICKEY}
+    Set Suite Variable   ${NS_ID}   ${id}
+    Sleep   ${WAIT_GUARD_FOR_VM_BOOT}   Waiting for VM's daemons to be up and running
 
 Get Vnf ID
-
-    ${_vnf_id}=   Get Vnf Id   ${ns_id}   ${vnf_member_index}
-    Set Suite Variable   ${vnf_id}   ${_vnf_id}
-
+    [Documentation]   Get the VNF instance id from OSM.
+    ${vnf_id}=   Get Vnf Id   ${NS_ID}   ${VNF_MEMBER_INDEX}
+    Set Suite Variable   ${VNF_ID}   ${vnf_id}
 
 Get Vnf Management Ip Addresses
-
-    ${rc}   ${vdu0_ip}=   Run and Return RC and Output   osm vnf-show ${vnf_id} --literal | yq '.vdur[0].interfaces[]."ip-address"' | tr -d \\"
-    ${rc}   ${vdu1_ip}=   Run and Return RC and Output   osm vnf-show ${vnf_id} --literal | yq '.vdur[1].interfaces[]."ip-address"' | tr -d \\"
-    Set Suite Variable   ${mgmnt_ip_addr_0}   ${vdu0_ip}
-    Set Suite Variable   ${mgmnt_ip_addr_1}   ${vdu1_ip}
-
+    [Documentation]   Get the IP addresses of the two VDU of the VNF.
+    ${rc}   ${vdu0_ip}=   Run And Return RC And Output   osm vnf-show ${VNF_ID} --literal | yq -r '.vdur[0].interfaces[]."ip-address"'
+    Log   ${rc},${vdu0_ip}
+    ${rc}   ${vdu1_ip}=   Run And Return RC And Output   osm vnf-show ${VNF_ID} --literal | yq -r '.vdur[1].interfaces[]."ip-address"'
+    Log   ${rc},${vdu1_ip}
+    Set Suite Variable   ${MGMT_IP_ADDR_0}   ${vdu0_ip}
+    Set Suite Variable   ${MGMT_IP_ADDR_1}   ${vdu1_ip}
 
 Ensure that VDUs can share data
-
-    Execute Remote Command Check Rc Return Output   ${mgmnt_ip_addr_0}   ${username}   ${EMPTY}   ${privatekey}   sudo mkfs.ext3 -F /dev/vdb && sudo mkdir /shared && sudo mount /dev/vdb /shared && sudo chown ubuntu /shared && echo "osmtest" > /shared/test_file
-    Execute Remote Command Check Rc Return Output   ${mgmnt_ip_addr_1}   ${username}   osmpass   ${privatekey}   sudo mkdir /shared && sudo mount /dev/vdb /shared && cat /shared/test_file
-    ${stdout}=   Execute Remote Command Check Rc Return Output   ${mgmnt_ip_addr_0}   ${username}   ${EMPTY}   ${privatekey}   cat /shared/test_file
+    [Documentation]   Connect via SSH to the two VDUs of the VNF and check that the volume is shared as expected.
+    Execute Remote Command Check Rc Return Output   ${MGMT_IP_ADDR_0}   ${VDU0_USERNAME}   ${VDU0_PASSWORD}   ${VDU0_PRIVATEKEY}   sudo mkfs.ext3 -F /dev/vdb && sudo mkdir /shared && sudo mount /dev/vdb /shared && sudo chown ubuntu:ubuntu /shared && echo "osmtest" > /shared/test_file
+    Sleep   10s
+    Execute Remote Command Check Rc Return Output   ${MGMT_IP_ADDR_1}   ${VDU1_USERNAME}   ${VDU1_PASSWORD}   ${VDU1_PRIVATEKEY}   sudo mkdir /shared && sudo mount /dev/vdb /shared && ls /shared
+    Execute Remote Command Check Rc Return Output   ${MGMT_IP_ADDR_1}   ${VDU1_USERNAME}   ${VDU1_PASSWORD}   ${VDU1_PRIVATEKEY}   cat /shared/test_file
+    ${stdout}=   Execute Remote Command Check Rc Return Output   ${MGMT_IP_ADDR_0}   ${VDU0_USERNAME}   ${VDU0_PASSWORD}   ${VDU0_PRIVATEKEY}   cat /shared/test_file
     Log   ${stdout}
     Should Be Equal   ${stdout}   osmtest   Shared data can't be read
 
-
 Delete NS Instance Test
+    [Documentation]   Delete NS instance.
     [Tags]   cleanup
-
-    Delete NS   ${ns_name}
-
+    Delete NS   ${NS_NAME}
 
 Delete NS Descriptor Test
+    [Documentation]   Delete NS package from OSM.
     [Tags]   cleanup
-
-    Delete NSD   ${nsd_name}
-
+    Delete NSD   ${NSD_NAME}
 
 Delete VNF Descriptor Test
+    [Documentation]   Delete VNF package from OSM.
     [Tags]   cleanup
-
-    Delete VNFD   ${vnfd_name}
+    Delete VNFD   ${VNFD_NAME}
 
 
 *** Keywords ***
 Suite Cleanup
     [Documentation]   Test Suit Cleanup: Deleting Descriptor, instance and vim
-
-    Run Keyword If Any Tests Failed   Delete NS   ${ns_name}
-
-    Run Keyword If Any Tests Failed   Delete NSD   ${nsd_name}
-
-    Run Keyword If Any Tests Failed   Delete VNFD   ${vnfd_name}
+    Run Keyword If Any Tests Failed   Delete NS   ${NS_NAME}
+    Run Keyword If Any Tests Failed   Delete NSD   ${NSD_NAME}
+    Run Keyword If Any Tests Failed   Delete VNFD   ${VNFD_NAME}
diff --git a/robot-systest/testsuite/basic_32-volume_with_different_az.robot b/robot-systest/testsuite/basic_32-volume_with_different_az.robot
new file mode 100644 (file)
index 0000000..6ea3e92
--- /dev/null
@@ -0,0 +1,113 @@
+*** Comments ***
+#   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.
+
+
+*** Settings ***
+Documentation   [BASIC-32] Basic NS with a volume in different availability zone
+
+Library   OperatingSystem
+Library   String
+Library   Collections
+Library   Process
+Library   SSHLibrary
+
+Resource   ../lib/vim_lib.resource
+Resource   ../lib/prometheus_lib.resource
+Resource   ../lib/vnfd_lib.resource
+Resource   ../lib/nsd_lib.resource
+Resource   ../lib/ns_lib.resource
+
+Variables   ../resources/basic_32-volume_with_different_az.py
+
+Test Tags   basic_32
+
+Suite Setup   Run Keyword And Ignore Error   Suite Preparation
+
+
+*** Variables ***
+# NS and VNF descriptor package folder and ids
+${VNFD_PKG}   several_volumes_vnf
+${VNFD_NAME}   several_volumes-vnf
+${NSD_PKG}   several_volumes_ns
+${NSD_NAME}   several_volumes-ns
+
+# NS instance name and configuration
+${NS_NAME}   basic_32
+${NS_CONFIG}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
+
+# SSH keys and username to be used
+${PUBLICKEY}   %{HOME}/.ssh/id_rsa.pub
+
+
+*** Test Cases ***
+Create VIM Target Basic
+    [Documentation]   Create a VIM Target only with the az parameters.
+    ...               Checks the status of the VIM in Prometheus after it creation.
+
+    Pass Execution If   '${VIM_ACCOUNT_TYPE}' != 'openstack'   Not applicable for ${VIM_ACCOUNT_TYPE} VIM
+    ${rand}=   Generate Random String   6   [NUMBERS]
+    ${VIM_NAME_AZ}=   Catenate   SEPARATOR=_   ${VIM_NAME_PREFIX}   ${rand}
+    Set Suite Variable   ${VIM_NAME_AZ}
+    ${CREATED_VIM_ACCOUNT_ID}=   Create VIM Target   ${VIM_NAME_AZ}   ${VIM_USER}   ${VIM_PASSWORD}   ${VIM_AUTH_URL}   ${VIM_TENANT}   ${VIM_ACCOUNT_TYPE}   config=${VIM_CONFIG}
+    Set Suite Variable   ${CREATED_VIM_ACCOUNT_ID}
+
+Create VNF Descriptor
+    [Documentation]   Upload VNF package for the testsuite.
+    Create VNFD   '%{PACKAGES_FOLDER}/${VNFD_PKG}'
+
+Create NS Descriptor
+    [Documentation]   Upload NS package for the testsuite.
+    Create NSD   '%{PACKAGES_FOLDER}/${NSD_PKG}'
+
+Network Service Instance Test
+    [Documentation]   Instantiate NS for the testsuite.
+    [Tags]   prepare
+    ${id}=   Create Network Service   ${NSD_NAME}   ${VIM_NAME_AZ}   ${NS_NAME}   ${NS_CONFIG}   ${PUBLICKEY}
+    Set Suite Variable   ${NS_ID}   ${id}
+
+Delete NS Instance Test
+    [Documentation]   Delete NS instance.
+    [Tags]   cleanup
+    Delete NS   ${NS_NAME}
+
+Delete NS Descriptor Test
+    [Documentation]   Delete NS package from OSM.
+    [Tags]   cleanup
+    Delete NSD   ${NSD_NAME}
+
+Delete VNF Descriptor Test
+    [Documentation]   Delete VNF package from OSM.
+    [Tags]   cleanup
+
+    Delete VNFD   ${VNFD_NAME}
+
+Delete VIM Target By ID
+    [Documentation]   Delete the VIM Target created in previous test-case by its ID.
+    ...               Checks whether the VIM Target was created or not before perform the deletion.
+    [Tags]   cleanup
+
+    ${vim_account_id}=   Get VIM Target ID   ${VIM_NAME_AZ}
+    Should Be Equal As Strings   ${vim_account_id}   ${CREATED_VIM_ACCOUNT_ID}
+    Delete VIM Target   ${vim_account_id}
+
+
+*** Keywords ***
+Suite Preparation
+    [Documentation]   Test Suite Preparation: Setting Prometheus Testsuite Variables
+    Set Testsuite Prometheus Variables
+
+Suite Cleanup
+    [Documentation]   Test Suit Cleanup: Deleting Descriptor, instance and vim
+    Run Keyword If Any Tests Failed   Delete NS   ${NS_NAME}
+    Run Keyword If Any Tests Failed   Delete NSD   ${NSD_NAME}
+    Run Keyword If Any Tests Failed   Delete VNFD   ${VNFD_NAME}
index 981ed58..7b838bc 100644 (file)
@@ -1,3 +1,4 @@
+*** Comments ***
 #   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
@@ -10,6 +11,7 @@
 #   See the License for the specific language governing permissions and
 #   limitations under the License.
 
+
 *** Settings ***
 Documentation   [EPA-01] EPA+SRIOV without underlay.
 
@@ -18,92 +20,81 @@ Library   String
 Library   Collections
 Library   SSHLibrary
 
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/vnfd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/nsd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ns_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ssh_lib.robot
+Resource   ../lib/vnfd_lib.resource
+Resource   ../lib/nsd_lib.resource
+Resource   ../lib/ns_lib.resource
+Resource   ../lib/ssh_lib.resource
 
-Force Tags   epa_01   cluster_epa   daily   regression
+Test Tags   epa_01   cluster_epa   daily   regression
 
 Suite Teardown   Run Keyword And Ignore Error   Suite Cleanup
 
 
 *** Variables ***
 # NS and VNF descriptor package folder and ids
-${vnfd_pkg}   hackfest_basic_sriov_vnf
-${vnfd_name}   hackfest_basic_sriov-vnf
-${nsd_pkg}   hackfest_basic_sriov_ns
-${nsd_name}   hackfest_basic_sriov-ns
+${VNFD_PKG}   hackfest_basic_sriov_vnf
+${VNFD_NAME}   hackfest_basic_sriov-vnf
+${NSD_PKG}   hackfest_basic_sriov_ns
+${NSD_NAME}   hackfest_basic_sriov-ns
 
 # NS instance name and configuration
-${ns_name}   epa_01-epa_sriov_test
-${ns_config}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
-${ns_id}   ${EMPTY}
+${NS_NAME}   epa_01-epa_sriov_test
+${NS_CONFIG}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
+${NS_ID}   ${EMPTY}
 
 # SSH keys and username to be used
-${publickey}   %{HOME}/.ssh/id_rsa.pub
-${privatekey}   %{HOME}/.ssh/id_rsa
-${username}   ubuntu
-${password}   osm4u
-${vnf_member_index}   vnf
-${vnf_ip_addr}   ${EMPTY}
-
+${PUBLICKEY}   %{HOME}/.ssh/id_rsa.pub
+${PRIVATEKEY}   %{HOME}/.ssh/id_rsa
+${USERNAME}   ubuntu
+${PASSWORD}   osm4u
+${VNF_MEMBER_INDEX}   vnf
+${VNF_IP_ADDR}   ${EMPTY}
 
 
 *** Test Cases ***
 Create VNF Descriptor
-
-    Create VNFD   '%{PACKAGES_FOLDER}/${vnfd_pkg}'
-
+    [Documentation]   Upload VNF package for the testsuite.
+    Create VNFD   '%{PACKAGES_FOLDER}/${VNFD_PKG}'
 
 Create NS Descriptor
-
-    Create NSD   '%{PACKAGES_FOLDER}/${nsd_pkg}'
-
+    [Documentation]   Upload NS package for the testsuite.
+    Create NSD   '%{PACKAGES_FOLDER}/${NSD_PKG}'
 
 Instantiate Network Service
-
-    ${id}=   Create Network Service   ${nsd_name}   %{VIM_TARGET}   ${ns_name}   ${ns_config}   ${publickey}
-    Set Suite Variable   ${ns_id}   ${id}
-
+    [Documentation]   Instantiate NS for the testsuite.
+    ${id}=   Create Network Service   ${NSD_NAME}   %{VIM_TARGET}   ${NS_NAME}   ${NS_CONFIG}   ${PUBLICKEY}
+    Set Suite Variable   ${NS_ID}   ${id}
 
 Get VNF IP Address
-
-    ${ip_addr}=   Get Vnf Management Ip Address   ${ns_id}   ${vnf_member_index}
+    [Documentation]   Get the mgmt IP address of the VNF of the NS.
+    ${ip_addr}=   Get Vnf Management Ip Address   ${NS_ID}   ${VNF_MEMBER_INDEX}
     Log   ${ip_addr}
-    Set Suite Variable   ${vnf_ip_addr}   ${ip_addr}
-
+    Set Suite Variable   ${VNF_IP_ADDR}   ${ip_addr}
 
 Check SR-IOV Interface
-
+    [Documentation]   Connect via SSH to the mgmt IP address of the VNF and check that the interface is not based in VirtIO.
     Sleep   30 seconds   Waiting for SSH daemon to be up
-    Execute Remote Command Check Rc Return Output   ${vnf_ip_addr}   ${username}   ${password}   ${privatekey}   lspci | grep "Ethernet controller" | grep -v "Virtio"
+    Execute Remote Command Check Rc Return Output   ${VNF_IP_ADDR}   ${USERNAME}   ${PASSWORD}   ${PRIVATEKEY}   lspci | grep "Ethernet controller" | grep -v "Virtio"
 
 Delete NS Instance
+    [Documentation]   Delete NS instance.
     [Tags]   cleanup
-
-    Delete NS   ${ns_name}
-
+    Delete NS   ${NS_NAME}
 
 Delete NS Descriptor
+    [Documentation]   Delete NS package from OSM.
     [Tags]   cleanup
-
-    Delete NSD   ${nsd_name}
-
+    Delete NSD   ${NSD_NAME}
 
 Delete VNF Descriptor
+    [Documentation]   Delete VNF package from OSM.
     [Tags]   cleanup
-
-    Delete VNFD   ${vnfd_name}
+    Delete VNFD   ${VNFD_NAME}
 
 
 *** Keywords ***
 Suite Cleanup
     [Documentation]   Test Suite Cleanup: Deleting descriptors and NS instance
-
-    Run Keyword If Any Tests Failed   Delete NS   ${ns_name}
-
-    Run Keyword If Any Tests Failed   Delete NSD   ${nsd_name}
-
-    Run Keyword If Any Tests Failed   Delete VNFD   ${vnfd_name}
-
+    Run Keyword If Any Tests Failed   Delete NS   ${NS_NAME}
+    Run Keyword If Any Tests Failed   Delete NSD   ${NSD_NAME}
+    Run Keyword If Any Tests Failed   Delete VNFD   ${VNFD_NAME}
index 86b0e97..d278e63 100644 (file)
@@ -1,3 +1,4 @@
+*** Comments ***
 #   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
@@ -10,6 +11,7 @@
 #   See the License for the specific language governing permissions and
 #   limitations under the License.
 
+
 *** Settings ***
 Documentation   [EPA-02] Support for additional EPA capabilities.
 
@@ -18,106 +20,94 @@ Library   String
 Library   Collections
 Library   SSHLibrary
 
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/vnfd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/vnf_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/nsd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ns_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/openstack_lib.robot
+Resource   ../lib/vnfd_lib.resource
+Resource   ../lib/vnf_lib.resource
+Resource   ../lib/nsd_lib.resource
+Resource   ../lib/ns_lib.resource
+Resource   ../lib/openstack_lib.resource
 
-Force Tags   epa_02   cluster_epa   daily   regression
+Test Tags   epa_02   cluster_epa   daily   regression
 
 Suite Teardown   Run Keyword And Ignore Error   Suite Cleanup
 
 
 *** Variables ***
 # NS and VNF descriptor package folder and ids
-${vnfd_pkg}   epa_quota_vnf
-${vnfd_name}   epa_quota-vnf
-${nsd_pkg}   epa_quota_ns
-${nsd_name}   epa_quota-ns
+${VNFD_PKG}   epa_quota_vnf
+${VNFD_NAME}   epa_quota-vnf
+${NSD_PKG}   epa_quota_ns
+${NSD_NAME}   epa_quota-ns
 
 # NS instance name and configuration
-${ns_name}   epa_02-epa_quota_test
-${ns_config}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
+${NS_NAME}   epa_02-epa_quota_test
+${NS_CONFIG}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
 
 # SSH public keys file
-${publickey}   %{HOME}/.ssh/id_rsa.pub
+${PUBLICKEY}   %{HOME}/.ssh/id_rsa.pub
 
-${ns_id}   ${EMPTY}
-${vnf_server_id}   ${EMPTY}
-${flavor_properties}   ${EMPTY}
-${success_return_code}   0
+${NS_ID}   ${EMPTY}
+${VNF_SERVER_ID}   ${EMPTY}
+${FLAVOR_PROPERTIES}   ${EMPTY}
+${SUCCESS_RETURN_CODE}   0
 
 
 *** Test Cases ***
 Create VNF Descriptor
-
+    [Documentation]   Upload VNF package for the testsuite.
     Remove Environment Variable   OVERRIDES
-    Create VNFD   '%{PACKAGES_FOLDER}/${vnfd_pkg}'
-
+    Create VNFD   '%{PACKAGES_FOLDER}/${VNFD_PKG}'
 
 Create NS Descriptor
-
-    Create NSD   '%{PACKAGES_FOLDER}/${nsd_pkg}'
-
+    [Documentation]   Upload NS package for the testsuite.
+    Create NSD   '%{PACKAGES_FOLDER}/${NSD_PKG}'
 
 Instantiate Network Service
-
-    ${id}=   Create Network Service   ${nsd_name}   %{VIM_TARGET}   ${ns_name}   ${ns_config}   ${publickey}
-    Set Suite Variable   ${ns_id}   ${id}
-
+    [Documentation]   Instantiate the NS for the testsuite.
+    ${id}=   Create Network Service   ${NSD_NAME}   %{VIM_TARGET}   ${NS_NAME}   ${NS_CONFIG}   ${PUBLICKEY}
+    Set Suite Variable   ${NS_ID}   ${id}
 
 Get VNF Server ID
-
-    ${vnfs_list}=   Get Ns Vnf List   ${ns_id}
+    [Documentation]   Get the id of the VM at the VIM and store in VNF_SERVER_ID suite variable to be used later on.
+    ${vnfs_list}=   Get Ns Vnf List   ${NS_ID}
     ${vim_id}=   Get VNF VIM ID   ${vnfs_list}[0]
     Log   ${vim_id}
-    Set Suite Variable   ${vnf_server_id}   ${vim_id}
-
+    Set Suite Variable   ${VNF_SERVER_ID}   ${vim_id}
 
 Get Server Flavor Properties
-
-    ${flavor_id}=   Get Server Flavor ID   ${vnf_server_id}
+    [Documentation]   Get from the VIM the flavor properties of the VM with id VNF_SERVER_ID.
+    ${flavor_id}=   Get Server Flavor ID   ${VNF_SERVER_ID}
     ${properties}=   Get Flavor Properties   ${flavor_id}
     Log   ${properties}
-    Set Suite Variable   ${flavor_properties}   ${properties}
-
+    Set Suite Variable   ${FLAVOR_PROPERTIES}   ${properties}
 
 Check Flavor Quota Properties
-
-    ${rc}=   Run and Return RC   echo ${flavor_properties} | grep "cpu_shares_level=custom"
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    ${rc}=   Run and Return RC   echo ${flavor_properties} | grep "disk_io_shares_level=custom"
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    ${rc}=   Run and Return RC   echo ${flavor_properties} | grep "memory_shares_level=custom"
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-
+    [Documentation]   Assert that the flavor properties include the expected EPA parameters included in the descriptor.
+    ${rc}=   Run And Return Rc   echo ${FLAVOR_PROPERTIES} | grep "cpu_shares_level=custom"
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    ${rc}=   Run And Return Rc   echo ${FLAVOR_PROPERTIES} | grep "disk_io_shares_level=custom"
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    ${rc}=   Run And Return Rc   echo ${FLAVOR_PROPERTIES} | grep "memory_shares_level=custom"
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
 
 Delete NS Instance
+    [Documentation]   Delete NS instance.
     [Tags]   cleanup
-
-    Delete NS   ${ns_name}
-
+    Delete NS   ${NS_NAME}
 
 Delete NS Descriptor
+    [Documentation]   Delete NS package from OSM.
     [Tags]   cleanup
-
-    Delete NSD   ${nsd_name}
-
+    Delete NSD   ${NSD_NAME}
 
 Delete VNF Descriptor
+    [Documentation]   Delete VNF package from OSM.
     [Tags]   cleanup
-
-    Delete VNFD   ${vnfd_name}
+    Delete VNFD   ${VNFD_NAME}
 
 
 *** Keywords ***
 Suite Cleanup
     [Documentation]   Test Suite Cleanup: Deleting descriptors and NS instance
-
-    Run Keyword If Any Tests Failed   Delete NS   ${ns_name}
-
-    Run Keyword If Any Tests Failed   Delete NSD   ${nsd_name}
-
-    Run Keyword If Any Tests Failed   Delete VNFD   ${vnfd_name}
-
+    Run Keyword If Any Tests Failed   Delete NS   ${NS_NAME}
+    Run Keyword If Any Tests Failed   Delete NSD   ${NSD_NAME}
+    Run Keyword If Any Tests Failed   Delete VNFD   ${VNFD_NAME}
index 982a8de..116082b 100644 (file)
@@ -1,3 +1,4 @@
+*** Comments ***
 #   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
 #   See the License for the specific language governing permissions and
 #   limitations under the License.
 
+
 *** Settings ***
 Documentation   [EPA-03] CRUD operations on SDNC accounts.
 
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/sdnc_lib.robot
-
-Variables   %{ROBOT_DEVOPS_FOLDER}/resources/epa_03-crud_operations_on_sdnc_data.py
+Resource   ../lib/prometheus_lib.resource
+Resource   ../lib/sdnc_lib.resource
 
-Force Tags   epa_03   cluster_epa   daily   regression
+Test Tags   epa_03   cluster_epa   daily   regression
 
-Suite Teardown   Run Keyword And Ignore Error   Delete Basic SDNC
+Suite Setup   Run Keyword And Ignore Error   Suite Preparation
+Suite Teardown   Run Keyword And Ignore Error   Clean SDNC
 
 
 *** Variables ***
-${sdnc_enabled_max_wait_time}   1min
-${sdnc_enabled_pol_time}   10
+${SDNC_ENABLED_MAX_WAIT_TIME}   1min
+${SDNC_ENABLED_POL_TIME}   10
+${SDNC_NAME}   epa_03
+${SDNC_USER}   %{SDNC_USER=karaf}
+${SDNC_PASSWORD}   %{SDNC_PASSWORD=karaf}
+${SDNC_URL}   %{SDNC_URL=http://localhost:8181}
+${SDNC_TYPE}   %{SDNC_TYPE=onos_vpls}
 
 
 *** Test Cases ***
 Create Basic SDNC
-
-    ${created_sdnc_id}=   Create SDNC   ${sdnc_name}   ${sdnc_user}   ${sdnc_password}   ${sdnc_url}   ${sdnc_type}
-    Set Suite Variable   ${sdnc_id}   ${created_sdnc_id}
-    Wait Until Keyword Succeeds   ${sdnc_enabled_max_wait_time}   ${sdnc_enabled_pol_time}   Check for SDNC   ${sdnc_id}
-
+    [Documentation]   Register SDN controller in OSM.
+    ${created_sdnc_id}=   Create SDNC   ${SDNC_NAME}   ${SDNC_USER}   ${SDNC_PASSWORD}   ${SDNC_URL}   ${SDNC_TYPE}
+    Set Suite Variable   ${SDNC_ID}   ${created_sdnc_id}
+    Wait Until Keyword Succeeds   ${SDNC_ENABLED_MAX_WAIT_TIME}   ${SDNC_ENABLED_POL_TIME}   Check For SDNC   ${SDNC_ID}
 
 Check SDNC Status Is Healthy
-
-    Check for SDNC Status   ${sdnc_id}   ${prometheus_host}   ${prometheus_port}   ${prometheus_user}   ${prometheus_password}
-
+    [Documentation]   Check in Prometheus that the SDN controller is in healthy state.
+    Check For SDNC Status   ${SDNC_ID}   ${PROMETHEUS_HOST}   ${PROMETHEUS_PORT}   ${PROMETHEUS_USER}   ${PROMETHEUS_PASSWORD}
 
 Delete Basic SDNC
+    [Documentation]   Delete SDN controller from OSM.
     [Tags]   cleanup
+    Delete SDNC   ${SDNC_NAME}
+
+
+*** Keywords ***
+Suite Preparation
+    [Documentation]   Test Suite Preparation: Setting Prometheus Testsuite Variables.
+    Set Testsuite Prometheus Variables
 
+Clean SDNC
+    [Documentation]   Delete SDN controller from OSM.
     Delete SDNC   ${sdnc_name}
index 38a7023..437e138 100644 (file)
@@ -1,3 +1,4 @@
+*** Comments ***
 #   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
@@ -10,6 +11,7 @@
 #   See the License for the specific language governing permissions and
 #   limitations under the License.
 
+
 *** Settings ***
 Documentation   [EPA-04] EPA underlay SR-IOV.
 
@@ -18,110 +20,96 @@ Library   String
 Library   Collections
 Library   SSHLibrary
 
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/vnfd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/vnf_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/nsd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ns_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ssh_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/openstack_lib.robot
+Resource   ../lib/vnfd_lib.resource
+Resource   ../lib/vnf_lib.resource
+Resource   ../lib/nsd_lib.resource
+Resource   ../lib/ns_lib.resource
+Resource   ../lib/ssh_lib.resource
+Resource   ../lib/openstack_lib.resource
 
-Force Tags   epa_04   cluster_epa   daily   regression
+Test Tags   epa_04   cluster_epa   daily   regression
 
 Suite Teardown   Run Keyword And Ignore Error   Suite Cleanup
 
 
 *** Variables ***
 # NS and VNF descriptor package folder and ids
-${vnfd_pkg}   epa_1vm_sriov_vnf
-${vnfd_name}   epa_1vm_sriov-vnf
-${nsd_pkg}   epa_1vm_sriov_ns
-${nsd_name}   epa_1vm_sriov-ns
-${ns_name}   epa_04
+${VNFD_PKG}   epa_1vm_sriov_vnf
+${VNFD_NAME}   epa_1vm_sriov-vnf
+${NSD_PKG}   epa_1vm_sriov_ns
+${NSD_NAME}   epa_1vm_sriov-ns
+${NS_NAME}   epa_04
 
 # Fixed IPs and subnet for datanet VL
-${datanet_subnet}   192.168.100.0/24
-${datanet_ip1}   192.168.100.11
-${datanet_ip2}   192.168.100.22
+${DATANET_SUBNET}   192.168.100.0/24
+${DATANET_IP1}   192.168.100.11
+${DATANET_IP2}   192.168.100.22
 
-${vnf_member_index_1}   vnf1
-${vnf_member_index_2}   vnf2
-${username}   ubuntu
-${password}   osm4u
-${ns_config}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} , {name: datanet, ip-profile: {ip-version: ipv4, subnet-address: "${datanet_subnet}"}, vnfd-connection-point-ref: [ {member-vnf-index-ref: "${vnf_member_index_1}", vnfd-connection-point-ref: vnf-data-ext, ip-address: "${datanet_ip1}"}, {member-vnf-index-ref: "${vnf_member_index_2}", vnfd-connection-point-ref: vnf-data-ext, ip-address: "${datanet_ip2}"}]} ] }
-${success_return_code}   0
+${VNF_MEMBER_INDEX_1}   vnf1
+${VNF_MEMBER_INDEX_2}   vnf2
+${USERNAME}   ubuntu
+${PASSWORD}   osm4u
+${NS_CONFIG}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} , {name: datanet, ip-profile: {ip-version: ipv4, subnet-address: "${DATANET_SUBNET}"}, vnfd-connection-point-ref: [ {member-vnf-index-ref: "${VNF_MEMBER_INDEX_1}", vnfd-connection-point-ref: vnf-data-ext, ip-address: "${DATANET_IP1}"}, {member-vnf-index-ref: "${VNF_MEMBER_INDEX_2}", vnfd-connection-point-ref: vnf-data-ext, ip-address: "${DATANET_IP2}"}]} ] }
+${SUCCESS_RETURN_CODE}   0
 
 
 *** Test Cases ***
 Create VNF Descriptor
-
+    [Documentation]   Upload VNF package for the testsuite.
     Remove Environment Variable   OVERRIDES
-    Create VNFD   '%{PACKAGES_FOLDER}/${vnfd_pkg}'
-
+    Create VNFD   '%{PACKAGES_FOLDER}/${VNFD_PKG}'
 
 Create NS Descriptor
-
-    Create NSD   '%{PACKAGES_FOLDER}/${nsd_pkg}'
-
+    [Documentation]   Upload NS package for the testsuite.
+    Create NSD   '%{PACKAGES_FOLDER}/${NSD_PKG}'
 
 Instantiate Network Service
-
-    ${id}=   Create Network Service   ${nsd_name}   %{VIM_TARGET}   ${ns_name}   ${ns_config}   ${EMPTY}
-    Set Suite Variable   ${ns_id}   ${id}
-
+    [Documentation]   Instantiate NS for the testsuite.
+    ${id}=   Create Network Service   ${NSD_NAME}   %{VIM_TARGET}   ${NS_NAME}   ${NS_CONFIG}   ${EMPTY}
+    Set Suite Variable   ${NS_ID}   ${id}
 
 Get Management Ip Addresses
-
-    Variable Should Exist   ${ns_id}   msg=Network service instance is not available
-    ${ip}   Get Vnf Management Ip Address   ${ns_id}   ${vnf_member_index_1}
-    Set Suite Variable   ${ip_mgmt_1}   ${ip}
-    Log   ${ip_mgmt_1}
-
-    ${ip}   Get Vnf Management Ip Address   ${ns_id}   ${vnf_member_index_2}
-    Set Suite Variable   ${ip_mgmt_2}   ${ip}
-    Log   ${ip_mgmt_2}
-
+    [Documentation]   Get the mgmt IP addresses of both VNF of the NS.
+    Variable Should Exist   ${NS_ID}   msg=Network service instance is not available
+    ${ip}=   Get Vnf Management Ip Address   ${NS_ID}   ${VNF_MEMBER_INDEX_1}
+    Set Suite Variable   ${IP_MGMT_1}   ${ip}
+    Log   ${IP_MGMT_1}
+    ${ip}=   Get Vnf Management Ip Address   ${NS_ID}   ${VNF_MEMBER_INDEX_2}
+    Set Suite Variable   ${IP_MGMT_2}   ${ip}
+    Log   ${IP_MGMT_2}
 
 Ping from Vnf1 to Vnf2
-
-    Variable Should Exist   ${ip_mgmt_1}   msg=IP address of the data VNF '${vnf_member_index_1}' is not available
+    [Documentation]   Check connectivity from the first VNF to the second VNF using ping.
+    Variable Should Exist   ${IP_MGMT_1}   msg=IP address of the data VNF '${VNF_MEMBER_INDEX_1}' is not available
     Sleep   30 seconds   Wait for SSH daemon to be up
-    ${stdout}=   Execute Remote Command Check Rc Return Output   ${ip_mgmt_1}   ${username}   ${password}   ${EMPTY}   ip addr ; ping -c 5 ${datanet_ip2}
+    ${stdout}=   Execute Remote Command Check Rc Return Output   ${IP_MGMT_1}   ${USERNAME}   ${PASSWORD}   ${EMPTY}   ip addr ; ping -c 5 ${DATANET_IP2}
     Log   ${stdout}
 
-
 Ping from Vnf2 to Vnf1
-
-    Variable Should Exist   ${ip_mgmt_2}   msg=IP address of the data VNF '${vnf_member_index_2}' is not available
-    ${stdout}=   Execute Remote Command Check Rc Return Output   ${ip_mgmt_2}   ${username}   ${password}   ${EMPTY}   ip addr ; ping -c 5 ${datanet_ip1}
+    [Documentation]   Check connectivity from the second VNF to the first VNF using ping.
+    Variable Should Exist   ${IP_MGMT_2}   msg=IP address of the data VNF '${VNF_MEMBER_INDEX_2}' is not available
+    ${stdout}=   Execute Remote Command Check Rc Return Output   ${IP_MGMT_2}   ${USERNAME}   ${PASSWORD}   ${EMPTY}   ip addr ; ping -c 5 ${DATANET_IP1}
     Log   ${stdout}
 
-
 Delete NS Instance
+    [Documentation]   Delete NS instance.
     [Tags]   cleanup
-
-    Delete NS   ${ns_name}
-
+    Delete NS   ${NS_NAME}
 
 Delete NS Descriptor
+    [Documentation]   Delete NS package from OSM.
     [Tags]   cleanup
-
-    Delete NSD   ${nsd_name}
-
+    Delete NSD   ${NSD_NAME}
 
 Delete VNF Descriptor
+    [Documentation]   Delete VNF package from OSM.
     [Tags]   cleanup
-
-    Delete VNFD   ${vnfd_name}
-
+    Delete VNFD   ${VNFD_NAME}
 
 
 *** Keywords ***
 Suite Cleanup
     [Documentation]   Test Suite Cleanup: Deleting descriptors and NS instance
-
-    Run Keyword If Any Tests Failed   Delete NS   ${ns_name}
-
-    Run Keyword If Any Tests Failed   Delete NSD   ${nsd_name}
-
-    Run Keyword If Any Tests Failed   Delete VNFD   ${vnfd_name}
-
+    Run Keyword If Any Tests Failed   Delete NS   ${NS_NAME}
+    Run Keyword If Any Tests Failed   Delete NSD   ${NSD_NAME}
+    Run Keyword If Any Tests Failed   Delete VNFD   ${VNFD_NAME}
index 0e6dd50..a81de08 100644 (file)
@@ -1,3 +1,4 @@
+*** Comments ***
 #   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
@@ -10,6 +11,7 @@
 #   See the License for the specific language governing permissions and
 #   limitations under the License.
 
+
 *** Settings ***
 Documentation   [EPA-05] EPA underlay PASSTHROUGH.
 
@@ -18,111 +20,96 @@ Library   String
 Library   Collections
 Library   SSHLibrary
 
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/vnfd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/vnf_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/nsd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ns_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ssh_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/openstack_lib.robot
+Resource   ../lib/vnfd_lib.resource
+Resource   ../lib/vnf_lib.resource
+Resource   ../lib/nsd_lib.resource
+Resource   ../lib/ns_lib.resource
+Resource   ../lib/ssh_lib.resource
+Resource   ../lib/openstack_lib.resource
 
-Force Tags   epa_05   cluster_epa
+Test Tags   epa_05   cluster_epa
 
 Suite Teardown   Run Keyword And Ignore Error   Suite Cleanup
 
 
 *** Variables ***
 # NS and VNF descriptor package folder and ids
-${vnfd_pkg}   epa_1vm_passthrough_vnf
-${vnfd_name}   epa_1vm_passthrough-vnf
-${nsd_pkg}   epa_1vm_passthrough_ns
-${nsd_name}   epa_1vm_passthrough-ns
-${ns_name}   epa_05
+${VNFD_PKG}   epa_1vm_passthrough_vnf
+${VNFD_NAME}   epa_1vm_passthrough-vnf
+${NSD_PKG}   epa_1vm_passthrough_ns
+${NSD_NAME}   epa_1vm_passthrough-ns
+${NS_NAME}   epa_05
 
 # Fixed IPs and subnet for datanet VL
-${datanet_subnet}   192.168.110.0/24
-${datanet_ip1}   192.168.110.11
-${datanet_ip2}   192.168.110.22
+${DATANET_SUBNET}   192.168.110.0/24
+${DATANET_IP1}   192.168.110.11
+${DATANET_IP2}   192.168.110.22
 
-${vnf_member_index_1}   vnf1
-${vnf_member_index_2}   vnf2
-${username}   ubuntu
-${password}   osm4u
-${ns_config}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} , {name: datanet, ip-profile: {ip-version: ipv4, subnet-address: "${datanet_subnet}"}, vnfd-connection-point-ref: [ {member-vnf-index-ref: "${vnf_member_index_1}", vnfd-connection-point-ref: vnf-data-ext, ip-address: "${datanet_ip1}"}, {member-vnf-index-ref: "${vnf_member_index_2}", vnfd-connection-point-ref: vnf-data-ext, ip-address: "${datanet_ip2}"}]} ] }
-${success_return_code}   0
+${VNF_MEMBER_INDEX_1}   vnf1
+${VNF_MEMBER_INDEX_2}   vnf2
+${USERNAME}   ubuntu
+${PASSWORD}   osm4u
+${NS_CONFIG}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} , {name: datanet, ip-profile: {ip-version: ipv4, subnet-address: "${DATANET_SUBNET}"}, vnfd-connection-point-ref: [ {member-vnf-index-ref: "${VNF_MEMBER_INDEX_1}", vnfd-connection-point-ref: vnf-data-ext, ip-address: "${DATANET_IP1}"}, {member-vnf-index-ref: "${VNF_MEMBER_INDEX_2}", vnfd-connection-point-ref: vnf-data-ext, ip-address: "${DATANET_IP2}"}]} ] }
+${SUCCESS_RETURN_CODE}   0
 
 
 *** Test Cases ***
 Create VNF Descriptor
-
+    [Documentation]   Upload VNF package for the testsuite.
     Remove Environment Variable   OVERRIDES
-    Create VNFD   '%{PACKAGES_FOLDER}/${vnfd_pkg}'
-
+    Create VNFD   '%{PACKAGES_FOLDER}/${VNFD_PKG}'
 
 Create NS Descriptor
-
-    Create NSD   '%{PACKAGES_FOLDER}/${nsd_pkg}'
-
+    [Documentation]   Upload NS package for the testsuite.
+    Create NSD   '%{PACKAGES_FOLDER}/${NSD_PKG}'
 
 Instantiate Network Service
-
-    ${id}=   Create Network Service   ${nsd_name}   %{VIM_TARGET}   ${ns_name}   ${ns_config}   ${EMPTY}
-    Set Suite Variable   ${ns_id}   ${id}
-
+    [Documentation]   Instantiate NS for the testsuite.
+    ${id}=   Create Network Service   ${NSD_NAME}   %{VIM_TARGET}   ${NS_NAME}   ${NS_CONFIG}   ${EMPTY}
+    Set Suite Variable   ${NS_ID}   ${id}
 
 Get Management Ip Addresses
-
-    Variable Should Exist   ${ns_id}   msg=Network service instance is not available
-    ${ip}   Get Vnf Management Ip Address   ${ns_id}   ${vnf_member_index_1}
-    Set Suite Variable   ${ip_mgmt_1}   ${ip}
-    Log   ${ip_mgmt_1}
-
-    ${ip}   Get Vnf Management Ip Address   ${ns_id}   ${vnf_member_index_2}
-    Set Suite Variable   ${ip_mgmt_2}   ${ip}
-    Log   ${ip_mgmt_2}
-
+    [Documentation]   Get the mgmt IP addresses of both VNF of the NS.
+    Variable Should Exist   ${NS_ID}   msg=Network service instance is not available
+    ${ip}=   Get Vnf Management Ip Address   ${NS_ID}   ${VNF_MEMBER_INDEX_1}
+    Set Suite Variable   ${IP_MGMT_1}   ${ip}
+    Log   ${IP_MGMT_1}
+    ${ip}=   Get Vnf Management Ip Address   ${NS_ID}   ${VNF_MEMBER_INDEX_2}
+    Set Suite Variable   ${IP_MGMT_2}   ${ip}
+    Log   ${IP_MGMT_2}
 
 Ping from Vnf1 to Vnf2
-
-    Variable Should Exist   ${ip_mgmt_1}   msg=IP address of the data VNF '${vnf_member_index_1}' is not available
+    [Documentation]   Check connectivity from the first VNF to the second VNF using ping.
+    Variable Should Exist   ${IP_MGMT_1}   msg=IP address of the data VNF '${VNF_MEMBER_INDEX_1}' is not available
     Sleep   30 seconds   Wait for SSH daemon to be up
-    ${stdout}=   Execute Remote Command Check Rc Return Output   ${ip_mgmt_1}   ${username}   ${password}   ${EMPTY}   ip addr ; ping -c 5 ${datanet_ip2}
+    ${stdout}=   Execute Remote Command Check Rc Return Output   ${IP_MGMT_1}   ${USERNAME}   ${PASSWORD}   ${EMPTY}   ip addr ; ping -c 5 ${DATANET_IP2}
     Log   ${stdout}
 
-
 Ping from Vnf2 to Vnf1
-
-    Variable Should Exist   ${ip_mgmt_2}   msg=IP address of the data VNF '${vnf_member_index_2}' is not available
-    ${stdout}=   Execute Remote Command Check Rc Return Output   ${ip_mgmt_2}   ${username}   ${password}   ${EMPTY}   ip addr ; ping -c 5 ${datanet_ip1}
+    [Documentation]   Check connectivity from the second VNF to the first VNF using ping.
+    Variable Should Exist   ${IP_MGMT_2}   msg=IP address of the data VNF '${VNF_MEMBER_INDEX_2}' is not available
+    ${stdout}=   Execute Remote Command Check Rc Return Output   ${IP_MGMT_2}   ${USERNAME}   ${PASSWORD}   ${EMPTY}   ip addr ; ping -c 5 ${DATANET_IP1}
     Log   ${stdout}
 
-
 Delete NS Instance
+    [Documentation]   Delete NS instance.
     [Tags]   cleanup
-
-    Delete NS   ${ns_name}
-
+    Delete NS   ${NS_NAME}
 
 Delete NS Descriptor
+    [Documentation]   Delete NS package from OSM.
     [Tags]   cleanup
-
-    Delete NSD   ${nsd_name}
-
+    Delete NSD   ${NSD_NAME}
 
 Delete VNF Descriptor
+    [Documentation]   Delete VNF package from OSM.
     [Tags]   cleanup
-
-    Delete VNFD   ${vnfd_name}
-
+    Delete VNFD   ${VNFD_NAME}
 
 
 *** Keywords ***
 Suite Cleanup
     [Documentation]   Test Suite Cleanup: Deleting descriptors and NS instance
-
-    Run Keyword If Any Tests Failed   Delete NS   ${ns_name}
-
-    Run Keyword If Any Tests Failed   Delete NSD   ${nsd_name}
-
-    Run Keyword If Any Tests Failed   Delete VNFD   ${vnfd_name}
-
-
+    Run Keyword If Any Tests Failed   Delete NS   ${NS_NAME}
+    Run Keyword If Any Tests Failed   Delete NSD   ${NSD_NAME}
+    Run Keyword If Any Tests Failed   Delete VNFD   ${VNFD_NAME}
index 022ae5a..6c14e57 100644 (file)
@@ -1,3 +1,4 @@
+*** Comments ***
 #   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
@@ -10,6 +11,7 @@
 #   See the License for the specific language governing permissions and
 #   limitations under the License.
 
+
 *** Settings ***
 Documentation   [FAIL-01] A single VNF with 2 VDUs, one of them unallocatable because of resources.
 
@@ -18,102 +20,96 @@ Library   String
 Library   Collections
 Library   SSHLibrary
 
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/vnfd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/nsd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ns_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/openstack_lib.robot
+Resource   ../lib/vnfd_lib.resource
+Resource   ../lib/nsd_lib.resource
+Resource   ../lib/ns_lib.resource
+Resource   ../lib/openstack_lib.resource
 
-Force Tags   fail_01   cluster_main   daily   regression
+Test Tags   fail_01   cluster_main   daily   regression
 
 Suite Teardown   Run Keyword And Ignore Error   Suite Cleanup
 
 
 *** Variables ***
 # NS and VNF descriptor package folder and ids
-${vnfd_pkg}   simple_2vm_vnf
-${vnfd_name}   simple_2vm-vnf
-${nsd_pkg}   simple_2vm_ns
-${nsd_name}   simple_2vm-ns
+${VNFD_PKG}   simple_2vm_vnf
+${VNFD_NAME}   simple_2vm-vnf
+${NSD_PKG}   simple_2vm_ns
+${NSD_NAME}   simple_2vm-ns
 
 # NS instance name and configuration
-${ns_name_prefix}   fail_01
-${ns_config}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
+${NS_NAME_PREFIX}   fail_01
+${NS_CONFIG}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
 
 # SSH keys to be used
-${publickey}   %{HOME}/.ssh/id_rsa.pub
+${PUBLICKEY}   %{HOME}/.ssh/id_rsa.pub
 
 # Default memory in GB for dataVM VDU (can be overwritten by VM_MEMORY_OVERRIDE environment variable)
 # Only used if no quota is defined in Openstack's project (VDU tries to allocate the full memory of the quota)
-${default_memory}   250
+${DEFAULT_MEMORY}   250
 
 # NS launch timeout and polling time
-${ns_launch_max_wait_time}   5min
-${ns_launch_pol_time}   15
+${NS_LAUNCH_MAX_WAIT_TIME}   5min
+${NS_LAUNCH_POL_TIME}   15
 
 # Openstack delete operation timeout and polling time
-${os_delete_max_wait_time}   6min
-${os_delete_pol_time}   20
+${OS_DELETE_MAX_WAIT_TIME}   6min
+${OS_DELETE_POL_TIME}   20
 
 
 *** Test Cases ***
 Create VNF Descriptor
-
+    [Documentation]   Upload VNF package for the testsuite.
     ${ram_quota}=   Get Project Quota   ram
     IF   ${ram_quota} == -1
-        ${memory}=   Get Environment Variable   VM_MEMORY_OVERRIDE   default=${default_memory}
+        ${memory}=   Get Environment Variable   VM_MEMORY_OVERRIDE   default=${DEFAULT_MEMORY}
     ELSE
         ${memory}=   Evaluate   ${ram_quota} / 1000
     END
     Log   ${memory}
-    Create VNFD Overriding Fields   '%{PACKAGES_FOLDER}/${vnfd_pkg}'   virtual-compute-desc.1.virtual-memory.size=${memory}
-
+    Create VNFD Overriding Fields   '%{PACKAGES_FOLDER}/${VNFD_PKG}'   virtual-compute-desc.1.virtual-memory.size=${memory}
 
 Create NS Descriptor
-
-    Create NSD   '%{PACKAGES_FOLDER}/${nsd_pkg}'
-
+    [Documentation]   Upload NS package for the testsuite.
+    Create NSD   '%{PACKAGES_FOLDER}/${NSD_PKG}'
 
 Cannot Instantiate Network Service
-
+    [Documentation]   Assert failure when trying to instantiate the NS instance and there are not enough resources in the VIM.
     ${rand}=   Generate Random String   4   [NUMBERS]
-    ${ns_name}=   Catenate   SEPARATOR=_   ${ns_name_prefix}   ${rand}
-    Set Suite Variable   ${ns_name}
-    Log   ${ns_name}
-    ${id}=   Instantiate Network Service   ${ns_name}   ${nsd_name}   %{VIM_TARGET}   --config '${ns_config}' --ssh_keys ${publickey}
+    ${ns_name}=   Catenate   SEPARATOR=_   ${NS_NAME_PREFIX}   ${rand}
+    Set Suite Variable   ${NS_NAME}
+    Log   ${NS_NAME}
+    ${id}=   Instantiate Network Service   ${NS_NAME}   ${NSD_NAME}   %{VIM_TARGET}   --config '${NS_CONFIG}' --ssh_keys ${PUBLICKEY}
     Log   ${id}
-    Set Suite Variable   ${ns_id}   ${id}
-    WAIT UNTIL KEYWORD SUCCEEDS   ${ns_launch_max_wait_time}   ${ns_launch_pol_time}   Check For Ns Instance To Configured   ${ns_name}
-    ${rc}   ${stdout}=   run and return rc and output   osm ns-list --filter id="${ns_id}" | grep ${ns_id} | awk '{print $8}'
-    Log   ${stdout}
+    Set Suite Variable   ${NS_ID}   ${id}
+    WAIT UNTIL KEYWORD SUCCEEDS   ${NS_LAUNCH_MAX_WAIT_TIME}   ${NS_LAUNCH_POL_TIME}   Check For Ns Instance To Configured   ${NS_NAME}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm ns-list --filter id="${NS_ID}" | grep ${NS_ID} | awk '{print $8}'
+    Log   ${rc},${stdout}
     Should Contain   ${stdout}   BROKEN
-    ${rc}   ${stdout}=   run and return rc and output   osm ns-show ${ns_id} --literal | yq .errorDetail
-    Log   ${stdout}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm ns-show ${NS_ID} --literal | yq .errorDetail
+    Log   ${rc},${stdout}
     Should Contain   ${stdout}   Deploying at VIM: Error at create vdu
 
-
 Delete NS Instance And Check VIM
+    [Documentation]   Delete NS instance and check that the VMs have been deleted.
     [Tags]   cleanup
-
-    Delete NS   ${ns_name}
-    WAIT UNTIL KEYWORD SUCCEEDS   ${os_delete_max_wait_time}   ${os_delete_pol_time}   Check NS Servers In VIM   ${ns_name}   0
-
+    Delete NS   ${NS_NAME}
+    WAIT UNTIL KEYWORD SUCCEEDS   ${OS_DELETE_MAX_WAIT_TIME}   ${OS_DELETE_POL_TIME}   Check NS Servers In VIM   ${NS_NAME}   0
 
 Delete NS Descriptor
+    [Documentation]   Delete NS package from OSM.
     [Tags]   cleanup
-
-    Delete NSD   ${nsd_name}
-
+    Delete NSD   ${NSD_NAME}
 
 Delete VNF Descriptor
+    [Documentation]   Delete VNF package from OSM.
     [Tags]   cleanup
-
-    Delete VNFD   ${vnfd_name}
+    Delete VNFD   ${VNFD_NAME}
 
 
 *** Keywords ***
 Suite Cleanup
     [Documentation]   Test Suite Cleanup: Deleting descriptors and NS instance
-
-    Run Keyword If Any Tests Failed   Delete NS   ${ns_name}
-    Run Keyword If Any Tests Failed   Delete NSD   ${nsd_name}
-    Run Keyword If Any Tests Failed   Delete VNFD   ${vnfd_name}
+    Run Keyword If Any Tests Failed   Delete NS   ${NS_NAME}
+    Run Keyword If Any Tests Failed   Delete NSD   ${NSD_NAME}
+    Run Keyword If Any Tests Failed   Delete VNFD   ${VNFD_NAME}
index 3c3bb50..09d8aa5 100644 (file)
@@ -1,3 +1,4 @@
+*** Comments ***
 #   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
@@ -10,6 +11,7 @@
 #   See the License for the specific language governing permissions and
 #   limitations under the License.
 
+
 *** Settings ***
 Documentation   [HACKFEST-BASIC] Basic NS with a single-VDU VNF
 
@@ -19,94 +21,87 @@ Library   Collections
 Library   Process
 Library   SSHLibrary
 
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/vnfd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/nsd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ns_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/connectivity_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ssh_lib.robot
+Resource   ../lib/vnfd_lib.resource
+Resource   ../lib/nsd_lib.resource
+Resource   ../lib/ns_lib.resource
+Resource   ../lib/connectivity_lib.resource
+Resource   ../lib/ssh_lib.resource
 
-Force Tags   hackfest_basic   cluster_main   daily   regression   sanity
+Test Tags   hackfest_basic   cluster_main   daily   regression   sanity   azure
 
 Suite Teardown   Run Keyword And Ignore Error   Suite Cleanup
 
 
 *** Variables ***
 # NS and VNF descriptor package folder and ids
-${vnfd_pkg}   hackfest_basic_vnf
-${vnfd_name}   hackfest_basic-vnf
-${nsd_pkg}   hackfest_basic_ns
-${nsd_name}   hackfest_basic-ns
+${VNFD_PKG}   hackfest_basic_vnf
+${VNFD_NAME}   hackfest_basic-vnf
+${NSD_PKG}   hackfest_basic_ns
+${NSD_NAME}   hackfest_basic-ns
 
 # NS instance name and configuration
-${ns_name}   hfbasic
-${ns_config}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
+${NS_NAME}   hfbasic
+${NS_CONFIG}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
 
 # SSH keys and username to be used
-${publickey}   %{HOME}/.ssh/id_rsa.pub
-${privatekey}   %{HOME}/.ssh/id_rsa
-${username}   ubuntu
-${password}   ${EMPTY}
+${PUBLICKEY}   %{HOME}/.ssh/id_rsa.pub
+${PRIVATEKEY}   %{HOME}/.ssh/id_rsa
+${USERNAME}   ubuntu
+${PASSWORD}   ${EMPTY}
 
-${ns_id}   ${EMPTY}
-${vnf_member_index}   vnf
-${vnf_ip_addr}   ${EMPTY}
+${NS_ID}   ${EMPTY}
+${VNF_MEMBER_INDEX}   vnf
+${VNF_IP_ADDR}   ${EMPTY}
 
 
 *** Test Cases ***
 Create Hackfest Basic VNF Descriptor
-
-    Create VNFD   '%{PACKAGES_FOLDER}/${vnfd_pkg}'
-
+    [Documentation]   Upload VNF package for the testsuite.
+    Create VNFD   '%{PACKAGES_FOLDER}/${VNFD_PKG}'
 
 Create Hackfest Basic NS Descriptor
-
-    Create NSD   '%{PACKAGES_FOLDER}/${nsd_pkg}'
+    [Documentation]   Upload NS package for the testsuite.
+    Create NSD   '%{PACKAGES_FOLDER}/${NSD_PKG}'
 
 Network Service Instance Test
-
-    ${id}=   Create Network Service   ${nsd_name}   %{VIM_TARGET}   ${ns_name}   ${ns_config}   ${publickey}
-    Set Suite Variable   ${ns_id}   ${id}
-
+    [Documentation]   Instantiate NS for the testsuite.
+    ${id}=   Create Network Service   ${NSD_NAME}   %{VIM_TARGET}   ${NS_NAME}   ${NS_CONFIG}   ${PUBLICKEY}
+    Set Suite Variable   ${NS_ID}   ${id}
 
 Get Vnf Ip Address
-
-    ${ip_addr}   Get Vnf Management Ip Address   ${ns_id}   ${vnf_member_index}
+    [Documentation]   Get the mgmt IP address of the VNF of the NS.
+    ${ip_addr}=   Get Vnf Management Ip Address   ${NS_ID}   ${VNF_MEMBER_INDEX}
     Log   ${ip_addr}
-    Set Suite Variable   ${vnf_ip_addr}   ${ip_addr}
+    Set Suite Variable   ${VNF_IP_ADDR}   ${ip_addr}
 
 Test Ping
-    Test Connectivity   ${vnf_ip_addr}
+    [Documentation]   Test that the mgmt IP address of the VNF is reachable with ping.
+    Test Connectivity   ${VNF_IP_ADDR}
 
 Test SSH Access
+    [Documentation]   Check that the VNF is accessible via SSH in its mgmt IP address.
     Sleep   30s   Waiting ssh daemon to be up
-    Test SSH Connection   ${vnf_ip_addr}   ${username}   ${password}   ${privatekey}
+    Test SSH Connection   ${VNF_IP_ADDR}   ${USERNAME}   ${PASSWORD}   ${PRIVATEKEY}
 
 Delete NS Instance Test
+    [Documentation]   Delete NS instance.
     [Tags]   cleanup
-
-    Delete NS   ${ns_name}
-
+    Delete NS   ${NS_NAME}
 
 Delete NS Descriptor Test
+    [Documentation]   Delete NS package from OSM.
     [Tags]   cleanup
-
-    Delete NSD   ${nsd_name}
-
+    Delete NSD   ${NSD_NAME}
 
 Delete VNF Descriptor Test
+    [Documentation]   Delete VNF package from OSM.
     [Tags]   cleanup
-
-    Delete VNFD   ${vnfd_name}
+    Delete VNFD   ${VNFD_NAME}
 
 
 *** Keywords ***
 Suite Cleanup
     [Documentation]   Test Suit Cleanup: Deleting Descriptor, instance and vim
-
-    Run Keyword If Any Tests Failed   Delete NS   ${ns_name}
-
-    Run Keyword If Any Tests Failed   Delete NSD   ${nsd_name}
-
-    Run Keyword If Any Tests Failed   Delete VNFD   ${vnfd_name}
-
-
+    Run Keyword If Any Tests Failed   Delete NS   ${NS_NAME}
+    Run Keyword If Any Tests Failed   Delete NSD   ${NSD_NAME}
+    Run Keyword If Any Tests Failed   Delete VNFD   ${VNFD_NAME}
index cb95f0f..89aeb22 100644 (file)
@@ -1,3 +1,4 @@
+*** Comments ***
 #   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
@@ -10,6 +11,7 @@
 #   See the License for the specific language governing permissions and
 #   limitations under the License.
 
+
 *** Settings ***
 Documentation   [HACKFEST-CLOUDINIT] Basic NS with two multi-VDU VNF with cloudinit
 
@@ -19,99 +21,86 @@ Library   Collections
 Library   Process
 Library   SSHLibrary
 
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/vnfd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/nsd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ns_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/connectivity_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ssh_lib.robot
+Resource   ../lib/vnfd_lib.resource
+Resource   ../lib/nsd_lib.resource
+Resource   ../lib/ns_lib.resource
+Resource   ../lib/connectivity_lib.resource
+Resource   ../lib/ssh_lib.resource
 
-Force Tags   hackfest_cloudinit   cluster_main   daily   regression   sanity
+Test Tags   hackfest_cloudinit   cluster_main   daily   regression   sanity   azure
 
 Suite Teardown   Run Keyword And Ignore Error   Suite Cleanup
 
 
 *** Variables ***
 # NS and VNF descriptor package folder and ids
-${vnfd_pkg}   hackfest_cloudinit_vnf
-${vnfd_name}   hackfest_cloudinit-vnf
-${nsd_pkg}   hackfest_cloudinit_ns
-${nsd_name}   hackfest_cloudinit-ns
+${VNFD_PKG}   hackfest_cloudinit_vnf
+${VNFD_NAME}   hackfest_cloudinit-vnf
+${NSD_PKG}   hackfest_cloudinit_ns
+${NSD_NAME}   hackfest_cloudinit-ns
 
 # NS instance name and configuration
-${ns_name}   hfcloudinit
-${ns_config}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
+${NS_NAME}   hfcloudinit
+${NS_CONFIG}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
 
 # SSH user and password
-${username}   ubuntu
-${password}   osm4u
+${USERNAME}   ubuntu
+${PASSWORD}   osm4u
 
-${ns_id}   ${EMPTY}
-${vnf_member_index}   vnf1
-${vnf_ip_addr}   ${EMPTY}
+${NS_ID}   ${EMPTY}
+${VNF_MEMBER_INDEX}   vnf1
+${VNF_IP_ADDR}   ${EMPTY}
 
 
 *** Test Cases ***
 Create Hackfest Cloudinit VNF Descriptor
-
-    Create VNFD   '%{PACKAGES_FOLDER}/${vnfd_pkg}'
-
+    [Documentation]   Upload VNF package for the testsuite.
+    Create VNFD   '%{PACKAGES_FOLDER}/${VNFD_PKG}'
 
 Create Hackfest Cloudinit NS Descriptor
-
-    Create NSD   '%{PACKAGES_FOLDER}/${nsd_pkg}'
-
+    [Documentation]   Upload NS package for the testsuite.
+    Create NSD   '%{PACKAGES_FOLDER}/${NSD_PKG}'
 
 Network Service Instance Test
-
-    ${id}=   Create Network Service   ${nsd_name}   %{VIM_TARGET}   ${ns_name}   ${ns_config}   ${EMPTY}
-    Set Suite Variable   ${ns_id}   ${id}
-
+    [Documentation]   Instantiate NS for the testsuite.
+    ${id}=   Create Network Service   ${NSD_NAME}   %{VIM_TARGET}   ${NS_NAME}   ${NS_CONFIG}   ${EMPTY}
+    Set Suite Variable   ${NS_ID}   ${id}
 
 Get Vnf Ip Address
-
-    ${ip_addr}   Get Vnf Management Ip Address   ${ns_id}   ${vnf_member_index}
+    [Documentation]   Get the mgmt IP address of the VNF of the NS.
+    ${ip_addr}=   Get Vnf Management Ip Address   ${NS_ID}   ${VNF_MEMBER_INDEX}
     Log   ${ip_addr}
-    Set Suite Variable   ${vnf_ip_addr}   ${ip_addr}
-
+    Set Suite Variable   ${VNF_IP_ADDR}   ${ip_addr}
 
 Test SSH Access
-
+    [Documentation]   Check that the VNF is accessible via SSH in its mgmt IP address.
     Sleep   30s   Waiting ssh daemon to be up
-    Test SSH Connection   ${vnf_ip_addr}   ${username}   ${password}   ${EMPTY}
-
+    Test SSH Connection   ${VNF_IP_ADDR}   ${USERNAME}   ${PASSWORD}   ${EMPTY}
 
 Check Remote File Injected Via Cloud-init
-
-    ${stdout}=   Execute Remote Command Check Rc Return Output   ${vnf_ip_addr}   ${username}   ${password}   ${EMPTY}   sudo cat /root/helloworld.txt
+    [Documentation]   Check that the day-0 configuration via cloudinit worked as expected in the VNF. A file should exist in the VM.
+    ${stdout}=   Execute Remote Command Check Rc Return Output   ${VNF_IP_ADDR}   ${USERNAME}   ${PASSWORD}   ${EMPTY}   sudo cat /root/helloworld.txt
     Log   ${stdout}
 
-
 Delete NS Instance Test
+    [Documentation]   Delete NS instance.
     [Tags]   cleanup
-
-    Delete NS   ${ns_name}
-
+    Delete NS   ${NS_NAME}
 
 Delete NS Descriptor Test
+    [Documentation]   Delete NS package from OSM.
     [Tags]   cleanup
-
-    Delete NSD   ${nsd_name}
-
+    Delete NSD   ${NSD_NAME}
 
 Delete VNF Descriptor Test
+    [Documentation]   Delete VNF package from OSM.
     [Tags]   cleanup
-
-    Delete VNFD   ${vnfd_name}
+    Delete VNFD   ${VNFD_NAME}
 
 
 *** Keywords ***
 Suite Cleanup
     [Documentation]   Test Suit Cleanup: Deleting Descriptor, instance and vim
-
-    Run Keyword If Any Tests Failed   Delete NS   ${ns_name}
-
-    Run Keyword If Any Tests Failed   Delete NSD   ${nsd_name}
-
-    Run Keyword If Any Tests Failed   Delete VNFD   ${vnfd_name}
-
-
+    Run Keyword If Any Tests Failed   Delete NS   ${NS_NAME}
+    Run Keyword If Any Tests Failed   Delete NSD   ${NSD_NAME}
+    Run Keyword If Any Tests Failed   Delete VNFD   ${VNFD_NAME}
index b5706e6..a4ddf33 100644 (file)
@@ -1,3 +1,4 @@
+*** Comments ***
 #   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
@@ -10,6 +11,7 @@
 #   See the License for the specific language governing permissions and
 #   limitations under the License.
 
+
 *** Settings ***
 Documentation   [HACKFEST-MULTIVDU] Basic NS with two multi-VDU VNF
 
@@ -19,96 +21,94 @@ Library   Collections
 Library   Process
 Library   SSHLibrary
 
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/vnfd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/nsd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ns_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/connectivity_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ssh_lib.robot
+Resource   ../lib/vnfd_lib.resource
+Resource   ../lib/nsd_lib.resource
+Resource   ../lib/ns_lib.resource
+Resource   ../lib/connectivity_lib.resource
+Resource   ../lib/ssh_lib.resource
 
-Force Tags   hackfest_multivdu   cluster_main   daily   regression
+Test Tags   hackfest_multivdu   cluster_main   daily   regression   azure
 
 Suite Teardown   Run Keyword And Ignore Error   Suite Cleanup
 
 
 *** Variables ***
 # NS and VNF descriptor package folder and ids
-${vnfd_pkg}   hackfest_multivdu_vnf
-${vnfd_name}   hackfest_multivdu-vnf
-${nsd_pkg}   hackfest_multivdu_ns
-${nsd_name}   hackfest_multivdu-ns
+${VNFD_PKG}   hackfest_multivdu_vnf
+${VNFD_NAME}   hackfest_multivdu-vnf
+${NSD_PKG}   hackfest_multivdu_ns
+${NSD_NAME}   hackfest_multivdu-ns
 
 # NS instance name and configuration
-${ns_name}   hfmultivdu
-${ns_config}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
+${NS_NAME}   hfmultivdu
+${NS_CONFIG}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
 
 # SSH keys and username to be used
-${publickey}   %{HOME}/.ssh/id_rsa.pub
-${privatekey}   %{HOME}/.ssh/id_rsa
-${username}   ubuntu
-${password}   ${EMPTY}
+${PUBLICKEY}   %{HOME}/.ssh/id_rsa.pub
+${PRIVATEKEY}   %{HOME}/.ssh/id_rsa
+${USERNAME}   ubuntu
+${PASSWORD}   ${EMPTY}
 
-${ns_id}   ${EMPTY}
-${vnf_member_index}   vnf1
-${vnf_ip_addr}   ${EMPTY}
-${wait_guard_for_vm_boot}   50s
+${NS_ID}   ${EMPTY}
+${VNF_MEMBER_INDEX}   vnf1
+${VNF_IP_ADDR}   ${EMPTY}
+${WAIT_GUARD_FOR_VM_BOOT}   50s
 
 
 *** Test Cases ***
 Create Hackfest multivdu VNF Descriptor
-
-    Create VNFD   '%{PACKAGES_FOLDER}/${vnfd_pkg}'
-
+    [Documentation]   Upload VNF package for the testsuite.
+    Create VNFD   '%{PACKAGES_FOLDER}/${VNFD_PKG}'
 
 Create Hackfest Multivdu NS Descriptor
-
-    Create NSD   '%{PACKAGES_FOLDER}/${nsd_pkg}'
+    [Documentation]   Upload NS package for the testsuite.
+    Create NSD   '%{PACKAGES_FOLDER}/${NSD_PKG}'
 
 Network Service Instance Test
-
-    ${status}   ${message}=   Run Keyword And Ignore Error   Variable Should Exist   ${publickey}
-        Run Keyword If   "${status}" == "FAIL"   Set Global Variable   ${publickey}   ${EMPTY}
-    ${id}=   Create Network Service   ${nsd_name}   %{VIM_TARGET}   ${ns_name}   ${ns_config}   ${publickey}
-    Set Suite Variable   ${ns_id}   ${id}
-    Sleep   ${wait_guard_for_vm_boot}   Waiting for VM's daemons to be up and running
+    [Documentation]   Instantiate NS for the testsuite.
+    ${status}   ${message}=   Run Keyword And Ignore Error   Variable Should Exist   ${PUBLICKEY}
+    Log   ${status},${message}
+    IF   "${status}" == "FAIL"   Set Global Variable   ${PUBLICKEY}   ${EMPTY}
+    ${id}=   Create Network Service   ${NSD_NAME}   %{VIM_TARGET}   ${NS_NAME}   ${NS_CONFIG}   ${PUBLICKEY}
+    Set Suite Variable   ${NS_ID}   ${id}
+    Sleep   ${WAIT_GUARD_FOR_VM_BOOT}   Waiting for VM's daemons to be up and running
 
 Get Vnf Ip Address
-
-    ${ip_addr}   Get Vnf Management Ip Address   ${ns_id}   ${vnf_member_index}
+    [Documentation]   Get the mgmt IP address of the VNF of the NS.
+    ${ip_addr}=   Get Vnf Management Ip Address   ${NS_ID}   ${VNF_MEMBER_INDEX}
     Log   ${ip_addr}
-    Set Suite Variable   ${vnf_ip_addr}   ${ip_addr}
+    Set Suite Variable   ${VNF_IP_ADDR}   ${ip_addr}
 
 Test Ping
-    Test Connectivity   ${vnf_ip_addr}
+    [Documentation]   Test that the mgmt IP address of the VNF is reachable with ping.
+    Test Connectivity   ${VNF_IP_ADDR}
 
 Test SSH Access
-    ${status}   ${message}=   Run Keyword And Ignore Error   Variable Should Exist   ${privatekey}
-        Run Keyword If   "${status}" == "FAIL"   Set Global Variable   ${privatekey}   ${EMPTY}
-    Test SSH Connection   ${vnf_ip_addr}   ${username}   ${password}   ${privatekey}
+    [Documentation]   Check that the VNF is accessible via SSH in its mgmt IP address.
+    ${status}   ${message}=   Run Keyword And Ignore Error   Variable Should Exist   ${PRIVATEKEY}
+    Log   ${status},${message}
+    IF   "${status}" == "FAIL"   Set Global Variable   ${PRIVATEKEY}   ${EMPTY}
+    Test SSH Connection   ${VNF_IP_ADDR}   ${USERNAME}   ${PASSWORD}   ${PRIVATEKEY}
 
 Delete NS Instance Test
+    [Documentation]   Delete NS instance.
     [Tags]   cleanup
-
-    Delete NS   ${ns_name}
-
+    Delete NS   ${NS_NAME}
 
 Delete NS Descriptor Test
+    [Documentation]   Delete NS package.
     [Tags]   cleanup
-
-    Delete NSD   ${nsd_name}
-
+    Delete NSD   ${NSD_NAME}
 
 Delete VNF Descriptor Test
+    [Documentation]   Delete VNF package.
     [Tags]   cleanup
-
-    Delete VNFD   ${vnfd_name}
+    Delete VNFD   ${VNFD_NAME}
 
 
 *** Keywords ***
 Suite Cleanup
     [Documentation]   Test Suit Cleanup: Deleting Descriptor, instance and vim
-
-    Run Keyword If Any Tests Failed   Delete NS   ${ns_name}
-
-    Run Keyword If Any Tests Failed   Delete NSD   ${nsd_name}
-
-    Run Keyword If Any Tests Failed   Delete VNFD   ${vnfd_name}
+    Run Keyword If Any Tests Failed   Delete NS   ${NS_NAME}
+    Run Keyword If Any Tests Failed   Delete NSD   ${NSD_NAME}
+    Run Keyword If Any Tests Failed   Delete VNFD   ${VNFD_NAME}
index 8b73611..3aa9a68 100644 (file)
@@ -1,3 +1,4 @@
+*** Comments ***
 #   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
@@ -10,6 +11,7 @@
 #   See the License for the specific language governing permissions and
 #   limitations under the License.
 
+
 *** Settings ***
 Documentation   [HEAL-01] Healing of a multi-volume VDU
 
@@ -19,176 +21,174 @@ Library   Collections
 Library   Process
 Library   SSHLibrary
 
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/vnfd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/vnf_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/nsd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ns_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ssh_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/openstack_lib.robot
-
-Force Tags   heal_01   cluster_heal   daily
+Resource   ../lib/vnfd_lib.resource
+Resource   ../lib/vnf_lib.resource
+Resource   ../lib/nsd_lib.resource
+Resource   ../lib/ns_lib.resource
+Resource   ../lib/ns_operation_lib.resource
+Resource   ../lib/ssh_lib.resource
+Resource   ../lib/openstack_lib.resource
 
+Test Tags   heal_01   cluster_heal   daily   regression
 
 Suite Teardown   Run Keyword And Ignore Error   Suite Cleanup
 
 
 *** Variables ***
 # NS and VNF descriptor package folder and ids
-${vnfd_volumes_pkg}   several_volumes_vnf
-${vnfd_volumes_name}   several_volumes-vnf
-${vdu_volumes_name}   several_volumes-VM
-${vnf_several_index}   several_volumes_vnf
-${vnfd_charm_pkg}   charm-packages/native_manual_scale_charm_vnf
-${vnfd_charm_name}   native_manual_scale_charm-vnf
-${nsd_pkg}   volumes_nativecharm_ns
-${nsd_name}   volumes_nativecharm-ns
+${VNFD_VOLUMES_PKG}   several_volumes_vnf
+${VNFD_VOLUMES_NAME}   several_volumes-vnf
+${VDU_VOLUMES_NAME}   several_volumes-VM
+${VNF_SEVERAL_INDEX}   several_volumes_vnf
+${VNFD_MANUALSCALE_PKG}   manual_scale_vnf
+${VNFD_MANUALSCALE_NAME}   manual_scale-vnf
+${NSD_PKG}   volumes_healing_ns
+${NSD_NAME}   volumes_healing-ns
 
 # NS instance name and configuration
-${ns_name}   heal_01
-${ns_config}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
+${NS_NAME}   heal_01
+${NS_CONFIG}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
+${NS_TIMEOUT}   6min
 
 # SSH keys and username to be used
-${publickey}   %{HOME}/.ssh/id_rsa.pub
-${privatekey}   %{HOME}/.ssh/id_rsa
-${username}   ubuntu
-${password}   ${EMPTY}
+${PUBLICKEY}   %{HOME}/.ssh/id_rsa.pub
+${PRIVATEKEY}   %{HOME}/.ssh/id_rsa
+${USERNAME}   ubuntu
+${PASSWORD}   ${EMPTY}
 
-${success_return_code}   0
+${SUCCESS_RETURN_CODE}   0
 
-@{vim_vdus}   @{EMPTY}
-@{vim_volumes}   @{EMPTY}
+@{VIM_VDUS}   @{EMPTY}
+@{VIM_VOLUMES}   @{EMPTY}
 
 
 *** Test Cases ***
 Create VNF Descriptors
-    Create VNFD   '%{PACKAGES_FOLDER}/${vnfd_charm_pkg}'
-    Create VNFD   '%{PACKAGES_FOLDER}/${vnfd_volumes_pkg}'
-
+    [Documentation]   Upload VNF packages for the testsuite.
+    Create VNFD   '%{PACKAGES_FOLDER}/${VNFD_MANUALSCALE_PKG}'
+    Create VNFD   '%{PACKAGES_FOLDER}/${VNFD_VOLUMES_PKG}'
 
 Create NS Descriptor
-    Create NSD   '%{PACKAGES_FOLDER}/${nsd_pkg}'
-
+    [Documentation]   Upload NS package for the testsuite.
+    Create NSD   '%{PACKAGES_FOLDER}/${NSD_PKG}'
 
 Network Service Instance Test
-    ${id}=   Create Network Service   ${nsd_name}   %{VIM_TARGET}   ${ns_name}   ${ns_config}   ${publickey}
-    Set Suite Variable   ${ns_id}   ${id}
-
+    [Documentation]   Instantiate NS for the testsuite.
+    ${id}=   Create Network Service   ${NSD_NAME}   %{VIM_TARGET}   ${NS_NAME}   ${NS_CONFIG}   ${PUBLICKEY}   ${NS_TIMEOUT}
+    Set Suite Variable   ${NS_ID}   ${id}
 
 Get NS Id
+    [Documentation]   Get NS identifier.
     [Tags]   cleanup
-    ${variables}   Get Variables
+    ${variables}=   Get Variables
     IF   not "\${ns_id}" in "${variables}"
-        ${id}=   Get Ns Id   ${ns_name}
-        Set Suite Variable   ${ns_id}   ${id}
+        ${id}=   Get Ns Id   ${NS_NAME}
+        Set Suite Variable   ${NS_ID}   ${id}
     END
 
-
 Get VIM Objects
-    Variable Should Exist   ${ns_id}   msg=NS is not available
-    @{vnf_id_list}=   Get Ns Vnf List   ${ns_id}
+    [Documentation]   Retrieve all VMs and volumes from the NS and stores them in VIM_VDUS and VIM_VOLUMES lists.
+    Variable Should Exist   ${NS_ID}   msg=NS is not available
+    @{vnf_id_list}=   Get Ns Vnf List   ${NS_ID}
     Log   ${vnf_id_list}
     FOR   ${vnf_id}   IN   @{vnf_id_list}
         Log   ${vnf_id}
         ${id}=   Get VNF VIM ID   ${vnf_id}
         @{vdu_ids}=   Split String   ${id}
-        Append To List   ${vim_vdus}   @{vdu_ids}
+        Append To List   ${VIM_VDUS}   @{vdu_ids}
     END
-    FOR   ${vdu_id}   IN   @{vim_vdus}
+    FOR   ${vdu_id}   IN   @{VIM_VDUS}
         ${volumes_attached}=   Get Server Property   ${vdu_id}   volumes_attached
         ${match}=   Get Regexp Matches   ${volumes_attached}   '([0-9a-f\-]+)'   1
         IF   ${match} != @{EMPTY}
-            IF   not "${match}[0]" in "@{vim_volumes}"
-                Append To List   ${vim_volumes}   ${match}[0]
+            IF   not "${match}[0]" in "@{VIM_VOLUMES}"
+                Append To List   ${VIM_VOLUMES}   ${match}[0]
             END
         END
     END
-    Log Many   @{vim_vdus}
-    Log Many   @{vim_volumes}
-
+    Log Many   @{VIM_VDUS}
+    Log Many   @{VIM_VOLUMES}
 
 Get Volume VNF Info
-    Variable Should Exist   ${ns_id}   msg=NS is not available
-    ${ip_addr}=   Get Vnf Management Ip Address   ${ns_id}   ${vnf_several_index}
+    [Documentation]   Get VDU ID, IP addresses and volumes of the VNF and stores them in suite variables to be used later on.
+    Variable Should Exist   ${NS_ID}   msg=NS is not available
+    ${ip_addr}=   Get Vnf Management Ip Address   ${NS_ID}   ${VNF_SEVERAL_INDEX}
     Log   ${ip_addr}
-    Set Suite Variable   ${vnf_volumes_ip_addr}   ${ip_addr}
-
-    ${vnf_id}=   Get Vnf Id   ${ns_id}   ${vnf_several_index}
-    Set Suite Variable   ${vnf_volumes_id}   ${vnf_id}
+    Set Suite Variable   ${VNF_VOLUMES_IP_ADDR}   ${ip_addr}
+    ${vnf_id}=   Get Vnf Id   ${NS_ID}   ${VNF_SEVERAL_INDEX}
+    Set Suite Variable   ${VNF_VOLUMES_ID}   ${vnf_id}
     ${id}=   Get VNF VIM ID   ${vnf_id}
-    Set Suite Variable   ${vdu_volumes_id}   ${id}
-    Log   ${vdu_volumes_id}
-
-    @{volumes_ip_list}=   Get Vnf Vdur IPs   ${vnf_volumes_id}
-    Set Suite Variable   @{volumes_ip_list}   @{volumes_ip_list}
-    Log   @{volumes_ip_list}
-
+    Set Suite Variable   ${VDU_VOLUMES_ID}   ${id}
+    Log   ${VDU_VOLUMES_ID}
+    @{VOLUMES_IP_LIST}=   Get Vnf Vdur IPs   ${VNF_VOLUMES_ID}
+    Set Suite Variable   @{VOLUMES_IP_LIST}   @{VOLUMES_IP_LIST}
+    Log   @{VOLUMES_IP_LIST}
 
 Get Volumes Info
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm vnfpkg-show ${vnfd_volumes_name} --literal | yq '.vdu[0]."virtual-storage-desc" | length'
-    Should Be Equal As Integers   ${rc}   ${success_return_code}   msg=${stdout}   values=False
+    [Documentation]   Get number of volumes from the VNF descriptor and get the attached volumes from the VDU instance.
+    ${rc}   ${stdout}=   Run And Return RC And Output   osm vnfpkg-show ${VNFD_VOLUMES_NAME} --literal | yq '.vdu[0]."virtual-storage-desc" | length'
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}   msg=${stdout}   values=False
     ${num_virtual_storage}=   Convert To Integer   ${stdout}
-    Set Suite Variable   ${vnf_num_volumes}   ${num_virtual_storage}
-    Log   ${vnf_num_volumes}
-    ${volumes_attached}=   Get Server Property   ${vdu_volumes_id}   volumes_attached
+    Set Suite Variable   ${VNF_NUM_VOLUMES}   ${num_virtual_storage}
+    Log   ${VNF_NUM_VOLUMES}
+    ${volumes_attached}=   Get Server Property   ${VDU_VOLUMES_ID}   volumes_attached
     ${match}=   Get Regexp Matches   ${volumes_attached}   '([0-9a-f\-]+)'   1
-    Set Suite Variable   ${volume_id}   ${match}[0]
-
+    Set Suite Variable   ${VOLUME_ID}   ${match}[0]
 
 Check VDU Disks
-    Variable Should Exist   ${vnf_volumes_ip_addr}   msg=VNF is not available
+    [Documentation]   Check that the number of disks in the VDU meets the expected one.
+    Variable Should Exist   ${VNF_VOLUMES_IP_ADDR}   msg=VNF is not available
     Sleep   20 seconds   Wait for SSH daemon to be up
-    ${stdout}=   Execute Remote Command Check Rc Return Output   ${vnf_volumes_ip_addr}   ${username}   ${password}   ${privatekey}   sudo lsblk -l
+    ${stdout}=   Execute Remote Command Check Rc Return Output   ${VNF_VOLUMES_IP_ADDR}   ${USERNAME}   ${PASSWORD}   ${PRIVATEKEY}   sudo lsblk -l
     Log   ${stdout}
     ${lines}=   Get Lines Containing String   ${stdout}   disk
     ${num_lines}=   Get Line Count   ${lines}
-    Run Keyword If   ${num_lines} < ${vnf_num_volumes}   Fail   msg=Number of disks (${num_lines}) is less than specified in VDU (${vnf_num_volumes})
-
+    IF   ${num_lines} < ${VNF_NUM_VOLUMES}   Fail   msg=Number of disks (${num_lines}) is less than specified in VDU (${VNF_NUM_VOLUMES})
 
 Delete Persistent Volume VDU
-    Variable Should Exist   ${vdu_volumes_id}   msg=VDU is not available
-    Delete Server   ${vdu_volumes_id}
+    [Documentation]   Manually delete the VM in Openstack.
+    Variable Should Exist   ${VDU_VOLUMES_ID}   msg=VDU is not available
+    Delete Server   ${VDU_VOLUMES_ID}
     Sleep   20
 
-
 Heal Persistent Volume VDU
-    Variable Should Exist   ${vnf_volumes_id}   msg=VNF is not available
-    Heal Network Service   ${ns_id}   --vnf ${vnf_volumes_id} --cause "Heal VM of volumes_vnf" --vdu ${vdu_volumes_name}
-
+    [Documentation]   Manually heal the VNF in order to re-create the deleted VM.
+    Variable Should Exist   ${VNF_VOLUMES_ID}   msg=VNF is not available
+    Heal Network Service   ${NS_ID}   --vnf ${VNF_VOLUMES_ID} --cause "Heal VM of volumes_vnf" --vdu ${VDU_VOLUMES_NAME}
 
 Check VNF After Healing
-    Variable Should Exist   ${vnf_volumes_id}   msg=VNF is not available
-
-    @{ip_list}=   Get Vnf Vdur IPs   ${vnf_volumes_id}
+    [Documentation]   Check that the IDs of the VM and volumes have not changed after healing.
+    Variable Should Exist   ${VNF_VOLUMES_ID}   msg=VNF is not available
+    @{ip_list}=   Get Vnf Vdur IPs   ${VNF_VOLUMES_ID}
     Log   @{ip_list}
-    Should Be Equal   ${ip_list}   ${volumes_ip_list}   IP addresses have changed after healing
-
-    ${id}=   Get VNF VIM ID   ${vnf_volumes_id}
+    Should Be Equal   ${ip_list}   ${VOLUMES_IP_LIST}   IP addresses have changed after healing
+    ${id}=   Get VNF VIM ID   ${VNF_VOLUMES_ID}
     Log   ${id}
-    Should Not Be Equal   ${id}   ${vdu_volumes_id}   VDU id has not changed after healing
-
+    Should Not Be Equal   ${id}   ${VDU_VOLUMES_ID}   VDU id has not changed after healing
     ${volumes_attached}=   Get Server Property   ${id}   volumes_attached
     ${match}=   Get Regexp Matches   ${volumes_attached}   '([0-9a-f\-]+)'   1
-    Should Be Equal   ${match}[0]   ${volume_id}   Volume id has changed after healing
-
+    Should Be Equal   ${match}[0]   ${VOLUME_ID}   Volume id has changed after healing
     Sleep   30 seconds   Wait for SSH daemon to be up
-    ${stdout}=   Execute Remote Command Check Rc Return Output   ${vnf_volumes_ip_addr}   ${username}   ${password}   ${privatekey}   sudo lsblk -l
+    ${stdout}=   Execute Remote Command Check Rc Return Output   ${VNF_VOLUMES_IP_ADDR}   ${USERNAME}   ${PASSWORD}   ${PRIVATEKEY}   sudo lsblk -l
     Log   ${stdout}
     ${lines}=   Get Lines Containing String   ${stdout}   disk
     ${num_lines}=   Get Line Count   ${lines}
-    Run Keyword If   ${num_lines} < ${vnf_num_volumes}   Fail   msg=Number of disks (${num_lines}) is less than specified in VDU (${vnf_num_volumes})
-
+    IF   ${num_lines} < ${VNF_NUM_VOLUMES}   Fail   msg=Number of disks (${num_lines}) is less than specified in VDU (${VNF_NUM_VOLUMES})
 
 Update VIM Objects
-    Variable Should Exist   ${ns_id}   msg=NS is not available
+    [Documentation]   Retrieve all VMs and volumes from the NS and stores them in VIM_VDUS and VIM_VOLUMES lists.
+    ...               This is done again to guarantee that all objects are cleaned in the VIM in case the heal operation
+    ...               added new objects.
+    Variable Should Exist   ${NS_ID}   msg=NS is not available
     @{vdu_updated}=   Create List
-    @{vnf_id_list}=   Get Ns Vnf List   ${ns_id}
+    @{vnf_id_list}=   Get Ns Vnf List   ${NS_ID}
     FOR   ${vnf_id}   IN   @{vnf_id_list}
         ${id}=   Get VNF VIM ID   ${vnf_id}
         @{vdu_ids}=   Split String   ${id}
         Append To List   ${vdu_updated}   @{vdu_ids}
         FOR   ${id}   IN   @{vdu_ids}
-            IF   not "${id}" in "@{vim_vdus}"
-                Append To List   ${vim_vdus}   ${id}
+            IF   not "${id}" in "@{VIM_VDUS}"
+                Append To List   ${VIM_VDUS}   ${id}
             END
         END
     END
@@ -196,44 +196,58 @@ Update VIM Objects
         ${volumes_attached}=   Get Server Property   ${vdu_id}   volumes_attached
         ${match}=   Get Regexp Matches   ${volumes_attached}   '([0-9a-f\-]+)'   1
         IF   ${match} != @{EMPTY}
-            IF   not "${match}[0]" in "@{vim_volumes}"
-                Append To List   ${vim_volumes}   ${match}[0]
+            IF   not "${match}[0]" in "@{VIM_VOLUMES}"
+                Append To List   ${VIM_VOLUMES}   ${match}[0]
             END
         END
     END
-    Log Many   @{vim_vdus}
-    Log Many   @{vim_volumes}
-
+    Log Many   @{VIM_VDUS}
+    Log Many   @{VIM_VOLUMES}
 
 Delete NS Instance
+    [Documentation]   Delete NS instance.
     [Tags]   cleanup
-    Delete NS   ${ns_name}
-
+    Delete NS   ${NS_NAME}
 
 Delete NS Descriptor
+    [Documentation]   Delete NS package from OSM.
     [Tags]   cleanup
-    Delete NSD   ${nsd_name}
-
+    Delete NSD   ${NSD_NAME}
 
 Delete VNF Descriptors
+    [Documentation]   Delete VNF packages from OSM.
     [Tags]   cleanup
-    Delete VNFD   ${vnfd_volumes_name}
-    Delete VNFD   ${vnfd_charm_name}
-
+    Delete VNFD   ${VNFD_VOLUMES_NAME}
+    Delete VNFD   ${VNFD_MANUALSCALE_NAME}
 
-Delete Objects in VIM
+Delete Remaining Objects in VIM
+    [Documentation]   Delete any remaining objects (volumes, VMs, etc.) in the VIM.
     [Tags]   cleanup
+    Delete Objects In VIM
+
+
+*** Keywords ***
+Suite Cleanup
+    [Documentation]   Test Suite Cleanup: Deleting Descriptor, instance and vim
+    Run Keyword If Any Tests Failed   Delete NS   ${NS_NAME}
+    Run Keyword If Any Tests Failed   Delete NSD   ${NSD_NAME}
+    Run Keyword If Any Tests Failed   Delete VNFD   ${VNFD_VOLUMES_NAME}
+    Run Keyword If Any Tests Failed   Delete VNFD   ${VNFD_MANUALSCALE_NAME}
+    Run Keyword If Any Tests Failed   Delete Objects In VIM
+
+Delete Objects In VIM
+    [Documentation]   Clean up remaining VMs and volumes directly from the VIM.
     ${error}=   Set Variable   0
-    FOR   ${vol_id}   IN   @{vim_volumes}
+    FOR   ${vol_id}   IN   @{VIM_VOLUMES}
         Log   Checking if volume ${vol_id} is still in VIM
         ${exists}=   Check If Volume Exists   ${vol_id}
-        IF   ${exists}!=0
+        IF   ${exists}
             ${error}=   Set Variable   1
             Log   Deleting volume ${vol_id}
             Run Keyword And Ignore Error   Delete Volume   ${vol_id}
         END
     END
-    FOR   ${vdu_id}   IN   @{vim_vdus}
+    FOR   ${vdu_id}   IN   @{VIM_VDUS}
         Log   Checking if server ${vdu_id} is still in VIM
         ${status}=   Run Keyword And Ignore Error   Get Server Property   ${vdu_id}   id
         Log   ${status}[0]
@@ -243,17 +257,4 @@ Delete Objects in VIM
             Run Keyword And Ignore Error   Delete Server   ${vdu_id}
         END
     END
-    IF   ${error}==1
-        Fail   Some objects created by test were not deleted in VIM
-    END
-
-
-*** Keywords ***
-Suite Cleanup
-    [Documentation]   Test Suit Cleanup: Deleting Descriptor, instance and vim
-
-    Run Keyword If Any Tests Failed   Delete NS   ${ns_name}
-    Run Keyword If Any Tests Failed   Delete NSD   ${nsd_name}
-    Run Keyword If Any Tests Failed   Delete VNFD   ${vnfd_volumes_name}
-    Run Keyword If Any Tests Failed   Delete VNFD   ${vnfd_charm_name}
-    Run Keyword If Any Tests Failed   Delete Objects in VIM
+    IF   ${error}==1   Fail   Some objects created by test were not deleted in VIM
index edeec97..ffdcb85 100644 (file)
@@ -1,3 +1,4 @@
+*** Comments ***
 #   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
@@ -10,8 +11,9 @@
 #   See the License for the specific language governing permissions and
 #   limitations under the License.
 
+
 *** Settings ***
-Documentation   [HEAL-02] Healing of scaled charm VDUs
+Documentation   [HEAL-02] Healing of scaled VDUs
 
 Library   OperatingSystem
 Library   String
@@ -19,174 +21,177 @@ Library   Collections
 Library   Process
 Library   SSHLibrary
 
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/vnfd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/vnf_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/nsd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ns_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ssh_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/openstack_lib.robot
-
-Force Tags   heal_02   cluster_heal   daily
+Resource   ../lib/vnfd_lib.resource
+Resource   ../lib/vnf_lib.resource
+Resource   ../lib/nsd_lib.resource
+Resource   ../lib/ns_lib.resource
+Resource   ../lib/ns_operation_lib.resource
+Resource   ../lib/ssh_lib.resource
+Resource   ../lib/openstack_lib.resource
 
+Test Tags   heal_02   cluster_heal   daily   regression
 
 Suite Teardown   Run Keyword And Ignore Error   Suite Cleanup
 
 
 *** Variables ***
 # NS and VNF descriptor package folder and ids
-${vnfd_volumes_pkg}   several_volumes_vnf
-${vnfd_volumes_name}   several_volumes-vnf
-${vdu_volumes_name}   several_volumes-VM
-${vnf_several_index}   several_volumes_vnf
-${vnfd_charm_pkg}   charm-packages/native_manual_scale_charm_vnf
-${vnfd_charm_name}   native_manual_scale_charm-vnf
-${vdu_charm_name}   mgmtVM
-${vnf_charm_index}   charm_vnf
-${vnf_charm_scaling_group}   manual-scaling_mgmtVM
-${vnf_charm_cloudinit_file}   /root/helloworld.txt
-${vnf_charm_day1_file}   /home/ubuntu/first-touch
-${nsd_pkg}   volumes_nativecharm_ns
-${nsd_name}   volumes_nativecharm-ns
+${VNFD_VOLUMES_PKG}   several_volumes_vnf
+${VNFD_VOLUMES_NAME}   several_volumes-vnf
+${VDU_VOLUMES_NAME}   several_volumes-VM
+${VNF_SEVERAL_INDEX}   several_volumes_vnf
+${VNFD_MANUALSCALE_PKG}   manual_scale_vnf
+${VNFD_MANUALSCALE_NAME}   manual_scale-vnf
+${VDU_MANUALSCALE_NAME}   mgmtVM
+${VNF_MANUALSCALE_INDEX}   manual_scale_vnf
+${VNF_MANUALSCALE_SCALING_GROUP}   manual-scaling_mgmtVM
+${VNF_MANUALSCALE_CLOUDINIT_FILE}   /root/helloworld.txt
+${VNF_MANUALSCALE_DAY1_FILE}   /home/ubuntu/first-touch
+${NSD_PKG}   volumes_healing_ns
+${NSD_NAME}   volumes_healing-ns
 
 # NS instance name and configuration
-${flavor_name}   osm.heal_02
-${ns_name}   heal_02
-${scale_wait_time}   4min
+${FLAVOR_NAME_PREFIX}   osm.heal02
+${NS_NAME}   heal_02
+${NS_TIMEOUT}   6min
+${SCALE_WAIT_TIME}   5min
 
 # SSH keys and username to be used
-${publickey}   %{HOME}/.ssh/id_rsa.pub
-${privatekey}   %{HOME}/.ssh/id_rsa
-${username}   ubuntu
-${password}   ${EMPTY}
+${PUBLICKEY}   %{HOME}/.ssh/id_rsa.pub
+${PRIVATEKEY}   %{HOME}/.ssh/id_rsa
+${USERNAME}   ubuntu
+${PASSWORD}   ${EMPTY}
 
-${success_return_code}   0
+${SUCCESS_RETURN_CODE}   0
 
-@{vim_vdus}   @{EMPTY}
-@{vim_volumes}   @{EMPTY}
+@{VIM_VDUS}   @{EMPTY}
+@{VIM_VOLUMES}   @{EMPTY}
 
 
 *** Test Cases ***
 Create VNF Descriptors
-    Create VNFD   '%{PACKAGES_FOLDER}/${vnfd_charm_pkg}'
-    Create VNFD   '%{PACKAGES_FOLDER}/${vnfd_volumes_pkg}'
-
+    [Documentation]   Upload VNF packages for the testsuite.
+    Create VNFD   '%{PACKAGES_FOLDER}/${VNFD_MANUALSCALE_PKG}'
+    Create VNFD   '%{PACKAGES_FOLDER}/${VNFD_VOLUMES_PKG}'
 
 Create NS Descriptor
-    Create NSD   '%{PACKAGES_FOLDER}/${nsd_pkg}'
-
+    [Documentation]   Upload NS package for the testsuite.
+    Create NSD   '%{PACKAGES_FOLDER}/${NSD_PKG}'
 
 Create Test Flavor
-    ${id}=   Create Flavor   ${flavor_name}
-    Set Suite Variable   ${flavor_id}   ${id}
-
+    [Documentation]   Create a flavor that will be used at NS instantiation time and save it as FLAVOR_ID.
+    ${rand}=   Generate Random String   6   [NUMBERS]
+    ${flavor_name}=   Catenate   SEPARATOR=_   ${FLAVOR_NAME_PREFIX}   ${rand}
+    ${id}=   Create Flavor   ${flavor_name}   1   1024   10
+    Set Suite Variable   ${FLAVOR_ID}   ${id}
 
 Network Service Instance Test
-    ${ns_config}=   Set Variable   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}}],vnf: [ {member-vnf-index: charm_vnf, vdu: [{ id: mgmtVM, vim-flavor-id: ${flavor_id}}]}] }
-    ${id}=   Create Network Service   ${nsd_name}   %{VIM_TARGET}   ${ns_name}   ${ns_config}   ${publickey}
-    Set Suite Variable   ${ns_id}   ${id}
-
+    [Documentation]   Instantiate NS for the testsuite using the previously created flavor.
+    ${ns_config}=   Set Variable   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}}],vnf: [ {member-vnf-index: manual_scale_vnf, vdu: [{ id: mgmtVM, vim-flavor-id: ${FLAVOR_ID}}]}] }
+    ${id}=   Create Network Service   ${NSD_NAME}   %{VIM_TARGET}   ${NS_NAME}   ${ns_config}   ${PUBLICKEY}   ${NS_TIMEOUT}
+    Set Suite Variable   ${NS_ID}   ${id}
 
 Get NS Id
+    [Documentation]   Get NS identifier.
     [Tags]   cleanup
-    ${variables}   Get Variables
+    ${variables}=   Get Variables
     IF   not "\${ns_id}" in "${variables}"
-        ${id}=   Get Ns Id   ${ns_name}
-        Set Suite Variable   ${ns_id}   ${id}
+        ${id}=   Get Ns Id   ${NS_NAME}
+        Set Suite Variable   ${NS_ID}   ${id}
     END
 
-
-Scale Out Charm VNF
-    ${vnf_id}=   Get Vnf Id   ${ns_id}   ${vnf_charm_index}
-    Set Suite Variable   ${vnf_charm_id}   ${vnf_id}
-    @{vdur_list}=   Get Vnf Vdur Names   ${vnf_charm_id}
+Scale Out Manual Scale VNF
+    [Documentation]   Perform a manual scale-out operation of the manual-scale VNF.
+    ${vnf_id}=   Get Vnf Id   ${NS_ID}   ${VNF_MANUALSCALE_INDEX}
+    Set Suite Variable   ${VNF_MANUALSCALE_ID}   ${vnf_id}
+    @{vdur_list}=   Get Vnf Vdur Names   ${VNF_MANUALSCALE_ID}
     ${vdurs}=   Get Length   ${vdur_list}
-    Set Suite Variable   ${initial_vdur_count}   ${vdurs}
-    Execute Manual VNF Scale   ${ns_name}   ${vnf_charm_index}   ${vnf_charm_scaling_group}   SCALE_OUT   ${scale_wait_time}
-    @{vdur_list}=   Get Vnf Vdur Names   ${vnf_charm_id}
+    Set Suite Variable   ${INITIAL_VDUR_COUNT}   ${vdurs}
+    Execute Manual VNF Scale   ${NS_NAME}   ${VNF_MANUALSCALE_INDEX}   ${VNF_MANUALSCALE_SCALING_GROUP}   SCALE_OUT   ${SCALE_WAIT_TIME}
+    @{vdur_list}=   Get Vnf Vdur Names   ${VNF_MANUALSCALE_ID}
     ${vdurs}=   Get Length   ${vdur_list}
-    Run Keyword If   ${vdurs} != ${initial_vdur_count} + 1   Fail   msg=There is no new VDU records in the VNF after Scale Out
-
+    IF   ${vdurs} != ${INITIAL_VDUR_COUNT} + 1   Fail   msg=There is no new VDU records in the VNF after Scale Out
 
 Get VIM Objects
-    Variable Should Exist   ${ns_id}   msg=NS is not available
-    @{vnf_id_list}=   Get Ns Vnf List   ${ns_id}
+    [Documentation]   Retrieve all VMs and volumes from the NS and stores them in VIM_VDUS and VIM_VOLUMES lists.
+    Variable Should Exist   ${NS_ID}   msg=NS is not available
+    @{vnf_id_list}=   Get Ns Vnf List   ${NS_ID}
     Log   ${vnf_id_list}
     FOR   ${vnf_id}   IN   @{vnf_id_list}
         Log   ${vnf_id}
         ${id}=   Get VNF VIM ID   ${vnf_id}
         @{vdu_ids}=   Split String   ${id}
-        Append To List   ${vim_vdus}   @{vdu_ids}
+        Append To List   ${VIM_VDUS}   @{vdu_ids}
     END
-    FOR   ${vdu_id}   IN   @{vim_vdus}
+    FOR   ${vdu_id}   IN   @{VIM_VDUS}
         ${volumes_attached}=   Get Server Property   ${vdu_id}   volumes_attached
         ${match}=   Get Regexp Matches   ${volumes_attached}   '([0-9a-f\-]+)'   1
         IF   ${match} != @{EMPTY}
-            IF   not "${match}[0]" in "@{vim_volumes}"
-                Append To List   ${vim_volumes}   ${match}[0]
+            IF   not "${match}[0]" in "@{VIM_VOLUMES}"
+                Append To List   ${VIM_VOLUMES}   ${match}[0]
             END
         END
     END
-    Log Many   @{vim_vdus}
-    Log Many   @{vim_volumes}
-
-
-Get Charm VNF Info
-    Variable Should Exist   ${ns_id}   msg=NS is not available
-    ${variables}   Get Variables
-    IF   not "\${vnf_charm_id}" in "${variables}"
-        ${vnf_id}=   Get Vnf Id   ${ns_id}   ${vnf_charm_index}
-        Set Suite Variable   ${vnf_charm_id}   ${vnf_id}
+    Log Many   @{VIM_VDUS}
+    Log Many   @{VIM_VOLUMES}
+
+Get Manual Scale VNF Info
+    [Documentation]   Get VDU ID and IP addresses of the manual scale VNF and stores them in VDU_MANUALSCALE_IDS and MANUALSCALE_IP_LIST.
+    Variable Should Exist   ${NS_ID}   msg=NS is not available
+    ${variables}=   Get Variables
+    IF   not "\${VNF_MANUALSCALE_ID}" in "${variables}"
+        ${vnf_id}=   Get Vnf Id   ${NS_ID}   ${VNF_MANUALSCALE_INDEX}
+        Set Suite Variable   ${VNF_MANUALSCALE_ID}   ${vnf_id}
     END
-    ${id}=   Get VNF VIM ID   ${vnf_charm_id}
-    @{vdu_charm_ids}=   Split String   ${id}
-    Set Suite Variable   @{vdu_charm_ids}   @{vdu_charm_ids}
-    Log   ${vdu_charm_ids}[1]
-    @{charm_ip_list}=   Get Vnf Vdur IPs   ${vnf_charm_id}
-    Set Suite Variable   @{charm_ip_list}   @{charm_ip_list}
-
-
-Halt Charm VDU
-    Variable Should Exist   @{vdu_charm_ids}   msg=VDU is not available
-    Halt Server   ${vdu_charm_ids}[1]
+    ${id}=   Get VNF VIM ID   ${VNF_MANUALSCALE_ID}
+    @{vdu_manualscale_ids}=   Split String   ${id}
+    Set Suite Variable   @{VDU_MANUALSCALE_IDS}   @{vdu_manualscale_ids}
+    Log   ${VDU_MANUALSCALE_IDS}[1]
+    @{manualscale_ip_list}=   Get Vnf Vdur IPs   ${VNF_MANUALSCALE_ID}
+    Set Suite Variable   @{MANUALSCALE_IP_LIST}   @{manualscale_ip_list}
+
+Halt Manual Scale VDU
+    [Documentation]   Halt one of the VM of the Manual Scale VNF.
+    Variable Should Exist   @{VDU_MANUALSCALE_IDS}   msg=VDU is not available
+    Halt Server   ${VDU_MANUALSCALE_IDS}[1]
     Sleep   15
 
-
-Heal Charm VDU
-    Variable Should Exist   ${vnf_charm_id}   msg=VNF is not available
-    Heal Network Service   ${ns_id}   --vnf ${vnf_charm_id} --cause "Heal VM of charm_vnf" --vdu ${vdu_charm_name} --count-index 1 --run-day1
-
+Heal Manual Scale VDU
+    [Documentation]   Heal manually via OSM commands all stopped VMs . They should be started again.
+    Variable Should Exist   ${VNF_MANUALSCALE_ID}   msg=VNF is not available
+    Heal Network Service   ${NS_ID}   --vnf ${VNF_MANUALSCALE_ID} --cause "Heal VM of manual_scale_vnf" --vdu ${VDU_MANUALSCALE_NAME} --count-index 1 --run-day1
 
 Check VNF After Healing
-    Variable Should Exist   ${vnf_charm_id}   msg=VNF is not available
-
-    @{ip_list}=   Get Vnf Vdur IPs   ${vnf_charm_id}
-    Should Be Equal   ${ip_list}   ${charm_ip_list}   IP addresses have changed after healing
-
-    ${id}=   Get VNF VIM ID   ${vnf_charm_id}
+    [Documentation]   Check that the IDs of the VM and volumes have not changed after healing.
+    Variable Should Exist   ${VNF_MANUALSCALE_ID}   msg=VNF is not available
+    @{ip_list}=   Get Vnf Vdur IPs   ${VNF_MANUALSCALE_ID}
+    Should Be Equal   ${ip_list}   ${MANUALSCALE_IP_LIST}   IP addresses have changed after healing
+    ${id}=   Get VNF VIM ID   ${VNF_MANUALSCALE_ID}
     @{ids}=   Split String   ${id}
-    Should Be Equal   ${vdu_charm_ids}[0]   ${ids}[0]   VDU[0] id has changed after healing
-    Should Not Be Equal   ${vdu_charm_ids}[1]   ${ids}[1]   VDU[1] id has not changed after healing
-    Should Be Equal   ${vdu_charm_ids}[2]   ${ids}[2]   VDU[2] id has changed after healing
-
-    ${ip}=   Get Vdu Attribute   ${vnf_charm_id}   ip-address   1
-    ${stdout}=   Execute Remote Command Check Rc Return Output   ${ip}   ${username}   ${password}   ${privatekey}   sudo ls ${vnf_charm_cloudinit_file}
+    Should Be Equal   ${VDU_MANUALSCALE_IDS}[0]   ${ids}[0]   VDU[0] id has changed after healing
+    Should Not Be Equal   ${VDU_MANUALSCALE_IDS}[1]   ${ids}[1]   VDU[1] id has not changed after healing
+    Should Be Equal   ${VDU_MANUALSCALE_IDS}[2]   ${ids}[2]   VDU[2] id has changed after healing
+    ${ip}=   Get Vdu Attribute   ${VNF_MANUALSCALE_ID}   ip-address   1
+    ${stdout}=   Execute Remote Command Check Rc Return Output   ${ip}   ${USERNAME}   ${PASSWORD}   ${PRIVATEKEY}   sudo ls ${VNF_MANUALSCALE_CLOUDINIT_FILE}
     Log   ${stdout}
-    Check If remote File Exists   ${ip}   ${username}   ${password}   ${privatekey}   ${vnf_charm_day1_file}
-    ${vim_info}=   Get Vdu Attribute   ${vnf_charm_id}   vim_info
-    Should Contain   ${vim_info}   flavor: {id: ${flavor_id},   msg=Flavor ID is incorrect
-
+    Check If Remote File Exists   ${ip}   ${USERNAME}   ${PASSWORD}   ${PRIVATEKEY}   ${VNF_MANUALSCALE_DAY1_FILE}
+    ${vim_info}=   Get Vdu Attribute   ${VNF_MANUALSCALE_ID}   vim_info   1
+    Should Contain   ${vim_info}   id: ${FLAVOR_ID}   msg=Flavor ID is incorrect
 
 Update VIM Objects
-    Variable Should Exist   ${ns_id}   msg=NS is not available
+    [Documentation]   Retrieve all VMs and volumes from the NS and stores them in VIM_VDUS and VIM_VOLUMES lists.
+    ...               This is done again to guarantee that all objects are cleaned in the VIM in case the heal operation
+    ...               added new objects.
+    Variable Should Exist   ${NS_ID}   msg=NS is not available
     @{vdu_updated}=   Create List
-    @{vnf_id_list}=   Get Ns Vnf List   ${ns_id}
+    @{vnf_id_list}=   Get Ns Vnf List   ${NS_ID}
     FOR   ${vnf_id}   IN   @{vnf_id_list}
         ${id}=   Get VNF VIM ID   ${vnf_id}
         @{vdu_ids}=   Split String   ${id}
         Append To List   ${vdu_updated}   @{vdu_ids}
         FOR   ${id}   IN   @{vdu_ids}
-            IF   not "${id}" in "@{vim_vdus}"
-                Append To List   ${vim_vdus}   ${id}
+            IF   not "${id}" in "@{VIM_VDUS}"
+                Append To List   ${VIM_VDUS}   ${id}
             END
         END
     END
@@ -194,44 +199,59 @@ Update VIM Objects
         ${volumes_attached}=   Get Server Property   ${vdu_id}   volumes_attached
         ${match}=   Get Regexp Matches   ${volumes_attached}   '([0-9a-f\-]+)'   1
         IF   ${match} != @{EMPTY}
-            IF   not "${match}[0]" in "@{vim_volumes}"
-                Append To List   ${vim_volumes}   ${match}[0]
+            IF   not "${match}[0]" in "@{VIM_VOLUMES}"
+                Append To List   ${VIM_VOLUMES}   ${match}[0]
             END
         END
     END
-    Log Many   @{vim_vdus}
-    Log Many   @{vim_volumes}
-
+    Log Many   @{VIM_VDUS}
+    Log Many   @{VIM_VOLUMES}
 
 Delete NS Instance
+    [Documentation]   Delete NS instance.
     [Tags]   cleanup
-    Delete NS   ${ns_name}
-
+    Delete NS   ${NS_NAME}
 
 Delete NS Descriptor
+    [Documentation]   Delete NS package from OSM.
     [Tags]   cleanup
-    Delete NSD   ${nsd_name}
-
+    Delete NSD   ${NSD_NAME}
 
 Delete VNF Descriptors
+    [Documentation]   Delete VNF packages from OSM.
     [Tags]   cleanup
-    Delete VNFD   ${vnfd_volumes_name}
-    Delete VNFD   ${vnfd_charm_name}
+    Delete VNFD   ${VNFD_VOLUMES_NAME}
+    Delete VNFD   ${VNFD_MANUALSCALE_NAME}
 
-
-Delete Objects in VIM
+Delete Remaining Objects In VIM
+    [Documentation]   Delete any remaining objects (volumes, VMs, etc.) in the VIM.
     [Tags]   cleanup
+    Delete Objects In VIM
+
+
+*** Keywords ***
+Suite Cleanup
+    [Documentation]   Test Suit Cleanup: Deleting Descriptor, instance and vim
+    Run Keyword If Any Tests Failed   Delete NS   ${NS_NAME}
+    Run Keyword If Any Tests Failed   Delete NSD   ${NSD_NAME}
+    Run Keyword If Any Tests Failed   Delete VNFD   ${VNFD_VOLUMES_NAME}
+    Run Keyword If Any Tests Failed   Delete VNFD   ${VNFD_MANUALSCALE_NAME}
+    Run Keyword If Any Tests Failed   Delete Objects In VIM
+
+Delete Objects In VIM
+    [Documentation]   Clean up remaining VMs and volumes directly from the VIM.
+    Delete Flavor   ${FLAVOR_ID}
     ${error}=   Set Variable   0
-    FOR   ${vol_id}   IN   @{vim_volumes}
+    FOR   ${vol_id}   IN   @{VIM_VOLUMES}
         Log   Checking if volume ${vol_id} is still in VIM
         ${exists}=   Check If Volume Exists   ${vol_id}
-        IF   ${exists}!=0
+        IF   ${exists}
             ${error}=   Set Variable   1
             Log   Deleting volume ${vol_id}
             Run Keyword And Ignore Error   Delete Volume   ${vol_id}
         END
     END
-    FOR   ${vdu_id}   IN   @{vim_vdus}
+    FOR   ${vdu_id}   IN   @{VIM_VDUS}
         Log   Checking if server ${vdu_id} is still in VIM
         ${status}=   Run Keyword And Ignore Error   Get Server Property   ${vdu_id}   id
         Log   ${status}[0]
@@ -244,19 +264,3 @@ Delete Objects in VIM
     IF   ${error}==1
         Fail   Some objects created by test were not deleted in VIM
     END
-
-
-Delete flavor
-    Delete Flavor   ${flavor_id}
-
-
-*** Keywords ***
-Suite Cleanup
-    [Documentation]   Test Suit Cleanup: Deleting Descriptor, instance and vim
-
-    Run Keyword If Any Tests Failed   Delete NS   ${ns_name}
-    Run Keyword If Any Tests Failed   Delete NSD   ${nsd_name}
-    Run Keyword If Any Tests Failed   Delete VNFD   ${vnfd_volumes_name}
-    Run Keyword If Any Tests Failed   Delete VNFD   ${vnfd_charm_name}
-    Run Keyword If Any Tests Failed   Delete Objects in VIM
-    Run Keyword If Any Tests Failed   Delete Flavor   ${flavor_id}
\ No newline at end of file
index 89f67dd..ec520c9 100644 (file)
@@ -1,3 +1,4 @@
+*** Comments ***
 #   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
@@ -10,6 +11,7 @@
 #   See the License for the specific language governing permissions and
 #   limitations under the License.
 
+
 *** Settings ***
 Documentation   [HEAL-03] Healing of multiple VDUs
 
@@ -19,187 +21,187 @@ Library   Collections
 Library   Process
 Library   SSHLibrary
 
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/vnfd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/vnf_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/nsd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ns_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ssh_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/openstack_lib.robot
-
-Force Tags   heal_03   cluster_heal   daily
+Resource   ../lib/vnfd_lib.resource
+Resource   ../lib/vnf_lib.resource
+Resource   ../lib/nsd_lib.resource
+Resource   ../lib/ns_lib.resource
+Resource   ../lib/ns_operation_lib.resource
+Resource   ../lib/ssh_lib.resource
+Resource   ../lib/openstack_lib.resource
 
+Test Tags   heal_03   cluster_heal   daily   regression
 
 Suite Teardown   Run Keyword And Ignore Error   Suite Cleanup
 
 
 *** Variables ***
 # NS and VNF descriptor package folder and ids
-${vnfd_volumes_pkg}   several_volumes_vnf
-${vnfd_volumes_name}   several_volumes-vnf
-${vdu_volumes_name}   several_volumes-VM
-${vnf_several_index}   several_volumes_vnf
-${vnfd_charm_pkg}   charm-packages/native_manual_scale_charm_vnf
-${vnfd_charm_name}   native_manual_scale_charm-vnf
-${vdu_charm_name}   mgmtVM
-${vnf_charm_index}   charm_vnf
-${vnf_charm_scaling_group}   manual-scaling_mgmtVM
-${vnf_charm_cloudinit_file}   /root/helloworld.txt
-${vnf_charm_day1_file}   /home/ubuntu/first-touch
-${nsd_pkg}   volumes_nativecharm_ns
-${nsd_name}   volumes_nativecharm-ns
+${VNFD_VOLUMES_PKG}   several_volumes_vnf
+${VNFD_VOLUMES_NAME}   several_volumes-vnf
+${VDU_VOLUMES_NAME}   several_volumes-VM
+${VNF_SEVERAL_INDEX}   several_volumes_vnf
+${VNFD_MANUALSCALE_PKG}   manual_scale_vnf
+${VNFD_MANUALSCALE_NAME}   manual_scale-vnf
+${VDU_MANUALSCALE_NAME}   mgmtVM
+${VNF_MANUALSCALE_INDEX}   manual_scale_vnf
+${VNF_MANUALSCALE_SCALING_GROUP}   manual-scaling_mgmtVM
+${VNF_MANUALSCALE_CLOUDINIT_FILE}   /root/helloworld.txt
+${VNF_MANUALSCALE_DAY1_FILE}   /home/ubuntu/first-touch
+${NSD_PKG}   volumes_healing_ns
+${NSD_NAME}   volumes_healing-ns
 
 # NS instance name and configuration
-${ns_name}   heal_03
-${ns_config}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
-${scale_wait_time}   4min
+${NS_NAME}   heal_03
+${NS_CONFIG}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
+${NS_TIMEOUT}   6min
+${SCALE_WAIT_TIME}   5min
 
 # SSH keys and username to be used
-${publickey}   %{HOME}/.ssh/id_rsa.pub
-${privatekey}   %{HOME}/.ssh/id_rsa
-${username}   ubuntu
-${password}   ${EMPTY}
+${PUBLICKEY}   %{HOME}/.ssh/id_rsa.pub
+${PRIVATEKEY}   %{HOME}/.ssh/id_rsa
+${USERNAME}   ubuntu
+${PASSWORD}   ${EMPTY}
 
-${success_return_code}   0
+${SUCCESS_RETURN_CODE}   0
 
-@{vim_vdus}   @{EMPTY}
-@{vim_volumes}   @{EMPTY}
+@{VIM_VDUS}   @{EMPTY}
+@{VIM_VOLUMES}   @{EMPTY}
 
 
 *** Test Cases ***
 Create VNF Descriptors
-    Create VNFD   '%{PACKAGES_FOLDER}/${vnfd_charm_pkg}'
-    Create VNFD   '%{PACKAGES_FOLDER}/${vnfd_volumes_pkg}'
-
+    [Documentation]   Upload VNF packages for the testsuite.
+    Create VNFD   '%{PACKAGES_FOLDER}/${VNFD_MANUALSCALE_PKG}'
+    Create VNFD   '%{PACKAGES_FOLDER}/${VNFD_VOLUMES_PKG}'
 
 Create NS Descriptor
-    Create NSD   '%{PACKAGES_FOLDER}/${nsd_pkg}'
-
+    [Documentation]   Upload NS package for the testsuite.
+    Create NSD   '%{PACKAGES_FOLDER}/${NSD_PKG}'
 
 Network Service Instance Test
-    ${id}=   Create Network Service   ${nsd_name}   %{VIM_TARGET}   ${ns_name}   ${ns_config}   ${publickey}
-    Set Suite Variable   ${ns_id}   ${id}
-
+    [Documentation]   Instantiate NS for the testsuite.
+    ${id}=   Create Network Service   ${NSD_NAME}   %{VIM_TARGET}   ${NS_NAME}   ${NS_CONFIG}   ${PUBLICKEY}   ${NS_TIMEOUT}
+    Set Suite Variable   ${NS_ID}   ${id}
 
 Get NS Id
+    [Documentation]   Get NS identifier and stores as suite variable to be used later on.
     [Tags]   cleanup
-    ${variables}   Get Variables
+    ${variables}=   Get Variables
     IF   not "\${ns_id}" in "${variables}"
-        ${id}=   Get Ns Id   ${ns_name}
-        Set Suite Variable   ${ns_id}   ${id}
+        ${id}=   Get Ns Id   ${NS_NAME}
+        Set Suite Variable   ${NS_ID}   ${id}
     END
 
-
-Scale Out Charm VNF
-    ${vnf_id}=   Get Vnf Id   ${ns_id}   ${vnf_charm_index}
-    Set Suite Variable   ${vnf_charm_id}   ${vnf_id}
-    @{vdur_list}=   Get Vnf Vdur Names   ${vnf_charm_id}
+Scale Out Manual Scale VNF
+    [Documentation]   Perform a manual scale-out operation of the manual scale VNF.
+    ${vnf_id}=   Get Vnf Id   ${NS_ID}   ${VNF_MANUALSCALE_INDEX}
+    Set Suite Variable   ${VNF_MANUALSCALE_ID}   ${vnf_id}
+    @{vdur_list}=   Get Vnf Vdur Names   ${VNF_MANUALSCALE_ID}
     ${vdurs}=   Get Length   ${vdur_list}
-    Set Suite Variable   ${initial_vdur_count}   ${vdurs}
-    Execute Manual VNF Scale   ${ns_name}   ${vnf_charm_index}   ${vnf_charm_scaling_group}   SCALE_OUT   ${scale_wait_time}
-    @{vdur_list}=   Get Vnf Vdur Names   ${vnf_charm_id}
+    Set Suite Variable   ${INITIAL_VDUR_COUNT}   ${vdurs}
+    Execute Manual VNF Scale   ${NS_NAME}   ${VNF_MANUALSCALE_INDEX}   ${VNF_MANUALSCALE_SCALING_GROUP}   SCALE_OUT   ${SCALE_WAIT_TIME}
+    @{vdur_list}=   Get Vnf Vdur Names   ${VNF_MANUALSCALE_ID}
     ${vdurs}=   Get Length   ${vdur_list}
-    Run Keyword If   ${vdurs} != ${initial_vdur_count} + 1   Fail   msg=There is no new VDU records in the VNF after Scale Out
-
+    IF   ${vdurs} != ${INITIAL_VDUR_COUNT} + 1   Fail   msg=There is no new VDU records in the VNF after Scale Out
 
 Get VIM Objects
-    Variable Should Exist   ${ns_id}   msg=NS is not available
-    @{vnf_id_list}=   Get Ns Vnf List   ${ns_id}
+    [Documentation]   Retrieve all VMs and volumes from the NS and stores them in VIM_VDUS and VIM_VOLUMES lists.
+    Variable Should Exist   ${NS_ID}   msg=NS is not available
+    @{vnf_id_list}=   Get Ns Vnf List   ${NS_ID}
     Log   ${vnf_id_list}
     FOR   ${vnf_id}   IN   @{vnf_id_list}
         Log   ${vnf_id}
         ${id}=   Get VNF VIM ID   ${vnf_id}
         @{vdu_ids}=   Split String   ${id}
-        Append To List   ${vim_vdus}   @{vdu_ids}
+        Append To List   ${VIM_VDUS}   @{vdu_ids}
     END
-    FOR   ${vdu_id}   IN   @{vim_vdus}
+    FOR   ${vdu_id}   IN   @{VIM_VDUS}
         ${volumes_attached}=   Get Server Property   ${vdu_id}   volumes_attached
         ${match}=   Get Regexp Matches   ${volumes_attached}   '([0-9a-f\-]+)'   1
         IF   ${match} != @{EMPTY}
-            IF   not "${match}[0]" in "@{vim_volumes}"
-                Append To List   ${vim_volumes}   ${match}[0]
+            IF   not "${match}[0]" in "@{VIM_VOLUMES}"
+                Append To List   ${VIM_VOLUMES}   ${match}[0]
             END
         END
     END
-    Log Many   @{vim_vdus}
-    Log Many   @{vim_volumes}
-
-
-Get Charm VNF Info
-    Variable Should Exist   ${ns_id}   msg=NS is not available
-    ${variables}   Get Variables
-    IF   not "\${vnf_charm_id}" in "${variables}"
-        ${vnf_id}=   Get Vnf Id   ${ns_id}   ${vnf_charm_index}
-        Set Suite Variable   ${vnf_charm_id}   ${vnf_id}
+    Log Many   @{VIM_VDUS}
+    Log Many   @{VIM_VOLUMES}
+
+Get Manual Scale VNF Info
+    [Documentation]   Get VDU ID and IP addresses of the manual scale VNF and stores them in VDU_MANUALSCALE_IDS and MANUALSCALE_IP_LIST.
+    Variable Should Exist   ${NS_ID}   msg=NS is not available
+    ${variables}=   Get Variables
+    IF   not "\${VNF_MANUALSCALE_ID}" in "${variables}"
+        ${vnf_id}=   Get Vnf Id   ${NS_ID}   ${VNF_MANUALSCALE_INDEX}
+        Set Suite Variable   ${VNF_MANUALSCALE_ID}   ${vnf_id}
     END
-    ${id}=   Get VNF VIM ID   ${vnf_charm_id}
-    @{vdu_charm_ids}=   Split String   ${id}
-    Set Suite Variable   @{vdu_charm_ids}   @{vdu_charm_ids}
-    Log   ${vdu_charm_ids}[1]
-    @{charm_ip_list}=   Get Vnf Vdur IPs   ${vnf_charm_id}
-    Set Suite Variable   @{charm_ip_list}   @{charm_ip_list}
-
+    ${id}=   Get VNF VIM ID   ${VNF_MANUALSCALE_ID}
+    @{vdu_manualscale_ids}=   Split String   ${id}
+    Set Suite Variable   @{VDU_MANUALSCALE_IDS}   @{vdu_manualscale_ids}
+    Log   ${VDU_MANUALSCALE_IDS}[1]
+    @{manualscale_ip_list}=   Get Vnf Vdur IPs   ${VNF_MANUALSCALE_ID}
+    Set Suite Variable   @{MANUALSCALE_IP_LIST}   @{manualscale_ip_list}
 
 Get Volume VNF Info
-    Variable Should Exist   ${ns_id}   msg=NS is not available
-    ${ip_addr}=   Get Vnf Management Ip Address   ${ns_id}   ${vnf_several_index}
+    [Documentation]   Get info about volumes and VM of the VNF with several volumes and stores them in suite variables.
+    Variable Should Exist   ${NS_ID}   msg=NS is not available
+    ${ip_addr}=   Get Vnf Management Ip Address   ${NS_ID}   ${VNF_SEVERAL_INDEX}
     Log   ${ip_addr}
-    Set Suite Variable   ${vnf_volumes_ip_addr}   ${ip_addr}
-
-    ${vnf_id}=   Get Vnf Id   ${ns_id}   ${vnf_several_index}
-    Set Suite Variable   ${vnf_volumes_id}   ${vnf_id}
+    Set Suite Variable   ${VNF_VOLUMES_IP_ADDR}   ${ip_addr}
+    ${vnf_id}=   Get Vnf Id   ${NS_ID}   ${VNF_SEVERAL_INDEX}
+    Set Suite Variable   ${VNF_VOLUMES_ID}   ${vnf_id}
     ${id}=   Get VNF VIM ID   ${vnf_id}
-    Set Suite Variable   ${vdu_volumes_id}   ${id}
-    Log   ${vdu_volumes_id}
-
-    @{volumes_ip_list}=   Get Vnf Vdur IPs   ${vnf_volumes_id}
-    Set Suite Variable   @{volumes_ip_list}   @{volumes_ip_list}
-    Log   @{volumes_ip_list}
-
+    Set Suite Variable   ${VDU_VOLUMES_ID}   ${id}
+    Log   ${VDU_VOLUMES_ID}
+    @{volumes_ip_list}=   Get Vnf Vdur IPs   ${VNF_VOLUMES_ID}
+    Set Suite Variable   @{VOLUMES_IP_LIST}   @{volumes_ip_list}
+    Log   @{VOLUMES_IP_LIST}
 
 Stop VDUs
-    Variable Should Exist   @{vdu_charm_ids}   msg=Charm VDUs are not available
-    Variable Should Exist   ${vdu_volumes_id}   msg=Volume VDU is not available
-    Stop Server   ${vdu_charm_ids}[1]
-    Stop Server   ${vdu_charm_ids}[2]
-    Stop Server   ${vdu_volumes_id}
+    [Documentation]   Stop all VMs.
+    Variable Should Exist   @{VDU_MANUALSCALE_IDS}   msg=Manual Scale VDUs are not available
+    Variable Should Exist   ${VDU_VOLUMES_ID}   msg=Volume VDU is not available
+    Stop Server   ${VDU_MANUALSCALE_IDS}[1]
+    Stop Server   ${VDU_MANUALSCALE_IDS}[2]
+    Stop Server   ${VDU_VOLUMES_ID}
     Sleep   30
 
-
 Heal VDUs
-    Variable Should Exist   ${vnf_charm_id}   msg=Charm VNF is not available
-    Variable Should Exist   ${vnf_volumes_id}   msg=Volume VNF is not available
-    Heal Network Service   ${ns_id}   --vnf ${vnf_volumes_id} --cause "Heal myvdu1 of several_volumes_vnf" --vdu several_volumes-VM --vnf ${vnf_charm_id} --cause "Heal two VMs of native_manual_scale_charm_vnf" --vdu mgmtVM --count-index 1 --run-day1 --vdu mgmtVM --count-index 2
-
+    [Documentation]   Heal manually via OSM commands all stopped VMs . They should be started again.
+    Variable Should Exist   ${VNF_MANUALSCALE_ID}   msg=Manual Scale VNF is not available
+    Variable Should Exist   ${VNF_VOLUMES_ID}   msg=Volume VNF is not available
+    Heal Network Service   ${NS_ID}   --vnf ${VNF_VOLUMES_ID} --cause "Heal myvdu1 of several_volumes_vnf" --vdu several_volumes-VM --vnf ${VNF_MANUALSCALE_ID} --cause "Heal two VMs of manual_scale_vnf" --vdu mgmtVM --count-index 1 --run-day1 --vdu mgmtVM --count-index 2
 
 Check VNFs After Healing
-    Variable Should Exist   ${vnf_charm_id}   msg=Charm VNF is not available
-    Variable Should Exist   ${vnf_volumes_id}   msg=Volume VNF is not available
-    ${id}=   Get VNF VIM ID   ${vnf_charm_id}
+    [Documentation]   Check that the IDs of the VM and volumes have not changed after healing.
+    Variable Should Exist   ${VNF_MANUALSCALE_ID}   msg=Manual scale VNF is not available
+    Variable Should Exist   ${VNF_VOLUMES_ID}   msg=Volume VNF is not available
+    ${id}=   Get VNF VIM ID   ${VNF_MANUALSCALE_ID}
     @{ids}=   Split String   ${id}
-    Should Be Equal   ${vdu_charm_ids}[0]   ${ids}[0]   VDU[0] id has changed after healing
-    Should Not Be Equal   ${vdu_charm_ids}[1]   ${ids}[1]   VDU[1] id has not changed after healing
-    Should Not Be Equal   ${vdu_charm_ids}[2]   ${ids}[2]   VDU[2] id has not changed after healing
-
-    ${id}=   Get VNF VIM ID   ${vnf_volumes_id}
-    Should Not Be Equal   ${id}   ${vdu_volumes_id}   VDU id has not changed after healing
-
-    ${ip}=   Get Vdu Attribute   ${vnf_charm_id}   ip-address   1
-    ${stdout}=   Execute Remote Command Check Rc Return Output   ${ip}   ${username}   ${password}   ${privatekey}   sudo ls ${vnf_charm_cloudinit_file}
+    Should Be Equal   ${VDU_MANUALSCALE_IDS}[0]   ${ids}[0]   VDU[0] id has changed after healing
+    Should Not Be Equal   ${VDU_MANUALSCALE_IDS}[1]   ${ids}[1]   VDU[1] id has not changed after healing
+    Should Not Be Equal   ${VDU_MANUALSCALE_IDS}[2]   ${ids}[2]   VDU[2] id has not changed after healing
+    ${id}=   Get VNF VIM ID   ${VNF_VOLUMES_ID}
+    Should Not Be Equal   ${id}   ${VDU_VOLUMES_ID}   VDU id has not changed after healing
+    ${ip}=   Get Vdu Attribute   ${VNF_MANUALSCALE_ID}   ip-address   1
+    ${stdout}=   Execute Remote Command Check Rc Return Output   ${ip}   ${USERNAME}   ${PASSWORD}   ${PRIVATEKEY}   sudo ls ${VNF_MANUALSCALE_CLOUDINIT_FILE}
     Log   ${stdout}
-    Check If remote File Exists   ${ip}   ${username}   ${password}   ${privatekey}   ${vnf_charm_day1_file}
-
+    Check If Remote File Exists   ${ip}   ${USERNAME}   ${PASSWORD}   ${PRIVATEKEY}   ${VNF_MANUALSCALE_DAY1_FILE}
 
 Update VIM Objects
-    Variable Should Exist   ${ns_id}   msg=NS is not available
+    [Documentation]   Retrieve all VMs and volumes from the NS and stores them in VIM_VDUS and VIM_VOLUMES lists.
+    ...               This is done again to guarantee that all objects are cleaned in the VIM in case the heal operation
+    ...               added new objects.
+    Variable Should Exist   ${NS_ID}   msg=NS is not available
     @{vdu_updated}=   Create List
-    @{vnf_id_list}=   Get Ns Vnf List   ${ns_id}
+    @{vnf_id_list}=   Get Ns Vnf List   ${NS_ID}
     FOR   ${vnf_id}   IN   @{vnf_id_list}
         ${id}=   Get VNF VIM ID   ${vnf_id}
         @{vdu_ids}=   Split String   ${id}
         Append To List   ${vdu_updated}   @{vdu_ids}
         FOR   ${id}   IN   @{vdu_ids}
-            IF   not "${id}" in "@{vim_vdus}"
-                Append To List   ${vim_vdus}   ${id}
+            IF   not "${id}" in "@{VIM_VDUS}"
+                Append To List   ${VIM_VDUS}   ${id}
             END
         END
     END
@@ -207,44 +209,44 @@ Update VIM Objects
         ${volumes_attached}=   Get Server Property   ${vdu_id}   volumes_attached
         ${match}=   Get Regexp Matches   ${volumes_attached}   '([0-9a-f\-]+)'   1
         IF   ${match} != @{EMPTY}
-            IF   not "${match}[0]" in "@{vim_volumes}"
-                Append To List   ${vim_volumes}   ${match}[0]
+            IF   not "${match}[0]" in "@{VIM_VOLUMES}"
+                Append To List   ${VIM_VOLUMES}   ${match}[0]
             END
         END
     END
-    Log Many   @{vim_vdus}
-    Log Many   @{vim_volumes}
-
+    Log Many   @{VIM_VDUS}
+    Log Many   @{VIM_VOLUMES}
 
 Delete NS Instance
+    [Documentation]   Delete NS instance.
     [Tags]   cleanup
-    Delete NS   ${ns_name}
-
+    Delete NS   ${NS_NAME}
 
 Delete NS Descriptor
+    [Documentation]   Delete NS package from OSM.
     [Tags]   cleanup
-    Delete NSD   ${nsd_name}
-
+    Delete NSD   ${NSD_NAME}
 
 Delete VNF Descriptors
+    [Documentation]   Delete VNF packages from OSM.
     [Tags]   cleanup
-    Delete VNFD   ${vnfd_volumes_name}
-    Delete VNFD   ${vnfd_charm_name}
+    Delete VNFD   ${VNFD_VOLUMES_NAME}
+    Delete VNFD   ${VNFD_MANUALSCALE_NAME}
 
-
-Delete Objects in VIM
+Delete Objects In VIM
+    [Documentation]   Delete any remaining objects (volumes, VMs, etc.) in the VIM.
     [Tags]   cleanup
     ${error}=   Set Variable   0
-    FOR   ${vol_id}   IN   @{vim_volumes}
+    FOR   ${vol_id}   IN   @{VIM_VOLUMES}
         Log   Checking if volume ${vol_id} is still in VIM
         ${exists}=   Check If Volume Exists   ${vol_id}
-        IF   ${exists}!=0
+        IF   ${exists}
             ${error}=   Set Variable   1
             Log   Deleting volume ${vol_id}
             Run Keyword And Ignore Error   Delete Volume   ${vol_id}
         END
     END
-    FOR   ${vdu_id}   IN   @{vim_vdus}
+    FOR   ${vdu_id}   IN   @{VIM_VDUS}
         Log   Checking if server ${vdu_id} is still in VIM
         ${status}=   Run Keyword And Ignore Error   Get Server Property   ${vdu_id}   id
         Log   ${status}[0]
@@ -262,8 +264,7 @@ Delete Objects in VIM
 *** Keywords ***
 Suite Cleanup
     [Documentation]   Test Suit Cleanup: Deleting Descriptor, instance and vim
-
-    Run Keyword If Any Tests Failed   Delete NS   ${ns_name}
-    Run Keyword If Any Tests Failed   Delete NSD   ${nsd_name}
-    Run Keyword If Any Tests Failed   Delete VNFD   ${vnfd_volumes_name}
-    Run Keyword If Any Tests Failed   Delete VNFD   ${vnfd_charm_name}
+    Run Keyword If Any Tests Failed   Delete NS   ${NS_NAME}
+    Run Keyword If Any Tests Failed   Delete NSD   ${NSD_NAME}
+    Run Keyword If Any Tests Failed   Delete VNFD   ${VNFD_VOLUMES_NAME}
+    Run Keyword If Any Tests Failed   Delete VNFD   ${VNFD_MANUALSCALE_NAME}
index ada204a..048e7ad 100644 (file)
@@ -1,3 +1,4 @@
+*** Comments ***
 #   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
@@ -10,6 +11,7 @@
 #   See the License for the specific language governing permissions and
 #   limitations under the License.
 
+
 *** Settings ***
 Documentation   [HEAL-04] Autohealing of NS
 
@@ -19,159 +21,159 @@ Library   Collections
 Library   Process
 Library   SSHLibrary
 
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/vnfd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/vnf_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/nsd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ns_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ssh_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/openstack_lib.robot
+Resource   ../lib/vnfd_lib.resource
+Resource   ../lib/vnf_lib.resource
+Resource   ../lib/nsd_lib.resource
+Resource   ../lib/ns_lib.resource
+Resource   ../lib/ns_operation_lib.resource
+Resource   ../lib/ssh_lib.resource
+Resource   ../lib/openstack_lib.resource
 
-Force Tags   heal_04   cluster_heal   daily
+Test Tags   heal_04   cluster_heal   daily   regression
 
 Suite Teardown   Run Keyword And Ignore Error   Suite Cleanup
 
 
 *** Variables ***
 # NS and VNF descriptor package folder and ids
-${vnfd_pkg}   autoheal_vnf
-${vnfd_name}   autoheal_vnfd
-${vdu_name}   autoheal_vnfd-VM
-${vnf_index}   autoheal-basic-1
-${nsd_pkg}   autoheal_ns
-${nsd_name}   autoheal_nsd
+${VNFD_PKG}   autoheal_vnf
+${VNFD_NAME}   autoheal_vnfd
+${VDU_NAME}   autoheal_vnfd-VM
+${VNF_INDEX}   autoheal-basic-1
+${NSD_PKG}   autoheal_ns
+${NSD_NAME}   autoheal_nsd
 # NS instance name and configuration
-${ns_name}   heal_04
-${ns_config}   {vld: [ {name: mgmt, vim-network-name: %{VIM_MGMT_NET}} ] }
+${NS_NAME}   heal_04
+${NS_CONFIG}   {vld: [ {name: mgmt, vim-network-name: %{VIM_MGMT_NET}} ] }
 
 # SSH keys and username to be used
-${publickey}   %{HOME}/.ssh/id_rsa.pub
-${privatekey}   %{HOME}/.ssh/id_rsa
-${username}   ubuntu
-${password}   ${EMPTY}
+${PUBLICKEY}   %{HOME}/.ssh/id_rsa.pub
+${PRIVATEKEY}   %{HOME}/.ssh/id_rsa
+${USERNAME}   ubuntu
+${PASSWORD}   ${EMPTY}
 
-${success_return_code}   0
+${SUCCESS_RETURN_CODE}   0
 
-#Healing wait time
-${healing_pol_time}   15sec
-${healing_max_wait_time}   10m
+# Healing wait time
+${HEALING_POL_TIME}   15sec
+${HEALING_MAX_WAIT_TIME}   10m
 
-@{vim_vdus}   @{EMPTY}
+@{VIM_VDUS}   @{EMPTY}
 
 
 *** Test Cases ***
 Create VNF Descriptors
-    Create VNFD   '%{PACKAGES_FOLDER}/${vnfd_pkg}'
-
+    [Documentation]   Upload VNF package for the testsuite.
+    Create VNFD   '%{PACKAGES_FOLDER}/${VNFD_PKG}'
 
 Create NS Descriptor
-    Create NSD   '%{PACKAGES_FOLDER}/${nsd_pkg}'
-
+    [Documentation]   Upload NS package for the testsuite.
+    Create NSD   '%{PACKAGES_FOLDER}/${NSD_PKG}'
 
 Network Service Instance Test
-    ${id}=   Create Network Service   ${nsd_name}   %{VIM_TARGET}   ${ns_name}   ${ns_config}   ${publickey}
-    Set Suite Variable   ${ns_id}   ${id}
-
+    [Documentation]   Instantiate NS for the testsuite.
+    ${id}=   Create Network Service   ${NSD_NAME}   %{VIM_TARGET}   ${NS_NAME}   ${NS_CONFIG}   ${PUBLICKEY}
+    Set Suite Variable   ${NS_ID}   ${id}
 
 Get NS Id
+    [Documentation]   Get NS identifier and stores as suite variable to be used later on.
     [Tags]   cleanup
-    ${variables}   Get Variables
+    ${variables}=   Get Variables
     IF   not "\${ns_id}" in "${variables}"
-        ${id}=   Get Ns Id   ${ns_name}
-        Set Suite Variable   ${ns_id}   ${id}
+        ${id}=   Get Ns Id   ${NS_NAME}
+        Set Suite Variable   ${NS_ID}   ${id}
     END
 
-
 Get VIM Objects
-    Variable Should Exist   ${ns_id}   msg=NS is not available
-    @{vnf_id_list}=   Get Ns Vnf List   ${ns_id}
+    [Documentation]   Retrieve all VMs and volumes from the NS and stores them in VIM_VDUS and VIM_VOLUMES lists.
+    Variable Should Exist   ${NS_ID}   msg=NS is not available
+    @{vnf_id_list}=   Get Ns Vnf List   ${NS_ID}
     Log   ${vnf_id_list}
     FOR   ${vnf_id}   IN   @{vnf_id_list}
         Log   ${vnf_id}
         ${id}=   Get VNF VIM ID   ${vnf_id}
         @{vdu_ids}=   Split String   ${id}
-        Append To List   ${vim_vdus}   @{vdu_ids}
+        Append To List   ${VIM_VDUS}   @{vdu_ids}
     END
-    Log Many   @{vim_vdus}
-
+    Log Many   @{VIM_VDUS}
 
 Get VNF Info
-    Variable Should Exist   ${ns_id}   msg=NS is not available
-    ${ip_addr}=   Get Vnf Management Ip Address   ${ns_id}   ${vnf_index}
+    [Documentation]   Get VDU ID and IP addresses of the VNF and stores them to be used later on.
+    Variable Should Exist   ${NS_ID}   msg=NS is not available
+    ${ip_addr}=   Get Vnf Management Ip Address   ${NS_ID}   ${VNF_INDEX}
     Log   ${ip_addr}
-    Set Suite Variable   ${vnf_ip_addr}   ${ip_addr}
-
-    ${vnf_id}=   Get Vnf Id   ${ns_id}   ${vnf_index}
-    Set Suite Variable   ${vnf_autoheal_id}   ${vnf_id}
+    Set Suite Variable   ${VNF_IP_ADDR}   ${ip_addr}
+    ${vnf_id}=   Get Vnf Id   ${NS_ID}   ${VNF_INDEX}
+    Set Suite Variable   ${VNF_AUTOHEAL_ID}   ${vnf_id}
     ${id}=   Get VNF VIM ID   ${vnf_id}
-    Set Suite Variable   ${vdu_autoheal_id}   ${id}
-    Log   ${vdu_autoheal_id}
-
-    @{autoheal_ip_list}=   Get Vnf Vdur IPs   ${vnf_autoheal_id}
-    Set Suite Variable   @{autoheal_ip_list}   @{autoheal_ip_list}
-    Log   @{autoheal_ip_list}
-
+    Set Suite Variable   ${VDU_AUTOHEAL_ID}   ${id}
+    Log   ${VDU_AUTOHEAL_ID}
+    @{AUTOHEAL_IP_LIST}=   Get Vnf Vdur IPs   ${VNF_AUTOHEAL_ID}
+    Set Suite Variable   @{AUTOHEAL_IP_LIST}   @{AUTOHEAL_IP_LIST}
+    Log   @{AUTOHEAL_IP_LIST}
 
 Stop Autoheal VDU
-    Variable Should Exist   ${vdu_autoheal_id}   msg=VDU is not available
-    Halt Server   ${vdu_autoheal_id}
+    [Documentation]   Stop one VM of the VNF.
+    Variable Should Exist   ${VDU_AUTOHEAL_ID}   msg=VDU is not available
+    Halt Server   ${VDU_AUTOHEAL_ID}
     Sleep   30
 
-
 Wait For Autohealing To Be Completed
-    ${healing_max_wait_time}=   Convert Time   ${healing_max_wait_time}   result_format=number
-    ${healing_max_wait_time}=   Evaluate   ${healing_max_wait_time} * ${vim_timeout_multiplier}
-    Wait Until Keyword Succeeds   ${healing_max_wait_time}   ${healing_pol_time}   Get Operations By Type   ${ns_id}   heal
-    ${stdout}=   Get Operations By Type   ${ns_id}   heal
-    Wait Until Keyword Succeeds   ${healing_max_wait_time}   ${healing_pol_time}   Check For NS Operation Ended   ${stdout}
+    [Documentation]   Wait for auto-healing to be completed. OSM will detect that the VM is down and will re-create it.
+    ${healing_max_wait_time}=   Convert Time   ${HEALING_MAX_WAIT_TIME}   result_format=number
+    ${healing_max_wait_time}=   Evaluate   ${healing_max_wait_time} * ${VIM_TIMEOUT_MULTIPLIER}
+    Wait Until Keyword Succeeds   ${healing_max_wait_time}   ${HEALING_POL_TIME}   Get Operations By Type   ${NS_ID}   heal
+    ${stdout}=   Get Operations By Type   ${NS_ID}   heal
+    Wait Until Keyword Succeeds   ${healing_max_wait_time}   ${HEALING_POL_TIME}   Check For NS Operation Ended   ${stdout}
     Check For NS Operation Completed   ${stdout}
 
-
 Check VNF After Healing
-    Variable Should Exist   ${vnf_autoheal_id}   msg=VNF is not available
-
-    @{ip_list}=   Get Vnf Vdur IPs   ${vnf_autoheal_id}
+    [Documentation]   Check that the ID of the VM and the IP addresses have not changed after healing.
+    Variable Should Exist   ${VNF_AUTOHEAL_ID}   msg=VNF is not available
+    @{ip_list}=   Get Vnf Vdur IPs   ${VNF_AUTOHEAL_ID}
     Log   @{ip_list}
-    Should Be Equal   ${ip_list}   ${autoheal_ip_list}   IP addresses have changed after healing
-
-    ${id}=   Get VNF VIM ID   ${vnf_autoheal_id}
+    Should Be Equal   ${ip_list}   ${AUTOHEAL_IP_LIST}   IP addresses have changed after healing
+    ${id}=   Get VNF VIM ID   ${VNF_AUTOHEAL_ID}
     Log   ${id}
-    Should Not Be Equal   ${id}   ${vdu_autoheal_id}   VDU id has not changed after healing
-
+    Should Not Be Equal   ${id}   ${VDU_AUTOHEAL_ID}   VDU id has not changed after healing
 
 Update VIM Objects
-    Variable Should Exist   ${ns_id}   msg=NS is not available
-    @{vnf_id_list}=   Get Ns Vnf List   ${ns_id}
+    [Documentation]   Retrieve all VMs from the NS and stores them in VIM_VDUS.
+    ...               This is done again to guarantee that all objects are cleaned in the VIM in case the heal operation
+    ...               added new objects.
+    Variable Should Exist   ${NS_ID}   msg=NS is not available
+    @{vnf_id_list}=   Get Ns Vnf List   ${NS_ID}
     FOR   ${vnf_id}   IN   @{vnf_id_list}
         ${id}=   Get VNF VIM ID   ${vnf_id}
         @{vdu_ids}=   Split String   ${id}
         FOR   ${id}   IN   @{vdu_ids}
-            IF   not "${id}" in "@{vim_vdus}"
-                Append To List   ${vim_vdus}   ${id}
+            IF   not "${id}" in "@{VIM_VDUS}"
+                Append To List   ${VIM_VDUS}   ${id}
             END
         END
     END
-    Log Many   @{vim_vdus}
-
+    Log Many   @{VIM_VDUS}
 
 Delete NS Instance
+    [Documentation]   Delete NS instance.
     [Tags]   cleanup
-    Delete NS   ${ns_name}
-
+    Delete NS   ${NS_NAME}
 
 Delete NS Descriptor
+    [Documentation]   Delete NS package from OSM.
     [Tags]   cleanup
-    Delete NSD   ${nsd_name}
-
+    Delete NSD   ${NSD_NAME}
 
 Delete VNF Descriptors
+    [Documentation]   Delete VNF package from OSM.
     [Tags]   cleanup
-    Delete VNFD   ${vnfd_name}
+    Delete VNFD   ${VNFD_NAME}
 
-
-Delete Objects in VIM
+Delete Objects In VIM
+    [Documentation]   Delete any remaining objects (volumes, VMs, etc.) in the VIM.
     [Tags]   cleanup
     ${error}=   Set Variable   0
-    FOR   ${vdu_id}   IN   @{vim_vdus}
+    FOR   ${vdu_id}   IN   @{VIM_VDUS}
         Log   Checking if server ${vdu_id} is still in VIM
         ${status}=   Run Keyword And Ignore Error   Get Server Property   ${vdu_id}   id
         Log   ${status}[0]
@@ -189,7 +191,6 @@ Delete Objects in VIM
 *** Keywords ***
 Suite Cleanup
     [Documentation]   Test Suit Cleanup: Deleting Descriptor, instance and vim
-
-    Run Keyword If Any Tests Failed   Delete NS   ${ns_name}
-    Run Keyword If Any Tests Failed   Delete NSD   ${nsd_name}
-    Run Keyword If Any Tests Failed   Delete VNFD   ${vnfd_name}
+    Run Keyword If Any Tests Failed   Delete NS   ${NS_NAME}
+    Run Keyword If Any Tests Failed   Delete NSD   ${NSD_NAME}
+    Run Keyword If Any Tests Failed   Delete VNFD   ${VNFD_NAME}
index 899aed4..b87a174 100644 (file)
@@ -1,3 +1,4 @@
+*** Comments ***
 #   Copyright 2020 Canonical Ltd.
 #
 #   Licensed under the Apache License, Version 2.0 (the "License");
@@ -12,6 +13,7 @@
 #   See the License for the specific language governing permissions and
 #   limitations under the License.
 
+
 *** Settings ***
 Documentation   [K8s-01] Create K8s cluster.
 
@@ -20,148 +22,135 @@ Library   String
 Library   Collections
 Library   Process
 Library   SSHLibrary
-Library   %{ROBOT_DEVOPS_FOLDER}/lib/renderTemplate.py
+Library   ../lib/renderTemplate.py
 
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/vnfd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/nsd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ns_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ssh_lib.robot
+Resource   ../lib/vnfd_lib.resource
+Resource   ../lib/nsd_lib.resource
+Resource   ../lib/ns_lib.resource
+Resource   ../lib/ssh_lib.resource
 
-Force Tags   k8s_01   cluster_k8s
+Test Tags   k8s_01   cluster_k8s
 
 Suite Teardown   Run Keyword And Ignore Error   Suite Cleanup
 
 
 *** Variables ***
 # NS and VNF descriptor package files
-${vnfd_pkg1}   k8s_jujucontroller_vnf.tar.gz
-${vnfd_pkg2}   k8s_jujumachine_vnf.tar.gz
-${nsd_pkg}   k8s_juju_ns.tar.gz
-${vnfd_name1}   k8s_jujucontroller_vnf
-${vnfd_name2}   k8s_jujumachine_vnf
-${nsd_name}   k8s_juju
+${VNFD_PKG1}   k8s_jujucontroller_vnf.tar.gz
+${VNFD_PKG2}   k8s_jujumachine_vnf.tar.gz
+${NSD_PKG}   k8s_juju_ns.tar.gz
+${VNFD_NAME1}   k8s_jujucontroller_vnf
+${VNFD_NAME2}   k8s_jujumachine_vnf
+${NSD_NAME}   k8s_juju
 
 # VNF Member indexes
-${vnf_member_index_1}   k8s_vnf1
-${vnf_member_index_2}   k8s_vnf2
-${vnf_member_index_3}   k8s_vnf3
-${vnf_member_index_4}   k8s_vnf4
-${vnf_member_index_5}   k8s_juju
-
-# Username
-${username}   ubuntu
+${VNF_MEMBER_INDEX_1}   k8s_vnf1
+${VNF_MEMBER_INDEX_2}   k8s_vnf2
+${VNF_MEMBER_INDEX_3}   k8s_vnf3
+${VNF_MEMBER_INDEX_4}   k8s_vnf4
+${VNF_MEMBER_INDEX_5}   k8s_juju
 
 # Kubeconfig file
-${kubeconfig_file}   /home/ubuntu/.kube/config
+${KUBECONFIG_FILE}   /home/ubuntu/.kube/config
 
 # NS instance name
-${ns_name}   k8s-cluster
+${NS_NAME}   k8s-cluster
 
 # SSH keys and username to be used
-${publickey}   %{HOME}/.ssh/id_rsa.pub
-${privatekey}   %{HOME}/.ssh/id_rsa
-${username}   ubuntu
-${password}   ${EMPTY}
+${PUBLICKEY}   %{HOME}/.ssh/id_rsa.pub
+${PRIVATEKEY}   %{HOME}/.ssh/id_rsa
+${USERNAME}   ubuntu
+${PASSWORD}   ${EMPTY}
 
 # Template and config file to use
-${template}   k8s_juju_template.yaml
-${config_file}   config.yaml
+${TEMPLATE}   k8s_juju_template.yaml
+${CONFIG_FILE}   config.yaml
 
 
 *** Test Cases ***
 Render a template
-
-    ${stdout}=   Render template   %{ROBOT_DEVOPS_FOLDER}/resources/${template}   %{ROBOT_DEVOPS_FOLDER}/resources/${config_file}   IP_VM1=%{IP_VM1}   IP_VM2=%{IP_VM2}   IP_VM3=%{IP_VM3}   IP_VM4=%{IP_VM4}   IP_JUJU=%{IP_JUJU}   NETWORK=%{VIM_MGMT_NET}
+    [Documentation]   Generate from a template the instantiation parameters that will be used for the NS instance.
+    ${stdout}=   Render Template   ../resources/${TEMPLATE}   ../resources/${CONFIG_FILE}   IP_VM1=%{IP_VM1}   IP_VM2=%{IP_VM2}   IP_VM3=%{IP_VM3}   IP_VM4=%{IP_VM4}   IP_JUJU=%{IP_JUJU}   NETWORK=%{VIM_MGMT_NET}
     Log To Console   \n${stdout}
 
-
 Create Controller VNF Descriptor
-
-    Create VNFD   '%{PACKAGES_FOLDER}/${vnfd_pkg1}'
-
+    [Documentation]   Upload first VNF package for the testsuite.
+    Create VNFD   '%{PACKAGES_FOLDER}/${VNFD_PKG1}'
 
 Create Machines VNF Descriptor
-
-    Create VNFD   '%{PACKAGES_FOLDER}/${vnfd_pkg2}'
-
+    [Documentation]   Upload second VNF package for the testsuite.
+    Create VNFD   '%{PACKAGES_FOLDER}/${VNFD_PKG2}'
 
 Create K8s Cluster NS Descriptor
-
-    Create NSD   '%{PACKAGES_FOLDER}/${nsd_pkg}'
-
+    [Documentation]   Upload NS package for the testsuite.
+    Create NSD   '%{PACKAGES_FOLDER}/${NSD_PKG}'
 
 Instantiate K8s Cluster Network Service
-
-    ${id}=   Create Network Service   ${nsd_name}   %{VIM_TARGET}   ${ns_name}   ns_config=${EMPTY}   publickey=${publickey}   ns_launch_max_wait_time=70min   config_file=%{ROBOT_DEVOPS_FOLDER}/resources/${config_file}
-    Set Suite Variable   ${ns_id}   ${id}
-
+    [Documentation]   Instantiate NS for the testsuite.
+    ${id}=   Create Network Service   ${NSD_NAME}   %{VIM_TARGET}   ${NS_NAME}   ns_config=${EMPTY}   publickey=${PUBLICKEY}   ns_launch_max_wait_time=70min   config_file=%{ROBOT_DEVOPS_FOLDER}/resources/${CONFIG_FILE}
+    Set Suite Variable   ${NS_ID}   ${id}
 
 Get Management Ip Addresses
-
-    ${ip_addr_1}   Get Vnf Management Ip Address   ${ns_id}   ${vnf_member_index_1}
+    [Documentation]   Get the mgmt IP addresses of the five VNF of the NS.
+    ${ip_addr_1}=   Get Vnf Management Ip Address   ${NS_ID}   ${VNF_MEMBER_INDEX_1}
     Log   ${ip_addr_1}
-    Set Suite Variable   ${vnf_1_ip_addr}   ${ip_addr_1}
-    ${ip_addr_2}   Get Vnf Management Ip Address   ${ns_id}   ${vnf_member_index_2}
+    Set Suite Variable   ${VNF_1_IP_ADDR}   ${ip_addr_1}
+    ${ip_addr_2}=   Get Vnf Management Ip Address   ${NS_ID}   ${VNF_MEMBER_INDEX_2}
     Log   ${ip_addr_2}
-    Set Suite Variable   ${vnf_2_ip_addr}   ${ip_addr_2}
-    ${ip_addr_3}   Get Vnf Management Ip Address   ${ns_id}   ${vnf_member_index_3}
+    Set Suite Variable   ${VNF_2_IP_ADDR}   ${ip_addr_2}
+    ${ip_addr_3}=   Get Vnf Management Ip Address   ${NS_ID}   ${VNF_MEMBER_INDEX_3}
     Log   ${ip_addr_3}
-    Set Suite Variable   ${vnf_3_ip_addr}   ${ip_addr_3}
-    ${ip_addr_4}   Get Vnf Management Ip Address   ${ns_id}   ${vnf_member_index_4}
+    Set Suite Variable   ${VNF_3_IP_ADDR}   ${ip_addr_3}
+    ${ip_addr_4}=   Get Vnf Management Ip Address   ${NS_ID}   ${VNF_MEMBER_INDEX_4}
     Log   ${ip_addr_4}
-    Set Suite Variable   ${vnf_4_ip_addr}   ${ip_addr_4}
-    ${ip_addr_5}   Get Vnf Management Ip Address   ${ns_id}   ${vnf_member_index_5}
+    Set Suite Variable   ${VNF_4_IP_ADDR}   ${ip_addr_4}
+    ${ip_addr_5}=   Get Vnf Management Ip Address   ${NS_ID}   ${VNF_MEMBER_INDEX_5}
     Log   ${ip_addr_5}
-    Set Suite Variable   ${vnf_5_ip_addr}   ${ip_addr_5}
-
+    Set Suite Variable   ${VNF_5_IP_ADDR}   ${ip_addr_5}
 
 Test SSH Access
-
-    Variable Should Exist   ${vnf_1_ip_addr}   msg=IP address of the management VNF '${vnf_member_index_1}' is not available
-    Variable Should Exist   ${vnf_2_ip_addr}   msg=IP address of the management VNF '${vnf_member_index_2}' is not available
-    Variable Should Exist   ${vnf_3_ip_addr}   msg=IP address of the management VNF '${vnf_member_index_3}' is not available
-    Variable Should Exist   ${vnf_4_ip_addr}   msg=IP address of the management VNF '${vnf_member_index_4}' is not available
-    Variable Should Exist   ${vnf_5_ip_addr}   msg=IP address of the management VNF '${vnf_member_index_5}' is not available
+    [Documentation]   Check that the five VNF are accessible via SSH in their respective mgmt IP address.
+    Variable Should Exist   ${VNF_1_IP_ADDR}   msg=IP address of the management VNF '${VNF_MEMBER_INDEX_1}' is not available
+    Variable Should Exist   ${VNF_2_IP_ADDR}   msg=IP address of the management VNF '${VNF_MEMBER_INDEX_2}' is not available
+    Variable Should Exist   ${VNF_3_IP_ADDR}   msg=IP address of the management VNF '${VNF_MEMBER_INDEX_3}' is not available
+    Variable Should Exist   ${VNF_4_IP_ADDR}   msg=IP address of the management VNF '${VNF_MEMBER_INDEX_4}' is not available
+    Variable Should Exist   ${VNF_5_IP_ADDR}   msg=IP address of the management VNF '${VNF_MEMBER_INDEX_5}' is not available
     Sleep   30s   Waiting ssh daemon to be up
-    Test SSH Connection   ${vnf_1_ip_addr}   ${username}   ${password}   ${privatekey}
-    Test SSH Connection   ${vnf_2_ip_addr}   ${username}   ${password}   ${privatekey}
-    Test SSH Connection   ${vnf_3_ip_addr}   ${username}   ${password}   ${privatekey}
-    Test SSH Connection   ${vnf_4_ip_addr}   ${username}   ${password}   ${privatekey}
-    Test SSH Connection   ${vnf_5_ip_addr}   ${username}   ${password}   ${privatekey}
-
-
-Check kubeconfig file
-
-    Check If remote File Exists   ${vnf_5_ip_addr}   ${username}   ${password}   ${privatekey}   ${kubeconfig_file}
+    Test SSH Connection   ${VNF_1_IP_ADDR}   ${USERNAME}   ${PASSWORD}   ${PRIVATEKEY}
+    Test SSH Connection   ${VNF_2_IP_ADDR}   ${USERNAME}   ${PASSWORD}   ${PRIVATEKEY}
+    Test SSH Connection   ${VNF_3_IP_ADDR}   ${USERNAME}   ${PASSWORD}   ${PRIVATEKEY}
+    Test SSH Connection   ${VNF_4_IP_ADDR}   ${USERNAME}   ${PASSWORD}   ${PRIVATEKEY}
+    Test SSH Connection   ${VNF_5_IP_ADDR}   ${USERNAME}   ${PASSWORD}   ${PRIVATEKEY}
 
+Check Kubeconfig File
+    [Documentation]   Check that the Kubeconfig file of the provisioned cluster is present in the VNF.
+    Check If Remote File Exists   ${VNF_5_IP_ADDR}   ${USERNAME}   ${PASSWORD}   ${PRIVATEKEY}   ${KUBECONFIG_FILE}
 
 Delete NS Instance
+    [Documentation]   Delete NS instance.
     [Tags]   cleanup
-
-    Delete NS   ${ns_name}
-
+    Delete NS   ${NS_NAME}
 
 Delete NS Descriptor
+    [Documentation]   Delete NS package from OSM.
     [Tags]   cleanup
-
-    Delete NSD   ${nsd_name}
-
+    Delete NSD   ${NSD_NAME}
 
 Delete Controller VNF Descriptor
+    [Documentation]   Delete first VNF package from OSM.
     [Tags]   cleanup
-
-    Delete VNFD   ${vnfd_name1}
+    Delete VNFD   ${VNFD_NAME1}
 
 Delete Machines VNF Descriptor
+    [Documentation]   Delete second VNF package from OSM.
     [Tags]   cleanup
-
-    Delete VNFD   ${vnfd_name2}
+    Delete VNFD   ${VNFD_NAME2}
 
 
 *** Keywords ***
 Suite Cleanup
     [Documentation]   Test Suite Cleanup: Deleting descriptors and NS instance
-
-    Run Keyword If Any Tests Failed   Delete NS   ${ns_name}
-    Run Keyword If Any Tests Failed   Delete NSD   ${nsd_name}
-    Run Keyword If Any Tests Failed   Delete VNFD   ${vnfd_name}
+    Run Keyword If Any Tests Failed   Delete NS   ${NS_NAME}
+    Run Keyword If Any Tests Failed   Delete NSD   ${NSD_NAME}
+    Run Keyword If Any Tests Failed   Delete VNFD   ${VNFD_NAME1}
+    Run Keyword If Any Tests Failed   Delete VNFD   ${VNFD_NAME2}
index 1983782..3e4c741 100644 (file)
@@ -1,3 +1,4 @@
+*** Comments ***
 # Copyright 2020 Canonical Ltd.
 #
 #   Licensed under the Apache License, Version 2.0 (the "License");
@@ -12,6 +13,7 @@
 #   See the License for the specific language governing permissions and
 #   limitations under the License.
 
+
 *** Settings ***
 Documentation   [K8s-02] K8s cluster addition.
 
@@ -20,47 +22,48 @@ Library   String
 Library   Collections
 Library   Process
 
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/k8scluster_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/vim_lib.robot
+Resource   ../lib/k8scluster_lib.resource
+Resource   ../lib/vim_lib.resource
 
-Variables   %{ROBOT_DEVOPS_FOLDER}/resources/basic_01-crud_operations_on_vim_targets_data.py
+Variables   ../resources/basic_01-crud_operations_on_vim_targets_data.py
 
-Force Tags   k8s_02   cluster_k8s   daily   regression
+Test Tags   k8s_02   cluster_k8s   daily   regression   azure
 
 Suite Teardown   Run Keyword And Ignore Error   Suite Cleanup
 
 
 *** Variables ***
 # K8s cluster name and version
-${k8scluster_name}   k8s02
-${k8scluster_version}   v1
+${K8SCLUSTER_NAME}   k8s02
+${K8SCLUSTER_VERSION}   v1
+
 
 *** Test Cases ***
 Create VIM Target Basic
     [Documentation]   Creates a VIM for the K8s cluster to be anchored against
-
     ${rand}=   Generate Random String   6   [NUMBERS]
-    ${vim_name}=   Catenate   SEPARATOR=_   ${vim_name_prefix}   ${rand}
-    Set Suite Variable   ${vim_name}
-    ${created_vim_account_id}=   Create VIM Target   ${vim_name}   ${vim_user}   ${vim_password}   ${vim_auth_url}   ${vim_tenant}   ${vim_account_type}
-    Set Suite Variable   ${created_vim_account_id}
+    ${VIM_NAME}=   Catenate   SEPARATOR=_   ${vim_name_prefix}   ${rand}
+    Set Suite Variable   ${VIM_NAME}
+    ${CREATED_VIM_ACCOUNT_ID}=   Create VIM Target   ${VIM_NAME}   ${VIM_USER}   ${VIM_PASSWORD}   ${VIM_AUTH_URL}   ${VIM_TENANT}   ${VIM_ACCOUNT_TYPE}
+    Set Suite Variable   ${CREATED_VIM_ACCOUNT_ID}
 
 Add K8s Cluster To OSM
-
-    Create K8s Cluster   %{K8S_CREDENTIALS}   ${k8scluster_version}   ${vim_name}   %{VIM_MGMT_NET}   ${k8scluster_name}
+    [Documentation]   Creates a VIM for the K8s cluster to be anchored against
+    Create K8s Cluster   %{K8S_CREDENTIALS}   ${K8SCLUSTER_VERSION}   ${VIM_NAME}   %{VIM_MGMT_NET}   ${K8SCLUSTER_NAME}
+    Check For K8s Cluster To Be Ready   ${K8SCLUSTER_NAME}
 
 Remove K8s Cluster from OSM
+    [Documentation]   Delete K8s cluster.
     [Tags]   cleanup
-
-    Delete K8s Cluster   ${k8scluster_name}
+    Delete K8s Cluster   ${K8SCLUSTER_NAME}
 
 Delete VIM Target By ID
     [Documentation]   Delete the VIM Target created in previous test-case by its ID.
     ...               Checks whether the VIM Target was created or not before perform the deletion.
     [Tags]   cleanup
 
-    ${vim_account_id}=   Get VIM Target ID   ${vim_name}
-    Should Be Equal As Strings   ${vim_account_id}   ${created_vim_account_id}
+    ${vim_account_id}=   Get VIM Target ID   ${VIM_NAME}
+    Should Be Equal As Strings   ${vim_account_id}   ${CREATED_VIM_ACCOUNT_ID}
     Delete VIM Target   ${vim_account_id}
 
 
@@ -68,4 +71,4 @@ Delete VIM Target By ID
 Suite Cleanup
     [Documentation]   Test Suit Cleanup: Deleting K8s Cluster
 
-    Run Keyword If Any Tests Failed   Delete K8s Cluster   ${k8scluster_name}
+    Run Keyword If Any Tests Failed   Delete K8s Cluster   ${K8SCLUSTER_NAME}
index 94ad3a2..a6838ea 100644 (file)
@@ -1,3 +1,4 @@
+*** Comments ***
 #   Copyright 2020 Canonical Ltd.
 #
 #   Licensed under the Apache License, Version 2.0 (the "License");
@@ -12,6 +13,7 @@
 #   See the License for the specific language governing permissions and
 #   limitations under the License.
 
+
 *** Settings ***
 Documentation   [K8s-03] Simple K8s.
 
@@ -20,76 +22,85 @@ Library   String
 Library   Collections
 Library   Process
 
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/vnfd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/nsd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ns_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/package_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/connectivity_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ssh_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/k8scluster_lib.robot
+Resource   ../lib/vnfd_lib.resource
+Resource   ../lib/nsd_lib.resource
+Resource   ../lib/ns_lib.resource
+Resource   ../lib/ns_operation_lib.resource
+Resource   ../lib/package_lib.resource
+Resource   ../lib/connectivity_lib.resource
+Resource   ../lib/ssh_lib.resource
+Resource   ../lib/k8scluster_lib.resource
 
-Force Tags   k8s_03   cluster_k8s   daily   regression   sanity
+Test Tags   k8s_03   cluster_k8s   regression   azure
 
 Suite Teardown   Run Keyword And Ignore Error   Suite Cleanup
 
 
 *** Variables ***
 # NS and VNF descriptor package folder and ids
-${vnfd_pkg}   charm-packages/native_k8s_charm_vnf
-${vnfd_name}   native_k8s_charm-vnf
-${nsd_pkg}   charm-packages/native_k8s_charm_ns
-${nsd_name}   native_k8s_charm-ns
+${VNFD_PKG}   charm-packages/native_k8s_charm_vnf
+${VNFD_NAME}   native_k8s_charm-vnf
+${NSD_PKG}   charm-packages/native_k8s_charm_ns
+${NSD_NAME}   native_k8s_charm-ns
 
 # NS instance name and configuration
-${ns_name}   native-k8s
-${ns_config}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
+${NS_NAME}   native-k8s
+${NS_CONFIG}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
+
+${NS_ID}   ${EMPTY}
+${PUBLICKEY}   ${EMPTY}
+${VNF_MEMBER_INDEX}   native_k8s_charm-vnf
+${ACTION_NAME}   changecontent
+${KDU_NAME}   native-kdu
+${APPLICATION_NAME}   nginx
+${CUSTOMTITLE}   Day 2 Action
 
-${ns_id}   ${EMPTY}
-${publickey}   ${EMPTY}
-${vnf_member_index}   native_k8s_charm-vnf
-${action_name}   changecontent
-${kdu_name}   native-kdu
-${application_name}   nginx
-${customtitle}   Day 2 Action
 
 *** Test Cases ***
 Create Simple K8s VNF Descriptor
-    Create VNFD   '%{PACKAGES_FOLDER}/${vnfd_pkg}'
+    [Documentation]   Upload NF package for the testsuite.
+    Create VNFD   '%{PACKAGES_FOLDER}/${VNFD_PKG}'
 
 Create Simple K8s Descriptor
-    Create NSD   '%{PACKAGES_FOLDER}/${nsd_pkg}'
+    [Documentation]   Upload NS package for the testsuite.
+    Create NSD   '%{PACKAGES_FOLDER}/${NSD_PKG}'
 
 Network Service K8s Instance Test
-    ${id}=   Create Network Service   ${nsd_name}   %{VIM_TARGET}   ${ns_name}   ${ns_config}   ${publickey}
-    Set Suite Variable   ${ns_id}   ${id}
+    [Documentation]   Instantiate NS for the testsuite.
+    ${id}=   Create Network Service   ${NSD_NAME}   %{VIM_TARGET}   ${NS_NAME}   ${NS_CONFIG}   ${PUBLICKEY}
+    Set Suite Variable   ${NS_ID}   ${id}
 
 Execute Day 2 Operations
     [Documentation]   Performs one Day 2 operation per VNF that creates a new file.
-
-    Variable Should Exist   ${ns_id}   msg=Network service instance is not available
-    ${ns_op_id}=   Execute NS K8s Action   ${ns_name}   ${action_name}   ${vnf_member_index}   ${kdu_name}   application-name=${application_name}   customtitle=${customtitle}
+    Variable Should Exist   ${NS_ID}   msg=Network service instance is not available
+    ${ns_op_id}=   Execute NS K8s Action   ${NS_NAME}   ${ACTION_NAME}   ${VNF_MEMBER_INDEX}   ${KDU_NAME}   application-name=${APPLICATION_NAME}   customtitle=${CUSTOMTITLE}
+    Log   ${ns_op_id}
 
 Delete NS K8s Instance Test
+    [Documentation]   Delete NS instance.
     [Tags]   cleanup
-    Delete NS   ${ns_name}
+    Delete NS   ${NS_NAME}
 
 Delete NS Descriptor Test
+    [Documentation]   Delete NS package from OSM.
     [Tags]   cleanup
-    Delete NSD   ${nsd_name}
+    Delete NSD   ${NSD_NAME}
 
 Delete VNF Descriptor Test
+    [Documentation]   Delete NF package from OSM.
     [Tags]   cleanup
-    Delete VNFD   ${vnfd_name}
+    Delete VNFD   ${VNFD_NAME}
 
 Delete VNF NS Packages
+    [Documentation]   Delete tar.gz NF and NS package files.
     [Tags]   cleanup
-    Delete Package   '%{PACKAGES_FOLDER}/${vnfd_pkg}'
-    Delete Package   '%{PACKAGES_FOLDER}/${nsd_pkg}'
+    Delete Package   '%{PACKAGES_FOLDER}/${VNFD_PKG}'
+    Delete Package   '%{PACKAGES_FOLDER}/${NSD_PKG}'
 
 
 *** Keywords ***
 Suite Cleanup
     [Documentation]   Test Suit Cleanup: Deleting Descriptor, instance and vim
-    Run Keyword If Any Tests Failed   Delete NS   ${ns_name}
-    Run Keyword If Any Tests Failed   Delete NSD   ${nsd_name}
-    Run Keyword If Any Tests Failed   Delete VNFD   ${vnfd_name}
+    Run Keyword If Any Tests Failed   Delete NS   ${NS_NAME}
+    Run Keyword If Any Tests Failed   Delete NSD   ${NSD_NAME}
+    Run Keyword If Any Tests Failed   Delete VNFD   ${VNFD_NAME}
index 214bbc6..74cd4d5 100644 (file)
@@ -1,3 +1,4 @@
+*** Comments ***
 #   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
@@ -10,6 +11,7 @@
 #   See the License for the specific language governing permissions and
 #   limitations under the License.
 
+
 *** Settings ***
 Documentation   [K8s-04] Openldap Helm chart.
 
@@ -18,102 +20,119 @@ Library   String
 Library   Collections
 Library   Process
 
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/vnfd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/nsd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ns_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/connectivity_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ssh_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/k8scluster_lib.robot
+Resource   ../lib/vnfd_lib.resource
+Resource   ../lib/nsd_lib.resource
+Resource   ../lib/ns_lib.resource
+Resource   ../lib/ns_operation_lib.resource
+Resource   ../lib/connectivity_lib.resource
+Resource   ../lib/ssh_lib.resource
+Resource   ../lib/k8scluster_lib.resource
 
-Force Tags   k8s_04   cluster_k8s   daily   regression   sanity
+Test Tags   k8s_04   cluster_k8s   daily   regression   sanity   azure
 
 Suite Teardown   Run Keyword And Ignore Error   Suite Cleanup
 
 
 *** Variables ***
 # NS and VNF descriptor package folder and ids
-${vnfd_pkg}   openldap_knf
-${vnfd_name}   openldap_knf
-${nsd_pkg}   openldap_ns
-${nsd_name}   openldap_ns
+${VNFD_PKG}   openldap_knf
+${VNFD_NAME}   openldap_knf
+${NSD_PKG}   openldap_ns
+${NSD_NAME}   openldap_ns
 
 # NS instance name and configuration
-${ns_name}   ldap
-${ns_config}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}}], additionalParamsForVnf: [ {member-vnf-index: openldap, additionalParamsForKdu: [ {kdu_name: ldap, additionalParams: {service: {type: LoadBalancer }, adminPassword: admin}} ] } ] }
+${NS_NAME}   ldap
+${NS_CONFIG}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}}], additionalParamsForVnf: [ {member-vnf-index: openldap, additionalParamsForKdu: [ {kdu_name: ldap, additionalParams: {service: {type: LoadBalancer }, adminPassword: admin}} ] } ] }
+
+${NS_ID}   ${EMPTY}
+${PUBLICKEY}   ${EMPTY}
+${VNF_MEMBER_INDEX}   openldap
+${KDU_NAME}   ldap
+${UPGRADE_ACTION}   upgrade
+${ROLLBACK_ACTION}   rollback
+${REPLICA_COUNT}   3
 
-${ns_id}   ${EMPTY}
-${publickey}   ${EMPTY}
-${vnf_member_index}   openldap
-${kdu_name}   ldap
-${upgrade_action}   upgrade
-${rollback_action}   rollback
-${replica_count}   3
 
 *** Test Cases ***
 Create Package For OpenLDAP CNF
+    [Documentation]   Upload NF package for the testsuite.
     [Tags]   prepare
-    Create VNFD   '%{PACKAGES_FOLDER}/${vnfd_pkg}'
+    Create VNFD   '%{PACKAGES_FOLDER}/${VNFD_PKG}'
 
 Create Package For OpenLDAP NS
+    [Documentation]   Upload NS package for the testsuite.
     [Tags]   prepare
-    Create NSD   '%{PACKAGES_FOLDER}/${nsd_pkg}'
+    Create NSD   '%{PACKAGES_FOLDER}/${NSD_PKG}'
 
 Create Network Service Instance
+    [Documentation]   Instantiate NS for the testsuite.
     [Tags]   prepare
-    ${id}=   Create Network Service   ${nsd_name}   %{VIM_TARGET}   ${ns_name}   ${ns_config}   ${publickey}
+    ${id}=   Create Network Service   ${NSD_NAME}   %{VIM_TARGET}   ${NS_NAME}   ${NS_CONFIG}   ${PUBLICKEY}
+    Log   ${id}
 
 Get Ns Id
+    [Documentation]   Retrieve NS instance id to be used later on.
     [Tags]   verify
-    ${id}=   Get Ns Id   ${ns_name}
-    Set Suite Variable   ${ns_id}   ${id}
+    ${id}=   Get Ns Id   ${NS_NAME}
+    Set Suite Variable   ${NS_ID}   ${id}
 
 Get Vnf Id
+    [Documentation]   Retrieve NF instance id to be used later on.
     [Tags]   verify
-    Variable Should Exist   ${ns_id}   msg=Network service instance is not available
-    @{vnfr_list}=   Get Ns Vnfr Ids   ${ns_id}
+    Variable Should Exist   ${NS_ID}   msg=Network service instance is not available
+    @{vnfr_list}=   Get Ns Vnfr Ids   ${NS_ID}
     Log List   ${vnfr_list}
-    Set Suite Variable   ${vnf_id}   ${vnfr_list}[0]
+    Set Suite Variable   ${VNF_ID}   ${vnfr_list}[0]
 
 Execute Upgrade Operation
+    [Documentation]   Perform OSM action to upgrade the number of replicas of a deployment in the CNF.
     [Tags]   verify
-    Variable Should Exist   ${ns_id}   msg=Network service instance is not available
-    ${ns_op_id}=   Execute NS K8s Action   ${ns_name}   ${upgrade_action}   ${vnf_member_index}   ${kdu_name}   replicaCount=${replica_count}
+    Variable Should Exist   ${NS_ID}   msg=Network service instance is not available
+    ${ns_op_id}=   Execute NS K8s Action   ${NS_NAME}   ${UPGRADE_ACTION}   ${VNF_MEMBER_INDEX}   ${KDU_NAME}   replicaCount=${REPLICA_COUNT}
+    Log   ${ns_op_id}
 
 Check Replicas After Upgrade Operation
+    [Documentation]   Check that the number of replicas after the upgrade is the expected one.
     [Tags]   verify
-    Variable Should Exist   ${ns_id}   msg=Network service instance is not available
-    ${count}=   Get Vnf Kdu Replica Count   ${vnf_id}   ${kdu_name}
+    Variable Should Exist   ${NS_ID}   msg=Network service instance is not available
+    ${count}=   Get Vnf Kdu Replica Count   ${VNF_ID}   ${KDU_NAME}
     Log   ${count}
-    Should Be Equal As Integers   ${count}   ${replica_count}
+    Should Be Equal As Integers   ${count}   ${REPLICA_COUNT}
 
 Execute Rollback Operation
+    [Documentation]   Perform OSM action to rollback the previous upgrade of the CNF.
     [Tags]   verify
-    Variable Should Exist   ${ns_id}   msg=Network service instance is not available
-    ${ns_op_id}=   Execute NS K8s Action   ${ns_name}   ${rollback_action}   ${vnf_member_index}   ${kdu_name}
+    Variable Should Exist   ${NS_ID}   msg=Network service instance is not available
+    ${ns_op_id}=   Execute NS K8s Action   ${NS_NAME}   ${ROLLBACK_ACTION}   ${VNF_MEMBER_INDEX}   ${KDU_NAME}
+    Log   ${ns_op_id}
 
 Check Replicas After Rollback Operation
+    [Documentation]   Check that the number of replcias after the rollback is the expected one.
     [Tags]   verify
-    Variable Should Exist   ${ns_id}   msg=Network service instance is not available
-    ${count}=   Get Vnf Kdu Replica Count   ${vnf_id}   ${kdu_name}
+    Variable Should Exist   ${NS_ID}   msg=Network service instance is not available
+    ${count}=   Get Vnf Kdu Replica Count   ${VNF_ID}   ${KDU_NAME}
     Log   ${count}
     Should Be Empty   ${count}
 
 Delete Network Service Instance
+    [Documentation]   Delete NS instance.
     [Tags]   cleanup
-    Delete NS   ${ns_name}
+    Delete NS   ${NS_NAME}
 
 Delete NS Descriptor Test
+    [Documentation]   Delete NS package from OSM.
     [Tags]   cleanup
-    Delete NSD   ${nsd_name}
+    Delete NSD   ${NSD_NAME}
 
 Delete VNF Descriptor Test
+    [Documentation]   Delete NF package from OSM.
     [Tags]   cleanup
-    Delete VNFD   ${vnfd_name}
+    Delete VNFD   ${VNFD_NAME}
 
 
 *** Keywords ***
 Suite Cleanup
     [Documentation]   Test Suit Cleanup: Deleting Descriptor, instance and vim
-    Run Keyword If Any Tests Failed   Delete NS   ${ns_name}
-    Run Keyword If Any Tests Failed   Delete NSD   ${nsd_name}
-    Run Keyword If Any Tests Failed   Delete VNFD   ${vnfd_name}
+    Run Keyword If Any Tests Failed   Delete NS   ${NS_NAME}
+    Run Keyword If Any Tests Failed   Delete NSD   ${NSD_NAME}
+    Run Keyword If Any Tests Failed   Delete VNFD   ${VNFD_NAME}
index 4cf5ed0..be3bb31 100644 (file)
@@ -1,3 +1,4 @@
+*** Comments ***
 #   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
 #   See the License for the specific language governing permissions and
 #   limitations under the License.
 
+
 *** Settings ***
 Documentation   [K8s-05] K8s Proxy Charm.
 
 Library   OperatingSystem
 Library   SSHLibrary
 
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/vnfd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/nsd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ns_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ssh_lib.robot
+Resource   ../lib/vnfd_lib.resource
+Resource   ../lib/nsd_lib.resource
+Resource   ../lib/ns_lib.resource
+Resource   ../lib/ns_operation_lib.resource
+Resource   ../lib/ssh_lib.resource
 
-Force Tags   k8s_05   cluster_ee_config   cluster_k8s_charms   daily   regression
+Test Tags   k8s_05   cluster_ee_config   cluster_k8s_charms   regression   azure
 
 Suite Teardown   Run Keyword And Ignore Error   Suite Cleanup
 
 
 *** Variables ***
 # NS and VNF descriptor package folder and ids
-${vnfd_pkg}   charm-packages/k8s_proxy_charm_vnf
-${vnfd_name}   k8s_proxy_charm-vnf
-${nsd_pkg}   charm-packages/k8s_proxy_charm_ns
-${nsd_name}   k8s_proxy_charm-ns
+${VNFD_PKG}   charm-packages/k8s_proxy_charm_vnf
+${VNFD_NAME}   k8s_proxy_charm-vnf
+${NSD_PKG}   charm-packages/k8s_proxy_charm_ns
+${NSD_NAME}   k8s_proxy_charm-ns
 
 # NS instance name and configuration
-${ns_name}   k8s_05-k8s_proxy_charm
-${ns_config}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
-${ns_timeout}   15min
+${NS_NAME}   k8s_05-k8s_proxy_charm
+${NS_CONFIG}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
+${NS_TIMEOUT}   15min
 
 # SSH keys and username to be used
-${publickey}   %{HOME}/.ssh/id_rsa.pub
-${privatekey}   %{HOME}/.ssh/id_rsa
-${username}   ubuntu
-${password}   ${EMPTY}
+${PUBLICKEY}   %{HOME}/.ssh/id_rsa.pub
+${PRIVATEKEY}   %{HOME}/.ssh/id_rsa
+${USERNAME}   ubuntu
+${PASSWORD}   ${EMPTY}
 
-${action_name}   touch
-${vnf_member_index_1}   vnf1
-${vnf_member_index_2}   vnf2
-${day_1_file_name}   /home/ubuntu/first-touch
-${day_2_file_name_1}   /home/ubuntu/mytouch1
-${day_2_file_name_2}   /home/ubuntu/mytouch2
+${ACTION_NAME}   touch
+${VNF_MEMBER_INDEX_1}   vnf1
+${VNF_MEMBER_INDEX_2}   vnf2
+${DAY_1_FILE_NAME}   /home/ubuntu/first-touch
+${DAY_2_FILE_NAME_1}   /home/ubuntu/mytouch1
+${DAY_2_FILE_NAME_2}   /home/ubuntu/mytouch2
 
 
 *** Test Cases ***
 Create Charm VNF Descriptor
-
-    Create VNFD   '%{PACKAGES_FOLDER}/${vnfd_pkg}'
-
+    [Documentation]   Upload VNF package for the testsuite.
+    Create VNFD   '%{PACKAGES_FOLDER}/${VNFD_PKG}'
 
 Create Charm NS Descriptor
-
-    Create NSD   '%{PACKAGES_FOLDER}/${nsd_pkg}'
-
+    [Documentation]   Upload NS package for the testsuite.
+    Create NSD   '%{PACKAGES_FOLDER}/${NSD_PKG}'
 
 Instantiate Charm Network Service
-
-    ${id}=   Create Network Service   ${nsd_name}   %{VIM_TARGET}   ${ns_name}   ${ns_config}   ${publickey}   ${ns_timeout}
-    Set Suite Variable   ${ns_id}   ${id}
-
+    [Documentation]   Instantiate NS for the testsuite.
+    ${id}=   Create Network Service   ${NSD_NAME}   %{VIM_TARGET}   ${NS_NAME}   ${NS_CONFIG}   ${PUBLICKEY}   ${NS_TIMEOUT}
+    Set Suite Variable   ${NS_ID}   ${id}
 
 Get Management Ip Addresses
-
-    ${ip_addr_1}   Get Vnf Management Ip Address   ${ns_id}   ${vnf_member_index_1}
+    [Documentation]   Get the mgmt IP address of the two VNF of the NS.
+    ${ip_addr_1}=   Get Vnf Management Ip Address   ${NS_ID}   ${VNF_MEMBER_INDEX_1}
     Log   ${ip_addr_1}
-    Set Suite Variable   ${vnf_1_ip_addr}   ${ip_addr_1}
-    ${ip_addr_2}   Get Vnf Management Ip Address   ${ns_id}   ${vnf_member_index_2}
+    Set Suite Variable   ${VNF_1_IP_ADDR}   ${ip_addr_1}
+    ${ip_addr_2}=   Get Vnf Management Ip Address   ${NS_ID}   ${VNF_MEMBER_INDEX_2}
     Log   ${ip_addr_2}
-    Set Suite Variable   ${vnf_2_ip_addr}   ${ip_addr_2}
-
+    Set Suite Variable   ${VNF_2_IP_ADDR}   ${ip_addr_2}
 
 Test SSH Access
-
-    Variable Should Exist   ${vnf_1_ip_addr}   msg=IP address of the management VNF '${vnf_member_index_1}' is not available
-    Variable Should Exist   ${vnf_2_ip_addr}   msg=IP address of the management VNF '${vnf_member_index_2}' is not available
+    [Documentation]   Check that both VNF are accessible via SSH in their respective mgmt IP address.
+    Variable Should Exist   ${VNF_1_IP_ADDR}   msg=IP address of the management VNF '${VNF_MEMBER_INDEX_1}' is not available
+    Variable Should Exist   ${VNF_2_IP_ADDR}   msg=IP address of the management VNF '${VNF_MEMBER_INDEX_2}' is not available
     Sleep   30s   Waiting ssh daemon to be up
-    Test SSH Connection   ${vnf_1_ip_addr}   ${username}   ${password}   ${privatekey}
-    Test SSH Connection   ${vnf_2_ip_addr}   ${username}   ${password}   ${privatekey}
-
+    Test SSH Connection   ${VNF_1_IP_ADDR}   ${USERNAME}   ${PASSWORD}   ${PRIVATEKEY}
+    Test SSH Connection   ${VNF_2_IP_ADDR}   ${USERNAME}   ${PASSWORD}   ${PRIVATEKEY}
 
 Check Remote Files Created Via Day 1 Operations
     [Documentation]   The Charm VNF has a Day 1 operation that creates a file named ${day_1_file_name}.
     ...               This test checks whether that files have been created or not.
-
-    Check If remote File Exists   ${vnf_1_ip_addr}   ${username}   ${password}   ${privatekey}   ${day_1_file_name}
-    Check If remote File Exists   ${vnf_2_ip_addr}   ${username}   ${password}   ${privatekey}   ${day_1_file_name}
-
+    Check If Remote File Exists   ${VNF_1_IP_ADDR}   ${USERNAME}   ${PASSWORD}   ${PRIVATEKEY}   ${DAY_1_FILE_NAME}
+    Check If Remote File Exists   ${VNF_2_IP_ADDR}   ${USERNAME}   ${PASSWORD}   ${PRIVATEKEY}   ${DAY_1_FILE_NAME}
 
 Execute Day 2 Operations
     [Documentation]   Performs one Day 2 operation per VNF that creates a new file.
-
-    Variable Should Exist   ${ns_id}   msg=Network service instance is not available
-    ${ns_op_id_1}=   Execute NS Action   ${ns_name}   ${action_name}   ${vnf_member_index_1}   filename=${day_2_file_name_1}
-    ${ns_op_id_2}=   Execute NS Action   ${ns_name}   ${action_name}   ${vnf_member_index_2}   filename=${day_2_file_name_2}
-
+    Variable Should Exist   ${NS_ID}   msg=Network service instance is not available
+    ${ns_op_id_1}=   Execute NS Action   ${NS_NAME}   ${ACTION_NAME}   ${VNF_MEMBER_INDEX_1}   filename=${DAY_2_FILE_NAME_1}
+    Log   ${ns_op_id_1}
+    ${ns_op_id_2}=   Execute NS Action   ${NS_NAME}   ${ACTION_NAME}   ${VNF_MEMBER_INDEX_2}   filename=${DAY_2_FILE_NAME_2}
+    Log   ${ns_op_id_2}
 
 Check Remote Files Created Via Day 2 Operations
     [Documentation]   Check whether the files created in the previous test via Day 2 operations exist or not.
-
-    Check If remote File Exists   ${vnf_1_ip_addr}   ${username}   ${password}   ${privatekey}   ${day_2_file_name_1}
-    Check If remote File Exists   ${vnf_2_ip_addr}   ${username}   ${password}   ${privatekey}   ${day_2_file_name_2}
-
+    Check If Remote File Exists   ${VNF_1_IP_ADDR}   ${USERNAME}   ${PASSWORD}   ${PRIVATEKEY}   ${DAY_2_FILE_NAME_1}
+    Check If Remote File Exists   ${VNF_2_IP_ADDR}   ${USERNAME}   ${PASSWORD}   ${PRIVATEKEY}   ${DAY_2_FILE_NAME_2}
 
 Delete NS Instance
+    [Documentation]   Delete NS instance.
     [Tags]   cleanup
-
-    Delete NS   ${ns_name}
-
+    Delete NS   ${NS_NAME}
 
 Delete NS Descriptor
+    [Documentation]   Delete NS package from OSM.
     [Tags]   cleanup
-
-    Delete NSD   ${nsd_name}
-
+    Delete NSD   ${NSD_NAME}
 
 Delete VNF Descriptor
+    [Documentation]   Delete NF package from OSM.
     [Tags]   cleanup
-
-    Delete VNFD   ${vnfd_name}
+    Delete VNFD   ${VNFD_NAME}
 
 
 *** Keywords ***
 Suite Cleanup
     [Documentation]   Test Suite Cleanup: Deleting descriptors and NS instance
-
-    Run Keyword If Any Tests Failed   Delete NS   ${ns_name}
-
-    Run Keyword If Any Tests Failed   Delete NSD   ${nsd_name}
-
-    Run Keyword If Any Tests Failed   Delete VNFD   ${vnfd_name}
-
+    Run Keyword If Any Tests Failed   Delete NS   ${NS_NAME}
+    Run Keyword If Any Tests Failed   Delete NSD   ${NSD_NAME}
+    Run Keyword If Any Tests Failed   Delete VNFD   ${VNFD_NAME}
index 25a999e..d422d32 100644 (file)
@@ -1,3 +1,4 @@
+*** Comments ***
 #   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
 #   See the License for the specific language governing permissions and
 #   limitations under the License.
 
+
 *** Settings ***
 Documentation   [K8s-06] K8s Secure Key Management.
 
 Library   OperatingSystem
 Library   SSHLibrary
 
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/vnfd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/nsd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ns_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ssh_lib.robot
+Resource   ../lib/vnfd_lib.resource
+Resource   ../lib/nsd_lib.resource
+Resource   ../lib/ns_lib.resource
+Resource   ../lib/ns_operation_lib.resource
+Resource   ../lib/ssh_lib.resource
 
-Force Tags   k8s_06   cluster_ee_config   cluster_k8s_charms   daily   regression
+Test Tags   k8s_06   cluster_ee_config   cluster_k8s_charms   regression   azure
 
 Suite Teardown   Run Keyword And Ignore Error   Suite Cleanup
 
 
 *** Variables ***
 # NS and VNF descriptor package folder and ids
-${vnfd_pkg}   charm-packages/nopasswd_k8s_proxy_charm_vnf
-${vnfd_name}   nopasswd_k8s_proxy_charm-vnf
-${nsd_pkg}   charm-packages/nopasswd_k8s_proxy_charm_ns
-${nsd_name}   nopasswd_k8s_proxy_charm-ns
+${VNFD_PKG}   charm-packages/nopasswd_k8s_proxy_charm_vnf
+${VNFD_NAME}   nopasswd_k8s_proxy_charm-vnf
+${NSD_PKG}   charm-packages/nopasswd_k8s_proxy_charm_ns
+${NSD_NAME}   nopasswd_k8s_proxy_charm-ns
 
 # NS instance name and configuration
-${ns_name}   k8s_06-nopasswd_k8s_proxy_charm
-${ns_config}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
-${ns_timeout}   15min
+${NS_NAME}   k8s_06-nopasswd_k8s_proxy_charm
+${NS_CONFIG}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
+${NS_TIMEOUT}   15min
 
 # SSH keys and username to be used
-${publickey}   %{HOME}/.ssh/id_rsa.pub
-${privatekey}   %{HOME}/.ssh/id_rsa
-${username}   ubuntu
-${password}   ${EMPTY}
+${PUBLICKEY}   %{HOME}/.ssh/id_rsa.pub
+${PRIVATEKEY}   %{HOME}/.ssh/id_rsa
+${USERNAME}   ubuntu
+${PASSWORD}   ${EMPTY}
 
-${action_name}   touch
-${vnf_member_index_1}   vnf1
-${vnf_member_index_2}   vnf2
-${day_1_file_name}   /home/ubuntu/first-touch
-${day_2_file_name_1}   /home/ubuntu/mytouch1
-${day_2_file_name_2}   /home/ubuntu/mytouch2
-${ns_timeout}   15min
+${ACTION_NAME}   touch
+${VNF_MEMBER_INDEX_1}   vnf1
+${VNF_MEMBER_INDEX_2}   vnf2
+${DAY_1_FILE_NAME}   /home/ubuntu/first-touch
+${DAY_2_FILE_NAME_1}   /home/ubuntu/mytouch1
+${DAY_2_FILE_NAME_2}   /home/ubuntu/mytouch2
 
 
 *** Test Cases ***
 Create Charm VNF Descriptor
+    [Documentation]   Upload VNF package for the testsuite.
     [Tags]   prepare
-    Create VNFD   '%{PACKAGES_FOLDER}/${vnfd_pkg}'
-
+    Create VNFD   '%{PACKAGES_FOLDER}/${VNFD_PKG}'
 
 Create Charm NS Descriptor
+    [Documentation]   Upload NS package for the testsuite.
     [Tags]   prepare
-    Create NSD   '%{PACKAGES_FOLDER}/${nsd_pkg}'
-
+    Create NSD   '%{PACKAGES_FOLDER}/${NSD_PKG}'
 
 Instantiate Charm Network Service
+    [Documentation]   Instantiate NS for the testsuite.
     [Tags]   prepare
-    ${id}=   Create Network Service   ${nsd_name}   %{VIM_TARGET}   ${ns_name}   ${ns_config}   ${publickey}   ${ns_timeout}
+    ${id}=   Create Network Service   ${NSD_NAME}   %{VIM_TARGET}   ${NS_NAME}   ${NS_CONFIG}   ${PUBLICKEY}   ${NS_TIMEOUT}
+    Log   ${id}
 
 Get Ns Id
+    [Documentation]   Get the NS id and save it NS_ID suite variable to use it later on.
     [Tags]   verify
-    ${id}=   Get Ns Id   ${ns_name}
-    Set Suite Variable   ${ns_id}   ${id}
+    ${id}=   Get Ns Id   ${NS_NAME}
+    Set Suite Variable   ${NS_ID}   ${id}
 
 Get Management Ip Addresses
+    [Documentation]   Get the mgmt IP address of the two VNF of the NS.
     [Tags]   verify
-    ${ip_addr_1}   Get Vnf Management Ip Address   ${ns_id}   ${vnf_member_index_1}
+    ${ip_addr_1}=   Get Vnf Management Ip Address   ${NS_ID}   ${VNF_MEMBER_INDEX_1}
     Log   ${ip_addr_1}
-    Set Suite Variable   ${vnf_1_ip_addr}   ${ip_addr_1}
-    ${ip_addr_2}   Get Vnf Management Ip Address   ${ns_id}   ${vnf_member_index_2}
+    Set Suite Variable   ${VNF_1_IP_ADDR}   ${ip_addr_1}
+    ${ip_addr_2}=   Get Vnf Management Ip Address   ${NS_ID}   ${VNF_MEMBER_INDEX_2}
     Log   ${ip_addr_2}
-    Set Suite Variable   ${vnf_2_ip_addr}   ${ip_addr_2}
-
+    Set Suite Variable   ${VNF_2_IP_ADDR}   ${ip_addr_2}
 
 Test SSH Access
+    [Documentation]   Check that both VNF are accessible via SSH in their respective mgmt IP address.
     [Tags]   verify
-    Variable Should Exist   ${vnf_1_ip_addr}   msg=IP address of the management VNF '${vnf_member_index_1}' is not available
-    Variable Should Exist   ${vnf_2_ip_addr}   msg=IP address of the management VNF '${vnf_member_index_2}' is not available
+    Variable Should Exist   ${VNF_1_IP_ADDR}   msg=IP address of the management VNF '${VNF_MEMBER_INDEX_1}' is not available
+    Variable Should Exist   ${VNF_2_IP_ADDR}   msg=IP address of the management VNF '${VNF_MEMBER_INDEX_2}' is not available
     Sleep   30s   Waiting ssh daemon to be up
-    Test SSH Connection   ${vnf_1_ip_addr}   ${username}   ${password}   ${privatekey}
-    Test SSH Connection   ${vnf_2_ip_addr}   ${username}   ${password}   ${privatekey}
-
+    Test SSH Connection   ${VNF_1_IP_ADDR}   ${USERNAME}   ${PASSWORD}   ${PRIVATEKEY}
+    Test SSH Connection   ${VNF_2_IP_ADDR}   ${USERNAME}   ${PASSWORD}   ${PRIVATEKEY}
 
 Check Remote Files Created Via Day 1 Operations
-    [Tags]   verify
-    [Documentation]   The Charm VNF has a Day 1 operation that creates a file named ${day_1_file_name}.
+    [Documentation]   The Charm VNF has a Day 1 operation that creates a file named ${DAY_1_FILE_NAME}.
     ...               This test checks whether that files have been created or not.
-
-    Check If remote File Exists   ${vnf_1_ip_addr}   ${username}   ${password}   ${privatekey}   ${day_1_file_name}
-    Check If remote File Exists   ${vnf_2_ip_addr}   ${username}   ${password}   ${privatekey}   ${day_1_file_name}
-
+    [Tags]   verify
+    Check If Remote File Exists   ${VNF_1_IP_ADDR}   ${USERNAME}   ${PASSWORD}   ${PRIVATEKEY}   ${DAY_1_FILE_NAME}
+    Check If Remote File Exists   ${VNF_2_IP_ADDR}   ${USERNAME}   ${PASSWORD}   ${PRIVATEKEY}   ${DAY_1_FILE_NAME}
 
 Execute Day 2 Operations
-    [Tags]   verify
     [Documentation]   Performs one Day 2 operation per VNF that creates a new file.
-
-    Variable Should Exist   ${ns_id}   msg=Network service instance is not available
-    ${ns_op_id_1}=   Execute NS Action   ${ns_name}   ${action_name}   ${vnf_member_index_1}   filename=${day_2_file_name_1}
-    ${ns_op_id_2}=   Execute NS Action   ${ns_name}   ${action_name}   ${vnf_member_index_2}   filename=${day_2_file_name_2}
-
+    [Tags]   verify
+    Variable Should Exist   ${NS_ID}   msg=Network service instance is not available
+    ${ns_op_id_1}=   Execute NS Action   ${NS_NAME}   ${ACTION_NAME}   ${VNF_MEMBER_INDEX_1}   filename=${DAY_2_FILE_NAME_1}
+    Log   ${ns_op_id_1}
+    ${ns_op_id_2}=   Execute NS Action   ${NS_NAME}   ${ACTION_NAME}   ${VNF_MEMBER_INDEX_2}   filename=${DAY_2_FILE_NAME_2}
+    Log   ${ns_op_id_2}
 
 Check Remote Files Created Via Day 2 Operations
-    [Tags]   verify
     [Documentation]   Check whether the files created in the previous test via Day 2 operations exist or not.
-
-    Check If remote File Exists   ${vnf_1_ip_addr}   ${username}   ${password}   ${privatekey}   ${day_2_file_name_1}
-    Check If remote File Exists   ${vnf_2_ip_addr}   ${username}   ${password}   ${privatekey}   ${day_2_file_name_2}
-
+    [Tags]   verify
+    Check If Remote File Exists   ${VNF_1_IP_ADDR}   ${USERNAME}   ${PASSWORD}   ${PRIVATEKEY}   ${DAY_2_FILE_NAME_1}
+    Check If Remote File Exists   ${VNF_2_IP_ADDR}   ${USERNAME}   ${PASSWORD}   ${PRIVATEKEY}   ${DAY_2_FILE_NAME_2}
 
 Delete NS Instance
+    [Documentation]   Delete NS instance.
     [Tags]   cleanup
-
-    Delete NS   ${ns_name}
-
+    Delete NS   ${NS_NAME}
 
 Delete NS Descriptor
+    [Documentation]   Delete NS package from OSM.
     [Tags]   cleanup
-
-    Delete NSD   ${nsd_name}
-
+    Delete NSD   ${NSD_NAME}
 
 Delete VNF Descriptor
+    [Documentation]   Delete NF package from OSM.
     [Tags]   cleanup
-
-    Delete VNFD   ${vnfd_name}
+    Delete VNFD   ${VNFD_NAME}
 
 
 *** Keywords ***
 Suite Cleanup
     [Documentation]   Test Suite Cleanup: Deleting descriptors and NS instance
-
-    Run Keyword If Any Tests Failed   Delete NS   ${ns_name}
-
-    Run Keyword If Any Tests Failed   Delete NSD   ${nsd_name}
-
-    Run Keyword If Any Tests Failed   Delete VNFD   ${vnfd_name}
-
+    Run Keyword If Any Tests Failed   Delete NS   ${NS_NAME}
+    Run Keyword If Any Tests Failed   Delete NSD   ${NSD_NAME}
+    Run Keyword If Any Tests Failed   Delete VNFD   ${VNFD_NAME}
index c70f550..3716896 100644 (file)
@@ -1,3 +1,4 @@
+*** Comments ***
 #   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
@@ -10,6 +11,7 @@
 #   See the License for the specific language governing permissions and
 #   limitations under the License.
 
+
 *** Settings ***
 Documentation   [K8s-07] Openldap Helm in isolated cluster with dummy VIM.
 
@@ -18,90 +20,102 @@ Library   String
 Library   Collections
 Library   Process
 
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/vim_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/vnfd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/nsd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ns_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/connectivity_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ssh_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/k8scluster_lib.robot
+Resource   ../lib/vim_lib.resource
+Resource   ../lib/vnfd_lib.resource
+Resource   ../lib/nsd_lib.resource
+Resource   ../lib/ns_lib.resource
+Resource   ../lib/connectivity_lib.resource
+Resource   ../lib/ssh_lib.resource
+Resource   ../lib/k8scluster_lib.resource
 
-Force Tags   k8s_07   cluster_k8s   daily   regression
+Test Tags   k8s_07   cluster_k8s   daily   regression   azure
 
 Suite Teardown   Run Keyword And Ignore Error   Suite Cleanup
 
 
 *** Variables ***
 # VIM Configuration
-${vim_name}   k8s07_dummy
-${vim_user}   user
-${vim_password}   pass
-${vim_auth_url}   http://localhost/dummy
-${vim_tenant}   tenant
-${vim_account_type}   dummy
+${VIM_NAME}   k8s07_dummy
+${VIM_USER}   user
+${VIM_PASSWORD}   pass
+${VIM_AUTH_URL}   http://localhost/dummy
+${VIM_TENANT}   tenant
+${VIM_ACCOUNT_TYPE}   dummy
 
 # K8s cluster data
-${k8scluster_name}   k8s07
-${k8scluster_version}   v1
-${k8scluster_net}   null
+${K8SCLUSTER_NAME}   k8s07
+${K8SCLUSTER_VERSION}   v1
+${K8SCLUSTER_NET}   null
 
 # NS and VNF descriptor package files
-${vnfd_pkg}   openldap_knf
-${nsd_pkg}   openldap_ns
-${vnfd_name}   openldap_knf
-${nsd_name}   openldap_ns
+${VNFD_PKG}   openldap_knf
+${NSD_PKG}   openldap_ns
+${VNFD_NAME}   openldap_knf
+${NSD_NAME}   openldap_ns
 
 # NS instance name
-${ns_name}   ldap
+${NS_NAME}   ldap
 
-${ns_id}   ${EMPTY}
-${ns_config}   ${EMPTY}
-${publickey}   ${EMPTY}
+${NS_ID}   ${EMPTY}
+${NS_CONFIG}   ${EMPTY}
+${PUBLICKEY}   ${EMPTY}
 
 
 *** Test Cases ***
 Create Package For OpenLDAP CNF
-    Create VNFD   '%{PACKAGES_FOLDER}/${vnfd_pkg}'
+    [Documentation]   Upload NF package for the testsuite.
+    Create VNFD   '%{PACKAGES_FOLDER}/${VNFD_PKG}'
 
 Create Package For OpenLDAP NS
-    Create NSD   '%{PACKAGES_FOLDER}/${nsd_pkg}'
+    [Documentation]   Upload NS package for the testsuite.
+    Create NSD   '%{PACKAGES_FOLDER}/${NSD_PKG}'
 
 Create Dummy VIM
-    ${created_vim_account_id}=   Create VIM Target   ${vim_name}   ${vim_user}   ${vim_password}   ${vim_auth_url}   ${vim_tenant}   ${vim_account_type}
+    [Documentation]   Register a VIM of type dummy in OSM.
+    ${created_vim_account_id}=   Create VIM Target   ${VIM_NAME}   ${VIM_USER}   ${VIM_PASSWORD}   ${VIM_AUTH_URL}   ${VIM_TENANT}   ${VIM_ACCOUNT_TYPE}
+    Log   ${created_vim_account_id}
 
 Add K8s Cluster To OSM
-    Create K8s Cluster   %{K8S_CREDENTIALS}   ${k8scluster_version}   ${vim_name}   ${k8scluster_net}   ${k8scluster_name}
+    [Documentation]   Register a K8s cluster associated to the dummy VIM.
+    Create K8s Cluster   %{K8S_CREDENTIALS}   ${K8SCLUSTER_VERSION}   ${VIM_NAME}   ${K8SCLUSTER_NET}   ${K8SCLUSTER_NAME}
+    Check For K8s Cluster To Be Ready   ${K8SCLUSTER_NAME}
 
 Create Network Service Instance
-    ${id}=   Create Network Service   ${nsd_name}   ${vim_name}   ${ns_name}   ${ns_config}   ${publickey}
-    Set Suite Variable   ${ns_id}   ${id}
+    [Documentation]   Instantiate NS for the testsuite.
+    ${id}=   Create Network Service   ${NSD_NAME}   ${VIM_NAME}   ${NS_NAME}   ${NS_CONFIG}   ${PUBLICKEY}
+    Set Suite Variable   ${NS_ID}   ${id}
 
 Delete Network Service Instance
+    [Documentation]   Delete NS instance.
     [Tags]   cleanup
-    Delete NS   ${ns_name}
+    Delete NS   ${NS_NAME}
 
 Remove K8s Cluster from OSM
+    [Documentation]   Remove K8s cluster from OSM.
     [Tags]   cleanup
-    Delete K8s Cluster   ${k8scluster_name}
+    Delete K8s Cluster   ${K8SCLUSTER_NAME}
 
 Delete VIM
+    [Documentation]   Remove VIM from OSM.
     [Tags]   cleanup
-    Delete VIM Target   ${vim_name}
+    Delete VIM Target   ${VIM_NAME}
 
 Delete NS Descriptor Test
+    [Documentation]   Delete NS package from OSM.
     [Tags]   cleanup
-    Delete NSD   ${nsd_name}
+    Delete NSD   ${NSD_NAME}
 
 Delete VNF Descriptor Test
+    [Documentation]   Delete NF package from OSM.
     [Tags]   cleanup
-    Delete VNFD   ${vnfd_name}
+    Delete VNFD   ${VNFD_NAME}
 
 
 *** Keywords ***
 Suite Cleanup
     [Documentation]   Test Suit Cleanup: Deleting Descriptor, instance, cluster and vim
-    Run Keyword If Any Tests Failed   Delete NS   ${ns_name}
-    Run Keyword If Any Tests Failed   Delete NSD   ${nsd_name}
-    Run Keyword If Any Tests Failed   Delete VNFD   ${vnfd_name}
-    Run Keyword If Any Tests Failed   Delete K8s Cluster   ${k8scluster_name}
-    Run Keyword If Any Tests Failed   Delete VIM Target   ${vim_name}
+    Run Keyword If Any Tests Failed   Delete NS   ${NS_NAME}
+    Run Keyword If Any Tests Failed   Delete NSD   ${NSD_NAME}
+    Run Keyword If Any Tests Failed   Delete VNFD   ${VNFD_NAME}
+    Run Keyword If Any Tests Failed   Delete K8s Cluster   ${K8SCLUSTER_NAME}
+    Run Keyword If Any Tests Failed   Delete VIM Target   ${VIM_NAME}
index 90171a1..034a702 100644 (file)
@@ -1,3 +1,4 @@
+*** Comments ***
 #   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
@@ -10,6 +11,7 @@
 #   See the License for the specific language governing permissions and
 #   limitations under the License.
 
+
 *** Settings ***
 Documentation   [K8s-08] Simple K8s Scale.
 
@@ -19,110 +21,115 @@ Library   Collections
 Library   Process
 Library   SSHLibrary
 
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/vnfd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/nsd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ns_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ssh_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/k8scluster_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/juju_lib.robot
+Resource   ../lib/vnfd_lib.resource
+Resource   ../lib/nsd_lib.resource
+Resource   ../lib/ns_lib.resource
+Resource   ../lib/ns_operation_lib.resource
+Resource   ../lib/ssh_lib.resource
+Resource   ../lib/k8scluster_lib.resource
+Resource   ../lib/juju_lib.resource
 
-Force Tags   k8s_08   cluster_k8s   daily   regression
+Test Tags   k8s_08   cluster_k8s   regression   azure
 
 Suite Teardown   Run Keyword And Ignore Error   Suite Cleanup
 
 
 *** Variables ***
 # NS and VNF descriptor package folder and ids
-${vnfd_pkg}   charm-packages/native_k8s_scale_charm_vnf
-${vnfd_name}   native_k8s_scale_charm-vnf
-${nsd_pkg}   charm-packages/native_k8s_scale_charm_ns
-${nsd_name}   native_k8s_scale_charm-ns
+${VNFD_PKG}   charm-packages/native_k8s_scale_charm_vnf
+${VNFD_NAME}   native_k8s_scale_charm-vnf
+${NSD_PKG}   charm-packages/native_k8s_scale_charm_ns
+${NSD_NAME}   native_k8s_scale_charm-ns
 
-${kdu_name}   native-kdu
-${application_name}   nginx
-${vnf_member_index}   native_k8s_scale_charm-vnf
-${instantiation_count}   2
+${KDU_NAME}   native-kdu
+${APPLICATION_NAME}   nginx
+${VNF_MEMBER_INDEX}   native_k8s_scale_charm-vnf
+${INSTANTIATION_COUNT}   2
 
 # NS instance name and configuration
-${ns_name}   native-k8s-scale
-${ns_config}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ], additionalParamsForVnf: [{member-vnf-index: ${vnf_member_index}, additionalParamsForKdu: [{ kdu_name: ${kdu_name}, additionalParams: { overlay: { applications: { ${application_name}: { scale: ${instantiation_count} } }}}}]}]}
-${ns_id}   ${EMPTY}
-${publickey}   %{HOME}/.ssh/id_rsa.pub
+${NS_NAME}   native-k8s-scale
+${NS_CONFIG}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ], additionalParamsForVnf: [{member-vnf-index: ${VNF_MEMBER_INDEX}, additionalParamsForKdu: [{ kdu_name: ${KDU_NAME}, additionalParams: { overlay: { applications: { ${APPLICATION_NAME}: { scale: ${INSTANTIATION_COUNT} } }}}}]}]}
+${NS_ID}   ${EMPTY}
+${PUBLICKEY}   %{HOME}/.ssh/id_rsa.pub
 
 # Username and SSH private key for accessing OSM host
-${username}   ubuntu
-${password}   ${EMPTY}
-${privatekey}   %{OSM_RSA_FILE}
+${USERNAME}   ubuntu
+${PASSWORD}   ${EMPTY}
+${PRIVATEKEY}   %{OSM_RSA_FILE}
+
+${MODEL_NAME}   ${EMPTY}
+${ACTION_NAME}   changecontent
+${SCALING_GROUP}   scale-kdu
 
-${model_name}   ${EMPTY}
-${action_name}   changecontent
-${scaling_group}   scale-kdu
 
 *** Test Cases ***
 Create Simple K8s Scale VNF Descriptor
-    Create VNFD   '%{PACKAGES_FOLDER}/${vnfd_pkg}'
+    [Documentation]   Upload VNF package for the testsuite.
+    Create VNFD   '%{PACKAGES_FOLDER}/${VNFD_PKG}'
 
 Create Simple K8s Scale NS Descriptor
-    Create NSD   '%{PACKAGES_FOLDER}/${nsd_pkg}'
+    [Documentation]   Upload NS package for the testsuite.
+    Create NSD   '%{PACKAGES_FOLDER}/${NSD_PKG}'
 
 Network Service K8s Instance Test
-    ${id}=   Create Network Service   ${nsd_name}   %{VIM_TARGET}   ${ns_name}   ${ns_config}   ${publickey}
-    Set Suite Variable   ${ns_id}   ${id}
+    [Documentation]   Instantiate NS for the testsuite.
+    ${id}=   Create Network Service   ${NSD_NAME}   %{VIM_TARGET}   ${NS_NAME}   ${NS_CONFIG}   ${PUBLICKEY}
+    Set Suite Variable   ${NS_ID}   ${id}
 
 Get KDU Model Name
     [Documentation]   Get the model name of the network service k8s instance
-
-    Variable Should Exist   ${ns_id}   msg=Network service instance is not available
-    ${name}=   Get Model Name   %{OSM_HOSTNAME}   ${username}   ${password}   ${privatekey}   ${ns_id}   ${kdu_name}
-    Set Suite Variable   ${model_name}   ${name}
+    Variable Should Exist   ${NS_ID}   msg=Network service instance is not available
+    ${name}=   Get Model Name   %{OSM_HOSTNAME}   ${USERNAME}   ${PASSWORD}   ${PRIVATEKEY}   ${NS_ID}   ${KDU_NAME}
+    Set Suite Variable   ${MODEL_NAME}   ${name}
 
 Get Scale Count Before Scale Out
     [Documentation]   Get the scale count of the application of network service k8s instance
-
-    Variable Should Exist   ${model_name}   msg=Model name is not available
-    ${kdu_count}=   Get Scale Number   %{OSM_HOSTNAME}   ${username}   ${password}   ${privatekey}   ${application_name}   ${model_name}
-    Set Suite Variable   ${initial_kdu_count}   ${kdu_count}
-    Run Keyword If   ${initial_kdu_count} != ${instantiation_count}   Fail   msg=Instantiation parameters were not applied.
+    Variable Should Exist   ${MODEL_NAME}   msg=Model name is not available
+    ${kdu_count}=   Get Scale Number   %{OSM_HOSTNAME}   ${USERNAME}   ${PASSWORD}   ${PRIVATEKEY}   ${APPLICATION_NAME}   ${MODEL_NAME}
+    Set Suite Variable   ${INITIAL_KDU_COUNT}   ${kdu_count}
+    IF   ${INITIAL_KDU_COUNT} != ${INSTANTIATION_COUNT}   Fail   msg=Instantiation parameters were not applied.
 
 Perform Manual KDU Scale Out
     [Documentation]   Scale out the application of network service k8s instance.
-
-    ${ns_op_id_2}=   Execute Manual VNF Scale   ${ns_name}   ${vnf_member_index}   ${scaling_group}   SCALE_OUT
+    ${ns_op_id_2}=   Execute Manual VNF Scale   ${NS_NAME}   ${VNF_MEMBER_INDEX}   ${SCALING_GROUP}   SCALE_OUT
+    Log   ${ns_op_id_2}
 
 Check Scale Count After Scale Out
     [Documentation]   Check whether the scale count is more than one.
 
-    Variable Should Exist   ${initial_kdu_count}   msg=Initial KDU count is not available
-    ${kdu_count}=   Get Scale Number   %{OSM_HOSTNAME}   ${username}   ${password}   ${privatekey}   ${application_name}   ${model_name}
-    Run Keyword If   ${kdu_count} != ${initial_kdu_count} + 1   Fail   msg=There is no new KDU in the model after Scale Out
+    Variable Should Exist   ${INITIAL_KDU_COUNT}   msg=Initial KDU count is not available
+    ${kdu_count}=   Get Scale Number   %{OSM_HOSTNAME}   ${USERNAME}   ${PASSWORD}   ${PRIVATEKEY}   ${APPLICATION_NAME}   ${MODEL_NAME}
+    IF   ${kdu_count} != ${INITIAL_KDU_COUNT} + 1   Fail   msg=There is no new KDU in the model after Scale Out
 
 Perform Manual KDU Scale In
     [Documentation]   Scale in the application of network service k8s instance.
-
-    ${ns_op_id_3}=   Execute Manual VNF Scale   ${ns_name}   ${vnf_member_index}   ${scaling_group}   SCALE_IN
+    ${ns_op_id_3}=   Execute Manual VNF Scale   ${NS_NAME}   ${VNF_MEMBER_INDEX}   ${SCALING_GROUP}   SCALE_IN
+    Log   ${ns_op_id_3}
 
 Check Scale Count After Scale In
     [Documentation]   Check whether the scale count is one less.
-
-    ${kdu_count}=   Get Scale Number   %{OSM_HOSTNAME}   ${username}   ${password}   ${privatekey}   ${application_name}   ${model_name}
-    Run Keyword If   ${kdu_count} != ${initial_kdu_count}   Fail   msg=There is the same number of KDU in the model after Scale In
+    ${kdu_count}=   Get Scale Number   %{OSM_HOSTNAME}   ${USERNAME}   ${PASSWORD}   ${PRIVATEKEY}   ${APPLICATION_NAME}   ${MODEL_NAME}
+    IF   ${kdu_count} != ${INITIAL_KDU_COUNT}   Fail   msg=There is the same number of KDU in the model after Scale In
 
 Delete NS K8s Instance Test
+    [Documentation]   Delete NS instance.
     [Tags]   cleanup
-    Delete NS   ${ns_name}
+    Delete NS   ${NS_NAME}
 
 Delete NS Descriptor Test
+    [Documentation]   Delete NS package from OSM.
     [Tags]   cleanup
-    Delete NSD   ${nsd_name}
+    Delete NSD   ${NSD_NAME}
 
 Delete VNF Descriptor Test
+    [Documentation]   Delete NF package from OSM.
     [Tags]   cleanup
-    Delete VNFD   ${vnfd_name}
+    Delete VNFD   ${VNFD_NAME}
 
 
 *** Keywords ***
 Suite Cleanup
     [Documentation]   Test Suit Cleanup: Deleting Descriptor, instance and vim
-    Run Keyword If Any Tests Failed   Delete NS   ${ns_name}
-    Run Keyword If Any Tests Failed   Delete NSD   ${nsd_name}
-    Run Keyword If Any Tests Failed   Delete VNFD   ${vnfd_name}
+    Run Keyword If Any Tests Failed   Delete NS   ${NS_NAME}
+    Run Keyword If Any Tests Failed   Delete NSD   ${NSD_NAME}
+    Run Keyword If Any Tests Failed   Delete VNFD   ${VNFD_NAME}
index 57d12ee..40c4ddb 100644 (file)
@@ -1,3 +1,4 @@
+*** Comments ***
 #   Copyright 2020 Canonical Ltd.
 #
 #   Licensed under the Apache License, Version 2.0 (the "License");
@@ -12,6 +13,7 @@
 #   See the License for the specific language governing permissions and
 #   limitations under the License.
 
+
 *** Settings ***
 Documentation   [K8s-09] Pebble Charm.
 
@@ -20,76 +22,85 @@ Library   String
 Library   Collections
 Library   Process
 
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/vnfd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/nsd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ns_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/package_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/connectivity_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ssh_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/k8scluster_lib.robot
+Resource   ../lib/vnfd_lib.resource
+Resource   ../lib/nsd_lib.resource
+Resource   ../lib/ns_lib.resource
+Resource   ../lib/ns_operation_lib.resource
+Resource   ../lib/package_lib.resource
+Resource   ../lib/connectivity_lib.resource
+Resource   ../lib/ssh_lib.resource
+Resource   ../lib/k8scluster_lib.resource
 
-Force Tags   k8s_09   cluster_k8s   daily   regression
+Test Tags   k8s_09   cluster_k8s   regression   azure
 
 Suite Teardown   Run Keyword And Ignore Error   Suite Cleanup
 
 
 *** Variables ***
 # NS and VNF descriptor package folder and ids
-${vnfd_pkg}   charm-packages/pebble_charm_vnf
-${vnfd_name}   pebble_charm-vnf
-${nsd_pkg}   charm-packages/pebble_charm_ns
-${nsd_name}   pebble_charm-ns
+${VNFD_PKG}   charm-packages/pebble_charm_vnf
+${VNFD_NAME}   pebble_charm-vnf
+${NSD_PKG}   charm-packages/pebble_charm_ns
+${NSD_NAME}   pebble_charm-ns
 
 # NS instance name and configuration
-${ns_name}   pebble-charm-k8s
-${ns_config}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
+${NS_NAME}   pebble-charm-k8s
+${NS_CONFIG}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
+
+${NS_ID}   ${EMPTY}
+${PUBLICKEY}   ${EMPTY}
+${VNF_MEMBER_INDEX}   pebble_charm-vnf
+${ACTION_NAME}   list-available-apps
+${KDU_NAME}   onos-kdu
+${APPLICATION_NAME}   onos
 
-${ns_id}   ${EMPTY}
-${publickey}   ${EMPTY}
-${vnf_member_index}   pebble_charm-vnf
-${action_name}   list-available-apps
-${kdu_name}   onos-kdu
-${application_name}   onos
-${customtitle}   Day 2 Action
 
 *** Test Cases ***
 Create Simple K8s VNF Descriptor
-    Create VNFD   '%{PACKAGES_FOLDER}/${vnfd_pkg}'
+    [Documentation]   Upload VNF package for the testsuite.
+    Create VNFD   '%{PACKAGES_FOLDER}/${VNFD_PKG}'
 
 Create Simple K8s Descriptor
-    Create NSD   '%{PACKAGES_FOLDER}/${nsd_pkg}'
+    [Documentation]   Upload NS package for the testsuite.
+    Create NSD   '%{PACKAGES_FOLDER}/${NSD_PKG}'
 
 Network Service K8s Instance Test
-    ${id}=   Create Network Service   ${nsd_name}   %{VIM_TARGET}   ${ns_name}   ${ns_config}   ${publickey}
-    Set Suite Variable   ${ns_id}   ${id}
+    [Documentation]   Instantiate NS for the testsuite.
+    ${id}=   Create Network Service   ${NSD_NAME}   %{VIM_TARGET}   ${NS_NAME}   ${NS_CONFIG}   ${PUBLICKEY}
+    Set Suite Variable   ${NS_ID}   ${id}
 
 Execute Day 2 Operations
     [Documentation]   Performs one Day 2 operation per VNF that creates a new file.
 
-    Variable Should Exist   ${ns_id}   msg=Network service instance is not available
-    ${ns_op_id}=   Execute NS K8s Action   ${ns_name}   ${action_name}   ${vnf_member_index}   ${kdu_name}   application-name=${application_name}
+    Variable Should Exist   ${NS_ID}   msg=Network service instance is not available
+    ${ns_op_id}=   Execute NS K8s Action   ${NS_NAME}   ${ACTION_NAME}   ${VNF_MEMBER_INDEX}   ${KDU_NAME}   application-name=${APPLICATION_NAME}
+    Log   ${ns_op_id}
 
 Delete NS K8s Instance Test
+    [Documentation]   Delete NS instance.
     [Tags]   cleanup
-    Delete NS   ${ns_name}
+    Delete NS   ${NS_NAME}
 
 Delete NS Descriptor Test
+    [Documentation]   Delete the NS package.
     [Tags]   cleanup
-    Delete NSD   ${nsd_name}
+    Delete NSD   ${NSD_NAME}
 
 Delete VNF Descriptor Test
+    [Documentation]   Delete the VNF package.
     [Tags]   cleanup
-    Delete VNFD   ${vnfd_name}
+    Delete VNFD   ${VNFD_NAME}
 
 Delete VNF NS Packages
+    [Documentation]   Delete the tar.gz files associated to the VNF and NS packages.
     [Tags]   cleanup
-    Delete Package   '%{PACKAGES_FOLDER}/${vnfd_pkg}'
-    Delete Package   '%{PACKAGES_FOLDER}/${nsd_pkg}'
+    Delete Package   '%{PACKAGES_FOLDER}/${VNFD_PKG}'
+    Delete Package   '%{PACKAGES_FOLDER}/${NSD_PKG}'
 
 
 *** Keywords ***
 Suite Cleanup
     [Documentation]   Test Suit Cleanup: Deleting Descriptor, instance and vim
-    Run Keyword If Any Tests Failed   Delete NS   ${ns_name}
-    Run Keyword If Any Tests Failed   Delete NSD   ${nsd_name}
-    Run Keyword If Any Tests Failed   Delete VNFD   ${vnfd_name}
+    Run Keyword If Any Tests Failed   Delete NS   ${NS_NAME}
+    Run Keyword If Any Tests Failed   Delete NSD   ${NSD_NAME}
+    Run Keyword If Any Tests Failed   Delete VNFD   ${VNFD_NAME}
index cd8cb11..29fbea7 100644 (file)
@@ -1,3 +1,4 @@
+*** Comments ***
 #   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
 #   See the License for the specific language governing permissions and
 #   limitations under the License.
 
+
 *** Settings ***
 Documentation   [K8s-10] K8s Proxy Charm using SOL004 and SOL007 packages.
 
 Library   OperatingSystem
 Library   SSHLibrary
 
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/vnfd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/nsd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ns_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ssh_lib.robot
+Resource   ../lib/vnfd_lib.resource
+Resource   ../lib/nsd_lib.resource
+Resource   ../lib/ns_lib.resource
+Resource   ../lib/ns_operation_lib.resource
+Resource   ../lib/ssh_lib.resource
 
-Force Tags   k8s_10   cluster_ee_config   cluster_k8s_charms   daily   regression
+Test Tags   k8s_10   cluster_ee_config   cluster_k8s_charms   regression   azure
 
 Suite Teardown   Run Keyword And Ignore Error   Suite Cleanup
 
 
 *** Variables ***
 # NS and VNF descriptor package folder and ids
-${vnfd_pkg}   charm-packages/sol004_k8s_proxy_charm_vnf
-${vnfd_name}   sol004_k8s_proxy_charm-vnf
-${nsd_pkg}   charm-packages/sol007_k8s_proxy_charm_ns
-${nsd_name}   sol007_k8s_proxy_charm-ns
+${VNFD_PKG}   charm-packages/sol004_k8s_proxy_charm_vnf
+${VNFD_NAME}   sol004_k8s_proxy_charm-vnf
+${NSD_PKG}   charm-packages/sol007_k8s_proxy_charm_ns
+${NSD_NAME}   sol007_k8s_proxy_charm-ns
 
 # NS instance name and configuration
-${ns_name}   k8s_10-k8s_proxy_charm
-${ns_config}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
-${ns_timeout}   15min
+${NS_NAME}   k8s_10-k8s_proxy_charm
+${NS_CONFIG}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
+${NS_TIMEOUT}   15min
 
 # SSH keys and username to be used
-${publickey}   %{HOME}/.ssh/id_rsa.pub
-${privatekey}   %{HOME}/.ssh/id_rsa
-${username}   ubuntu
-${password}   ${EMPTY}
+${PUBLICKEY}   %{HOME}/.ssh/id_rsa.pub
+${PRIVATEKEY}   %{HOME}/.ssh/id_rsa
+${USERNAME}   ubuntu
+${PASSWORD}   ${EMPTY}
 
-${action_name}   touch
-${vnf_member_index_1}   vnf1
-${vnf_member_index_2}   vnf2
-${day_1_file_name}   /home/ubuntu/first-touch
-${day_2_file_name_1}   /home/ubuntu/mytouch1
-${day_2_file_name_2}   /home/ubuntu/mytouch2
+${ACTION_NAME}   touch
+${VNF_MEMBER_INDEX_1}   vnf1
+${VNF_MEMBER_INDEX_2}   vnf2
+${DAY_1_FILE_NAME}   /home/ubuntu/first-touch
+${DAY_2_FILE_NAME_1}   /home/ubuntu/mytouch1
+${DAY_2_FILE_NAME_2}   /home/ubuntu/mytouch2
 
 
 *** Test Cases ***
 Create Charm VNF Descriptor
-
-    Create VNFD   '%{PACKAGES_FOLDER}/${vnfd_pkg}'
-
+    [Documentation]   Upload VNF package for the testsuite.
+    Create VNFD   '%{PACKAGES_FOLDER}/${VNFD_PKG}'
 
 Create Charm NS Descriptor
-
-    Create NSD   '%{PACKAGES_FOLDER}/${nsd_pkg}'
-
+    [Documentation]   Upload NS package for the testsuite.
+    Create NSD   '%{PACKAGES_FOLDER}/${NSD_PKG}'
 
 Instantiate Charm Network Service
-
-    ${id}=   Create Network Service   ${nsd_name}   %{VIM_TARGET}   ${ns_name}   ${ns_config}   ${publickey}   ${ns_timeout}
-    Set Suite Variable   ${ns_id}   ${id}
-
+    [Documentation]   Instantiate NS for the testsuite.
+    ${id}=   Create Network Service   ${NSD_NAME}   %{VIM_TARGET}   ${NS_NAME}   ${NS_CONFIG}   ${PUBLICKEY}   ${NS_TIMEOUT}
+    Set Suite Variable   ${NS_ID}   ${id}
 
 Get Management Ip Addresses
-
-    ${ip_addr_1}   Get Vnf Management Ip Address   ${ns_id}   ${vnf_member_index_1}
+    [Documentation]   Get the mgmt IP addresses of both VNF of the NS.
+    ${ip_addr_1}=   Get Vnf Management Ip Address   ${NS_ID}   ${VNF_MEMBER_INDEX_1}
     Log   ${ip_addr_1}
-    Set Suite Variable   ${vnf_1_ip_addr}   ${ip_addr_1}
-    ${ip_addr_2}   Get Vnf Management Ip Address   ${ns_id}   ${vnf_member_index_2}
+    Set Suite Variable   ${VNF_1_IP_ADDR}   ${ip_addr_1}
+    ${ip_addr_2}=   Get Vnf Management Ip Address   ${NS_ID}   ${VNF_MEMBER_INDEX_2}
     Log   ${ip_addr_2}
-    Set Suite Variable   ${vnf_2_ip_addr}   ${ip_addr_2}
-
+    Set Suite Variable   ${VNF_2_IP_ADDR}   ${ip_addr_2}
 
 Test SSH Access
-
-    Variable Should Exist   ${vnf_1_ip_addr}   msg=IP address of the management VNF '${vnf_member_index_1}' is not available
-    Variable Should Exist   ${vnf_2_ip_addr}   msg=IP address of the management VNF '${vnf_member_index_2}' is not available
+    [Documentation]   Check that both VNF are accessible via SSH in their mgmt IP addresses.
+    Variable Should Exist   ${VNF_1_IP_ADDR}   msg=IP address of the management VNF '${VNF_MEMBER_INDEX_1}' is not available
+    Variable Should Exist   ${VNF_2_IP_ADDR}   msg=IP address of the management VNF '${VNF_MEMBER_INDEX_2}' is not available
     Sleep   30s   Waiting ssh daemon to be up
-    Test SSH Connection   ${vnf_1_ip_addr}   ${username}   ${password}   ${privatekey}
-    Test SSH Connection   ${vnf_2_ip_addr}   ${username}   ${password}   ${privatekey}
-
+    Test SSH Connection   ${VNF_1_IP_ADDR}   ${USERNAME}   ${PASSWORD}   ${PRIVATEKEY}
+    Test SSH Connection   ${VNF_2_IP_ADDR}   ${USERNAME}   ${PASSWORD}   ${PRIVATEKEY}
 
 Check Remote Files Created Via Day 1 Operations
     [Documentation]   The Charm VNF has a Day 1 operation that creates a file named ${day_1_file_name}.
     ...               This test checks whether that files have been created or not.
-
-    Check If remote File Exists   ${vnf_1_ip_addr}   ${username}   ${password}   ${privatekey}   ${day_1_file_name}
-    Check If remote File Exists   ${vnf_2_ip_addr}   ${username}   ${password}   ${privatekey}   ${day_1_file_name}
-
+    Check If Remote File Exists   ${VNF_1_IP_ADDR}   ${USERNAME}   ${PASSWORD}   ${PRIVATEKEY}   ${DAY_1_FILE_NAME}
+    Check If Remote File Exists   ${VNF_2_IP_ADDR}   ${USERNAME}   ${PASSWORD}   ${PRIVATEKEY}   ${DAY_1_FILE_NAME}
 
 Execute Day 2 Operations
     [Documentation]   Performs one Day 2 operation per VNF that creates a new file.
-
-    Variable Should Exist   ${ns_id}   msg=Network service instance is not available
-    ${ns_op_id_1}=   Execute NS Action   ${ns_name}   ${action_name}   ${vnf_member_index_1}   filename=${day_2_file_name_1}
-    ${ns_op_id_2}=   Execute NS Action   ${ns_name}   ${action_name}   ${vnf_member_index_2}   filename=${day_2_file_name_2}
-
+    Variable Should Exist   ${NS_ID}   msg=Network service instance is not available
+    ${ns_op_id_1}=   Execute NS Action   ${NS_NAME}   ${ACTION_NAME}   ${VNF_MEMBER_INDEX_1}   filename=${DAY_2_FILE_NAME_1}
+    Log   ${ns_op_id_1}
+    ${ns_op_id_2}=   Execute NS Action   ${NS_NAME}   ${ACTION_NAME}   ${VNF_MEMBER_INDEX_2}   filename=${DAY_2_FILE_NAME_2}
+    Log   ${ns_op_id_2}
 
 Check Remote Files Created Via Day 2 Operations
     [Documentation]   Check whether the files created in the previous test via Day 2 operations exist or not.
-
-    Check If remote File Exists   ${vnf_1_ip_addr}   ${username}   ${password}   ${privatekey}   ${day_2_file_name_1}
-    Check If remote File Exists   ${vnf_2_ip_addr}   ${username}   ${password}   ${privatekey}   ${day_2_file_name_2}
-
+    Check If Remote File Exists   ${VNF_1_IP_ADDR}   ${USERNAME}   ${PASSWORD}   ${PRIVATEKEY}   ${DAY_2_FILE_NAME_1}
+    Check If Remote File Exists   ${VNF_2_IP_ADDR}   ${USERNAME}   ${PASSWORD}   ${PRIVATEKEY}   ${DAY_2_FILE_NAME_2}
 
 Delete NS Instance
+    [Documentation]   Delete NS instance.
     [Tags]   cleanup
-
-    Delete NS   ${ns_name}
-
+    Delete NS   ${NS_NAME}
 
 Delete NS Descriptor
+    [Documentation]   Delete NS package from OSM.
     [Tags]   cleanup
-
-    Delete NSD   ${nsd_name}
-
+    Delete NSD   ${NSD_NAME}
 
 Delete VNF Descriptor
+    [Documentation]   Delete VNF package from OSM.
     [Tags]   cleanup
-
-    Delete VNFD   ${vnfd_name}
+    Delete VNFD   ${VNFD_NAME}
 
 
 *** Keywords ***
 Suite Cleanup
     [Documentation]   Test Suite Cleanup: Deleting descriptors and NS instance
-
-    Run Keyword If Any Tests Failed   Delete NS   ${ns_name}
-
-    Run Keyword If Any Tests Failed   Delete NSD   ${nsd_name}
-
-    Run Keyword If Any Tests Failed   Delete VNFD   ${vnfd_name}
-
+    Run Keyword If Any Tests Failed   Delete NS   ${NS_NAME}
+    Run Keyword If Any Tests Failed   Delete NSD   ${NSD_NAME}
+    Run Keyword If Any Tests Failed   Delete VNFD   ${VNFD_NAME}
index f5a73a7..f818a04 100644 (file)
@@ -1,3 +1,4 @@
+*** Comments ***
 #   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
@@ -10,6 +11,7 @@
 #   See the License for the specific language governing permissions and
 #   limitations under the License.
 
+
 *** Settings ***
 Documentation   [K8s-11] Simple Helm K8s Scale.
 
@@ -19,117 +21,127 @@ Library   Collections
 Library   Process
 Library   SSHLibrary
 
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/vnfd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/nsd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ns_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/connectivity_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ssh_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/k8scluster_lib.robot
+Resource   ../lib/vnfd_lib.resource
+Resource   ../lib/nsd_lib.resource
+Resource   ../lib/ns_lib.resource
+Resource   ../lib/ns_operation_lib.resource
+Resource   ../lib/connectivity_lib.resource
+Resource   ../lib/ssh_lib.resource
+Resource   ../lib/k8scluster_lib.resource
 
-Force Tags   k8s_11   cluster_k8s
+Test Tags   k8s_11   cluster_k8s
 
 Suite Teardown   Run Keyword And Ignore Error   Suite Cleanup
 
 
 *** Variables ***
 # K8s cluster name and version
-${k8scluster_name}   k8s11
-${k8scluster_version}   v1
+${K8SCLUSTER_NAME}   k8s11
+${K8SCLUSTER_VERSION}   v1
 
 # NS and VNF descriptor package folder and ids
-${vnfd_pkg}   openldap_scale_knf
-${vnfd_name}   openldap_scale_knf
-${nsd_pkg}   openldap_scale_ns
-${nsd_name}   openldap_scale_ns
+${VNFD_PKG}   openldap_scale_knf
+${VNFD_NAME}   openldap_scale_knf
+${NSD_PKG}   openldap_scale_ns
+${NSD_NAME}   openldap_scale_ns
 
 # NS instance name and configuration
-${ns_name}   openldap-scale
-${ns_config}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
+${NS_NAME}   openldap-scale
+${NS_CONFIG}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
 
 # Username and SSH private key for accessing OSM host
-${username}   ubuntu
-${password}   ${EMPTY}
-${privatekey}   %{OSM_RSA_FILE}
+${USERNAME}   ubuntu
+${PASSWORD}   ${EMPTY}
+${PRIVATEKEY}   %{OSM_RSA_FILE}
+
+${NS_ID}   ${EMPTY}
+${PUBLICKEY}   %{HOME}/.ssh/id_rsa.pub
+${VNF_MEMBER_INDEX}   openldap
+${KDU_NAME}   native-kdu
+${SCALING_GROUP}   scale-kdu
 
-${ns_id}   ${EMPTY}
-${publickey}   %{HOME}/.ssh/id_rsa.pub
-${vnf_member_index}   openldap
-${kdu_name}   native-kdu
-${scaling_group}   scale-kdu
 
 *** Test Cases ***
 Create Simple K8s Scale VNF Descriptor
-    Create VNFD   '%{PACKAGES_FOLDER}/${vnfd_pkg}'
+    [Documentation]   Upload VNF package for the testsuite.
+    Create VNFD   '%{PACKAGES_FOLDER}/${VNFD_PKG}'
 
 Create Simple K8s Scale NS Descriptor
-    Create NSD   '%{PACKAGES_FOLDER}/${nsd_pkg}'
+    [Documentation]   Upload NS package for the testsuite.
+    Create NSD   '%{PACKAGES_FOLDER}/${NSD_PKG}'
 
 Add K8s Cluster To OSM
-    Create K8s Cluster   %{K8S_CREDENTIALS}   ${k8scluster_version}   %{VIM_TARGET}   %{VIM_MGMT_NET}   ${k8scluster_name}
+    [Documentation]   Register K8s cluster in OSM.
+    Create K8s Cluster   %{K8S_CREDENTIALS}   ${K8SCLUSTER_VERSION}   %{VIM_TARGET}   %{VIM_MGMT_NET}   ${K8SCLUSTER_NAME}
+    Check For K8s Cluster To Be Ready   ${K8SCLUSTER_NAME}
 
 Create Network Service Instance
-    ${id}=   Create Network Service   ${nsd_name}   %{VIM_TARGET}   ${ns_name}   ${ns_config}   ${publickey}
-    Set Suite Variable   ${ns_id}   ${id}
+    [Documentation]   Instantiate NS for the testsuite.
+    ${id}=   Create Network Service   ${NSD_NAME}   %{VIM_TARGET}   ${NS_NAME}   ${NS_CONFIG}   ${PUBLICKEY}
+    Set Suite Variable   ${NS_ID}   ${id}
 
 Get Vnf Id
-    Variable Should Exist   ${ns_id}   msg=Network service instance is not available
-    @{vnfr_list}=   Get Ns Vnfr Ids   ${ns_id}
+    [Documentation]   Get VNF identifier from OSM.
+    Variable Should Exist   ${NS_ID}   msg=Network service instance is not available
+    @{vnfr_list}=   Get Ns Vnfr Ids   ${NS_ID}
     Log List   ${vnfr_list}
-    Set Suite Variable   ${vnf_id}   ${vnfr_list}[0]
+    Set Suite Variable   ${VNF_ID}   ${vnfr_list}[0]
 
 Get Scale Count Before Scale Out
     [Documentation]   Get the scale count of the application of network service k8s instance
-
-    Variable Should Exist   ${ns_id}   msg=Network service instance is not available
-    ${kdu_count}=   Get Vnf Kdu Replica Count   ${vnf_id}   ${kdu_name}
+    Variable Should Exist   ${NS_ID}   msg=Network service instance is not available
+    ${kdu_count}=   Get Vnf Kdu Replica Count   ${VNF_ID}   ${KDU_NAME}
     Log   ${kdu_count}
-    Set Suite Variable   ${initial_kdu_count}   ${kdu_count}
+    Set Suite Variable   ${INITIAL_KDU_COUNT}   ${kdu_count}
 
 Perform Manual KDU Scale Out
     [Documentation]   Scale out the application of network service k8s instance.
-
-    ${ns_op_id_1}=   Execute Manual VNF Scale   ${ns_name}   ${vnf_member_index}   ${scaling_group}   SCALE_OUT
+    ${ns_op_id_1}=   Execute Manual VNF Scale   ${NS_NAME}   ${VNF_MEMBER_INDEX}   ${SCALING_GROUP}   SCALE_OUT
+    Log   ${ns_op_id_1}
 
 Check Scale Count After Scale Out
     [Documentation]   Check whether the scale count is more than one.
 
-    Variable Should Exist   ${initial_kdu_count}   msg=Initial KDU count is not available
-    ${kdu_count}=   Get Vnf Kdu Replica Count   ${vnf_id}   ${kdu_name}
+    Variable Should Exist   ${INITIAL_KDU_COUNT}   msg=Initial KDU count is not available
+    ${kdu_count}=   Get Vnf Kdu Replica Count   ${VNF_ID}   ${KDU_NAME}
     Log   ${kdu_count}
-    Run Keyword If   ${kdu_count} != ${initial_kdu_count} + 2   Fail   msg=There is no new KDU in the model after Scale Out
+    IF   ${kdu_count} != ${INITIAL_KDU_COUNT} + 2   Fail   msg=There is no new KDU in the model after Scale Out
 
 Perform Manual KDU Scale In
     [Documentation]   Scale in the application of network service k8s instance.
-
-    ${ns_op_id_2}=   Execute Manual VNF Scale   ${ns_name}   ${vnf_member_index}   ${scaling_group}   SCALE_IN
+    ${ns_op_id_2}=   Execute Manual VNF Scale   ${NS_NAME}   ${VNF_MEMBER_INDEX}   ${SCALING_GROUP}   SCALE_IN
+    Log   ${ns_op_id_2}
 
 Check Scale Count After Scale In
     [Documentation]   Check whether the scale count is one less.
-
-    ${kdu_count}=   Get Vnf Kdu Replica Count   ${vnf_id}   ${kdu_name}
-    Run Keyword If   ${kdu_count} != ${initial_kdu_count}   Fail   msg=There is the same number of KDU in the model after Scale In
+    ${kdu_count}=   Get Vnf Kdu Replica Count   ${VNF_ID}   ${KDU_NAME}
+    IF   ${kdu_count} != ${INITIAL_KDU_COUNT}   Fail   msg=There is the same number of KDU in the model after Scale In
 
 Delete NS K8s Instance Test
+    [Documentation]   Delete NS instance.
     [Tags]   cleanup
-    Delete NS   ${ns_name}
+    Delete NS   ${NS_NAME}
 
 Remove K8s Cluster from OSM
+    [Documentation]   Unregister K8s cluster from OSM.
     [Tags]   cleanup
-    Delete K8s Cluster   ${k8scluster_name}
+    Delete K8s Cluster   ${K8SCLUSTER_NAME}
 
 Delete NS Descriptor Test
+    [Documentation]   Delete NS package from OSM.
     [Tags]   cleanup
-    Delete NSD   ${nsd_name}
+    Delete NSD   ${NSD_NAME}
 
 Delete VNF Descriptor Test
+    [Documentation]   Delete NF package from OSM.
     [Tags]   cleanup
-    Delete VNFD   ${vnfd_name}
+    Delete VNFD   ${VNFD_NAME}
 
 
 *** Keywords ***
 Suite Cleanup
     [Documentation]   Test Suit Cleanup: Deleting Descriptor, instance and vim
-    Run Keyword If Any Tests Failed   Delete NS   ${ns_name}
-    Run Keyword If Any Tests Failed   Delete NSD   ${nsd_name}
-    Run Keyword If Any Tests Failed   Delete VNFD   ${vnfd_name}
-    Run Keyword If Any Tests Failed   Delete K8s Cluster   ${k8scluster_name}
+    Run Keyword If Any Tests Failed   Delete NS   ${NS_NAME}
+    Run Keyword If Any Tests Failed   Delete NSD   ${NSD_NAME}
+    Run Keyword If Any Tests Failed   Delete VNFD   ${VNFD_NAME}
+    Run Keyword If Any Tests Failed   Delete K8s Cluster   ${K8SCLUSTER_NAME}
index 4bf9d67..7bdb39c 100644 (file)
@@ -1,3 +1,4 @@
+*** Comments ***
 #   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
@@ -10,6 +11,7 @@
 #   See the License for the specific language governing permissions and
 #   limitations under the License.
 
+
 *** Settings ***
 Documentation   [K8s-12] Openldap Helm chart.
 
@@ -18,114 +20,134 @@ Library   String
 Library   Collections
 Library   Process
 
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/vnfd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/nsd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ns_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/connectivity_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ssh_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/k8scluster_lib.robot
+Resource   ../lib/vnfd_lib.resource
+Resource   ../lib/nsd_lib.resource
+Resource   ../lib/ns_lib.resource
+Resource   ../lib/ns_operation_lib.resource
+Resource   ../lib/connectivity_lib.resource
+Resource   ../lib/ssh_lib.resource
+Resource   ../lib/k8scluster_lib.resource
 
-Force Tags   k8s_12   cluster_k8s   daily
+Test Tags   k8s_12   cluster_k8s   regression   azure
 
 Suite Teardown   Run Keyword And Ignore Error   Suite Cleanup
 
 
 *** Variables ***
 # K8s cluster name and version
-${k8scluster_name}   k8s12
-${k8scluster_version}   v1
+${K8SCLUSTER_NAME}   k8s12
+${K8SCLUSTER_VERSION}   v1
 
 # NS and VNF descriptor package folder and ids
-${vnfd_pkg}   openldap_primitives_knf
-${vnfd_name}   openldap_knf
-${nsd_pkg}   openldap_primitives_ns
-${nsd_name}   openldap_ns
+${VNFD_PKG}   openldap_primitives_knf
+${VNFD_NAME}   openldap_knf
+${NSD_PKG}   openldap_primitives_ns
+${NSD_NAME}   openldap_ns
 
 # NS instance name and configuration
-${ns_name}   ldap
-${ns_config}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}}], additionalParamsForVnf: [ {member-vnf-index: openldap, additionalParamsForKdu: [ {kdu_name: ldap, additionalParams: {service: {type: LoadBalancer }, adminPassword: admin}} ] } ] }
-
-${ns_id}   ${EMPTY}
-${publickey}   ${EMPTY}
-${vnf_member_index}   openldap
-${kdu_name}   ldap
-${upgrade_action}   upgrade
-${rollback_action}   rollback
-${replica_count}   3
-${action_name}   get-user-info
-${action_param_cn}   admin
-${action_param_dc}   example.org
+${NS_NAME}   ldap
+${NS_CONFIG}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}}], additionalParamsForVnf: [ {member-vnf-index: openldap, additionalParamsForKdu: [ {kdu_name: ldap, additionalParams: {service: {type: LoadBalancer }, adminPassword: admin}} ] } ] }
+
+${NS_ID}   ${EMPTY}
+${PUBLICKEY}   ${EMPTY}
+${VNF_MEMBER_INDEX}   openldap
+${KDU_NAME}   ldap
+${UPGRADE_ACTION}   upgrade
+${ROLLBACK_ACTION}   rollback
+${REPLICA_COUNT}   3
+${ACTION_NAME}   get-user-info
+${ACTION_PARAM_CN}   admin
+${ACTION_PARAM_DC}   example.org
+
 
 *** Test Cases ***
 Create Package For OpenLDAP CNF
-    Create VNFD   '%{PACKAGES_FOLDER}/${vnfd_pkg}'
+    [Documentation]   Upload VNF package for the testsuite.
+    Create VNFD   '%{PACKAGES_FOLDER}/${VNFD_PKG}'
 
 Create Package For OpenLDAP NS
-    Create NSD   '%{PACKAGES_FOLDER}/${nsd_pkg}'
+    [Documentation]   Upload NS package for the testsuite.
+    Create NSD   '%{PACKAGES_FOLDER}/${NSD_PKG}'
 
 Add K8s Cluster To OSM
-    Create K8s Cluster   %{K8S_CREDENTIALS}   ${k8scluster_version}   %{VIM_TARGET}   %{VIM_MGMT_NET}   ${k8scluster_name}
+    [Documentation]   Register K8s cluster in OSM.
+    Create K8s Cluster   %{K8S_CREDENTIALS}   ${K8SCLUSTER_VERSION}   %{VIM_TARGET}   %{VIM_MGMT_NET}   ${K8SCLUSTER_NAME}
+    Check For K8s Cluster To Be Enabled   ${K8SCLUSTER_NAME}
 
 Create Network Service Instance
-    ${id}=   Create Network Service   ${nsd_name}   %{VIM_TARGET}   ${ns_name}   ${ns_config}   ${publickey}
+    [Documentation]   Instantiate NS for the testsuite.
+    ${id}=   Create Network Service   ${NSD_NAME}   %{VIM_TARGET}   ${NS_NAME}   ${NS_CONFIG}   ${PUBLICKEY}
+    Log   ${id}
 
 Get Ns Id
-    ${id}=   Get Ns Id   ${ns_name}
-    Set Suite Variable   ${ns_id}   ${id}
+    [Documentation]   Get NS instance id from OSM.
+    ${id}=   Get Ns Id   ${NS_NAME}
+    Set Suite Variable   ${NS_ID}   ${id}
 
 Get Vnf Id
-    Variable Should Exist   ${ns_id}   msg=Network service instance is not available
-    @{vnfr_list}=   Get Ns Vnfr Ids   ${ns_id}
+    [Documentation]   Get VNF instance id from OSM.
+    Variable Should Exist   ${NS_ID}   msg=Network service instance is not available
+    @{vnfr_list}=   Get Ns Vnfr Ids   ${NS_ID}
     Log List   ${vnfr_list}
-    Set Suite Variable   ${vnf_id}   ${vnfr_list}[0]
+    Set Suite Variable   ${VNF_ID}   ${vnfr_list}[0]
 
 Execute Day 2 Operations
     [Documentation]   Performs one Day 2 operation.
-
-    Variable Should Exist   ${ns_id}   msg=Network service instance is not available
-    ${ns_op_id}=   Execute NS K8s Action   ${ns_name}   ${action_name}   ${vnf_member_index}   ${kdu_name}   cn=${action_param_cn}   dc=${action_param_dc}
+    Variable Should Exist   ${NS_ID}   msg=Network service instance is not available
+    ${ns_op_id}=   Execute NS K8s Action   ${NS_NAME}   ${ACTION_NAME}   ${VNF_MEMBER_INDEX}   ${KDU_NAME}   cn=${ACTION_PARAM_CN}   dc=${ACTION_PARAM_DC}
+    Log   ${ns_op_id}
 
 Execute Upgrade Operation
-    Variable Should Exist   ${ns_id}   msg=Network service instance is not available
-    ${ns_op_id}=   Execute NS K8s Action   ${ns_name}   ${upgrade_action}   ${vnf_member_index}   ${kdu_name}   replicaCount=${replica_count}
+    [Documentation]   Perform OSM action to upgrade the number of replicas of a deployment in the CNF.
+    Variable Should Exist   ${NS_ID}   msg=Network service instance is not available
+    ${ns_op_id}=   Execute NS K8s Action   ${NS_NAME}   ${UPGRADE_ACTION}   ${VNF_MEMBER_INDEX}   ${KDU_NAME}   replicaCount=${REPLICA_COUNT}
+    Log   ${ns_op_id}
 
 Check Replicas After Upgrade Operation
-    Variable Should Exist   ${ns_id}   msg=Network service instance is not available
-    ${count}=   Get Vnf Kdu Replica Count   ${vnf_id}   ${kdu_name}
+    [Documentation]   Check that the number of replicas after the upgrade is the expected one.
+    Variable Should Exist   ${NS_ID}   msg=Network service instance is not available
+    ${count}=   Get Vnf Kdu Replica Count   ${VNF_ID}   ${KDU_NAME}
     Log   ${count}
-    Should Be Equal As Integers   ${count}   ${replica_count}
+    Should Be Equal As Integers   ${count}   ${REPLICA_COUNT}
 
 Execute Rollback Operation
-    Variable Should Exist   ${ns_id}   msg=Network service instance is not available
-    ${ns_op_id}=   Execute NS K8s Action   ${ns_name}   ${rollback_action}   ${vnf_member_index}   ${kdu_name}
+    [Documentation]   Perform OSM action to rollback the previous upgrade of the CNF.
+    Variable Should Exist   ${NS_ID}   msg=Network service instance is not available
+    ${ns_op_id}=   Execute NS K8s Action   ${NS_NAME}   ${ROLLBACK_ACTION}   ${VNF_MEMBER_INDEX}   ${KDU_NAME}
+    Log   ${ns_op_id}
 
 Check Replicas After Rollback Operation
-    Variable Should Exist   ${ns_id}   msg=Network service instance is not available
-    ${count}=   Get Vnf Kdu Replica Count   ${vnf_id}   ${kdu_name}
+    [Documentation]   Check that the number of replcias after the rollback is the expected one.
+    Variable Should Exist   ${NS_ID}   msg=Network service instance is not available
+    ${count}=   Get Vnf Kdu Replica Count   ${VNF_ID}   ${KDU_NAME}
     Log   ${count}
     Should Be Empty   ${count}
 
 Delete Network Service Instance
+    [Documentation]   Delete NS instance.
     [Tags]   cleanup
-    Delete NS   ${ns_name}
+    Delete NS   ${NS_NAME}
 
 Remove K8s Cluster from OSM
+    [Documentation]   Delete K8s cluster from OSM.
     [Tags]   cleanup
-    Delete K8s Cluster   ${k8scluster_name}
+    Delete K8s Cluster   ${K8SCLUSTER_NAME}
 
 Delete NS Descriptor Test
+    [Documentation]   Delete NS package from OSM.
     [Tags]   cleanup
-    Delete NSD   ${nsd_name}
+    Delete NSD   ${NSD_NAME}
 
 Delete VNF Descriptor Test
+    [Documentation]   Delete NF package from OSM.
     [Tags]   cleanup
-    Delete VNFD   ${vnfd_name}
+    Delete VNFD   ${VNFD_NAME}
 
 
 *** Keywords ***
 Suite Cleanup
     [Documentation]   Test Suit Cleanup: Deleting Descriptor, instance and vim
-    Run Keyword If Any Tests Failed   Delete NS   ${ns_name}
-    Run Keyword If Any Tests Failed   Delete NSD   ${nsd_name}
-    Run Keyword If Any Tests Failed   Delete VNFD   ${vnfd_name}
-    Run Keyword If Any Tests Failed   Delete K8s Cluster   ${k8scluster_name}
+    Run Keyword If Any Tests Failed   Delete NS   ${NS_NAME}
+    Run Keyword If Any Tests Failed   Delete NSD   ${NSD_NAME}
+    Run Keyword If Any Tests Failed   Delete VNFD   ${VNFD_NAME}
+    Run Keyword If Any Tests Failed   Delete K8s Cluster   ${K8SCLUSTER_NAME}
diff --git a/robot-systest/testsuite/k8s_13-two_helm_kdu.robot b/robot-systest/testsuite/k8s_13-two_helm_kdu.robot
new file mode 100644 (file)
index 0000000..763488b
--- /dev/null
@@ -0,0 +1,186 @@
+*** Comments ***
+#   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.
+
+
+*** Settings ***
+Documentation   [K8s-13] Two Helm-based KDU stored in public and private OCI repositories.
+
+Library   OperatingSystem
+Library   String
+Library   Collections
+Library   Process
+
+Resource   ../lib/vnfd_lib.resource
+Resource   ../lib/nsd_lib.resource
+Resource   ../lib/ns_lib.resource
+Resource   ../lib/ns_operation_lib.resource
+Resource   ../lib/connectivity_lib.resource
+Resource   ../lib/ssh_lib.resource
+Resource   ../lib/k8scluster_lib.resource
+Resource   ../lib/repo_lib.resource
+
+Test Tags   k8s_13   cluster_k8s   daily   azure
+
+Suite Teardown   Run Keyword And Ignore Error   Suite Cleanup
+
+
+*** Variables ***
+# NS and VNF descriptor package folder and ids
+${VNFD_PKG}   two_helm_oci_knf
+${VNFD_NAME}   two_helm_oci_knf
+${NSD_PKG}   two_helm_oci_ns
+${NSD_NAME}   two_helm_oci_ns
+
+# NS instance name and configuration
+${NS_NAME}   ldap
+${NS_CONFIG}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}}], additionalParamsForVnf: [ {member-vnf-index: two_helm_oci, additionalParamsForKdu: [ {kdu_name: haproxy, additionalParams: {service: {type: LoadBalancer }, adminPassword: admin}}, {kdu_name: ldap, additionalParams: {service: {type: LoadBalancer }, adminPassword: admin}} ] } ] }
+
+${NS_ID}   ${EMPTY}
+${PUBLICKEY}   ${EMPTY}
+${VNF_MEMBER_INDEX}   two_helm_oci
+${KDU1_NAME}   haproxy
+${KDU2_NAME}   ldap
+${UPGRADE_ACTION}   upgrade
+${ROLLBACK_ACTION}   rollback
+${REPLICA_COUNT}   3
+
+# OCI helm repo configuration
+${REPO_NAME}   osm-gitlab
+${REPO_URI}   %{OCI_REGISTRY_URL}
+${REPO_USER}   %{OCI_REGISTRY_USER}
+${REPO_PASSWORD}   %{OCI_REGISTRY_PASSWORD}
+
+
+*** Test Cases ***
+Create Package For CNF
+    [Documentation]   Create Package For CNF
+    [Tags]   prepare
+    Create VNFD   '%{PACKAGES_FOLDER}/${VNFD_PKG}'
+
+Create Package For NS
+    [Documentation]   Create Package For NS
+    [Tags]   prepare
+    Create NSD   '%{PACKAGES_FOLDER}/${NSD_PKG}'
+
+Create Helm OCI Repo
+    [Documentation]   Create Helm OCI Repo for openldap kdu
+    [Tags]   prepare
+    Create Repo   ${REPO_NAME}   ${REPO_URI}   helm-chart   ${REPO_USER}   ${REPO_PASSWORD}   --oci
+
+Create Network Service Instance
+    [Documentation]   Create Network Service Instance
+    [Tags]   prepare
+    ${id}=   Create Network Service   ${NSD_NAME}   %{VIM_TARGET}   ${NS_NAME}   ${NS_CONFIG}   ${PUBLICKEY}
+    Log   ${id}
+
+Get Ns Id
+    [Documentation]   Get ID of NS instance
+    [Tags]   verify
+    ${id}=   Get Ns Id   ${NS_NAME}
+    Set Suite Variable   ${NS_ID}   ${id}
+
+Get Vnf Id
+    [Documentation]   Get ID of VNF
+    [Tags]   verify
+    Variable Should Exist   ${NS_ID}   msg=Network service instance is not available
+    @{vnfr_list}=   Get Ns Vnfr Ids   ${NS_ID}
+    Log List   ${vnfr_list}
+    Set Suite Variable   ${VNF_ID}   ${vnfr_list}[0]
+
+Execute Upgrade Operation over first KDU
+    [Documentation]   Execute Upgrade Operation over first KDU
+    [Tags]   verify
+    Variable Should Exist   ${NS_ID}   msg=Network service instance is not available
+    ${ns_op_id}=   Execute NS K8s Action   ${NS_NAME}   ${UPGRADE_ACTION}   ${VNF_MEMBER_INDEX}   ${KDU1_NAME}   replicaCount=${REPLICA_COUNT}
+    Log   ${ns_op_id}
+
+Check Replicas After Upgrade Operation over first KDU
+    [Documentation]   Check Replicas After Upgrade Operation over first KDU
+    [Tags]   verify
+    Variable Should Exist   ${NS_ID}   msg=Network service instance is not available
+    ${count}=   Get Vnf Kdu Replica Count   ${VNF_ID}   ${KDU1_NAME}
+    Log   ${count}
+    Should Be Equal As Integers   ${count}   ${REPLICA_COUNT}
+
+Execute Rollback Operation over first KDU
+    [Documentation]   Execute Rollback Operation over first KDU
+    [Tags]   verify
+    Variable Should Exist   ${NS_ID}   msg=Network service instance is not available
+    ${ns_op_id}=   Execute NS K8s Action   ${NS_NAME}   ${ROLLBACK_ACTION}   ${VNF_MEMBER_INDEX}   ${KDU1_NAME}
+    Log   ${ns_op_id}
+
+Check Replicas After Rollback Operation over first KDU
+    [Documentation]   Check Replicas After Rollback Operation over first KDU
+    [Tags]   verify
+    Variable Should Exist   ${NS_ID}   msg=Network service instance is not available
+    ${count}=   Get Vnf Kdu Replica Count   ${VNF_ID}   ${KDU1_NAME}
+    Log   ${count}
+    Should Be Empty   ${count}
+
+Execute Upgrade Operation over second KDU
+    [Documentation]   Execute Upgrade Operation over second KDU
+    [Tags]   verify
+    Variable Should Exist   ${NS_ID}   msg=Network service instance is not available
+    ${ns_op_id}=   Execute NS K8s Action   ${NS_NAME}   ${UPGRADE_ACTION}   ${VNF_MEMBER_INDEX}   ${KDU2_NAME}   replicaCount=${REPLICA_COUNT}
+    Log   ${ns_op_id}
+
+Check Replicas After Upgrade Operation over second KDU
+    [Documentation]   Check Replicas After Upgrade Operation over second KDU
+    [Tags]   verify
+    Variable Should Exist   ${NS_ID}   msg=Network service instance is not available
+    ${count}=   Get Vnf Kdu Replica Count   ${VNF_ID}   ${KDU2_NAME}
+    Log   ${count}
+    Should Be Equal As Integers   ${count}   ${REPLICA_COUNT}
+
+Execute Rollback Operation over second KDU
+    [Documentation]   Execute Rollback Operation over second KDU
+    [Tags]   verify
+    Variable Should Exist   ${NS_ID}   msg=Network service instance is not available
+    ${ns_op_id}=   Execute NS K8s Action   ${NS_NAME}   ${ROLLBACK_ACTION}   ${VNF_MEMBER_INDEX}   ${KDU2_NAME}
+    Log   ${ns_op_id}
+
+Check Replicas After Rollback Operation over second KDU
+    [Documentation]   Check Replicas After Rollback Operation over second KDU
+    [Tags]   verify
+    Variable Should Exist   ${NS_ID}   msg=Network service instance is not available
+    ${count}=   Get Vnf Kdu Replica Count   ${VNF_ID}   ${KDU2_NAME}
+    Log   ${count}
+    Should Be Empty   ${count}
+
+Delete Network Service Instance
+    [Documentation]   Delete Network Service Instance
+    [Tags]   cleanup
+    Delete NS   ${NS_NAME}
+
+Delete Helm OCI Repo
+    [Documentation]   Delete Helm OCI Repo
+    [Tags]   prepare
+    Delete Repo   ${REPO_NAME}
+
+Delete NS Descriptor Test
+    [Documentation]   Delete NS Descriptor Test
+    [Tags]   cleanup
+    Delete NSD   ${NSD_NAME}
+
+Delete VNF Descriptor Test
+    [Documentation]   Delete VNF Descriptor Test
+    [Tags]   cleanup
+    Delete VNFD   ${VNFD_NAME}
+
+
+*** Keywords ***
+Suite Cleanup
+    [Documentation]   Test Suit Cleanup: Deleting Descriptor, instance and vim
+    Run Keyword If Any Tests Failed   Delete NS   ${NS_NAME}
+    Run Keyword If Any Tests Failed   Delete NSD   ${NSD_NAME}
+    Run Keyword If Any Tests Failed   Delete VNFD   ${VNFD_NAME}
diff --git a/robot-systest/testsuite/lcmop_01-cancel_operation_basic.robot b/robot-systest/testsuite/lcmop_01-cancel_operation_basic.robot
new file mode 100644 (file)
index 0000000..219c7c9
--- /dev/null
@@ -0,0 +1,97 @@
+*** Comments ***
+#   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.
+
+
+*** Settings ***
+Documentation   [LCMOP_01] Cancel an ongoing NS operation
+
+Library   OperatingSystem
+Library   String
+Library   Collections
+Library   Process
+Library   SSHLibrary
+
+Resource   ../lib/vnfd_lib.resource
+Resource   ../lib/nsd_lib.resource
+Resource   ../lib/ns_lib.resource
+Resource   ../lib/ns_operation_lib.resource
+Resource   ../lib/connectivity_lib.resource
+Resource   ../lib/ssh_lib.resource
+
+Test Tags   lcmop_01   cluster_lcmop   daily
+
+Suite Teardown   Run Keyword And Ignore Error   Suite Cleanup
+
+
+*** Variables ***
+# NS and VNF descriptor package folder and ids
+${VNFD_PKG}   simple_ee_vnf
+${VNFD_NAME}   simple_ee-vnf
+${NSD_PKG}   simple_ee_ns
+${NSD_NAME}   simple_ee-ns
+
+# NS instance name and configuration
+${NS_NAME}   lcmop_01_cancel_operation_basic
+${NS_CONFIG}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
+
+
+*** Test Cases ***
+Create VNF Descriptor
+    [Documentation]   Create the VNF descriptor
+    Create VNFD   '%{PACKAGES_FOLDER}/${VNFD_PKG}'
+
+Create NS Descriptor
+    [Documentation]   Create the NS descriptor
+    Create NSD   '%{PACKAGES_FOLDER}/${NSD_PKG}'
+
+Instantiate Network Service
+    [Documentation]   Instantiate the Network service
+    ${id}=   Instantiate Network Service   ${NS_NAME}   ${NSD_NAME}   %{VIM_TARGET}   --config '${NS_CONFIG}'
+    Set Suite Variable   ${NS_ID}   ${id}
+
+Get Operation ID
+    [Documentation]   Obtain the operation ID of the NS instantiation
+    ${id}=   Get Operations By Type   ${NS_ID}   instantiate
+    Set Suite Variable   ${OP_ID}   ${id}
+
+Cancel Operation
+    [Documentation]   Cancel the ongoing NS instantiation
+    Sleep   5s   Waiting before cancelling the operation
+    Cancel Operation By Id   ${OP_ID}
+
+Check That Operation Is Cancelled
+    [Documentation]   Check that the operation is succesfully cancelled
+    Check For NS Operation Cancelled   ${OP_ID}
+
+Delete NS Instance Test
+    [Documentation]   Delete the cancelled NS instance
+    [Tags]   cleanup
+    Delete NS   ${NS_NAME}
+
+Delete NS Descriptor Test
+    [Documentation]   Delete the NS descriptor
+    [Tags]   cleanup
+    Delete NSD   ${NSD_NAME}
+
+Delete VNF Descriptor Test
+    [Documentation]   Delete the VNF descriptor
+    [Tags]   cleanup
+    Delete VNFD   ${VNFD_NAME}
+
+
+*** Keywords ***
+Suite Cleanup
+    [Documentation]   Test Suit Cleanup: Deleting Descriptor, instance and vim
+    Run Keyword If Any Tests Failed   Delete NS   ${NS_NAME}
+    Run Keyword If Any Tests Failed   Delete NSD   ${NSD_NAME}
+    Run Keyword If Any Tests Failed   Delete VNFD   ${VNFD_NAME}
index 5cebb0f..6558c17 100644 (file)
@@ -1,3 +1,4 @@
+*** Comments ***
 #   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
@@ -10,6 +11,7 @@
 #   See the License for the specific language governing permissions and
 #   limitations under the License.
 
+
 *** Settings ***
 Documentation   [QUOTAS-01] Quota enforcement.
 
@@ -17,157 +19,151 @@ Library   OperatingSystem
 Library   String
 Library   Collections
 
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/project_lib.robot
+Resource   ../lib/project_lib.resource
+Resource   ../lib/user_lib.resource
 
-Force Tags   quotas_01   cluster_main   daily   regression
+Test Tags   quotas_01   cluster_main   daily   regression
 
 Suite Teardown   Run Keyword And Ignore Error   Suite Cleanup
 
 
 *** Variables ***
 # VNFD package to use during test
-${vnfd_pkg}   hackfest_basic_vnf
+${VNFD_PKG}   hackfest_basic_vnf
 
 # Project names and quotas to use
-${project_1_name}   quotas_01_proj_1
-${project_2_name}   quotas_01_proj_2
-${project_3_name}   quotas_01_proj_3
-${project_1_quotas}   vnfds=1,nsds=2,ns_instances=3
-${project_2_quotas}   vnfds=1,nsds=1,ns_instances=1
-${project_3_quotas}   vnfds=5,nsds=,ns_instances=
+${PROJECT_1_NAME}   quotas_01_proj_1
+${PROJECT_2_NAME}   quotas_01_proj_2
+${PROJECT_3_NAME}   quotas_01_proj_3
+${PROJECT_1_QUOTAS}   vnfds=1,nsds=2,ns_instances=3
+${PROJECT_2_QUOTAS}   vnfds=1,nsds=1,ns_instances=1
+${PROJECT_3_QUOTAS}   vnfds=5,nsds=,ns_instances=
 
 # User name and password for project
-${user_name}   quotas_01_user
-${user_password}   quotas_01_pass
+${USERNAME}   quotas_01_user
+${USER_PASSWORD}   Quotas_01_pass
+${USER_NEW_PASSWORD}   Quotas_01_new_pass
 
-${success_return_code}   0
+${SUCCESS_RETURN_CODE}   0
 
 
 *** Test Cases ***
 Create First Project With Quotas
-
-    Create Project With Quotas   ${project_1_name}   ${project_1_quotas}
-    ${project_1_vnfds}=   Get Project Quotas   ${project_1_name}   vnfds
+    [Documentation]   Create a first project with quotas, then get the project quotas and check that they are correct.
+    Create Project With Quotas   ${PROJECT_1_NAME}   ${PROJECT_1_QUOTAS}
+    ${project_1_vnfds}=   Get Project Quotas   ${PROJECT_1_NAME}   vnfds
     Should Be Equal As Integers   1   ${project_1_vnfds}
-    ${project_1_nsds}=   Get Project Quotas   ${project_1_name}   nsds
+    ${project_1_nsds}=   Get Project Quotas   ${PROJECT_1_NAME}   nsds
     Should Be Equal As Integers   2   ${project_1_nsds}
-    ${project_1_ns_instances}=   Get Project Quotas   ${project_1_name}   ns_instances
+    ${project_1_ns_instances}=   Get Project Quotas   ${PROJECT_1_NAME}   ns_instances
     Should Be Equal As Integers   3   ${project_1_ns_instances}
 
-
 Create Second Project With Quotas
-
-    Create Project With Quotas   ${project_2_name}   ${project_2_quotas}
-    ${project_2_vnfds}=   Get Project Quotas   ${project_2_name}   vnfds
+    [Documentation]   Create a second project with quotas, then get the project quotas and check that they are correct.
+    Create Project With Quotas   ${PROJECT_2_NAME}   ${PROJECT_2_QUOTAS}
+    ${project_2_vnfds}=   Get Project Quotas   ${PROJECT_2_NAME}   vnfds
     Should Be Equal As Integers   1   ${project_2_vnfds}
-    ${project_2_nsds}=   Get Project Quotas   ${project_2_name}   nsds
+    ${project_2_nsds}=   Get Project Quotas   ${PROJECT_2_NAME}   nsds
     Should Be Equal As Integers   1   ${project_2_nsds}
-    ${project_2_ns_instances}=   Get Project Quotas   ${project_2_name}   ns_instances
+    ${project_2_ns_instances}=   Get Project Quotas   ${PROJECT_2_NAME}   ns_instances
     Should Be Equal As Integers   1   ${project_2_ns_instances}
 
 Create User In Projects
-
-    ${rc}   ${stdout}=   Run And Return RC And Output   osm user-create ${user_name} --password ${user_password} --project-role-mappings ${project_1_name},project_admin --project-role-mappings ${project_2_name},project_admin
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    Check If User Is Assigned To Project   ${user_name}   ${project_1_name}
-    Check If User Is Assigned To Project   ${user_name}   ${project_2_name}
-
+    [Documentation]   Create a user with role project_admin in both projects.
+    ${rc}   ${stdout}=   Run And Return RC And Output   osm user-create ${USERNAME} --password ${USER_PASSWORD} --project-role-mappings ${PROJECT_1_NAME},project_admin --project-role-mappings ${PROJECT_2_NAME},project_admin
+    Log   ${rc},${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    Check If User Is Assigned To Project   ${USERNAME}   ${PROJECT_1_NAME}
+    Check If User Is Assigned To Project   ${USERNAME}   ${PROJECT_2_NAME}
+    Update User Password   ${USERNAME}   ${USER_PASSWORD}   ${USER_NEW_PASSWORD}
 
 Change First Project Name to Third Project Name
-
-    Update Project Name   ${project_1_name}   ${project_3_name}
-    ${project_3_vnfds}=   Get Project Quotas   ${project_3_name}   vnfds
+    [Documentation]   Rename first project. From now on, the project will be considered for the tests a third project.
+    Update Project Name   ${PROJECT_1_NAME}   ${PROJECT_3_NAME}
+    ${project_3_vnfds}=   Get Project Quotas   ${PROJECT_3_NAME}   vnfds
     Should Be Equal As Integers   1   ${project_3_vnfds}
-    ${project_3_nsds}=   Get Project Quotas   ${project_3_name}   nsds
+    ${project_3_nsds}=   Get Project Quotas   ${PROJECT_3_NAME}   nsds
     Should Be Equal As Integers   2   ${project_3_nsds}
-    ${project_3_ns_instances}=   Get Project Quotas   ${project_3_name}   ns_instances
+    ${project_3_ns_instances}=   Get Project Quotas   ${PROJECT_3_NAME}   ns_instances
     Should Be Equal As Integers   3   ${project_3_ns_instances}
-    Check If User Is Assigned To Project   ${user_name}   ${project_3_name}
-
+    Check If User Is Assigned To Project   ${USERNAME}   ${PROJECT_3_NAME}
 
 Create VNFDs On Third Project Until Exceed Quota
-
-    Create VNFD In Project   ${project_3_name}   '%{PACKAGES_FOLDER}/${vnfd_pkg}'   ${user_name}   ${user_password}   override='id=v1;product-name=v1'
-    Run Keyword And Expect Error   *   Create VNFD In Project   ${project_3_name}   '%{PACKAGES_FOLDER}/${vnfd_pkg}'   ${user_name}   ${user_password}   override='id=v2;product-name=v2'
-
+    [Documentation]   Upload VNF packages in the third project.
+    Create VNFD In Project   ${PROJECT_3_NAME}   '%{PACKAGES_FOLDER}/${VNFD_PKG}'   ${USERNAME}   ${USER_NEW_PASSWORD}   override='id=v1;product-name=v1'
+    Run Keyword And Expect Error   *   Create VNFD In Project   ${PROJECT_3_NAME}   '%{PACKAGES_FOLDER}/${VNFD_PKG}'   ${USERNAME}   ${USER_NEW_PASSWORD}   override='id=v2;product-name=v2'
 
 Increase Third Project Quotas
-
-    Update Project Quotas   ${project_3_name}   ${project_3_quotas}
-    ${project_3_vnfds}=   Get Project Quotas   ${project_3_name}   vnfds
+    [Documentation]   Update the quotas of the third project.
+    Update Project Quotas   ${PROJECT_3_NAME}   ${PROJECT_3_QUOTAS}
+    ${project_3_vnfds}=   Get Project Quotas   ${PROJECT_3_NAME}   vnfds
     Should Be Equal As Integers   5   ${project_3_vnfds}
 
-
 Create More VNFDs On Third Project Until Exceed Quota
-
-    Create VNFD In Project   ${project_3_name}   '%{PACKAGES_FOLDER}/${vnfd_pkg}'   ${user_name}   ${user_password}   override='id=v2;product-name=v2'
-    Create VNFD In Project   ${project_3_name}   '%{PACKAGES_FOLDER}/${vnfd_pkg}'   ${user_name}   ${user_password}   override='id=v3;product-name=v3'
-    Create VNFD In Project   ${project_3_name}   '%{PACKAGES_FOLDER}/${vnfd_pkg}'   ${user_name}   ${user_password}   override='id=v4;product-name=v4'
-    Create VNFD In Project   ${project_3_name}   '%{PACKAGES_FOLDER}/${vnfd_pkg}'   ${user_name}   ${user_password}   override='id=v5;product-name=v5'
-    Run Keyword And Expect Error   *   Create VNFD In Project   ${project_3_name}   '%{PACKAGES_FOLDER}/${vnfd_pkg}'   ${user_name}   ${user_password}   override='id=v6;product-name=v6'
-
+    [Documentation]   Upload VNF packages in the third project until the quota is reached, so that an error is obtained.
+    Create VNFD In Project   ${PROJECT_3_NAME}   '%{PACKAGES_FOLDER}/${VNFD_PKG}'   ${USERNAME}   ${USER_NEW_PASSWORD}   override='id=v2;product-name=v2'
+    Create VNFD In Project   ${PROJECT_3_NAME}   '%{PACKAGES_FOLDER}/${VNFD_PKG}'   ${USERNAME}   ${USER_NEW_PASSWORD}   override='id=v3;product-name=v3'
+    Create VNFD In Project   ${PROJECT_3_NAME}   '%{PACKAGES_FOLDER}/${VNFD_PKG}'   ${USERNAME}   ${USER_NEW_PASSWORD}   override='id=v4;product-name=v4'
+    Create VNFD In Project   ${PROJECT_3_NAME}   '%{PACKAGES_FOLDER}/${VNFD_PKG}'   ${USERNAME}   ${USER_NEW_PASSWORD}   override='id=v5;product-name=v5'
+    Run Keyword And Expect Error   *   Create VNFD In Project   ${PROJECT_3_NAME}   '%{PACKAGES_FOLDER}/${VNFD_PKG}'   ${USERNAME}   ${USER_NEW_PASSWORD}   override='id=v6;product-name=v6'
 
 Create VNFDs On Second Project Until Exceed Quota
-
-    Create VNFD In Project   ${project_2_name}   '%{PACKAGES_FOLDER}/${vnfd_pkg}'   ${user_name}   ${user_password}   override='id=vp2_1;product-name=vp2_1'
-    Run Keyword And Expect Error   *   Create VNFD In Project   ${project_2_name}   '%{PACKAGES_FOLDER}/${vnfd_pkg}'   ${user_name}   ${user_password}   override='id=vp2_2;product-name=vp2_2'
-
+    [Documentation]   Upload VNF packages in the second project until the quota is reached, so that an error is obtained.
+    Create VNFD In Project   ${PROJECT_2_NAME}   '%{PACKAGES_FOLDER}/${VNFD_PKG}'   ${USERNAME}   ${USER_NEW_PASSWORD}   override='id=vp2_1;product-name=vp2_1'
+    Run Keyword And Expect Error   *   Create VNFD In Project   ${PROJECT_2_NAME}   '%{PACKAGES_FOLDER}/${VNFD_PKG}'   ${USERNAME}   ${USER_NEW_PASSWORD}   override='id=vp2_2;product-name=vp2_2'
 
 Check Project Scopes
-
-    ${rc}   ${stdout}=   Run And Return RC And Output   osm --project ${project_3_name} --password ${user_password} --user ${user_name} vnfpkg-show vp2_1
+    [Documentation]   Check that the user can see a VNF package in both projects.
+    ${rc}   ${stdout}=   Run And Return RC And Output   osm --project ${PROJECT_3_NAME} --password ${USER_NEW_PASSWORD} --user ${USERNAME} vnfpkg-show vp2_1
     Log   ${stdout}
-    Should Not Be Equal As Integers   ${rc}   ${success_return_code}
-    ${rc}   ${stdout}=   Run And Return RC And Output   osm --project ${project_2_name} --password ${user_password} --user ${user_name} vnfpkg-show v1
+    Should Not Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    ${rc}   ${stdout}=   Run And Return RC And Output   osm --project ${PROJECT_2_NAME} --password ${USER_NEW_PASSWORD} --user ${USERNAME} vnfpkg-show v1
     Log   ${stdout}
-    Should Not Be Equal As Integers   ${rc}   ${success_return_code}
-
+    Should Not Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
 
 Delete Second Project VNFD
+    [Documentation]   Delete VNF packages from second project.
     [Tags]   cleanup
-
-    Delete VNFD In Project   ${project_2_name}   vp2_1   ${user_name}   ${user_password}
-
+    Delete VNFD In Project   ${PROJECT_2_NAME}   vp2_1   ${USERNAME}   ${USER_NEW_PASSWORD}
 
 Delete Third Project VNFDs
+    [Documentation]   Delete VNF packages from third project.
     [Tags]   cleanup
-
-    Delete VNFD In Project   ${project_3_name}   v1   ${user_name}   ${user_password}
-    Delete VNFD In Project   ${project_3_name}   v2   ${user_name}   ${user_password}
-    Delete VNFD In Project   ${project_3_name}   v3   ${user_name}   ${user_password}
-    Delete VNFD In Project   ${project_3_name}   v4   ${user_name}   ${user_password}
-    Delete VNFD In Project   ${project_3_name}   v5   ${user_name}   ${user_password}
-
+    Delete VNFD In Project   ${PROJECT_3_NAME}   v1   ${USERNAME}   ${USER_NEW_PASSWORD}
+    Delete VNFD In Project   ${PROJECT_3_NAME}   v2   ${USERNAME}   ${USER_NEW_PASSWORD}
+    Delete VNFD In Project   ${PROJECT_3_NAME}   v3   ${USERNAME}   ${USER_NEW_PASSWORD}
+    Delete VNFD In Project   ${PROJECT_3_NAME}   v4   ${USERNAME}   ${USER_NEW_PASSWORD}
+    Delete VNFD In Project   ${PROJECT_3_NAME}   v5   ${USERNAME}   ${USER_NEW_PASSWORD}
 
 Delete Second Project After Removing User From It
+    [Documentation]   Delete user from second project, then delete the second project.
     [Tags]   cleanup
-
-    Run Keyword And Expect Error   *   Delete Project   ${project_2_name}
-    Remove User From Project   ${user_name}   ${project_2_name}
-    Delete Project   ${project_2_name}
-
+    Run Keyword And Expect Error   *   Delete Project   ${PROJECT_2_NAME}
+    Remove User From Project   ${USERNAME}   ${PROJECT_2_NAME}
+    Delete Project   ${PROJECT_2_NAME}
 
 Delete Projects User
+    [Documentation]   Delete user.
     [Tags]   cleanup
-
-    ${rc}=   Run And Return RC   osm user-delete ${user_name}
-
+    ${rc}=   Run And Return RC   osm user-delete ${USERNAME}
+    Log   ${rc}
 
 Delete Third Project
+    [Documentation]   Delete third project.
     [Tags]   cleanup
-
-    Delete Project   ${project_3_name}
+    Delete Project   ${PROJECT_3_NAME}
 
 
 *** Keywords ***
 Suite Cleanup
-    Run Keyword If Any Tests Failed   Run Keyword And Ignore Error   Delete VNFD In Project   ${project_2_name}   vp2_1   ${user_name}   ${user_password}
-    Run Keyword If Any Tests Failed   Run Keyword And Ignore Error   Delete VNFD In Project   ${project_3_name}   v1   ${user_name}   ${user_password}
-    Run Keyword If Any Tests Failed   Run Keyword And Ignore Error   Delete VNFD In Project   ${project_3_name}   v2   ${user_name}   ${user_password}
-    Run Keyword If Any Tests Failed   Run Keyword And Ignore Error   Delete VNFD In Project   ${project_3_name}   v3   ${user_name}   ${user_password}
-    Run Keyword If Any Tests Failed   Run Keyword And Ignore Error   Delete VNFD In Project   ${project_3_name}   v4   ${user_name}   ${user_password}
-    Run Keyword If Any Tests Failed   Run Keyword And Ignore Error   Delete VNFD In Project   ${project_3_name}   v5   ${user_name}   ${user_password}
-    Run Keyword If Any Tests Failed   Run Keyword And Ignore Error   Delete Project   ${project_1_name}
-    Run Keyword If Any Tests Failed   Delete Project   ${project_2_name}
-    Run Keyword If Any Tests Failed   Run Keyword And Ignore Error   Delete Project   ${project_3_name}
-    Run And Return RC   osm user-delete ${user_name}
+    [Documentation]   Test Suite Cleanup: Deleting VNF packages, projects and users.
+    Run Keyword If Any Tests Failed   Run Keyword And Ignore Error   Delete VNFD In Project   ${PROJECT_2_NAME}   vp2_1   ${USERNAME}   ${USER_NEW_PASSWORD}
+    Run Keyword If Any Tests Failed   Run Keyword And Ignore Error   Delete VNFD In Project   ${PROJECT_3_NAME}   v1   ${USERNAME}   ${USER_NEW_PASSWORD}
+    Run Keyword If Any Tests Failed   Run Keyword And Ignore Error   Delete VNFD In Project   ${PROJECT_3_NAME}   v2   ${USERNAME}   ${USER_NEW_PASSWORD}
+    Run Keyword If Any Tests Failed   Run Keyword And Ignore Error   Delete VNFD In Project   ${PROJECT_3_NAME}   v3   ${USERNAME}   ${USER_NEW_PASSWORD}
+    Run Keyword If Any Tests Failed   Run Keyword And Ignore Error   Delete VNFD In Project   ${PROJECT_3_NAME}   v4   ${USERNAME}   ${USER_NEW_PASSWORD}
+    Run Keyword If Any Tests Failed   Run Keyword And Ignore Error   Delete VNFD In Project   ${PROJECT_3_NAME}   v5   ${USERNAME}   ${USER_NEW_PASSWORD}
+    Run Keyword If Any Tests Failed   Run Keyword And Ignore Error   Delete Project   ${PROJECT_1_NAME}
+    Run Keyword If Any Tests Failed   Delete Project   ${PROJECT_2_NAME}
+    Run Keyword If Any Tests Failed   Run Keyword And Ignore Error   Delete Project   ${PROJECT_3_NAME}
+    Run And Return RC   osm user-delete ${USERNAME}
index 8c3d677..871972e 100644 (file)
@@ -1,3 +1,4 @@
+*** Comments ***
 #   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
@@ -10,6 +11,7 @@
 #   See the License for the specific language governing permissions and
 #   limitations under the License.
 
+
 *** Settings ***
 Documentation   [SA-01] VNF with VIM-based metrics.
 
@@ -17,103 +19,95 @@ Library   OperatingSystem
 Library   String
 Library   Collections
 
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/vnfd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/nsd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ns_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ssh_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/prometheus_lib.robot
-
-Variables   %{ROBOT_DEVOPS_FOLDER}/resources/sa_01-vnf_with_vim_metrics_data.py
+Resource   ../lib/vnfd_lib.resource
+Resource   ../lib/nsd_lib.resource
+Resource   ../lib/ns_lib.resource
+Resource   ../lib/ssh_lib.resource
+Resource   ../lib/prometheus_lib.resource
 
-Force Tags   sa_01   cluster_sa   daily   regression
+Test Tags   sa_01   cluster_sa   daily   regression
 
+Suite Setup   Run Keyword And Ignore Error   Suite Preparation
 Suite Teardown   Run Keyword And Ignore Error   Suite Cleanup
 
 
 *** Variables ***
 # NS instantiation parameters
-${ns_config}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
+${NS_CONFIG}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
 
 # NS and VNF descriptor package folder and ids
-${vnfd_pkg}   hackfest_basic_metrics_vnf
-${vnfd_name}   hackfest_basic_metrics-vnf
-${nsd_pkg}   hackfest_basic_metrics_ns
-${nsd_name}   hackfest_basic-ns-metrics
+${VNFD_PKG}   hackfest_basic_metrics_vnf
+${VNFD_NAME}   hackfest_basic_metrics-vnf
+${NSD_PKG}   hackfest_basic_metrics_ns
+${NSD_NAME}   hackfest_basic-ns-metrics
 
 # NS instance name
-${ns_name}   sa_01-vnf_with_vim_metrics_test
+${NS_NAME}   sa_01-vnf_with_vim_metrics_test
 
 # SSH keys and username to be used
-${publickey}   %{HOME}/.ssh/id_rsa.pub
-${privatekey}   %{HOME}/.ssh/id_rsa
+${PUBLICKEY}   %{HOME}/.ssh/id_rsa.pub
+${PRIVATEKEY}   %{HOME}/.ssh/id_rsa
 
 # Prometheus polling interval and retries
-${prometheus_poll_retries}   15 times
-${prometheus_poll_timeout}   1 minute
+${PROMETHEUS_POLL_RETRIES}   15 times
+${PROMETHEUS_POLL_TIMEOUT}   1 minute
 
 # Prometheus metrics to retrieve
-${metric_1_name}   osm_cpu_utilization
-${metric_2_name}   osm_average_memory_utilization
+${METRIC_1_NAME}   osm_cpu_utilization
+${METRIC_2_NAME}   osm_average_memory_utilization
 
 
 *** Test Cases ***
 Create VNF Descriptor
-
-    Create VNFD   '%{PACKAGES_FOLDER}/${vnfd_pkg}'
-
+    [Documentation]   Upload VNF package for the testsuite.
+    Create VNFD   '%{PACKAGES_FOLDER}/${VNFD_PKG}'
 
 Create NS Descriptor
-
-    Create NSD   '%{PACKAGES_FOLDER}/${nsd_pkg}'
-
+    [Documentation]   Upload NS package for the testsuite.
+    Create NSD   '%{PACKAGES_FOLDER}/${NSD_PKG}'
 
 Instantiate Network Service
-
-    ${id}=   Create Network Service   ${nsd_name}   %{VIM_TARGET}   ${ns_name}   ${ns_config}   ${publickey}
-    Set Suite Variable   ${ns_id}   ${id}
-
+    [Documentation]   Instantiate NS for the testsuite.
+    ${id}=   Create Network Service   ${NSD_NAME}   %{VIM_TARGET}   ${NS_NAME}   ${NS_CONFIG}   ${PUBLICKEY}
+    Set Suite Variable   ${NS_ID}   ${id}
 
 Get VNF VIM-based Metrics
-
-    Variable Should Exist   ${prometheus_poll_retries}   msg=Metric polling retries is not available
-    Variable Should Exist   ${prometheus_poll_timeout}   msg=Metric polling timeout is not available
-    Variable Should Exist   ${prometheus_host}   msg=Prometheus address is not available
-    Variable Should Exist   ${prometheus_port}   msg=Prometheus port is not available
-    Variable Should Exist   ${metric_1_name}   msg=Prometheus first metric name is not available
-    Variable Should Exist   ${metric_2_name}   msg=Prometheus second metric name is not available
-    ${metric_filter}=   Set Variable   ns_id=${ns_id}
-    ${metric_1_value}=   Wait Until Keyword Succeeds   ${prometheus_poll_retries}   ${prometheus_poll_timeout}   Get Metric   ${prometheus_host}   ${prometheus_port}   ${prometheus_user}   ${prometheus_password}   ${metric_1_name}   ${metric_filter}
-    Run Keyword If   ${metric_1_value} <= 0   Fail   msg=The metric '${metric_1_name}' value is '${metric_1_value}'
-    ${metric_2_value}=   Wait Until Keyword Succeeds   ${prometheus_poll_retries}   ${prometheus_poll_timeout}   Get Metric   ${prometheus_host}   ${prometheus_port}   ${prometheus_user}   ${prometheus_password}   ${metric_2_name}   ${metric_filter}
-    Run Keyword If   ${metric_2_value} <= 0   Fail   msg=The metric '${metric_2_name}' value is '${metric_2_value}'
-
+    [Documentation]   Check that the expected metrics are present in Prometheus (pushed from SA modules).
+    Variable Should Exist   ${PROMETHEUS_POLL_RETRIES}   msg=Metric polling retries is not available
+    Variable Should Exist   ${PROMETHEUS_POLL_TIMEOUT}   msg=Metric polling timeout is not available
+    Variable Should Exist   ${PROMETHEUS_HOST}   msg=Prometheus address is not available
+    Variable Should Exist   ${PROMETHEUS_PORT}   msg=Prometheus port is not available
+    Variable Should Exist   ${METRIC_1_NAME}   msg=Prometheus first metric name is not available
+    Variable Should Exist   ${METRIC_2_NAME}   msg=Prometheus second metric name is not available
+    ${metric_filter}=   Set Variable   ns_id=${NS_ID}
+    ${metric_1_value}=   Wait Until Keyword Succeeds   ${PROMETHEUS_POLL_RETRIES}   ${PROMETHEUS_POLL_TIMEOUT}   Get Metric   ${PROMETHEUS_HOST}   ${PROMETHEUS_PORT}   ${PROMETHEUS_USER}   ${PROMETHEUS_PASSWORD}   ${METRIC_1_NAME}   ${metric_filter}
+    IF   ${metric_1_value} <= 0   Fail   msg=The metric '${METRIC_1_NAME}' value is '${metric_1_value}'
+    ${metric_2_value}=   Wait Until Keyword Succeeds   ${PROMETHEUS_POLL_RETRIES}   ${PROMETHEUS_POLL_TIMEOUT}   Get Metric   ${PROMETHEUS_HOST}   ${PROMETHEUS_PORT}   ${PROMETHEUS_USER}   ${PROMETHEUS_PASSWORD}   ${METRIC_2_NAME}   ${metric_filter}
+    IF   ${metric_2_value} <= 0   Fail   msg=The metric '${METRIC_2_NAME}' value is '${metric_2_value}'
 
 Delete NS Instance
+    [Documentation]   Delete NS instance.
     [Tags]   cleanup
-
-    Delete NS   ${ns_name}
-
+    Delete NS   ${NS_NAME}
 
 Delete NS Descriptor
+    [Documentation]   Delete NS package.
     [Tags]   cleanup
-
-    Delete NSD   ${nsd_name}
-
+    Delete NSD   ${NSD_NAME}
 
 Delete VNF Descriptor
+    [Documentation]   Delete VNF package.
     [Tags]   cleanup
-
-    Delete VNFD   ${vnfd_name}
+    Delete VNFD   ${VNFD_NAME}
 
 
 *** Keywords ***
+Suite Preparation
+    [Documentation]   Test Suite Preparation: Setting Prometheus Testsuite Variables
+    Set Testsuite Prometheus Variables
+
 Suite Cleanup
     [Documentation]   Test Suite Cleanup: Deleting descriptors and NS instance
-
-    Run Keyword If Any Tests Failed   Delete NS   ${ns_name}
-
-    Run Keyword If Any Tests Failed   Delete NSD   ${nsd_name}
-
-    Run Keyword If Any Tests Failed   Delete VNFD   ${vnfd_name}
-
-
+    Run Keyword If Any Tests Failed   Delete NS   ${NS_NAME}
+    Run Keyword If Any Tests Failed   Delete NSD   ${NSD_NAME}
+    Run Keyword If Any Tests Failed   Delete VNFD   ${VNFD_NAME}
index b18e34a..f760871 100644 (file)
@@ -1,3 +1,4 @@
+*** Comments ***
 #   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
@@ -10,6 +11,7 @@
 #   See the License for the specific language governing permissions and
 #   limitations under the License.
 
+
 *** Settings ***
 Documentation   [SA-02] VNF with VIM-based metrics and auto-scaling.
 
@@ -18,180 +20,170 @@ Library   String
 Library   Collections
 Library   SSHLibrary
 
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/vnfd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/nsd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ns_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ssh_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/prometheus_lib.robot
-
-Variables   %{ROBOT_DEVOPS_FOLDER}/resources/sa_02-vnf_with_vim_metrics_and_autoscaling_data.py
+Resource   ../lib/vnfd_lib.resource
+Resource   ../lib/nsd_lib.resource
+Resource   ../lib/ns_lib.resource
+Resource   ../lib/ssh_lib.resource
+Resource   ../lib/prometheus_lib.resource
 
-Force Tags   sa_02   cluster_sa   daily   regression   sanity
+Test Tags   sa_02   cluster_sa   daily   regression   sanity   azure
 
+Suite Setup   Run Keyword And Ignore Error   Suite Preparation
 Suite Teardown   Run Keyword And Ignore Error   Suite Cleanup
 
 
 *** Variables ***
 # NS instantiation parameters
-${ns_config}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
+${NS_CONFIG}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
 
 # NS and VNF descriptor package folder and ids
-${vnfd_pkg}   hackfest_basic_metrics_vnf
-${vnfd_name}   hackfest_basic_metrics-vnf
-${nsd_pkg}   hackfest_basic_metrics_ns
-${nsd_name}   hackfest_basic-ns-metrics
+${VNFD_PKG}   hackfest_basic_metrics_vnf
+${VNFD_NAME}   hackfest_basic_metrics-vnf
+${NSD_PKG}   hackfest_basic_metrics_ns
+${NSD_NAME}   hackfest_basic-ns-metrics
 
 # NS instance name and id
-${ns_id}   ${EMPTY}
-${ns_name}   sa_02
+${NS_ID}   ${EMPTY}
+${NS_NAME}   sa_02
 
 # SSH keys and username to be used
-${publickey}   %{HOME}/.ssh/id_rsa.pub
-${privatekey}   %{HOME}/.ssh/id_rsa
-${username}   ubuntu
-${password}   osm4u
+${PUBLICKEY}   %{HOME}/.ssh/id_rsa.pub
+${PRIVATEKEY}   %{HOME}/.ssh/id_rsa
+${USERNAME}   ubuntu
+${PASSWORD}   osm4u
 
 # Prometheus polling interval and retries
-${prometheus_poll_retries}   15 times
-${prometheus_poll_timeout}   1 minute
+${PROMETHEUS_POLL_RETRIES}   15 times
+${PROMETHEUS_POLL_TIMEOUT}   1 minute
 
 # Prometheus metrics to retrieve
-${metric_name}   osm_cpu_utilization
+${METRIC_NAME}   osm_cpu_utilization
 
 # VNF Variables
-${vnf_member_index}   vnf
-${vnf_ip_addr}   ${EMPTY}
-${vnf_id}   ${EMPTY}
+${VNF_MEMBER_INDEX}   vnf
+${VNF_IP_ADDR}   ${EMPTY}
+${VNF_ID}   ${EMPTY}
 
-${success_return_code}   0
+${SUCCESS_RETURN_CODE}   0
 
 
 *** Test Cases ***
 Create VNF Descriptor
-
-    Create VNFD   '%{PACKAGES_FOLDER}/${vnfd_pkg}'
-
+    [Documentation]   Upload VNF package for the testsuite.
+    Create VNFD   '%{PACKAGES_FOLDER}/${VNFD_PKG}'
 
 Get Thresholds From VNF
-
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm vnfpkg-show ${vnfd_name} --literal | yq '.df[0]."scaling-aspect"[0]."scaling-policy"[0]."scaling-criteria"[0]."scale-out-threshold"' | tr -d \\"
-    Should Be Equal As Integers   ${rc}   ${success_return_code}   msg=${stdout}   values=False
+    [Documentation]   Read metric threshold and threshold time from VNF descriptor.
+    ${rc}   ${stdout}=   Run And Return RC And Output   osm vnfpkg-show ${VNFD_NAME} --literal | yq -r '.df[0]."scaling-aspect"[0]."scaling-policy"[0]."scaling-criteria"[0]."scale-out-threshold"'
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}   msg=${stdout}   values=False
     ${scaleout_threshold}=   Convert To Number   ${stdout}
-    Set Suite Variable   ${metric_threshold}   ${scaleout_threshold}
-    Log   ${metric_threshold}
-
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm vnfpkg-show ${vnfd_name} --literal | yq '.df[0]."scaling-aspect"[0]."scaling-policy"[0]."threshold-time"' | tr -d \\"
-    Should Be Equal As Integers   ${rc}   ${success_return_code}   msg=${stdout}   values=False
+    Set Suite Variable   ${METRIC_THRESHOLD}   ${scaleout_threshold}
+    Log   ${METRIC_THRESHOLD}
+    ${rc}   ${stdout}=   Run And Return RC And Output   osm vnfpkg-show ${VNFD_NAME} --literal | yq -r '.df[0]."scaling-aspect"[0]."scaling-policy"[0]."threshold-time"'
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}   msg=${stdout}   values=False
     ${threshold_time_value}=   Convert To Number   ${stdout}
-    Set Suite Variable   ${threshold_time}   ${threshold_time_value}
-    Log   ${threshold_time}
-
+    Set Suite Variable   ${THRESHOLD_TIME}   ${threshold_time_value}
+    Log   ${THRESHOLD_TIME}
 
 Create NS Descriptor
-
-    Create NSD   '%{PACKAGES_FOLDER}/${nsd_pkg}'
-
+    [Documentation]   Upload NS package for the testsuite.
+    Create NSD   '%{PACKAGES_FOLDER}/${NSD_PKG}'
 
 Instantiate Network Service
-
-    ${id}=   Create Network Service   ${nsd_name}   %{VIM_TARGET}   ${ns_name}   ${ns_config}   ${publickey}
-    Set Suite Variable   ${ns_id}   ${id}
-
+    [Documentation]   Instantiate the NS for the testsuite.
+    ${id}=   Create Network Service   ${NSD_NAME}   %{VIM_TARGET}   ${NS_NAME}   ${NS_CONFIG}   ${PUBLICKEY}
+    Set Suite Variable   ${NS_ID}   ${id}
 
 Get VNF Id
-
-    @{vnfr_list}=   Get Ns Vnfr Ids   ${ns_id}
+    [Documentation]   Retrieve VNF instance id to be used later on.
+    @{vnfr_list}=   Get Ns Vnfr Ids   ${NS_ID}
     Log List   ${vnfr_list}
-    Set Suite Variable   ${vnf_id}   ${vnfr_list}[0]
-
+    Set Suite Variable   ${VNF_ID}   ${vnfr_list}[0]
 
 Get VNF IP Address
-
-    ${ip_addr}=   Get Vnf Management Ip Address   ${ns_id}   ${vnf_member_index}
+    [Documentation]   Get the mgmt IP address of the VNF to be used in later tests.
+    ${ip_addr}=   Get Vnf Management Ip Address   ${NS_ID}   ${VNF_MEMBER_INDEX}
     Log   ${ip_addr}
-    Set Suite Variable   ${vnf_ip_addr}   ${ip_addr}
-
+    Set Suite Variable   ${VNF_IP_ADDR}   ${ip_addr}
 
 Get VNF VIM-based Metric Before Auto-scaling
-
-    Variable Should Exist   ${prometheus_poll_retries}   msg=Metric polling retries is not available
-    Variable Should Exist   ${prometheus_poll_timeout}   msg=Metric polling timeout is not available
-    Variable Should Exist   ${prometheus_host}   msg=Prometheus address is not available
-    Variable Should Exist   ${prometheus_port}   msg=Prometheus port is not available
-    Variable Should Exist   ${metric_name}   msg=Prometheus metric name is not available
-    ${metric_filter}=   Set Variable   ns_id=${ns_id}
-    ${metric_value}=   Wait Until Keyword Succeeds   ${prometheus_poll_retries}   ${prometheus_poll_timeout}   Get Metric   ${prometheus_host}   ${prometheus_port}   ${prometheus_user}   ${prometheus_password}   ${metric_name}   ${metric_filter}
-    Run Keyword If   ${metric_value} <= 0   Fail   msg=The metric '${metric_name}' value is '${metric_value}'
-    Run Keyword If   ${metric_value} >= ${metric_threshold}   Fail   msg=The metric '${metric_name}' value is higher than '${metric_threshold}' before scaling
-
+    [Documentation]   Get from Prometheus the VIM metric associated to the VNF auto-scaling group.
+    Variable Should Exist   ${PROMETHEUS_POLL_RETRIES}   msg=Metric polling retries is not available
+    Variable Should Exist   ${PROMETHEUS_POLL_TIMEOUT}   msg=Metric polling timeout is not available
+    Variable Should Exist   ${PROMETHEUS_HOST}   msg=Prometheus address is not available
+    Variable Should Exist   ${PROMETHEUS_PORT}   msg=Prometheus port is not available
+    Variable Should Exist   ${METRIC_NAME}   msg=Prometheus metric name is not available
+    ${metric_filter}=   Set Variable   ns_id=${NS_ID}
+    ${metric_value}=   Wait Until Keyword Succeeds   ${PROMETHEUS_POLL_RETRIES}   ${PROMETHEUS_POLL_TIMEOUT}   Get Metric   ${PROMETHEUS_HOST}   ${PROMETHEUS_PORT}   ${PROMETHEUS_USER}   ${PROMETHEUS_PASSWORD}   ${METRIC_NAME}   ${metric_filter}
+    IF   ${metric_value} <= 0
+        Fail   msg=The metric '${METRIC_NAME}' value is '${metric_value}'
+    END
+    IF   ${metric_value} >= ${METRIC_THRESHOLD}
+        Fail   msg=The metric '${METRIC_NAME}' value is higher than '${METRIC_THRESHOLD}' before scaling
+    END
 
 Increase VIM-based Metric To Force Auto-scaling
-
-    Variable Should Exist   ${privatekey}   msg=SSH private key not available
-    Execute Remote Command Check Rc Return Output   ${vnf_ip_addr}   ${username}   ${password}   ${privatekey}   for i in {1..9}; do yes > /dev/null & done
-
+    [Documentation]   Connect to the VNF via SSH and force VIM metric to increase.
+    Variable Should Exist   ${PRIVATEKEY}   msg=SSH private key not available
+    Execute Remote Command Check Rc Return Output   ${VNF_IP_ADDR}   ${USERNAME}   ${PASSWORD}   ${PRIVATEKEY}   for i in {1..9}; do yes &> /dev/null & done
 
 Wait VIM-based Metric To Exceed Threshold
-
-    Variable Should Exist   ${prometheus_poll_retries}   msg=Metric polling retries is not available
-    Variable Should Exist   ${prometheus_poll_timeout}   msg=Metric polling timeout is not available
-    Wait Until Keyword Succeeds   ${prometheus_poll_retries}   ${prometheus_poll_timeout}   Check VIM-based Metric Exceeds Threshold
-
+    [Documentation]   Wait until the VIM metric exceeds threshold, which should lead to a scale up.
+    Variable Should Exist   ${PROMETHEUS_POLL_RETRIES}   msg=Metric polling retries is not available
+    Variable Should Exist   ${PROMETHEUS_POLL_TIMEOUT}   msg=Metric polling timeout is not available
+    Wait Until Keyword Succeeds   ${PROMETHEUS_POLL_RETRIES}   ${PROMETHEUS_POLL_TIMEOUT}   Check VIM-based Metric Exceeds Threshold
 
 Wait Threshold Time
-
-    ${threshold_time_sleep}=   Evaluate   ${threshold_time} + 1
+    [Documentation]   Wait until the VIM metric has exceeded threshold for the defined period in the descriptor.
+    ${threshold_time_sleep}=   Evaluate   ${THRESHOLD_TIME} + 1
     Sleep   ${threshold_time_sleep} minutes   Wait scale-out threshold time plus 1 minute
 
-
 Check VIM-based Metric Exceeds Threshold After Threshold-time
-
+    [Documentation]   Check that the VIM metric has exceeded the threshold.
     Check VIM-based Metric Exceeds Threshold
 
-
 Get VDUs After Auto-scaling
-
+    [Documentation]   Check that the VNF has scaled up and the humber of VDUs has increased.
     Sleep   2 minutes   Wait for auto-scale to take place
-    @{vdur_list}=   Get Vnf Vdur Names   ${vnf_id}
+    @{vdur_list}=   Get Vnf Vdur Names   ${VNF_ID}
     Log List   ${vdur_list}
     ${vdurs}=   Get Length   ${vdur_list}
-    Run Keyword If   ${vdurs} <= 1   Fail   msg=There is no new VDU after auto-scaling
-
+    IF   ${vdurs} <= 1   Fail   msg=There is no new VDU after auto-scaling
 
 Delete NS Instance
+    [Documentation]   Delete NS instance.
     [Tags]   cleanup
-
-    Delete NS   ${ns_name}
-
+    Delete NS   ${NS_NAME}
 
 Delete NS Descriptor
+    [Documentation]   Delete NS package from OSM.
     [Tags]   cleanup
-
-    Delete NSD   ${nsd_name}
-
+    Delete NSD   ${NSD_NAME}
 
 Delete VNF Descriptor
+    [Documentation]   Delete VNF package from OSM.
     [Tags]   cleanup
-
-    Delete VNFD   ${vnfd_name}
+    Delete VNFD   ${VNFD_NAME}
 
 
 *** Keywords ***
+Suite Preparation
+    [Documentation]   Test Suite Preparation: Setting Prometheus Testsuite Variables
+    Set Testsuite Prometheus Variables
+
 Suite Cleanup
     [Documentation]   Test Suite Cleanup: Deleting descriptors and NS instance
-
-    Run Keyword If Any Tests Failed   Delete NS   ${ns_name}
-    Run Keyword If Any Tests Failed   Delete NSD   ${nsd_name}
-    Run Keyword If Any Tests Failed   Delete VNFD   ${vnfd_name}
-
+    Run Keyword If Any Tests Failed   Delete NS   ${NS_NAME}
+    Run Keyword If Any Tests Failed   Delete NSD   ${NSD_NAME}
+    Run Keyword If Any Tests Failed   Delete VNFD   ${VNFD_NAME}
 
 Check VIM-based Metric Exceeds Threshold
     [Documentation]   Auxiliar keyword to check if metric exceeds threshold
-
-    Variable Should Exist   ${prometheus_host}   msg=Prometheus address is not available
-    Variable Should Exist   ${prometheus_port}   msg=Prometheus port is not available
-    Variable Should Exist   ${metric_name}   msg=Prometheus metric name is not available
-    ${metric_filter}=   Set Variable   ns_id=${ns_id}
-    ${metric_value}=   Get Metric   ${prometheus_host}   ${prometheus_port}   ${prometheus_user}   ${prometheus_password}   ${metric_name}   ${metric_filter}
-    Run Keyword If   ${metric_value} <= ${metric_threshold}   Fail   msg=The metric '${metric_name}' value is '${metric_value}' which is lower than '${metric_threshold}'
-
+    Variable Should Exist   ${PROMETHEUS_HOST}   msg=Prometheus address is not available
+    Variable Should Exist   ${PROMETHEUS_PORT}   msg=Prometheus port is not available
+    Variable Should Exist   ${METRIC_NAME}   msg=Prometheus metric name is not available
+    ${metric_filter}=   Set Variable   ns_id=${NS_ID}
+    ${metric_value}=   Get Metric   ${PROMETHEUS_HOST}   ${PROMETHEUS_PORT}   ${PROMETHEUS_USER}   ${PROMETHEUS_PASSWORD}   ${METRIC_NAME}   ${metric_filter}
+    IF   ${metric_value} <= ${METRIC_THRESHOLD}
+        Fail   msg=The metric '${METRIC_NAME}' value is '${metric_value}' which is lower than '${METRIC_THRESHOLD}'
+    END
index eada9ba..a26ca11 100644 (file)
@@ -1,3 +1,4 @@
+*** Comments ***
 #   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
@@ -10,6 +11,7 @@
 #   See the License for the specific language governing permissions and
 #   limitations under the License.
 
+
 *** Settings ***
 Documentation   [SA-07] Events or alarms coming from SA-related VNFs in the NS.
 
@@ -18,188 +20,173 @@ Library   String
 Library   Collections
 Library   SSHLibrary
 
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/vnfd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/nsd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ns_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ssh_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/prometheus_lib.robot
-
-Variables   %{ROBOT_DEVOPS_FOLDER}/resources/sa_07-alarms_from_sa-related_vnfs_data.py
+Resource   ../lib/vnfd_lib.resource
+Resource   ../lib/nsd_lib.resource
+Resource   ../lib/ns_lib.resource
+Resource   ../lib/ssh_lib.resource
+Resource   ../lib/prometheus_lib.resource
 
-Force Tags   sa_07   cluster_sa   daily   regression
+Test Tags   sa_07   cluster_sa   daily   regression
 
+Suite Setup   Run Keyword And Ignore Error   Suite Preparation
 Suite Teardown   Run Keyword And Ignore Error   Suite Cleanup
 
 
 *** Variables ***
 # NS instantiation parameters
-${ns_config}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
+${NS_CONFIG}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
 
 # NS and VNF descriptor package folder and ids
-${vnfd_pkg}   cirros_alarm_vnf
-${vnfd_name}   cirros_alarm-vnf
-${vnfd_file}   cirros_alarm_vnfd.yaml
-${new_vnfd_pkg}   new_cirros_alarm_vnf
-${nsd_pkg}   cirros_alarm_ns
-${nsd_name}   cirros_alarm-ns
+${VNFD_PKG}   cirros_alarm_vnf
+${VNFD_NAME}   cirros_alarm-vnf
+${VNFD_FILE}   cirros_alarm_vnfd.yaml
+${NEW_VNFD_PKG}   new_cirros_alarm_vnf
+${NSD_PKG}   cirros_alarm_ns
+${NSD_NAME}   cirros_alarm-ns
 
 # NS instance name and id
-${ns_id}   ${EMPTY}
-${ns_name}   sa_07-alarm_test
+${NS_ID}   ${EMPTY}
+${NS_NAME}   sa_07-alarm_test
 
 # Webhook NS and VNF descriptor package folder and ids
-${ws_vnfd_pkg}   hackfest_basic_vnf
-${ws_nsd_pkg}   hackfest_basic_ns
-${ws_vnfd_name}   hackfest_basic-vnf
-${ws_nsd_name}   hackfest_basic-ns
+${WS_VNFD_PKG}   hackfest_basic_vnf
+${WS_NSD_PKG}   hackfest_basic_ns
+${WS_VNFD_NAME}   hackfest_basic-vnf
+${WS_NSD_NAME}   hackfest_basic-ns
 
 # Webhook NS instance name and id
-${ws_ns_id}   ${EMPTY}
-${ws_ns_name}   sa_07-webhook_service_test
+${WS_NS_ID}   ${EMPTY}
+${WS_NS_NAME}   sa_07-webhook_service_test
 
 # Webhook NS Variables
-${ws_vnf_member_index}   vnf
-${ws_vnf_ip_addr}   ${EMPTY}
-${ws_log_file}   webhook.log
-${ws_port}   5212
-${ws_alarm_msg}   notify_alarm
+${WS_VNF_MEMBER_INDEX}   vnf
+${WS_VNF_IP_ADDR}   ${EMPTY}
+${WS_LOG_FILE}   webhook.log
+${WS_PORT}   5212
+${WS_ALARM_MSG}   notify_alarm
 
 # SSH keys and username to be used
-${publickey}   %{HOME}/.ssh/id_rsa.pub
-${privatekey}   %{HOME}/.ssh/id_rsa
-${username}   ubuntu
-${password}   ${EMPTY}
+${PUBLICKEY}   %{HOME}/.ssh/id_rsa.pub
+${PRIVATEKEY}   %{HOME}/.ssh/id_rsa
+${USERNAME}   ubuntu
+${PASSWORD}   ${EMPTY}
 
 # Prometheus polling interval and retries
-${prometheus_poll_retries}   15 times
-${prometheus_poll_timeout}   1 minute
+${PROMETHEUS_POLL_RETRIES}   15 times
+${PROMETHEUS_POLL_TIMEOUT}   1 minute
 
 # Prometheus metrics to retrieve
-${metric_name}   osm_cpu_utilization
+${METRIC_NAME}   osm_cpu_utilization
 
-${success_return_code}   0
+${SUCCESS_RETURN_CODE}   0
 
 
 *** Test Cases ***
 Create Webhook Service VNF Descriptor
-
-    Create VNFD   '%{PACKAGES_FOLDER}/${ws_vnfd_pkg}'
-
+    [Documentation]   Upload VNF package with a webhook service for the testsuite.
+    Create VNFD   '%{PACKAGES_FOLDER}/${WS_VNFD_PKG}'
 
 Create Webhook Service NS Descriptor
-
-    Create NSD   '%{PACKAGES_FOLDER}/${ws_nsd_pkg}'
-
+    [Documentation]   Upload NS package with a webhook service for the testsuite.
+    Create NSD   '%{PACKAGES_FOLDER}/${WS_NSD_PKG}'
 
 Instantiate Webhook Service Network Service
-
-    ${id}=   Create Network Service   ${ws_nsd_name}   %{VIM_TARGET}   ${ws_ns_name}   ${ns_config}   ${publickey}
-    Set Suite Variable   ${ws_ns_id}   ${id}
-
+    [Documentation]   Instantiate NS with the webhook for the testsuite.
+    ${id}=   Create Network Service   ${WS_NSD_NAME}   %{VIM_TARGET}   ${WS_NS_NAME}   ${NS_CONFIG}   ${PUBLICKEY}
+    Set Suite Variable   ${WS_NS_ID}   ${id}
 
 Get Webhook Service VNF IP Address
-
-    ${ip_addr}=   Get Vnf Management Ip Address   ${ws_ns_id}   ${ws_vnf_member_index}
+    [Documentation]   Get the mgmt IP address of the VNF offering the webhook service.
+    ${ip_addr}=   Get Vnf Management Ip Address   ${WS_NS_ID}   ${WS_VNF_MEMBER_INDEX}
     Log   ${ip_addr}
-    Set Suite Variable   ${ws_vnf_ip_addr}   ${ip_addr}
-
+    Set Suite Variable   ${WS_VNF_IP_ADDR}   ${ip_addr}
 
 Start Webhook Service
-
-    Variable Should Exist   ${privatekey}   msg=SSH private key not available
+    [Documentation]   Launch simple command in webhook VNF to listen to notifications.
+    Variable Should Exist   ${PRIVATEKEY}   msg=SSH private key not available
     Sleep   40 seconds   Wait for SSH daemon to be up
-    ${stdout}=   Execute Remote Command Check Rc Return Output   ${ws_vnf_ip_addr}   ${username}   ${password}   ${privatekey}   while true; do { echo -e 'HTTP/1.1 200 OK\r\n'; test; } | nc -l '${ws_port}'; done > '${ws_log_file}' 2>&1 &
-
+    ${stdout}=   Execute Remote Command Check Rc Return Output   ${WS_VNF_IP_ADDR}   ${USERNAME}   ${PASSWORD}   ${PRIVATEKEY}   while true; do { echo -e 'HTTP/1.0 200 OK\r\nContent-Length: 0\r\n\r\n'; test; } | nc -l '${WS_PORT}'; done > '${WS_LOG_FILE}' 2>&1 &
+    Log   ${stdout}
 
 Create VNF Descriptor
-
-    ${rc}   ${stdout}=   Run and Return RC and Output   mkdir '%{PACKAGES_FOLDER}/${new_vnfd_pkg}' && WEBHOOK_URL="http://${ws_vnf_ip_addr}:${ws_port}" envsubst < '%{PACKAGES_FOLDER}/${vnfd_pkg}'/'${vnfd_file}' > '%{PACKAGES_FOLDER}/${new_vnfd_pkg}'/'${vnfd_file}'
+    [Documentation]   Upload VNF package for the testsuite.
+    ${rc}   ${stdout}=   Run And Return RC And Output   mkdir '%{PACKAGES_FOLDER}/${NEW_VNFD_PKG}' && WEBHOOK_URL="http://${WS_VNF_IP_ADDR}:${WS_PORT}" envsubst < '%{PACKAGES_FOLDER}/${VNFD_PKG}'/'${VNFD_FILE}' > '%{PACKAGES_FOLDER}/${NEW_VNFD_PKG}'/'${VNFD_FILE}'
     Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    Create VNFD   '%{PACKAGES_FOLDER}/${new_vnfd_pkg}'
-
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    Create VNFD   '%{PACKAGES_FOLDER}/${NEW_VNFD_PKG}'
 
 Create NS Descriptor
-
-    Create NSD   '%{PACKAGES_FOLDER}/${nsd_pkg}'
-
+    [Documentation]   Upload NS package for the testsuite.
+    Create NSD   '%{PACKAGES_FOLDER}/${NSD_PKG}'
 
 Instantiate Network Service
-
-    ${id}=   Create Network Service   ${nsd_name}   %{VIM_TARGET}   ${ns_name}   ${ns_config}   ${publickey}
-    Set Suite Variable   ${ns_id}   ${id}
-
+    [Documentation]   Instantiate the main NS for the testsuite.
+    ${id}=   Create Network Service   ${NSD_NAME}   %{VIM_TARGET}   ${NS_NAME}   ${NS_CONFIG}   ${PUBLICKEY}
+    Set Suite Variable   ${NS_ID}   ${id}
 
 Get Alarm Metric
-
-    Variable Should Exist   ${prometheus_poll_retries}   msg=Metric polling retries is not available
-    Variable Should Exist   ${prometheus_poll_timeout}   msg=Metric polling timeout is not available
-    Variable Should Exist   ${prometheus_host}   msg=Prometheus address is not available
-    Variable Should Exist   ${prometheus_port}   msg=Prometheus port is not available
-    Variable Should Exist   ${metric_name}   msg=Prometheus metric name is not available
-    ${metric_filter}=   Set Variable   ns_id=${ns_id}
-    ${metric_value}=   Wait Until Keyword Succeeds   ${prometheus_poll_retries}   ${prometheus_poll_timeout}   Get Metric   ${prometheus_host}   ${prometheus_port}   ${prometheus_user}   ${prometheus_password}   ${metric_name}   ${metric_filter}
-    Run Keyword If   ${metric_value} <= 0   Fail   msg=The metric '${metric_name}' value is '${metric_value}'
-
+    [Documentation]   Check that the expected metric is present in Prometheus (pushed from SA modules).
+    Variable Should Exist   ${PROMETHEUS_POLL_RETRIES}   msg=Metric polling retries is not available
+    Variable Should Exist   ${PROMETHEUS_POLL_TIMEOUT}   msg=Metric polling timeout is not available
+    Variable Should Exist   ${PROMETHEUS_HOST}   msg=Prometheus address is not available
+    Variable Should Exist   ${PROMETHEUS_PORT}   msg=Prometheus port is not available
+    Variable Should Exist   ${METRIC_NAME}   msg=Prometheus metric name is not available
+    ${metric_filter}=   Set Variable   ns_id=${NS_ID}
+    ${metric_value}=   Wait Until Keyword Succeeds   ${PROMETHEUS_POLL_RETRIES}   ${PROMETHEUS_POLL_TIMEOUT}   Get Metric   ${PROMETHEUS_HOST}   ${PROMETHEUS_PORT}   ${PROMETHEUS_USER}   ${PROMETHEUS_PASSWORD}   ${METRIC_NAME}   ${metric_filter}
+    IF   ${metric_value} <= 0   Fail   msg=The metric '${METRIC_NAME}' value is '${metric_value}'
 
 Check Alarms Were Received
-
-    Wait Until Keyword Succeeds   6 times   40 seconds   Execute Remote Command Check Rc Return Output   ${ws_vnf_ip_addr}   ${username}   ${password}   ${privatekey}   cat '${ws_log_file}' | grep '${ws_alarm_msg}' | grep '${ns_name}'
-
+    [Documentation]   Check in the webhook VNF that the notification is received.
+    Wait Until Keyword Succeeds   6 times   40 seconds   Execute Remote Command Check Rc Return Output   ${WS_VNF_IP_ADDR}   ${USERNAME}   ${PASSWORD}   ${PRIVATEKEY}   cat '${WS_LOG_FILE}' | grep '${WS_ALARM_MSG}' | grep '${NS_NAME}'
 
 Delete NS Instance
+    [Documentation]   Delete main NS instance.
     [Tags]   cleanup
-
-    Delete NS   ${ns_name}
-
+    Delete NS   ${NS_NAME}
 
 Delete NS Descriptor
+    [Documentation]   Delete main NS package.
     [Tags]   cleanup
-
-    Delete NSD   ${nsd_name}
-
+    Delete NSD   ${NSD_NAME}
 
 Delete VNF Descriptor
+    [Documentation]   Delete main VNF package.
     [Tags]   cleanup
-
-    Delete VNFD   ${vnfd_name}
-
+    Delete VNFD   ${VNFD_NAME}
 
 Delete Webhook Service NS Instance
+    [Documentation]   Delete NS instance for the webhook.
     [Tags]   cleanup
-
-    Delete NS   ${ws_ns_name}
-
+    Delete NS   ${WS_NS_NAME}
 
 Delete Webhook Service NS Descriptor
+    [Documentation]   Delete NS package for the webhook.
     [Tags]   cleanup
-
-    Delete NSD   ${ws_nsd_name}
-
+    Delete NSD   ${WS_NSD_NAME}
 
 Delete Webhook Service VNF Descriptor
+    [Documentation]   Delete VNF package for the webhook.
     [Tags]   cleanup
-
-    Delete VNFD   ${ws_vnfd_name}
+    Delete VNFD   ${WS_VNFD_NAME}
 
 
 *** Keywords ***
+Suite Preparation
+    [Documentation]   Test Suite Preparation: Setting Prometheus Testsuite Variables
+    Set Testsuite Prometheus Variables
+
 Suite Cleanup
     [Documentation]   Test Suite Cleanup: Deleting descriptors and NS instance
-
-    Run Keyword If Any Tests Failed   Delete NS   ${ns_name}
-    Run Keyword If Any Tests Failed   Delete NSD   ${nsd_name}
-    Run Keyword If Any Tests Failed   Delete VNFD   ${vnfd_name}
-    Run Keyword If Any Tests Failed   Delete NS   ${ws_ns_name}
-    Run Keyword If Any Tests Failed   Delete NSD   ${ws_nsd_name}
-    Run Keyword If Any Tests Failed   Delete VNFD   ${ws_vnfd_name}
-    Delete Temporary Descriptor Folder   '%{PACKAGES_FOLDER}/${new_vnfd_pkg}'
-
+    Run Keyword If Any Tests Failed   Delete NS   ${NS_NAME}
+    Run Keyword If Any Tests Failed   Delete NSD   ${NSD_NAME}
+    Run Keyword If Any Tests Failed   Delete VNFD   ${VNFD_NAME}
+    Run Keyword If Any Tests Failed   Delete NS   ${WS_NS_NAME}
+    Run Keyword If Any Tests Failed   Delete NSD   ${WS_NSD_NAME}
+    Run Keyword If Any Tests Failed   Delete VNFD   ${WS_VNFD_NAME}
+    Delete Temporary Descriptor Folder   '%{PACKAGES_FOLDER}/${NEW_VNFD_PKG}'
 
 Delete Temporary Descriptor Folder
     [Documentation]   Removes the temporary package folder created for the test
     [Arguments]   ${folder_name}
-    ${rc}   ${stdout}=   Run and Return RC and Output   rm -rf '${folder_name}'
-    Log   ${stdout}
-
-
+    ${rc}   ${stdout}=   Run And Return RC And Output   rm -rf '${folder_name}'
+    Log   ${rc},${stdout}
index a937bcd..7ba0818 100644 (file)
@@ -1,3 +1,4 @@
+*** Comments ***
 #   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
@@ -10,6 +11,7 @@
 #   See the License for the specific language governing permissions and
 #   limitations under the License.
 
+
 *** Settings ***
 Documentation   [SA-08] VNF with VNF-based indicators through SNMP.
 
@@ -17,94 +19,90 @@ Library   OperatingSystem
 Library   String
 Library   Collections
 
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/vnfd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/nsd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ns_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ssh_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/prometheus_lib.robot
-
-Variables   %{ROBOT_DEVOPS_FOLDER}/resources/sa_08-vnf_with_vnf_indicators_snmp_data.py
+Resource   ../lib/vnfd_lib.resource
+Resource   ../lib/nsd_lib.resource
+Resource   ../lib/ns_lib.resource
+Resource   ../lib/ssh_lib.resource
+Resource   ../lib/prometheus_lib.resource
 
-Force Tags   sa_08   cluster_k8s   daily   regression
+Test Tags   sa_08   cluster_k8s   daily   regression
 
+Suite Setup   Run Keyword And Ignore Error   Suite Preparation
 Suite Teardown   Run Keyword And Ignore Error   Suite Cleanup
 
 
 *** Variables ***
 # NS instantiation parameters
-${ns_config}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
+${NS_CONFIG}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
 
 # NS and VNF descriptor package folder and ids
-${vnfd_pkg}   snmp_ee_vnf
-${vnfd_name}   snmp_ee-vnf
-${nsd_pkg}   snmp_ee_ns
-${nsd_name}   snmp_ee-ns
+${VNFD_PKG}   snmp_ee_vnf
+${VNFD_NAME}   snmp_ee-vnf
+${NSD_PKG}   snmp_ee_ns
+${NSD_NAME}   snmp_ee-ns
 
 # NS instance name
-${ns_name}   sa_08-vnf_with_vnf_indicators_snmp_test
+${NS_NAME}   sa_08-vnf_with_vnf_indicators_snmp_test
 
 # Prometheus polling interval and retries
-${prometheus_poll_retries}   10 times
-${prometheus_poll_timeout}   1 minute
+${PROMETHEUS_POLL_RETRIES}   10 times
+${PROMETHEUS_POLL_TIMEOUT}   1 minute
 
 # Prometheus metrics to retrieve
-${metric_1_name}   ifInOctets
-${metric_1_filter}   ifIndex=1
-${metric_2_name}   ifMtu
-${metric_2_filter}   ifIndex=2
+${METRIC_1_NAME}   ifInOctets
+${METRIC_1_FILTER}   ifIndex=1
+${METRIC_2_NAME}   ifMtu
+${METRIC_2_FILTER}   ifIndex=2
 
 
 *** Test Cases ***
 Create VNF Descriptor
-
-    Create VNFD   '%{PACKAGES_FOLDER}/${vnfd_pkg}'
-
+    [Documentation]   Upload VNF package for the testsuite.
+    Create VNFD   '%{PACKAGES_FOLDER}/${VNFD_PKG}'
 
 Create NS Descriptor
-
-    Create NSD   '%{PACKAGES_FOLDER}/${nsd_pkg}'
-
+    [Documentation]   Upload NS package for the testsuite.
+    Create NSD   '%{PACKAGES_FOLDER}/${NSD_PKG}'
 
 Instantiate Network Service
-
-    ${id}=   Create Network Service   ${nsd_name}   %{VIM_TARGET}   ${ns_name}   ${ns_config}   ${EMPTY}
-    Set Suite Variable   ${ns_id}   ${id}
-
+    [Documentation]   Instantiate the NS for the testsuite.
+    ${id}=   Create Network Service   ${NSD_NAME}   %{VIM_TARGET}   ${NS_NAME}   ${NS_CONFIG}   ${EMPTY}
+    Set Suite Variable   ${NS_ID}   ${id}
 
 Get VNF SNMP Metrics
-
-    Variable Should Exist   ${prometheus_host}   msg=Prometheus address is not available
-    Variable Should Exist   ${prometheus_port}   msg=Prometheus port is not available
-    Variable Should Exist   ${metric_1_name}   msg=Prometheus first metric name is not available
-    Variable Should Exist   ${metric_2_name}   msg=Prometheus second metric name is not available
-    ${metric_1_value}=   Wait Until Keyword Succeeds   ${prometheus_poll_retries}   ${prometheus_poll_timeout}   Get Metric   ${prometheus_host}   ${prometheus_port}   ${prometheus_user}   ${prometheus_password}   ${metric_1_name}   ${metric_1_filter}
-    Run Keyword If   ${metric_1_value} <= 0   Fail   msg=The metric '${metric_1_name}' value is '${metric_1_value}'
-    ${metric_2_value}=   Wait Until Keyword Succeeds   ${prometheus_poll_retries}   ${prometheus_poll_timeout}   Get Metric   ${prometheus_host}   ${prometheus_port}   ${prometheus_user}   ${prometheus_password}   ${metric_2_name}   ${metric_2_filter}
-    Run Keyword If   ${metric_2_value} <= 0   Fail   msg=The metric '${metric_2_name}' value is '${metric_2_value}'
-
+    [Documentation]   Check that SNMP metrics from the VNF are stored in Prometheus.
+    Variable Should Exist   ${PROMETHEUS_HOST}   msg=Prometheus address is not available
+    Variable Should Exist   ${PROMETHEUS_PORT}   msg=Prometheus port is not available
+    Variable Should Exist   ${METRIC_1_NAME}   msg=Prometheus first metric name is not available
+    Variable Should Exist   ${METRIC_2_NAME}   msg=Prometheus second metric name is not available
+    ${metric_1_value}=   Wait Until Keyword Succeeds   ${PROMETHEUS_POLL_RETRIES}   ${PROMETHEUS_POLL_TIMEOUT}   Get Metric   ${PROMETHEUS_HOST}   ${PROMETHEUS_PORT}   ${PROMETHEUS_USER}   ${PROMETHEUS_PASSWORD}   ${METRIC_1_NAME}   ${METRIC_1_FILTER}
+    IF   ${metric_1_value} <= 0   Fail   msg=The metric '${METRIC_1_NAME}' value is '${metric_1_value}'
+    ${metric_2_value}=   Wait Until Keyword Succeeds   ${PROMETHEUS_POLL_RETRIES}   ${PROMETHEUS_POLL_TIMEOUT}   Get Metric   ${PROMETHEUS_HOST}   ${PROMETHEUS_PORT}   ${PROMETHEUS_USER}   ${PROMETHEUS_PASSWORD}   ${METRIC_2_NAME}   ${METRIC_2_FILTER}
+    IF   ${metric_2_value} <= 0   Fail   msg=The metric '${METRIC_2_NAME}' value is '${metric_2_value}'
 
 Delete NS Instance
+    [Documentation]   Delete NS instance.
     [Tags]   cleanup
-
-    Delete NS   ${ns_name}
-
+    Delete NS   ${NS_NAME}
 
 Delete NS Descriptor
+    [Documentation]   Delete NS package from OSM.
     [Tags]   cleanup
-
-    Delete NSD   ${nsd_name}
-
+    Delete NSD   ${NSD_NAME}
 
 Delete VNF Descriptor
+    [Documentation]   Delete VNF package from OSM.
     [Tags]   cleanup
-
-    Delete VNFD   ${vnfd_name}
+    Delete VNFD   ${VNFD_NAME}
 
 
 *** Keywords ***
+Suite Preparation
+    [Documentation]   Test Suite Preparation: Setting Prometheus Testsuite Variables
+    Set Testsuite Prometheus Variables
+
 Suite Cleanup
     [Documentation]   Test Suite Cleanup: Deleting descriptors and NS instance
-
-    Run Keyword If Any Tests Failed   Delete NS   ${ns_name}
-    Run Keyword If Any Tests Failed   Delete NSD   ${nsd_name}
-    Run Keyword If Any Tests Failed   Delete VNFD   ${vnfd_name}
+    Run Keyword If Any Tests Failed   Delete NS   ${NS_NAME}
+    Run Keyword If Any Tests Failed   Delete NSD   ${NSD_NAME}
+    Run Keyword If Any Tests Failed   Delete VNFD   ${VNFD_NAME}
index a910524..bc595f9 100644 (file)
@@ -1,3 +1,4 @@
+*** Comments ***
 #   Copyright 2020 Atos
 #
 #   Licensed under the Apache License, Version 2.0 (the "License");
@@ -12,6 +13,7 @@
 #   See the License for the specific language governing permissions and
 #   limitations under the License.
 
+
 *** Settings ***
 Documentation   [SLICE-01] Network Slicing.
 
@@ -22,171 +24,140 @@ Library   Process
 Library   SSHLibrary
 Library   yaml
 
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/vnfd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/nsd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/nst_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/nsi_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ns_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/connectivity_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ssh_lib.robot
+Resource   ../lib/vnfd_lib.resource
+Resource   ../lib/nsd_lib.resource
+Resource   ../lib/nst_lib.resource
+Resource   ../lib/nsi_lib.resource
+Resource   ../lib/ns_lib.resource
+Resource   ../lib/connectivity_lib.resource
+Resource   ../lib/ssh_lib.resource
 
-Force Tags   slice_01   cluster_slices   daily   regression
+Test Tags   slice_01   cluster_slices   daily   regression
 
 Suite Teardown   Run Keyword And Ignore Error   Suite Cleanup
 
 
 *** Variables ***
 # NS and VNF descriptor package files
-${vnfd1_pkg}   slice_basic_vnf
-${vnfd2_pkg}   slice_basic_middle_vnf
-${nsd1_pkg}   slice_basic_ns
-${nsd2_pkg}   slice_basic_middle_ns
-${nst}   slice_basic_nst/slice_basic_nst.yaml
+${VNFD1_PKG}   slice_basic_vnf
+${VNFD2_PKG}   slice_basic_middle_vnf
+${NSD1_PKG}   slice_basic_ns
+${NSD2_PKG}   slice_basic_middle_ns
+${NST}   slice_basic_nst/slice_basic_nst.yaml
 
 # Descriptor names
-${nst_name}   slice_basic_nst
-${vnfd1_name}   slice_basic_vnf
-${vnfd2_name}   slice_basic_middle_vnf
-${nsd1_name}   slice_basic_ns
-${nsd2_name}   slice_basic_middle_ns
+${NST_NAME}   slice_basic_nst
+${VNFD1_NAME}   slice_basic_vnf
+${VNFD2_NAME}   slice_basic_middle_vnf
+${NSD1_NAME}   slice_basic_ns
+${NSD2_NAME}   slice_basic_middle_ns
 
 # Instance names
-${slice_name}   slicebasic
-${middle_ns_name}   slicebasic.slice_basic_nsd_2
+${SLICE_NAME}   slicebasic
+${MIDDLE_NS_NAME}   slicebasic.slice_basic_nsd_2
 
 # SSH keys and username to be used
-${publickey}   %{HOME}/.ssh/id_rsa.pub
-${privatekey}   %{HOME}/.ssh/id_rsa
-${username}   ubuntu
-${password}   ${EMPTY}
+${PUBLICKEY}   %{HOME}/.ssh/id_rsa.pub
+${PRIVATEKEY}   %{HOME}/.ssh/id_rsa
+${USERNAME}   ubuntu
+${PASSWORD}   ${EMPTY}
 
-${ns_id}   ${EMPTY}
-${vnf_member_index}   middle
-${vnf_ip_addr}   ${EMPTY}
-${mgmt_vnf_ip}   ${EMPTY}
-${nst_config}   {netslice-vld: [ {name: slice_vld_mgmt, vim-network-name: %{VIM_MGMT_NET}} ] }
+${VNF_MEMBER_INDEX}   middle
+${VNF_IP_ADDR}   ${EMPTY}
+${MGMT_VNF_IP}   ${EMPTY}
+${NST_CONFIG}   {netslice-vld: [ {name: slice_vld_mgmt, vim-network-name: %{VIM_MGMT_NET}} ] }
 
 
 *** Test Cases ***
 Create Slice VNF Descriptors
     [Documentation]   Onboards all the VNFDs required for the test: vnfd1_pkg and vnfd2_pkg (in the variables file)
-
-    Create VNFD   '%{PACKAGES_FOLDER}/${vnfd1_pkg}'
-    Create VNFD   '%{PACKAGES_FOLDER}/${vnfd2_pkg}'
-
+    Create VNFD   '%{PACKAGES_FOLDER}/${VNFD1_PKG}'
+    Create VNFD   '%{PACKAGES_FOLDER}/${VNFD2_PKG}'
 
 Create Slice NS Descriptors
     [Documentation]   Onboards all the NSDs required for the test: nsd1_pkg and nsd2_pkg (in the variables file)
-
-    Create NSD   '%{PACKAGES_FOLDER}/${nsd1_pkg}'
-    Create NSD   '%{PACKAGES_FOLDER}/${nsd2_pkg}'
+    Create NSD   '%{PACKAGES_FOLDER}/${NSD1_PKG}'
+    Create NSD   '%{PACKAGES_FOLDER}/${NSD2_PKG}'
 
 Create Slice Template
     [Documentation]   Onboards the Network Slice Template: nst (in the variables file)
-
-    Create NST   '%{PACKAGES_FOLDER}/${nst}'
+    Create NST   '%{PACKAGES_FOLDER}/${NST}'
 
 Network Slice Instance Test
     [Documentation]   Instantiates the NST recently onboarded and sets the instantiation id as a suite variable (nsi_id)
-
-    ${id}=   Create Network Slice   ${nst_name}   %{VIM_TARGET}   ${slice_name}   ${nst_config}   ${publickey}
-    Set Suite Variable   ${nsi_id}   ${id}
-
+    ${id}=   Create Network Slice   ${NST_NAME}   %{VIM_TARGET}   ${SLICE_NAME}   ${NST_CONFIG}   ${PUBLICKEY}
+    Set Suite Variable   ${NSI_ID}   ${id}
 
 Get Middle Vnf Management Ip
     [Documentation]   Obtains the management IP of the slice middle VNF (name in the reources file) and sets the ip as a suite variable (mgmt_vnf_ip)
-
-    ${middle_ns_id}=   Run and Return RC and Output   osm ns-list | grep ${middle_ns_name} | awk '{print $4}' 2>&1
-    ${vnf_ip}   Get Vnf Management Ip Address   ${middle_ns_id}[1]   ${vnf_member_index}
-    Run Keyword If   '${vnf_ip}' == '${EMPTY}'   Fatal Error   Variable \$\{ vnf_ip\} Empty
-    Set Suite Variable   ${mgmt_vnf_ip}   ${vnf_ip}
-
+    ${middle_ns_id}=   Run And Return RC And Output   osm ns-list | grep ${MIDDLE_NS_NAME} | awk '{print $4}' 2>&1
+    ${vnf_ip}=   Get Vnf Management Ip Address   ${middle_ns_id}[1]   ${VNF_MEMBER_INDEX}
+    IF   '${vnf_ip}' == '${EMPTY}'   Fatal Error   Variable \$\{ vnf_ip\} Empty
+    Set Suite Variable   ${MGMT_VNF_IP}   ${vnf_ip}
 
 Get Slice Vnf Ip Addresses
     [Documentation]   Obtains the list of IPs addresses in the slice and sets the list as a suite variable (slice_vnfs_ips)
-
     # Get all the ns_id in the slice except the middle one to avoid self ping
-    @{slice_ns_list}   Get Slice Ns List Except One   ${slice_name}   ${middle_ns_name}
-    Log many   @{slice_ns_list}
+    @{slice_ns_list}=   Get Slice Ns List Except One   ${SLICE_NAME}   ${MIDDLE_NS_NAME}
+    Log Many   @{slice_ns_list}
     @{temp_list}=   Create List
     # For each ns_id in the list, get all the vnf_id and their IP addresses
     FOR   ${ns_id}   IN   @{slice_ns_list}
         Log   ${ns_id}
-        @{vnf_id_list}   Get Ns Vnf List   ${ns_id}
+        @{vnf_id_list}=   Get Ns Vnf List   ${ns_id}
         # For each vnf_id in the list, get all its IP addresses
-        @{ns_ip_list}   Get Ns Ip List   @{vnf_id_list}
+        @{ns_ip_list}=   Get Ns Ip List   @{vnf_id_list}
         @{temp_list}=   Combine Lists   ${temp_list}   ${ns_ip_list}
     END
     Log List   ${temp_list}
-    Set Suite Variable   ${slice_vnfs_ips}   ${temp_list}
-
+    Set Suite Variable   ${SLICE_VNFS_IPS}   ${temp_list}
 
 Test Middle Ns Ping
     [Documentation]   Pings the slice middle vnf (mgmt_vnf_ip)
-
     Sleep   60s   Waiting for the network to be up
     # Ping to the middle VNF
-    Log   ${mgmt_vnf_ip}
-    Test Connectivity   ${mgmt_vnf_ip}
-
+    Log   ${MGMT_VNF_IP}
+    Test Connectivity   ${MGMT_VNF_IP}
 
 Test Middle Vnf SSH Access
     [Documentation]   SSH access to the slice middle vnf (mgmt_vnf_ip) with the credentials provided in the variables file
-
     Sleep   30s   Waiting ssh daemon to be up
-    Test SSH Connection   ${mgmt_vnf_ip}   ${username}   ${password}   ${privatekey}
-
+    Test SSH Connection   ${MGMT_VNF_IP}   ${USERNAME}   ${PASSWORD}   ${PRIVATEKEY}
 
 Test Slice Connectivity
     [Documentation]   SSH access to the slice middle vnf (mgmt_vnf_ip) with the credentials provided in the variables file
     ...               and pings all the IP addresses in the list (slice_vnfs_ips)
-
-    Ping Many   ${mgmt_vnf_ip}   ${username}   ${password}   ${privatekey}   @{slice_vnfs_ips}
-
+    Ping Many   ${MGMT_VNF_IP}   ${USERNAME}   ${PASSWORD}   ${PRIVATEKEY}   @{SLICE_VNFS_IPS}
 
 Delete Slice Instance
     [Documentation]   Stops the slice instance (slice_name)
     [Tags]   cleanup
-
-    Delete NSI   ${slice_name}
-
+    Delete NSI   ${SLICE_NAME}
 
 Delete Slice Template
     [Documentation]   Deletes the NST (nst_name) from OSM
     [Tags]   cleanup
-
-    Delete NST   ${nst_name}
-
+    Delete NST   ${NST_NAME}
 
 Delete NS Descriptors
     [Documentation]   Deletes all the NSDs created for the test: nsd1_name, nsd2_name
     [Tags]   cleanup
-
-    Delete NSD   ${nsd1_name}
-    Delete NSD   ${nsd2_name}
-
+    Delete NSD   ${NSD1_NAME}
+    Delete NSD   ${NSD2_NAME}
 
 Delete VNF Descriptors
     [Documentation]   Deletes all the VNFDs created for the test: vnfd1_name, vnfd2_name
     [Tags]   cleanup
-
-    Delete VNFD   ${vnfd1_name}
-    Delete VNFD   ${vnfd2_name}
+    Delete VNFD   ${VNFD1_NAME}
+    Delete VNFD   ${VNFD2_NAME}
 
 
 *** Keywords ***
 Suite Cleanup
     [Documentation]   Test Suit Cleanup: Deleting Descriptors, instance and template
-
-    Run Keyword If Any Tests Failed   Delete NSI   ${slice_name}
-
-    Run Keyword If Any Tests Failed   Delete NST   ${nst_name}
-
-    Run Keyword If Any Tests Failed   Delete NSD   ${nsd1_name}
-    Run Keyword If Any Tests Failed   Delete NSD   ${nsd2_name}
-
-    Run Keyword If Any Tests Failed   Delete VNFD   ${vnfd1_name}
-    Run Keyword If Any Tests Failed   Delete VNFD   ${vnfd2_name}
-
-
-
+    Run Keyword If Any Tests Failed   Delete NSI   ${SLICE_NAME}
+    Run Keyword If Any Tests Failed   Delete NST   ${NST_NAME}
+    Run Keyword If Any Tests Failed   Delete NSD   ${NSD1_NAME}
+    Run Keyword If Any Tests Failed   Delete NSD   ${NSD2_NAME}
+    Run Keyword If Any Tests Failed   Delete VNFD   ${VNFD1_NAME}
+    Run Keyword If Any Tests Failed   Delete VNFD   ${VNFD2_NAME}
index 869eb45..ded9fb0 100644 (file)
@@ -1,3 +1,4 @@
+*** Comments ***
 #   Copyright 2020 Atos
 #
 #   Licensed under the Apache License, Version 2.0 (the "License");
@@ -12,6 +13,7 @@
 #   See the License for the specific language governing permissions and
 #   limitations under the License.
 
+
 *** Settings ***
 Documentation   [SLICE-02] Shared Network Slicing.
 
@@ -21,227 +23,180 @@ Library   Collections
 Library   Process
 Library   SSHLibrary
 
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/vnfd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/nsd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/nst_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/nsi_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ns_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/connectivity_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ssh_lib.robot
+Resource   ../lib/vnfd_lib.resource
+Resource   ../lib/nsd_lib.resource
+Resource   ../lib/nst_lib.resource
+Resource   ../lib/nsi_lib.resource
+Resource   ../lib/ns_lib.resource
+Resource   ../lib/connectivity_lib.resource
+Resource   ../lib/ssh_lib.resource
 
-Force Tags   slice_02   cluster_slices   daily   regression
+Test Tags   slice_02   cluster_slices   daily   regression
 
 Suite Teardown   Run Keyword And Ignore Error   Suite Cleanup
 
 
 *** Variables ***
-
 # NS and VNF descriptor package files
-${vnfd1_pkg}   slice_basic_vnf
-${vnfd2_pkg}   slice_basic_middle_vnf
-${nsd1_pkg}   slice_basic_ns
-${nsd2_pkg}   slice_basic_middle_ns
-${nst}   slice_basic_nst/slice_basic_nst.yaml
-${nst2}   slice_basic_nst/slice_basic_2nd_nst.yaml
+${VNFD1_PKG}   slice_basic_vnf
+${VNFD2_PKG}   slice_basic_middle_vnf
+${NSD1_PKG}   slice_basic_ns
+${NSD2_PKG}   slice_basic_middle_ns
+${NST}   slice_basic_nst/slice_basic_nst.yaml
+${NST2}   slice_basic_nst/slice_basic_2nd_nst.yaml
 
 # Instance names
-${slice_name}   slicebasic
-${slice2_name}   sliceshared
-${middle_ns_name}   slicebasic.slice_basic_nsd_2
+${SLICE_NAME}   slicebasic
+${SLICE2_NAME}   sliceshared
+${MIDDLE_NS_NAME}   slicebasic.slice_basic_nsd_2
 
 # Descriptor names
-${nst_name}   slice_basic_nst
-${nst2_name}   slice_basic_nst2
-${vnfd1_name}   slice_basic_vnf
-${vnfd2_name}   slice_basic_middle_vnf
-${nsd1_name}   slice_basic_ns
-${nsd2_name}   slice_basic_middle_ns
+${NST_NAME}   slice_basic_nst
+${NST2_NAME}   slice_basic_nst2
+${VNFD1_NAME}   slice_basic_vnf
+${VNFD2_NAME}   slice_basic_middle_vnf
+${NSD1_NAME}   slice_basic_ns
+${NSD2_NAME}   slice_basic_middle_ns
 
 # SSH keys and username to be used
-${publickey}   %{HOME}/.ssh/id_rsa.pub
-${privatekey}   %{HOME}/.ssh/id_rsa
-${username}   ubuntu
-${password}   ${EMPTY}
+${PUBLICKEY}   %{HOME}/.ssh/id_rsa.pub
+${PRIVATEKEY}   %{HOME}/.ssh/id_rsa
+${USERNAME}   ubuntu
+${PASSWORD}   ${EMPTY}
 
-${ns_id}   ${EMPTY}
-${vnf_member_index}   middle
-${vnf_ip_addr}   ${EMPTY}
-${nst_config}   {netslice-vld: [ {name: slice_vld_mgmt, vim-network-name: %{VIM_MGMT_NET}} ] }
+${VNF_MEMBER_INDEX}   middle
+${VNF_IP_ADDR}   ${EMPTY}
+${NST_CONFIG}   {netslice-vld: [ {name: slice_vld_mgmt, vim-network-name: %{VIM_MGMT_NET}} ] }
 
 
 *** Test Cases ***
 Create Slice VNF Descriptors
     [Documentation]   Onboards all the VNFDs required for the test: vnfd1_pkg and vnfd2_pkg (in the variables file)
-
-    Create VNFD   '%{PACKAGES_FOLDER}/${vnfd1_pkg}'
-    Create VNFD   '%{PACKAGES_FOLDER}/${vnfd2_pkg}'
-
+    Create VNFD   '%{PACKAGES_FOLDER}/${VNFD1_PKG}'
+    Create VNFD   '%{PACKAGES_FOLDER}/${VNFD2_PKG}'
 
 Create Slice NS Descriptors
     [Documentation]   Onboards all the NSDs required for the test: nsd1_pkg and nsd2_pkg (in the variables file)
-
-    Create NSD   '%{PACKAGES_FOLDER}/${nsd1_pkg}'
-    Create NSD   '%{PACKAGES_FOLDER}/${nsd2_pkg}'
+    Create NSD   '%{PACKAGES_FOLDER}/${NSD1_PKG}'
+    Create NSD   '%{PACKAGES_FOLDER}/${NSD2_PKG}'
 
 Create Slice Templates
     [Documentation]   Onboards the Network Slice Templates: nst, nst2 (in the variables file)
-
-    Create NST   '%{PACKAGES_FOLDER}/${nst}'
-    Create NST   '%{PACKAGES_FOLDER}/${nst2}'
+    Create NST   '%{PACKAGES_FOLDER}/${NST}'
+    Create NST   '%{PACKAGES_FOLDER}/${NST2}'
 
 Network Slice First Instance
     [Documentation]   Instantiates the First NST recently onboarded (nst_name) and sets the instantiation id as a suite variable (nsi_id)
     ...               The slice contains 3 NS (1 shared)
-
-    ${id}=   Create Network Slice   ${nst_name}   %{VIM_TARGET}   ${slice_name}   ${nst_config}   ${publickey}
-    Set Suite Variable   ${nsi_id}   ${id}
-
+    ${id}=   Create Network Slice   ${NST_NAME}   %{VIM_TARGET}   ${SLICE_NAME}   ${NST_CONFIG}   ${PUBLICKEY}
+    Set Suite Variable   ${NSI_ID}   ${id}
 
 Network Slice Second Instance
     [Documentation]   Instantiates the Second NST recently onboarded (nst2_name) and sets the instantiation id as a suite variable (nsi2_id)
     ...               The slice contains 2 NS (1 shared)
-
-    ${id}=   Create Network Slice   ${nst2_name}   %{VIM_TARGET}   ${slice2_name}   ${nst_config}   ${publickey}
-    Set Suite Variable   ${nsi2_id}   ${id}
-
+    ${id}=   Create Network Slice   ${NST2_NAME}   %{VIM_TARGET}   ${SLICE2_NAME}   ${NST_CONFIG}   ${PUBLICKEY}
+    Set Suite Variable   ${NSI2_ID}   ${id}
 
 First Network Slice Ns Count
     [Documentation]   Counts the NS in both slice instances and shoul be equal to 4
-
-    ${slice1_count}=   Get Slice Ns Count   ${slice_name}
-    ${slice2_count}=   Get Slice Ns Count   ${slice2_name}
+    ${slice1_count}=   Get Slice Ns Count   ${SLICE_NAME}
+    ${slice2_count}=   Get Slice Ns Count   ${SLICE2_NAME}
     ${together}=   Evaluate   ${slice1_count} + ${slice2_count}
     Should Be Equal As Integers   ${together}   4
 
-
 Get Middle Vnf Management Ip
     [Documentation]   Obtains the management IP of the shared NS main (only) VNF and sets it as a suite variable (mgmt_vnf_ip)
-
-    ${middle_ns_id}=   Run and Return RC and Output   osm ns-list | grep ${middle_ns_name} | awk '{print $4}' 2>&1
-    ${vnf_ip}   Get Vnf Management Ip Address   ${middle_ns_id}[1]   ${vnf_member_index}
-    Run Keyword If   '${vnf_ip}' == '${EMPTY}'   Fatal Error   Variable \$\{ vnf_ip\} Empty
-    Set Suite Variable   ${mgmt_vnf_ip}   ${vnf_ip}
-
+    ${middle_ns_id}=   Run And Return RC And Output   osm ns-list | grep ${MIDDLE_NS_NAME} | awk '{print $4}' 2>&1
+    ${vnf_ip}=   Get Vnf Management Ip Address   ${middle_ns_id}[1]   ${VNF_MEMBER_INDEX}
+    IF   '${vnf_ip}' == '${EMPTY}'   Fatal Error   Variable \$\{ vnf_ip\} Empty
+    Set Suite Variable   ${MGMT_VNF_IP}   ${vnf_ip}
 
 Get First Slice Vnf IPs
     [Documentation]   Obtains the list of IPs addresses in the first slice and sets the list as a suite variable (slice1_vnfs_ips)
-
     # Get all the ns_id in the slice except the middle one
-    @{ip_list}   Get Slice Vnf Ip Addresses   ${slice_name}
+    @{ip_list}=   Get Slice Vnf Ip Addresses   ${SLICE_NAME}
     Should Be True   ${ip_list} is not None
-    Set Suite Variable   ${slice1_vnfs_ips}   ${ip_list}
-
+    Set Suite Variable   ${SLICE1_VNFS_IPS}   ${ip_list}
 
 Test Middle Ns Ping
     [Documentation]   Pings the slice middle vnf (mgmt_vnf_ip)
-
     Sleep   60s   Waiting for the network to be up
     # Ping to the middle VNF
-    Test Connectivity   ${mgmt_vnf_ip}
-
+    Test Connectivity   ${MGMT_VNF_IP}
 
 Test Middle Vnf SSH Access
     [Documentation]   SSH access to the slice middle vnf (mgmt_vnf_ip) with the credentials provided in the variables file
-
     Sleep   30s   Waiting ssh daemon to be up
-    Test SSH Connection   ${mgmt_vnf_ip}   ${username}   ${password}   ${privatekey}
-
+    Test SSH Connection   ${MGMT_VNF_IP}   ${USERNAME}   ${PASSWORD}   ${PRIVATEKEY}
 
 Test First Slice Connectivity
     [Documentation]   SSH access to the slice middle vnf (mgmt_vnf_ip) with the credentials provided in the variables file
     ...               and pings all the IP addresses in the list (slice1_vnfs_ips)
-
-    Ping Many   ${mgmt_vnf_ip}   ${username}   ${password}   ${privatekey}   @{slice1_vnfs_ips}
-
+    Ping Many   ${MGMT_VNF_IP}   ${USERNAME}   ${PASSWORD}   ${PRIVATEKEY}   @{SLICE1_VNFS_IPS}
 
 Delete Slice One Instance
     [Documentation]   Stops the slice instance (slice_name)
-
     [Tags]   cleanup
-
-    Delete NSI   ${slice_name}
-
+    Delete NSI   ${SLICE_NAME}
 
 Second Network Slice Ns Count
     [Documentation]   Counts the NS in both slice instances and should be equal to 2
-
-    ${slice1_count}=   Get Slice Ns Count   ${slice_name}
-    ${slice2_count}=   Get Slice Ns Count   ${slice2_name}
+    ${slice1_count}=   Get Slice Ns Count   ${SLICE_NAME}
+    ${slice2_count}=   Get Slice Ns Count   ${SLICE2_NAME}
     ${together}=   Evaluate   ${slice1_count} + ${slice2_count}
     Should Be Equal As Integers   ${together}   2
 
 Get Second Slice Vnf IPs
     [Documentation]   Obtains the list of IPs addresses in the second slice and sets the list as a suite variable (slice2_vnfs_ips)
-
     # Get all the ns_id in the slice
-    @{ip_list}   Get Slice Vnf Ip Addresses   ${slice2_name}
+    @{ip_list}=   Get Slice Vnf Ip Addresses   ${SLICE2_NAME}
     Should Be True   ${ip_list} is not None
-    Set Suite Variable   ${slice2_vnfs_ips}   ${ip_list}
-
+    Set Suite Variable   ${SLICE2_VNFS_IPS}   ${ip_list}
 
 Test Second Slice Connectivity
     [Documentation]   SSH access to the slice middle vnf (mgmt_vnf_ip) with the credentials provided in the variables file
     ...               and pings all the IP addresses in the list (slice2_vnfs_ips)
-
-    Ping Many   ${mgmt_vnf_ip}   ${username}   ${password}   ${privatekey}   @{slice2_vnfs_ips}
-
+    Ping Many   ${MGMT_VNF_IP}   ${USERNAME}   ${PASSWORD}   ${PRIVATEKEY}   @{SLICE2_VNFS_IPS}
 
 Delete Slice Two Instance
     [Documentation]   Stops the slice instance (slice2_name)
-
     [Tags]   cleanup
-
-    Delete NSI   ${slice2_name}
-
+    Delete NSI   ${SLICE2_NAME}
 
 Delete Slice One Template
     [Documentation]   Deletes the NST (nst_name) from OSM
-
     [Tags]   cleanup
-
-    Delete NST   ${nst_name}
-
+    Delete NST   ${NST_NAME}
 
 Delete Slice Two Template
     [Documentation]   Deletes the NST (nst2_name) from OSM
-
     [Tags]   cleanup
-
-    Delete NST   ${nst2_name}
-
+    Delete NST   ${NST2_NAME}
 
 Delete NS Descriptors
     [Documentation]   Deletes all the NSDs created for the test: nsd1_name, nsd2_name
-
     [Tags]   cleanup
-
-    Delete NSD   ${nsd1_name}
-    Delete NSD   ${nsd2_name}
-
+    Delete NSD   ${NSD1_NAME}
+    Delete NSD   ${NSD2_NAME}
 
 Delete VNF Descriptors
     [Documentation]   Deletes all the VNFDs created for the test: vnfd1_name, vnfd2_name
-
     [Tags]   cleanup
-
-    Delete VNFD   ${vnfd1_name}
-    Delete VNFD   ${vnfd2_name}
+    Delete VNFD   ${VNFD1_NAME}
+    Delete VNFD   ${VNFD2_NAME}
 
 
 *** Keywords ***
 Suite Cleanup
     [Documentation]   Test Suit Cleanup: Deleting Descriptors, instance and templates
+    Run Keyword If Any Tests Failed   Delete NSI   ${SLICE_NAME}
+    Run Keyword If Any Tests Failed   Delete NSI   ${SLICE2_NAME}
 
-    Run Keyword If Any Tests Failed   Delete NSI   ${slice_name}
-    Run Keyword If Any Tests Failed   Delete NSI   ${slice2_name}
-
-    Run Keyword If Any Tests Failed   Delete NST   ${nst_name}
-    Run Keyword If Any Tests Failed   Delete NST   ${nst2_name}
-
-    Run Keyword If Any Tests Failed   Delete NSD   ${nsd1_name}
-    Run Keyword If Any Tests Failed   Delete NSD   ${nsd2_name}
-
-    Run Keyword If Any Tests Failed   Delete VNFD   ${vnfd1_name}
-    Run Keyword If Any Tests Failed   Delete VNFD   ${vnfd2_name}
+    Run Keyword If Any Tests Failed   Delete NST   ${NST_NAME}
+    Run Keyword If Any Tests Failed   Delete NST   ${NST2_NAME}
 
+    Run Keyword If Any Tests Failed   Delete NSD   ${NSD1_NAME}
+    Run Keyword If Any Tests Failed   Delete NSD   ${NSD2_NAME}
 
+    Run Keyword If Any Tests Failed   Delete VNFD   ${VNFD1_NAME}
+    Run Keyword If Any Tests Failed   Delete VNFD   ${VNFD2_NAME}
index 750ea84..6e84541 100644 (file)
@@ -1,3 +1,4 @@
+*** Comments ***
 #   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
@@ -10,6 +11,7 @@
 #   See the License for the specific language governing permissions and
 #   limitations under the License
 
+
 *** Settings ***
 Documentation   [SOL003-01] Sol003 Api testing
 
@@ -21,45 +23,50 @@ Library   yaml
 Library   JsonValidator
 Library   JSONLibrary
 
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/sol003_common_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/vnfd_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ns_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/vnf_lib.robot
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/vim_lib.robot
+Resource   ../lib/rest_lib.resource
+Resource   ../lib/vnfd_lib.resource
+Resource   ../lib/ns_lib.resource
+Resource   ../lib/vnf_lib.resource
+Resource   ../lib/vim_lib.resource
 
-Force Tags   sol003_01   cluster_sol003   daily
+Test Tags   sol003_01   cluster_osm_rest   daily   regression
 
 Suite Teardown   Run Keyword And Ignore Error   Suite Cleanup
 
 
 *** Variables ***
-${vnfd_pkg}   hackfest_basic_metrics_vnf
-${vnfd_name}   hackfest_basic_metrics-vnf
+# SOL003 API URI paths
+${VNF_INSTANCE_URI}   /osm/vnflcm/v1/vnf_instances
+${VNF_INSTANCE_LCM_OPS}   /osm/vnflcm/v1/vnf_lcm_op_occs
+
+# NS and VNF descriptor package folder and ids
+${VNFD_PKG}   hackfest_basic_metrics_vnf
+${VNFD_NAME}   hackfest_basic_metrics-vnf
 
 
 *** Test Cases ***
-Create VNF package from JSON file descriptor
-    [Documentation]   Test case to create a VNF Identifier
+Create VNF Package From JSON File
+    [Documentation]   Create a VNF package and update it via SOL003 interface using a JSON file
     Get VNFDs List
-    ${id}=   Create VNFD   '%{PACKAGES_FOLDER}/${vnfd_pkg}'
-    Set Suite Variable   ${vnfid}   ${id}
-    ${created_vim_account_id}=   Get VIM Target ID   %{VIM_TARGET}
-    Set Suite Variable   ${created_vim_account_id}
+    ${id}=   Create VNFD   '%{PACKAGES_FOLDER}/${VNFD_PKG}'
+    Log   ${id}
+    ${CREATED_VIM_ACCOUNT_ID}=   Get VIM Target ID   %{VIM_TARGET}
+    Set Suite Variable   ${CREATED_VIM_ACCOUNT_ID}
     Get Auth Token
     ${json_path}=   Read Directory
     ${json_obj}=   Load JSON From File   ${json_path}/sol003_01-vnf-lifecycle-management.json
     ${json_obj}=   Get Variable Value   ${json_obj['data'][0]}
-    ${updated_json_obj}=   JSONLibrary.Update Value To Json   ${json_obj}   $..vimAccountId   ${created_vim_account_id}
-    Log   ${updated_json_obj}
-    ${updated_json_obj}=   JSONLibrary.Update Value To Json   ${updated_json_obj}   $..additionalParams.virtual-link-desc[0][id]   %{VIM_MGMT_NET}
-    Log   ${updated_json_obj}
-    ${updated_json_obj}=   JSONLibrary.Update Value To Json   ${updated_json_obj}   $..additionalParams.virtual-link-profile-id   %{VIM_MGMT_NET}
-    Log   ${updated_json_obj}
-    Set Test Variable   ${updated_json_obj}
-    Post API Request   ${vnf_instance_uri}
-    Pass Execution If   ${request_response.status_code} in ${success_status_code_list}   Query VNF Instance completed
+    ${UPDATED_JSON_OBJ}=   JSONLibrary.Update Value To Json   ${json_obj}   $..vimAccountId   ${CREATED_VIM_ACCOUNT_ID}
+    Log   ${UPDATED_JSON_OBJ}
+    ${UPDATED_JSON_OBJ}=   JSONLibrary.Update Value To Json   ${UPDATED_JSON_OBJ}   $..additionalParams.virtual-link-desc[0][id]   %{VIM_MGMT_NET}
+    Log   ${UPDATED_JSON_OBJ}
+    ${UPDATED_JSON_OBJ}=   JSONLibrary.Update Value To Json   ${UPDATED_JSON_OBJ}   $..additionalParams.virtual-link-profile-id   %{VIM_MGMT_NET}
+    Log   ${UPDATED_JSON_OBJ}
+    Set Test Variable   ${UPDATED_JSON_OBJ}
+    Post Api Request   ${VNF_INSTANCE_URI}   ${UPDATED_JSON_OBJ}
+    Pass Execution If   ${request_response.status_code} in ${SUCCESS_STATUS_CODE_LIST}   Query VNF Instance completed
     ${id}=   Get Value From Json   ${request_response.json()}   $..id
-    Set Suite Variable   ${createid}   ${id[0]}
+    Set Suite Variable   ${CREATEID}   ${id[0]}
     Get VNFDs List
 
 Instantiate VNF
@@ -70,13 +77,13 @@ Instantiate VNF
     ${json_path}=   Read Directory
     ${json_obj}=   Load JSON From File   ${json_path}/sol003_01-vnf-lifecycle-management.json
     ${json_obj}=   Get Variable Value   ${json_obj['data'][1]}
-    ${updated_json_obj}=   JSONLibrary.Update Value To Json   ${json_obj}   $..vimAccountId   ${created_vim_account_id}
-    ${updated_json_obj}=   JSONLibrary.Update Value To Json   ${updated_json_obj}   $..vnfId   ${createid}
-    Set Test Variable   ${updated_json_obj}
-    Post API Request   ${vnf_instantiate_uri}/${createid}/instantiate
-    Pass Execution If   ${request_response.status_code} in ${success_status_code_list}   Instantiate VNF Instance completed
+    ${UPDATED_JSON_OBJ}=   JSONLibrary.Update Value To Json   ${json_obj}   $..vimAccountId   ${CREATED_VIM_ACCOUNT_ID}
+    ${UPDATED_JSON_OBJ}=   JSONLibrary.Update Value To Json   ${UPDATED_JSON_OBJ}   $..vnfId   ${CREATEID}
+    Set Test Variable   ${UPDATED_JSON_OBJ}
+    Post Api Request   ${VNF_INSTANCE_URI}/${CREATEID}/instantiate   ${UPDATED_JSON_OBJ}
+    Pass Execution If   ${request_response.status_code} in ${SUCCESS_STATUS_CODE_LIST}   Instantiate VNF Instance completed
     ${id}=   Get Value From Json   ${request_response.json()}   $..id
-    Set Suite Variable   ${instantiateid}   ${id[0]}
+    Set Suite Variable   ${INSTANTIATEID}   ${id[0]}
     Sleep   12s
     Get Ns List
     Get Vnf List
@@ -84,112 +91,127 @@ Instantiate VNF
 Query VNF Instances
     [Documentation]   Test case to query VNF Instance
     Get Auth Token
-    Get Api Request   ${vnf_instance_uri}
+    Get Api Request   ${VNF_INSTANCE_URI}
     ${value}=   Get ID   nsState
     Should Be Equal   ${value}   INSTANTIATED
-    Pass Execution If   ${request_response.status_code} in ${success_status_code_list}   Query VNF Instance completed
+    Pass Execution If   ${request_response.status_code} in ${SUCCESS_STATUS_CODE_LIST}   Query VNF Instance completed
     ${id}=   Get Value From Json   ${request_response.json()}   $.._id
-    Set Suite Variable   ${Queryid}   ${id[0]}
+    Set Suite Variable   ${QUERYID}   ${id[0]}
 
 Query VNF Instance ID
     [Documentation]   Test case to query Vnf instance ID
     Get Auth Token
-    Get Api Request   ${vnf_instance_uri}/${Queryid}
+    Get Api Request   ${VNF_INSTANCE_URI}/${QUERYID}
     ${value}=   Get ID   nsState
     Should Be Equal   ${value}   INSTANTIATED
     Should Be Equal As Strings   ${RequestResponse.status_code}   200
     ${id}=   Get Value From Json   ${request_response.json()}   $.._id
-    Set Suite Variable   ${Instanceid}   ${id[0]}
+    Set Suite Variable   ${INSTANCEID}   ${id[0]}
 
 Query VNF LCM Ops
     [Documentation]   Test case to Query VNF LCM operation
     Get Auth Token
-    Get Api Request   ${vnf_instance_lcm_ops}
-    ${ID1}=   Get Value From Json   ${request_response.json()}   $.._id
-    Set Suite Variable   ${lcmops}   ${ID1[0]}
-    FOR   ${Index}   IN RANGE   0   15
-        Get Api Request   ${vnf_instance_lcm_ops}
+    Get Api Request   ${VNF_INSTANCE_LCM_OPS}
+    ${id1}=   Get Value From Json   ${request_response.json()}   $.._id
+    Set Suite Variable   ${LCMOPS}   ${id1[0]}
+    FOR   ${index}   IN RANGE   0   15
+        Log   ${index}
+        Get Api Request   ${VNF_INSTANCE_LCM_OPS}
         ${value}=   Get ID   operationState
         ${status}=   Run Keyword And Return Status   Should Be Equal   ${value}   COMPLETED
-        Run Keyword If   ${status}   Exit For Loop
-        ...   ELSE   Sleep   10s
+        IF   ${status}
+            BREAK
+        ELSE
+            Sleep   10s
+        END
     END
 
 Query VNF LCM Ops ID
+    [Documentation]   Check if the operation has completed.
     Get Auth Token
-    Get Api Request   ${vnf_instance_lcm_ops}/${lcmops}
-    ${ID1}=   Get Value From Json   ${request_response.json()}   $.._id
-    Set Suite Variable   ${lcmopsid}   ${ID1[0]}
-    FOR   ${Index}   IN RANGE   0   15
-        Get Api Request   ${vnf_instance_lcm_ops}/${lcmops}
+    Get Api Request   ${VNF_INSTANCE_LCM_OPS}/${LCMOPS}
+    ${id1}=   Get Value From Json   ${request_response.json()}   $.._id
+    Set Suite Variable   ${LCMOPSID}   ${id1[0]}
+    FOR   ${index}   IN RANGE   0   15
+        Log   ${index}
+        Get Api Request   ${VNF_INSTANCE_LCM_OPS}/${LCMOPS}
         ${value}=   Get ID   operationState
         ${status}=   Run Keyword And Return Status   Should Be Equal   ${value}   COMPLETED
-        Run Keyword If   ${status}   Exit For Loop
-        ...   ELSE   Sleep   10s
+        IF   ${status}
+            BREAK
+        ELSE
+            Sleep   10s
+        END
     END
 
 Scale VNF
-    [Documentation]   Test case to   Scale out VNF
+    [Documentation]   Scale out VNF
     Get Auth Token
     ${json_path}=   Read Directory
     ${updated_json_obj}=   Load JSON From File   ${json_path}/sol003_01-vnf-lifecycle-management.json
-    ${updated_json_obj}=   Get Variable Value   ${updated_json_obj['data'][2]}
-    Set Test Variable   ${updated_json_obj}
-    Post API Request   ${vnf_instance_uri}/${createid}/scale
+    ${updated_json_obj}=   Get Variable Value   ${UPDATED_JSON_OBJ['data'][2]}
+    Set Test Variable   ${UPDATED_JSON_OBJ}
+    Post Api Request   ${VNF_INSTANCE_URI}/${CREATEID}/scale   ${UPDATED_JSON_OBJ}
     ${value}=   Get ID   id
-    ${ID1}=   Get Value From Json   ${request_response.json()}   $..id
-    Set Suite Variable   ${scaleoutid}   ${ID1[0]}
-    Get Api Request   ${vnf_instance_lcm_ops}/${scaleoutid}
+    ${id1}=   Get Value From Json   ${request_response.json()}   $..id
+    Set Suite Variable   ${SCALEOUTID}   ${id1[0]}
+    Get Api Request   ${VNF_INSTANCE_LCM_OPS}/${SCALEOUTID}
     ${LcmopsScale}=   Get Value From Json   ${request_response.json()}   $.._id
-    Set Suite Variable   ${lcmopsscaleid}   ${LcmopsScale[0]}
-    FOR   ${Index}   IN RANGE   0   15
-        Get Api Request   ${vnf_instance_lcm_ops}/${scaleoutid}
+    Set Suite Variable   ${LCMOPSSCALEID}   ${LcmopsScale[0]}
+    FOR   ${index}   IN RANGE   0   15
+        Log   ${index}
+        Get Api Request   ${VNF_INSTANCE_LCM_OPS}/${SCALEOUTID}
         ${value}=   Get ID   operationState
         ${status}=   Run Keyword And Return Status   Should Be Equal   ${value}   COMPLETED
-        Run Keyword If   ${status}   Exit For Loop
-        ...   ELSE   Sleep   10s
+        IF   ${status}
+            BREAK
+        ELSE
+            Sleep   10s
+        END
     END
-    Pass Execution If   ${request_response.status_code} in ${success_status_code_list}   Scale VNF instance completed
+    Pass Execution If   ${request_response.status_code} in ${SUCCESS_STATUS_CODE_LIST}   Scale VNF instance completed
 
 Terminate VNF
     [Documentation]   Test case to terminate the VNF
     Get Auth Token
     ${json_path}=   Read Directory
     ${updated_json_obj}=   Load JSON From File   ${json_path}/sol003_01-vnf-lifecycle-management.json
-    ${updated_json_obj}=   Get Variable Value   ${updated_json_obj['data'][3]}
-    Set Suite Variable   ${updated_json_obj}
-    Post API Request   ${vnf_instance_uri}/${createid}/terminate
+    ${updated_json_obj}=   Get Variable Value   ${UPDATED_JSON_OBJ['data'][3]}
+    Set Suite Variable   ${UPDATED_JSON_OBJ}
+    Post Api Request   ${VNF_INSTANCE_URI}/${CREATEID}/terminate   ${UPDATED_JSON_OBJ}
     ${id}=   Get Value From Json   ${request_response.json()}   $..id
-    Set Suite Variable   ${terminateid}   ${id[0]}
-    Get Api Request   ${vnf_instance_lcm_ops}/${terminateid}
+    Set Suite Variable   ${TERMINATEID}   ${id[0]}
+    Get Api Request   ${VNF_INSTANCE_LCM_OPS}/${TERMINATEID}
     ${LcmopsTerminate}=   Get Value From Json   ${request_response.json()}   $.._id
-    Set Suite Variable   ${lcmopsscaleid}   ${LcmopsTerminate[0]}
-    FOR   ${Index}   IN RANGE   0   15
-        Get Api Request   ${vnf_instance_lcm_ops}/${terminateid}
+    Set Suite Variable   ${LCMOPSSCALEID}   ${LcmopsTerminate[0]}
+    FOR   ${index}   IN RANGE   0   15
+        Log   ${index}
+        Get Api Request   ${VNF_INSTANCE_LCM_OPS}/${TERMINATEID}
         ${value}=   Get ID   operationState
         ${status}=   Run Keyword And Return Status   Should Be Equal   ${value}   COMPLETED
-        Run Keyword If   ${status}   Exit For Loop
-        ...   ELSE   Sleep   10s
+        IF   ${status}
+            BREAK
+        ELSE
+            Sleep   10s
+        END
     END
-    Pass Execution If   ${request_response.status_code} in ${success_status_code_list}   Terminate VNF instance completed
+    Pass Execution If   ${request_response.status_code} in ${SUCCESS_STATUS_CODE_LIST}   Terminate VNF instance completed
 
 Delete VNF
-    [Documentation]   Test case to delete VNF
+    [Documentation]   Delete VNF instance.
     Get Auth Token
-    Create Session   APISession   ${HOST}
-    &{Headers}   Create Dictionary   Content-Type=application/json   Accept=application/json   Authorization=Bearer ${AccessToken}
-    ${resp}=   DELETE On Session   APISession   ${vnf_instance_uri}/${createid}   headers=${Headers}
-    Pass Execution If   ${resp.status_code} in ${success_status_code_list}   Delete VNF Instance completed
+    Create Session   APISession   ${REST_API_HOST}
+    &{Headers}=   Create Dictionary   Content-Type=application/json   Accept=application/json   Authorization=Bearer ${ACCESS_TOKEN}
+    ${resp}=   DELETE On Session   APISession   ${VNF_INSTANCE_URI}/${CREATEID}   headers=${Headers}
+    Pass Execution If   ${resp.status_code} in ${SUCCESS_STATUS_CODE_LIST}   Delete VNF Instance completed
 
 Delete VNF Descriptor Test
+    [Documentation]   Delete VNF package from OSM.
     [Tags]   cleanup
-
-    Delete VNFD   ${vnfd_name}
+    Delete VNFD   ${VNFD_NAME}
 
 
 *** Keywords ***
 Suite Cleanup
     [Documentation]   Test Suit Cleanup: Deleting Descriptor
-
-    Run Keyword If Any Tests Failed   Delete VNFD   ${vnfd_name}
-
+    Run Keyword If Any Tests Failed   Delete VNFD   ${VNFD_NAME}
diff --git a/robot-systest/testsuite/sol003_02-dualstack_ip_vnfm.robot b/robot-systest/testsuite/sol003_02-dualstack_ip_vnfm.robot
new file mode 100644 (file)
index 0000000..542b7ab
--- /dev/null
@@ -0,0 +1,169 @@
+*** Comments ***
+#   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
+
+
+*** Settings ***
+Documentation   [Sol003-02] Sol003 Dual Stack IP in VNFM NB interface
+
+Library   OperatingSystem
+Library   String
+Library   Collections
+Library   RequestsLibrary
+Library   yaml
+Library   JsonValidator
+Library   JSONLibrary
+
+Resource   ../lib/rest_lib.resource
+Resource   ../lib/vnfd_lib.resource
+Resource   ../lib/ns_lib.resource
+Resource   ../lib/vnf_lib.resource
+Resource   ../lib/vim_lib.resource
+Resource   ../lib/nsd_lib.resource
+
+Test Tags   sol003_02   cluster_osm_rest   daily
+
+Suite Teardown   Run Keyword And Ignore Error   Suite Cleanup
+
+
+*** Variables ***
+# SOL003 API URI paths
+${VNF_INSTANCE_URI}   /osm/vnflcm/v1/vnf_instances
+${VNF_INSTANCE_LCM_OPS}   /osm/vnflcm/v1/vnf_lcm_op_occs
+
+# NS and VNF descriptor package folder and ids
+${VNFD_PKG}   hackfest_basic_vnf
+${VNFD_NAME}   hackfest_basic-vnf
+
+
+*** Test Cases ***
+Create VNFD Descriptor
+    [Documentation]   Test case to create a VNF Identifier
+    ${VNFD_ID}=   Create VNFD   %{PACKAGES_FOLDER}/${VNFD_PKG}
+    Set Suite Variable   ${VNFD_ID}
+    ${CREATED_VIM_ACCOUNT_ID}=   Get VIM Target ID   %{VIM_TARGET}
+    Set Suite Variable   ${CREATED_VIM_ACCOUNT_ID}
+    Get Auth Token
+    ${json_path}=   Read Directory
+    ${json_obj}=   Load JSON From File   ${json_path}/sol003_02-dualstack_ip_vnfm.json
+    ${json_obj}=   Get Variable Value   ${json_obj['data'][0]}
+    ${NS_NAME}=   Get Variable Value   ${json_obj['vnfInstanceName']}
+    Set Suite Variable   ${NS_NAME}
+    ${UPDATED_JSON_OBJ}=   JSONLibrary.Update Value To Json   ${json_obj}   $..vimAccountId   ${CREATED_VIM_ACCOUNT_ID}
+    Log   ${UPDATED_JSON_OBJ}
+    ${UPDATED_JSON_OBJ}=   JSONLibrary.Update Value To Json   ${UPDATED_JSON_OBJ}   $..additionalParams.virtual-link-desc[0][id]   %{VIM_MGMT_NET}
+    Log   ${UPDATED_JSON_OBJ}
+    ${UPDATED_JSON_OBJ}=   JSONLibrary.Update Value To Json   ${UPDATED_JSON_OBJ}   $..additionalParams.virtual-link-profile-id   %{VIM_MGMT_NET}
+    Log   ${UPDATED_JSON_OBJ}
+    Set Test Variable   ${UPDATED_JSON_OBJ}
+    Post Api Request   ${VNF_INSTANCE_URI}   ${UPDATED_JSON_OBJ}
+    Pass Execution If   ${request_response.status_code} in ${success_status_code_list}   Query VNF Instance completed
+    ${id}=   Get Value From Json   ${request_response.json()}   $..id
+    Set Suite Variable   ${CREATEID}   ${id[0]}
+    Get VNFDs List
+
+Instantiate VNF
+    [Documentation]   Test case to Instantiate a VNF
+    Get Ns List
+    Get Vnf List
+    Get Auth Token
+    ${json_path}=   Read Directory
+    ${json_obj}=   Load JSON From File   ${json_path}/sol003_02-dualstack_ip_vnfm.json
+    ${json_obj}=   Get Variable Value   ${json_obj['data'][1]}
+    ${UPDATED_JSON_OBJ}=   JSONLibrary.Update Value To Json   ${json_obj}   $..vimAccountId   ${CREATED_VIM_ACCOUNT_ID}
+    ${UPDATED_JSON_OBJ}=   JSONLibrary.Update Value To Json   ${UPDATED_JSON_OBJ}   $..vnfId   ${CREATEID}
+    Set Test Variable   ${UPDATED_JSON_OBJ}
+    Post Api Request   ${VNF_INSTANCE_URI}/${CREATEID}/instantiate   ${UPDATED_JSON_OBJ}
+    Pass Execution If   ${request_response.status_code} in ${success_status_code_list}   Instantiate VNF Instance completed
+    ${id}=   Get Value From Json   ${request_response.json()}   $..id
+    Set Suite Variable   ${VNF_INSTANCE_ID}   ${id[0]}
+    Sleep   12s
+    Check For NS Instance For Failure   ${ns_name}
+    Get Ns List
+    Get Vnf List
+
+Get Ns Id
+    [Documentation]   Get the NS instance id
+    ${id}=   Get Ns Id   ${ns_name}
+    Set Suite Variable   ${NS_ID}   ${id}
+
+Get Ip From The NSD
+    [Documentation]   Get the IP address from the NSD
+    ${id}=   Get NSD ID From The NS   ${NS_ID}
+    Set Suite Variable   ${NSD_ID}   ${id}
+    ${Nsd_IP}=   Get NSD Ip   ${NSD_ID}
+    Log   ${Nsd_IP}
+    ${Nsd_IP}=   Split String   ${Nsd_IP}
+    Set Suite Variable   ${IPV6NSD}   ${Nsd_IP}[0]
+    Set Suite Variable   ${IPV4NSD}   ${Nsd_IP}[1]
+    Log   ${IPV4NSD}
+    Log   ${IPV6NSD}
+
+Get Dual Ip
+    [Documentation]   Get the IP address from the NS
+    ${Ns_IP}=   Get Dual Ip   ${NS_ID}
+    Log   ${Ns_IP}
+    ${Ns_IP}=   Split String   ${Ns_IP}
+    Set Suite Variable   ${IPV6NS}   ${Ns_IP}[0]
+    Set Suite Variable   ${IPV4NS}   ${Ns_IP}[1]
+    Log   ${IPV4NS}
+    Log   ${IPV6NS}
+
+Verify Dual Ip
+    [Documentation]   Test case to validate the IP address.
+    Should Be Equal   ${IPV4NS}   ${IPV4NSD}
+    Should Be Equal   ${IPV6NS}   ${IPV6NSD}
+
+Terminate VNF
+    [Documentation]   Test case to terminate the VNF
+    Get Auth Token
+    ${json_path}=   Read Directory
+    ${UPDATED_JSON_OBJ}=   Load JSON From File   ${json_path}/sol003_02-dualstack_ip_vnfm.json
+    ${UPDATED_JSON_OBJ}=   Get Variable Value   ${UPDATED_JSON_OBJ['data'][3]}
+    Set Suite Variable   ${UPDATED_JSON_OBJ}
+    Post Api Request   ${VNF_INSTANCE_URI}/${CREATEID}/terminate   ${UPDATED_JSON_OBJ}
+    ${id}=   Get Value From Json   ${request_response.json()}   $..id
+    ${terminateid}=   Set Variable   ${id[0]}
+    Get Api Request   ${VNF_INSTANCE_LCM_OPS}/${terminateid}
+    ${LcmopsTerminate}=   Get Value From Json   ${request_response.json()}   $.._id
+    Log   ${LcmopsTerminate[0]}
+    FOR   ${index}   IN RANGE   0   15
+        Log   ${index}
+        Get Api Request   ${VNF_INSTANCE_LCM_OPS}/${terminateid}
+        ${value}=   Get ID   operationState
+        ${status}=   Run Keyword And Return Status   Should Be Equal   ${value}   COMPLETED
+        IF   ${status}
+            BREAK
+        ELSE
+            Sleep   10s
+        END
+    END
+    Pass Execution If   ${request_response.status_code} in ${success_status_code_list}   Terminate VNF instance completed
+
+Delete VNF
+    [Documentation]   Test case to delete VNF
+    Get Auth Token
+    Create Session   APISession   ${REST_API_HOST}
+    &{Headers}=   Create Dictionary   Content-Type=application/json   Accept=application/json   Authorization=Bearer ${AccessToken}
+    ${resp}=   DELETE On Session   APISession   ${VNF_INSTANCE_URI}/${CREATEID}   headers=${Headers}
+    Pass Execution If   ${resp.status_code} in ${success_status_code_list}   Delete VNF Instance completed
+
+Delete VNF Descriptor Test
+    [Documentation]   Test case to delete the VNF descriptor.
+    [Tags]   cleanup
+    Delete VNFD   ${VNFD_NAME}
+
+
+*** Keywords ***
+Suite Cleanup
+    [Documentation]   Test Suit Cleanup: Deleting Descriptor
+    Run Keyword If Any Tests Failed   Delete VNFD   ${VNFD_NAME}
diff --git a/tox.ini b/tox.ini
index 729a3e0..139a716 100644 (file)
--- a/tox.ini
+++ b/tox.ini
@@ -16,7 +16,7 @@
 #######################################################################################
 
 [tox]
-envlist = black, cover, flake8, pylint, safety
+envlist = black, cover, flake8, pylint, rflint, safety
 
 [tox:jenkins]
 toxworkdir = /tmp/.tox
@@ -57,7 +57,21 @@ deps =  {[testenv]deps}
         -r{toxinidir}/requirements-dev.txt
         pylint
 commands =
-        - pylint -E robot-systest/resources
+        pylint -E robot-systest
+
+
+#######################################################################################
+[testenv:rflint]
+changedir = {toxinidir}/robot-systest
+deps =  {[testenv]deps}
+        -r{toxinidir}/requirements-dev.txt
+        robotframework-lint
+        robotframework-robocop==4.2.2
+commands =
+        rflint --ignore LineTooLong --ignore TooFewTestSteps --ignore TooManyTestCases \
+               --ignore TooManyTestSteps --ignore TooFewKeywordSteps \
+               testsuite lib resources
+        robocop --configure return_status:quality_gate:E=0:W=0:I=0 --exclude 050*,0701,0923 .
 
 
 #######################################################################################