From 585bba1465e4fe2e83f6ff702c7db5af4f05d162 Mon Sep 17 00:00:00 2001 From: Peter Mikus Date: Tue, 25 Sep 2018 11:25:22 +0000 Subject: [PATCH] CSIT-1316 Fix ligato building mechanics in CSIT bootstraps Change-Id: Ia8da73cbf7ab213b61a330b757419330667be24b Signed-off-by: Peter Mikus --- resources/libraries/bash/function/gather.sh | 54 +++++++++++++-------------- resources/libraries/bash/shell/k8s_utils.sh | 2 +- resources/libraries/python/KubernetesUtils.py | 48 ++++++++++++++++++++++-- tests/kubernetes/perf/__init__.robot | 5 +++ 4 files changed, 75 insertions(+), 34 deletions(-) diff --git a/resources/libraries/bash/function/gather.sh b/resources/libraries/bash/function/gather.sh index e030652494..b5bc692955 100644 --- a/resources/libraries/bash/function/gather.sh +++ b/resources/libraries/bash/function/gather.sh @@ -152,50 +152,46 @@ function gather_ligato () { gather_vpp || die "The function should have died on error." - # Extract VPP API to specific folder - # FIXME: Make sure /tmp/vpp/ exists. Should we clean it? + mkdir -p /tmp/vpp && rm -f /tmp/vpp/* || { + die "Failed to create temporary directory!" + } dpkg -x "${DOWNLOAD_DIR}/vpp_"*".deb" "/tmp/vpp" || { die "Failed to extract VPP packages for kubernetes!" } ligato_repo_url="https://github.com/ligato/" - vpp_agent_stable_ver="$(cat "${CSIT_DIR}/VPP_AGENT_STABLE_VER")" || { - die "Cat failed." + vpp_agent_stable_ver="$(< "${CSIT_DIR}/VPP_AGENT_STABLE_VER")" || { + die "Failed to read vpp-agent stable version!" } - docker_deb="docker-ce_18.03.0~ce-0~ubuntu_amd64.deb" - # Clone & checkout stable vpp-agent - cd "${CSIT_DIR}" || die "Change directory failed." + # Clone & checkout stable vpp-agent. + cd "${CSIT_DIR}" || die "Change directory failed!" git clone -b "${vpp_agent_stable_ver}" --single-branch \ "${ligato_repo_url}/vpp-agent" "vpp-agent" || { die "Failed to run: git clone ${ligato_repo_url}/vpp-agent!" } - cd "vpp-agent" || die "Change directory failed." - - # Install Docker - url_prefix="https://download.docker.com/linux/ubuntu/dists/xenial/pool" - # URL is not in quotes, calling command from variable keeps them. - wget_command=("wget" "-nv" "${url_prefix}/stable/amd64/${docker_deb}") - "${wget_command[@]}" || die "Failed to download Docker package!" + cd "vpp-agent" || die "Change directory failed!" - sudo dpkg -i "${docker_deb}" || die "Failed to install Docker!" + # Install Docker. + curl -fsSL https://get.docker.com | sudo bash || { + die "Failed to install Docker package!" + } - # Pull ligato/dev_vpp_agent docker image and re-tag as local + # Pull ligato/dev_vpp_agent docker image and re-tag as local. sudo docker pull "ligato/dev-vpp-agent:${vpp_agent_stable_ver}" || { die "Failed to pull Docker image!" } - - first_arg="ligato/dev-vpp-agent:${vpp_agent_stable_ver}" - sudo docker tag "${first_arg}" "dev_vpp_agent:latest" || { + params=(ligato/dev-vpp-agent:${vpp_agent_stable_ver} dev_vpp_agent:latest) + sudo docker tag "${params[@]}" || { die "Failed to tag Docker image!" } - # Start dev_vpp_agent container as daemon + # Start dev_vpp_agent container as daemon. sudo docker run --rm -itd --name "agentcnt" "dev_vpp_agent" bash || { die "Failed to run Docker image!" } - # Copy latest vpp api into running container + # Copy latest vpp api into running container. sudo docker exec agentcnt rm -rf "agentcnt:/usr/share/vpp/api" || { die "Failed to remove previous API!" } @@ -203,7 +199,7 @@ function gather_ligato () { die "Failed to copy files Docker image!" } - # Recompile vpp-agent + # Recompile vpp-agent. script_arg=". ~/.bashrc; cd /go/src/github.com/ligato/vpp-agent" script_arg+=" && make generate && make install" sudo docker exec -i agentcnt script -qec "${script_arg}" || { @@ -216,28 +212,28 @@ function gather_ligato () { } for f in "${DOWNLOAD_DIR}"/*; do sudo docker cp "$f" "agentcnt:/opt/vpp-agent/dev/vpp/build-root"/ || { - die "Failed to copy files Docker image!" + die "Failed to copy files to Docker image!" } done - # Save container state + # Save container state. sudo docker commit "$(sudo docker ps -q)" "dev_vpp_agent:latest" || { die "Failed to commit state of Docker image!" } - # Build prod_vpp_agent docker image + # Build prod_vpp_agent docker image. cd "docker/prod" || die "Change directory failed." sudo docker build --tag "prod_vpp_agent" --no-cache "." || { die "Failed to build Docker image!" } - # Export Docker image + # Export Docker image. sudo docker save "prod_vpp_agent" | gzip > "prod_vpp_agent.tar.gz" || { die "Failed to save Docker image!" } docker_image="$(readlink -e "prod_vpp_agent.tar.gz")" || { - die "Readlink failed." + die "Failed to get Docker image path!" } - rm -r "${DOWNLOAD_DIR}/vpp"* || die "Rm failed." - mv "${docker_image}" "${DOWNLOAD_DIR}"/ || die "Mv failed." + rm -r "${DOWNLOAD_DIR}/vpp"* || die "Failed to remove VPP packages!" + mv "${docker_image}" "${DOWNLOAD_DIR}"/ || die "Failed to move image!" } diff --git a/resources/libraries/bash/shell/k8s_utils.sh b/resources/libraries/bash/shell/k8s_utils.sh index 55d3d815c9..ac5ecfa287 100644 --- a/resources/libraries/bash/shell/k8s_utils.sh +++ b/resources/libraries/bash/shell/k8s_utils.sh @@ -18,7 +18,7 @@ function k8s_utils.destroy { kubectl delete node $HOSTNAME # Revert any changes made to this host by 'kubeadm init' or 'kubeadm join' - sudo kubeadm reset && sudo rm -rf $HOME/.kube || \ + sudo kubeadm reset --force && sudo rm -rf $HOME/.kube || \ { echo "Failed to reset kubeadm"; exit 1; } } diff --git a/resources/libraries/python/KubernetesUtils.py b/resources/libraries/python/KubernetesUtils.py index 14cba480ac..7a4784d42f 100644 --- a/resources/libraries/python/KubernetesUtils.py +++ b/resources/libraries/python/KubernetesUtils.py @@ -17,7 +17,7 @@ from time import sleep from resources.libraries.python.constants import Constants from resources.libraries.python.topology import NodeType -from resources.libraries.python.ssh import SSH +from resources.libraries.python.ssh import SSH, exec_cmd_no_error from resources.libraries.python.CpuUtils import CpuUtils from resources.libraries.python.VppConfigGenerator import VppConfigGenerator @@ -33,6 +33,46 @@ class KubernetesUtils(object): """Initialize KubernetesUtils class.""" pass + @staticmethod + def load_docker_image_on_node(node, image_path): + """Load Docker container image from file on node. + + :param node: DUT node. + :param image_path: Container image path. + :type node: dict + :type image_path: str + :raises RuntimeError: If loading image failed on node. + """ + command = 'docker load -i {image_path}'.\ + format(image_path=image_path) + message = 'Failed to load Docker image on {node}.'.\ + format(node=node['host']) + exec_cmd_no_error(node, command, timeout=240, sudo=True, + message=message) + + command = "docker rmi $(sudo docker images -f 'dangling=true' -q)".\ + format(image_path=image_path) + message = 'Failed to clean Docker images on {node}.'.\ + format(node=node['host']) + try: + exec_cmd_no_error(node, command, timeout=240, sudo=True, + message=message) + except RuntimeError: + pass + + @staticmethod + def load_docker_image_on_all_duts(nodes, image_path): + """Load Docker container image from file on all DUTs. + + :param nodes: Topology nodes. + :param image_path: Container image path. + :type nodes: dict + :type image_path: str + """ + for node in nodes.values(): + if node['type'] == NodeType.DUT: + KubernetesUtils.load_docker_image_on_node(node, image_path) + @staticmethod def setup_kubernetes_on_node(node): """Set up Kubernetes on node. @@ -216,12 +256,12 @@ class KubernetesUtils(object): cmd = 'kubectl delete {nspace} {rtype} {name}'\ .format(nspace=nspace, rtype=rtype, name=name) - (ret_code, _, _) = ssh.exec_command_sudo(cmd) + (ret_code, _, _) = ssh.exec_command_sudo(cmd, timeout=120) if int(ret_code) != 0: raise RuntimeError('Failed to delete Kubernetes resources ' 'on {node}.'.format(node=node['host'])) - cmd = 'kubectl get {nspace} pods -a --no-headers'\ + cmd = 'kubectl get {nspace} pods --no-headers'\ .format(nspace=nspace) for _ in range(MAX_RETRY): (ret_code, stdout, stderr) = ssh.exec_command_sudo(cmd) @@ -355,7 +395,7 @@ class KubernetesUtils(object): nspace = '-n {nspace}'.format(nspace=nspace) if nspace \ else '--all-namespaces' - cmd = 'kubectl get {nspace} pods -a --no-headers' \ + cmd = 'kubectl get {nspace} pods --no-headers' \ .format(nspace=nspace) for _ in range(MAX_RETRY): (ret_code, stdout, _) = ssh.exec_command_sudo(cmd) diff --git a/tests/kubernetes/perf/__init__.robot b/tests/kubernetes/perf/__init__.robot index fd5e0328be..d21f2eecba 100644 --- a/tests/kubernetes/perf/__init__.robot +++ b/tests/kubernetes/perf/__init__.robot @@ -25,6 +25,8 @@ | Library | Collections | Suite Setup | Run Keywords | Setup performance global Variables | ... | AND | Setup Framework | ${nodes} +| ... | AND | Load Docker image on all duts | ${nodes} +| ... | ${dcr_image} | ... | AND | Setup Kubernetes on all duts | ${nodes} | ... | AND | Get CPU Layout from all nodes | ${nodes} | ... | AND | Update all numa nodes | ${nodes} @@ -39,6 +41,7 @@ | | ... | Setup suite Variables. Variables are used across performance testing. | | ... | | ... | _NOTE:_ This KW sets following suite variables: +| | ... | - dcr_image - vpp-agent docker image | | ... | - perf_pdr_loss_acceptance - Loss acceptance treshold | | ... | - perf_pdr_loss_acceptance_type - Loss acceptance treshold type | | ... | - pkt_trace - Switch to enable packet trace for test @@ -46,6 +49,8 @@ | | ... | - uio_driver - Default UIO driver | | ... | - plugins_to_enable - List of plugins to be enabled for test | | ... +| | Set Global Variable | ${dcr_image} +| | ... | /tmp/openvpp-testing/download_dir/prod_vpp_agent.tar.gz | | Set Global Variable | ${perf_pdr_loss_acceptance} | 0.5 | | Set Global Variable | ${perf_pdr_loss_acceptance_type} | percentage | | Set Global Variable | ${pkt_trace} | ${False} -- 2.16.6