diff options
-rwxr-xr-x | kud/hosting_providers/containerized/installer.sh | 31 | ||||
-rwxr-xr-x | kud/hosting_providers/vagrant/installer.sh | 21 | ||||
-rw-r--r-- | kud/tests/_common.sh | 68 | ||||
-rwxr-xr-x | kud/tests/_functions.sh | 60 | ||||
-rwxr-xr-x | kud/tests/kubevirt.sh | 66 |
5 files changed, 197 insertions, 49 deletions
diff --git a/kud/hosting_providers/containerized/installer.sh b/kud/hosting_providers/containerized/installer.sh index 8119a559..4ed1833b 100755 --- a/kud/hosting_providers/containerized/installer.sh +++ b/kud/hosting_providers/containerized/installer.sh @@ -16,16 +16,23 @@ set -ex INSTALLER_DIR="$(readlink -f "$(dirname "${BASH_SOURCE[0]}")")" function install_prerequisites { -#install package for docker images - echo "Removing ppa for jonathonf/python-3.6" - ls /etc/apt/sources.list.d/ || true - find /etc/apt/sources.list.d -maxdepth 1 -name '*jonathonf*' -delete || true apt-get update - apt-get install -y curl vim wget git \ - software-properties-common python-pip sudo gettext-base + apt-get install -y software-properties-common add-apt-repository -y ppa:longsleep/golang-backports apt-get update - apt-get install -y golang-go rsync + apt-get install -y \ + curl \ + gettext-base \ + git \ + golang-go \ + make \ + python3-pip \ + rsync \ + sshpass \ + sudo \ + unzip \ + vim \ + wget } # _install_ansible() - Install and Configure Ansible program @@ -33,7 +40,7 @@ function _install_ansible { local version=$(grep "ansible_version" ${kud_playbooks}/kud-vars.yml | awk -F ': ' '{print $2}') mkdir -p /etc/ansible/ - pip install --no-cache-dir ansible==$version + pip3 install --no-cache-dir ansible==$version } function install_kubespray { @@ -44,8 +51,6 @@ function install_kubespray { $kud_inventory_folder/group_vars/k8s-cluster.yml | \ awk -F "\"" '{print $2}') local tarball=v$version.tar.gz - # install make to run mitogen target & unzip is mitogen playbook dependency - apt-get install -y sshpass make unzip _install_ansible wget https://github.com/kubernetes-incubator/kubespray/archive/$tarball tar -C $dest_folder -xzf $tarball @@ -54,7 +59,7 @@ function install_kubespray { rm $tarball pushd $dest_folder/kubespray-$version/ - pip install --no-cache-dir -r ./requirements.txt + pip3 install --no-cache-dir -r ./requirements.txt make mitogen popd rm -f $kud_inventory_folder/group_vars/all.yml 2> /dev/null @@ -230,7 +235,7 @@ function install_host_artifacts { done mkdir -p ${host_addons_dir}/tests - for test in _common _common_test _functions topology-manager-sriov multus ovn4nfv nfd sriov-network qat cmk; do + for test in _common _common_test _functions topology-manager-sriov kubevirt multus ovn4nfv nfd sriov-network qat cmk; do cp ${kud_tests}/${test}.sh ${host_addons_dir}/tests done @@ -297,8 +302,6 @@ mkdir -p /opt/csar export CSAR_DIR=/opt/csar function install_pkg { -# Install dependencies - apt-get update install_prerequisites install_kubespray } diff --git a/kud/hosting_providers/vagrant/installer.sh b/kud/hosting_providers/vagrant/installer.sh index 8c8ff7f3..5535c31b 100755 --- a/kud/hosting_providers/vagrant/installer.sh +++ b/kud/hosting_providers/vagrant/installer.sh @@ -40,25 +40,16 @@ function _install_go { sudo sed -i 's|secure_path="\([^"]\+\)"|secure_path="\1:/usr/local/go/bin"|' /etc/sudoers } -# _install_pip() - Install Python Package Manager -function _install_pip { - if $(pip --version &>/dev/null); then - sudo -E pip install --no-cache-dir --upgrade pip - else - sudo apt-get install -y python-dev - curl -sL https://bootstrap.pypa.io/pip/2.7/get-pip.py | sudo python - fi -} - # _install_ansible() - Install and Configure Ansible program function _install_ansible { + sudo apt-get install -y python3-pip + sudo -E pip3 install --no-cache-dir --upgrade pip if $(ansible --version &>/dev/null); then - sudo pip uninstall -y ansible + sudo pip3 uninstall -y ansible fi - _install_pip local version=$(grep "ansible_version" ${kud_playbooks}/kud-vars.yml | awk -F ': ' '{print $2}') sudo mkdir -p /etc/ansible/ - sudo -E pip install --no-cache-dir ansible==$version + sudo -E pip3 install --no-cache-dir ansible==$version } function _set_environment_file { @@ -88,7 +79,7 @@ function install_k8s { rm $tarball pushd $dest_folder/kubespray-$version/ - sudo -E pip install --no-cache-dir -r ./requirements.txt + sudo -E pip3 install --no-cache-dir -r ./requirements.txt make mitogen popd rm -f $kud_inventory_folder/group_vars/all.yml 2> /dev/null @@ -213,7 +204,7 @@ function install_addons { # install_plugin() - Install ONAP Multicloud Kubernetes plugin function install_plugin { echo "Installing multicloud/k8s plugin" - sudo -E pip install --no-cache-dir docker-compose + sudo -E pip3 install --no-cache-dir docker-compose sudo mkdir -p /opt/{kubeconfig,consul/config} sudo cp $HOME/.kube/config /opt/kubeconfig/kud diff --git a/kud/tests/_common.sh b/kud/tests/_common.sh index ff975544..efeded6f 100644 --- a/kud/tests/_common.sh +++ b/kud/tests/_common.sh @@ -16,9 +16,11 @@ packetgen_deployment_name=packetgen sink_deployment_name=sink firewall_deployment_name=firewall image_name=virtlet.cloud/ubuntu/16.04 +kubevirt_image=integratedcloudnative/fedora:33 multus_deployment_name=multus-deployment virtlet_image=virtlet.cloud/fedora virtlet_deployment_name=virtlet-deployment +kubevirt_vmi_name=kubevirt-vmi plugin_deployment_name=plugin-deployment plugin_service_name=plugin-service ovn4nfv_deployment_name=ovn4nfv-deployment @@ -980,6 +982,72 @@ DEPLOYMENT popd } +# populate_CSAR_kubevirt() - This function creates the content of CSAR file +# required for testing Kubevirt feature +function populate_CSAR_kubevirt { + local csar_id=$1 + + _checks_args $csar_id + pushd ${CSAR_DIR}/${csar_id} + + cat << META > metadata.yaml +resources: + virtualmachineinstance: + - $kubevirt_vmi_name.yaml +META + + cat << DEPLOYMENT > $kubevirt_vmi_name.yaml +apiVersion: kubevirt.io/v1 +kind: VirtualMachineInstance +metadata: + name: $kubevirt_vmi_name +spec: + domain: + cpu: + model: host-passthrough + devices: + disks: + - disk: + bus: virtio + name: rootfs + - disk: + bus: virtio + name: cloudinit + interfaces: + - name: default + masquerade: {} + resources: + requests: + memory: 256M + networks: + - name: default + pod: {} + volumes: + - name: rootfs + containerDisk: + image: $kubevirt_image + imagePullPolicy: IfNotPresent + - name: cloudinit + cloudInitNoCloud: + userData: | + #cloud-config + ssh_pwauth: True + users: + - name: testuser + gecos: User + primary-group: testuser + groups: users + lock_passwd: false + shell: /bin/bash + # the password is "testuser" + passwd: "\$6\$rounds=4096\$wPs4Hz4tfs\$a8ssMnlvH.3GX88yxXKF2cKMlVULsnydoOKgkuStTErTq2dzKZiIx9R/pPWWh5JLxzoZEx7lsSX5T2jW5WISi1" + sudo: ALL=(ALL) NOPASSWD:ALL + runcmd: + - echo hello world +DEPLOYMENT + popd +} + # populate_CSAR_plugin()- Creates content used for Plugin functional tests function populate_CSAR_plugin { local csar_id=$1 diff --git a/kud/tests/_functions.sh b/kud/tests/_functions.sh index 10f8e090..1a803173 100755 --- a/kud/tests/_functions.sh +++ b/kud/tests/_functions.sh @@ -172,25 +172,31 @@ function _checks_args { mkdir -p ${CSAR_DIR}/${1} } +function _destroy { + local type=$1 + local name=$2 + + echo "$(date +%H:%M:%S) - $name : Destroying $type" + kubectl delete $type $name --ignore-not-found=true --now + while kubectl get $type $name &>/dev/null; do + echo "$(date +%H:%M:%S) - $name : Destroying $type" + done +} + # destroy_deployment() - This function ensures that a specific deployment is # destroyed in Kubernetes function destroy_deployment { local deployment_name=$1 - echo "$(date +%H:%M:%S) - $deployment_name : Destroying deployment" - kubectl delete deployment $deployment_name --ignore-not-found=true --now - while kubectl get deployment $deployment_name &>/dev/null; do - echo "$(date +%H:%M:%S) - $deployment_name : Destroying deployment" - done + _destroy "deployment" $deployment_name } -# recreate_deployment() - This function destroys an existing deployment and -# creates an new one based on its yaml file -function recreate_deployment { - local deployment_name=$1 +function _recreate { + local type=$1 + local name=$2 - destroy_deployment $deployment_name - kubectl create -f $deployment_name.yaml + _destroy $type $name + kubectl create -f $name.yaml } # wait_deployment() - Wait process to Running status on the Deployment's pods @@ -271,26 +277,40 @@ function wait_for_deployment_status { exit 1 } -# setup() - Base testing setup shared among functional tests -function setup { +function setup_type { + local type=$1 + shift; + if ! $(kubectl version &>/dev/null); then echo "This funtional test requires kubectl client" exit 1 fi - for deployment_name in $@; do - recreate_deployment $deployment_name + for name in $@; do + _recreate $type $name done sleep 5 - for deployment_name in $@; do - wait_deployment $deployment_name + for name in $@; do + wait_deployment $name done } +function teardown_type { + local type=$1 + shift; + + for name in $@; do + _destroy $type $name + done +} + +# setup() - Base testing setup shared among functional tests +function setup { + setup_type "deployment" $@ +} + # teardown() - Base testing teardown function function teardown { - for deployment_name in $@; do - destroy_deployment $deployment_name - done + teardown_type "deployment" $@ } # check_ip_range() - Verifying IP address in address range diff --git a/kud/tests/kubevirt.sh b/kud/tests/kubevirt.sh new file mode 100755 index 00000000..fbcf1bf6 --- /dev/null +++ b/kud/tests/kubevirt.sh @@ -0,0 +1,66 @@ +#!/bin/bash +# SPDX-license-identifier: Apache-2.0 +############################################################################## +# Copyright (c) 2021 +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +set -o errexit +set -o nounset +set -o pipefail + +source _common.sh +source _functions.sh + +csar_id=07f9cfe1-25f6-41fe-b4da-e61a2c94c319 + +# Setup +populate_CSAR_kubevirt $csar_id + +pushd ${CSAR_DIR}/${csar_id} + +# Under automation, the VMI CRD may not be defined yet and setup_type +# will fail. Retry to workaround this. +tries=3 +interval=10 +for ((try=1;try<=$tries;try++)); do + echo "try $try/$tries: setup test VMI" + sleep $interval + if setup_type "vmi" $kubevirt_vmi_name; then + break + fi +done +if (($try > $tries)); then + echo "setup failed" + exit 1 +fi + +# Test +master_ip=$(kubectl cluster-info | grep "Kubernetes master" | awk -F '[:/]' '{print $4}') +deployment_pod=$(kubectl get pods | grep $kubevirt_vmi_name | awk '{print $1}') +echo "Pod name: $deployment_pod" +echo "ssh testuser@$(kubectl get pods $deployment_pod -o jsonpath="{.status.podIP}")" +echo "kubectl virt console $kubevirt_vmi_name" + +tries=30 +interval=60 +for ((try=1;try<=$tries;try++)); do + echo "try $try/$tries: Wait for $interval seconds to check for ssh access" + sleep $interval + if sshpass -p testuser ssh -o ProxyCommand="ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -W %h:%p $master_ip" -o StrictHostKeyChecking=no testuser@$(kubectl get pods $deployment_pod -o jsonpath="{.status.podIP}") -- uptime; then + echo "ssh access check is success" + break + fi +done +if (($try > $tries)); then + echo "ssh access check failed" + exit 1 +fi + +popd + +# Teardown +teardown_type "vmi" $kubevirt_vmi_name |