From b70ccd6f95428c28aa3d756f07b91ee23a2637fd Mon Sep 17 00:00:00 2001 From: aktas Date: Wed, 26 May 2021 10:32:32 +0300 Subject: [PATCH] Feature 10509 manual scaling for native K8s charm This robot test created for this specific package https://osm.etsi.org/gitlab/vnf-onboarding/osm-packages/-/merge_requests/154 Test case steps: 1 - Adds packages 2 - Adds K8s Cluster 3 - Creates NS Service 4 - Gets the scale count 5 - Scale-out the NS 6 - Checks scale count 7 - Scale-in the NS 8 - Check scale count 9 - Removes the NS, K8s cluster and packages This commit includes Juju support Change-Id: Iba7c59a65c9ae2607b23c7104e8178e20b502c60 Signed-off-by: aktas (cherry picked from commit f47542be165ebd69b91945041697181b4df63954) --- README.md | 7 +- docker/Dockerfile | 14 ++ robot-systest/lib/juju_lib.robot | 36 +++++ .../k8s_08-simple_k8s_scaling_data.py | 32 +++++ robot-systest/run_test.sh | 4 +- .../testsuite/k8s_08-simple_k8s_scaling.robot | 126 ++++++++++++++++++ 6 files changed, 217 insertions(+), 2 deletions(-) create mode 100644 robot-systest/lib/juju_lib.robot create mode 100644 robot-systest/resources/k8s_08-simple_k8s_scaling_data.py create mode 100644 robot-systest/testsuite/k8s_08-simple_k8s_scaling.robot diff --git a/README.md b/README.md index 2556456..1d7d5dc 100644 --- a/README.md +++ b/README.md @@ -64,6 +64,9 @@ OS_SDNC= # K8S config file K8S_CREDENTIALS= +# Juju data file +JUJU_DATA= + # The following set of environment variables will be used in host # of the robot framework. Not needed for docker execution @@ -103,6 +106,7 @@ Volumes: * [OPTIONAL]: It is the absolute path to the clouds.yaml file in the host * [OPTIONAL]: It is the absolute path to the sdncs.yaml file in the host * [OPTIONAL]: It is the kubeconfig file to be used for k8s clusters +* [OPTIONAL]: It is the jujudata file to be used for juju cli ```bash docker run --rm=true -t osmtests --env-file \ @@ -110,6 +114,7 @@ docker run --rm=true -t osmtests --env-file \ -v :/robot-systest/clouds.yaml \ -v :/robot-systest/sdncs.yaml \ -v :/root/.kube/config \ + -v :/root/.local/share/juju \ -o \ -p \ -t @@ -145,7 +150,7 @@ The following tags exist for each testsuite: `basic_13`, `basic_14`, `k8s_05`, `k8s_06` - `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_07`, `sa_08` + - `cluster_k8s`: `k8s_01`, `k8s_02`, `k8s_03`, `k8s_04`, `k8s_07`, `k8s_08`, `sa_08` - `cluster_k8s_charms`: `k8s_05`, `k8s_06` - `cluster_sa`: `sa_01`, `sa_02`, `sa_07` - `cluster_slices`: `slice_01`, `slice_02` diff --git a/docker/Dockerfile b/docker/Dockerfile index 0431642..cc484bd 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -21,6 +21,17 @@ FROM ubuntu:18.04 RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get -y install git software-properties-common \ make python3 debhelper python3-pip apt-utils ssh iputils-ping libcurl4-openssl-dev libssl-dev cargo rustc +# Installing Juju +ARG JUJU_VERSION_M=2.8 +ARG JUJU_VERSION_R=11 +ARG JUJU_VERSION=$JUJU_VERSION_M.$JUJU_VERSION_R + +RUN curl --output /tmp/juju-$JUJU_VERSION-linux-amd64.tar.xz -LO \ + https://launchpad.net/juju/$JUJU_VERSION_M/$JUJU_VERSION/+download/juju-$JUJU_VERSION-linux-amd64.tar.xz && \ + tar -xf /tmp/juju-$JUJU_VERSION-linux-amd64.tar.xz -C /tmp && \ + install /tmp/juju /usr/local/bin/juju && \ + rm /tmp/juju /tmp/juju-$JUJU_VERSION-linux-amd64.tar.xz + RUN add-apt-repository -y ppa:rmescandon/yq && apt update && apt install yq -y RUN python3 -m pip install -U pip @@ -56,6 +67,9 @@ ENV ROBOT_REPORT_FOLDER=/robot-systest/reports # Kubeconfig file ENV K8S_CREDENTIALS=/root/.kube/config +# Juju data folder +ENV JUJU_DATA=/root/.local/share/juju + ENV LC_ALL=C.UTF-8 ENV LANG=C.UTF-8 diff --git a/robot-systest/lib/juju_lib.robot b/robot-systest/lib/juju_lib.robot new file mode 100644 index 0000000..2eab9bf --- /dev/null +++ b/robot-systest/lib/juju_lib.robot @@ -0,0 +1,36 @@ +# 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] ${application_name} ${model_name} + + Should Not Be Empty ${application_name} ${model_name} + ${rc} ${stdout}= Run and Return RC and Output juju show-status ${application_name} --format yaml -m ${model_name} | grep scale | awk -F ': ' '{print $2}' + log ${stdout} + Should Be Equal As Integers ${rc} ${success_return_code} + [Return] ${stdout} + +Get Model Name + [Arguments] ${ns_id} ${kdu_name} + + Should Not Be Empty ${ns_id} ${kdu_name} + ${rc} ${stdout}= Run and Return RC and Output juju models | grep -i ${kdu_name} | grep -i ${ns_id} | cut -f1 -d " " + log ${stdout} + Should Be Equal As Integers ${rc} ${success_return_code} + ${model_name}= Set Variable ${kdu_name}-${ns_id} + Should Be Equal As Strings ${model_name} ${stdout} + [Return] ${stdout} \ No newline at end of file diff --git a/robot-systest/resources/k8s_08-simple_k8s_scaling_data.py b/robot-systest/resources/k8s_08-simple_k8s_scaling_data.py new file mode 100644 index 0000000..669ffe0 --- /dev/null +++ b/robot-systest/resources/k8s_08-simple_k8s_scaling_data.py @@ -0,0 +1,32 @@ +# 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 pathlib import Path + +# Get ${HOME} from local machine +home = str(Path.home()) +# K8s cluster name +k8scluster_name = 'k8s-test' +k8scluster_version = 'v1' +# NS and VNF descriptor package files +vnfd_pkg = 'charm-packages/native_k8s_scale_charm_vnf' +nsd_pkg = 'charm-packages/native_k8s_scale_charm_ns' +# NS and VNF descriptor package files +vnfd_name = 'native_k8s_scale_charm-vnf' +nsd_name = 'native_k8s_scale_charm-ns' +# NS instance name +ns_name = 'native-k8s-scale' +# Scaling group name +scaling_group = 'scale-kdu' +# SSH keys to be used +publickey = home + '/.ssh/id_rsa.pub' +privatekey = home + '/.ssh/id_rsa' diff --git a/robot-systest/run_test.sh b/robot-systest/run_test.sh index dd77f8e..75cd0d4 100755 --- a/robot-systest/run_test.sh +++ b/robot-systest/run_test.sh @@ -150,6 +150,7 @@ Usage: -v :/reports osmtests \\ -v :/robot-systest/clouds.yaml \\ -v :/root/.kube/config \\ + -v :/root/.local/share/juju \\ -o \\ -p \\ -t @@ -165,7 +166,8 @@ Options: Volumes: [OPTIONAL]: It is the absolute path to reports location in the host [OPTIONAL]: It is the absolute path to the clouds.yaml file in the host - [OPTIONAL]: It is the kubeconfig file to be used for k8s clusters" + [OPTIONAL]: It is the kubeconfig file to be used for k8s clusters + [OPTIONAL]: It is the jujudata file to be used for juju cli" exit 0 ;; diff --git a/robot-systest/testsuite/k8s_08-simple_k8s_scaling.robot b/robot-systest/testsuite/k8s_08-simple_k8s_scaling.robot new file mode 100644 index 0000000..9b7f0f2 --- /dev/null +++ b/robot-systest/testsuite/k8s_08-simple_k8s_scaling.robot @@ -0,0 +1,126 @@ +# 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-08] Simple K8s Scale. + +Library OperatingSystem +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 %{ROBOT_DEVOPS_FOLDER}/lib/juju_lib.robot + +Variables %{ROBOT_DEVOPS_FOLDER}/resources/k8s_08-simple_k8s_scaling_data.py + +Force Tags k8s_08 cluster_k8s daily regression sanity + +Suite Teardown Run Keyword And Ignore Error Suite Cleanup + + +*** Variables *** +${ns_id} ${EMPTY} +${model_name} ${EMPTY} +${ns_config} {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] } +${publickey} ${EMPTY} +${vnf_member_index} native_k8s_scale_charm-vnf +${action_name} changecontent +${kdu_name} native-kdu +${application_name} nginx + +*** Test Cases *** +Create Simple K8s Scale VNF Descriptor + Create VNFD '%{PACKAGES_FOLDER}/${vnfd_pkg}' + +Create Simple K8s Scale NS Descriptor + 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} + +Network Service K8s Instance Test + ${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 ${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 ${application_name} ${model_name} + 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_2}= Execute Manual VNF Scale ${ns_name} ${vnf_member_index} ${scaling_group} SCALE_OUT + +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 ${application_name} ${model_name} + Run Keyword Unless ${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 + +Check Scale Count After Scale In + [Documentation] Check whether the scale count is one less. + + ${kdu_count}= Get Scale Number ${application_name} ${model_name} + Run Keyword Unless ${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 + [Tags] cleanup + Delete NS ${ns_name} + +Remove K8s Cluster from OSM + [Tags] cleanup + Delete K8s Cluster ${k8scluster_name} + +Delete NS Descriptor Test + [Tags] cleanup + Delete NSD ${nsd_name} + +Delete VNF Descriptor Test + [Tags] cleanup + Delete VNFD ${vnfd_name} + +Delete VNF NS Packages + [Tags] cleanup + 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 K8s Cluster ${k8scluster_name} -- 2.17.1