CSIT-1316 Fix ligato building mechanics in CSIT bootstraps 71/14971/16
authorPeter Mikus <pmikus@cisco.com>
Tue, 25 Sep 2018 11:25:22 +0000 (11:25 +0000)
committerPeter Mikus <pmikus@cisco.com>
Wed, 26 Sep 2018 10:53:07 +0000 (10:53 +0000)
Change-Id: Ia8da73cbf7ab213b61a330b757419330667be24b
Signed-off-by: Peter Mikus <pmikus@cisco.com>
resources/libraries/bash/function/gather.sh
resources/libraries/bash/shell/k8s_utils.sh
resources/libraries/python/KubernetesUtils.py
tests/kubernetes/perf/__init__.robot

index e030652..b5bc692 100644 (file)
@@ -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!"
 }
 
 
index 55d3d81..ac5ecfa 100644 (file)
@@ -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; }
 }
 
index 14cba48..7a4784d 100644 (file)
@@ -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)
index fd5e032..d21f2ee 100644 (file)
@@ -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}