From 4e1718db4996da50b857e6bd776b5ec311e4ade6 Mon Sep 17 00:00:00 2001
From: Jakob Meng <code@jakobmeng.de>
Date: Tue, 26 Apr 2022 21:02:24 +0200
Subject: [PATCH] Refactored ci script with shellcheck suggestions and install
 collections

Change-Id: I071e50eadfaf0f17f413a0c5f86e5d6b96356b36
---
 ci/requirements.yml                |  5 ++
 ci/run-ansible-tests-collection.sh | 83 +++++++++++++++++-------------
 2 files changed, 52 insertions(+), 36 deletions(-)
 create mode 100644 ci/requirements.yml

diff --git a/ci/requirements.yml b/ci/requirements.yml
new file mode 100644
index 0000000..ab5c152
--- /dev/null
+++ b/ci/requirements.yml
@@ -0,0 +1,5 @@
+---
+collections:
+- ansible.posix
+- ansible.utils
+- community.general
diff --git a/ci/run-ansible-tests-collection.sh b/ci/run-ansible-tests-collection.sh
index 31003ab..d281619 100644
--- a/ci/run-ansible-tests-collection.sh
+++ b/ci/run-ansible-tests-collection.sh
@@ -1,3 +1,4 @@
+#!/bin/bash
 #############################################################################
 # run-ansible-tests.sh
 #
@@ -41,27 +42,39 @@ while getopts "c:de:u:" opt
 do
     case $opt in
     d) USE_DEV=1 ;;
-    c) CLOUD=${OPTARG} ;;
-    u) CLOUD_ALT=${OPTARG} ;;
-    e) ENVDIR=${OPTARG} ;;
-    ?) echo "Invalid option: -${OPTARG}"
+    c) CLOUD=$OPTARG ;;
+    u) CLOUD_ALT=$OPTARG ;;
+    e) ENVDIR=$OPTARG ;;
+    ?) echo "Invalid option: -$OPTARG"
        exit 1;;
     esac
 done
 
-if [ -z ${ENVDIR} ]
-then
+# Shift arguments read by getopts
+shift $((OPTIND-1))
+
+# Remaining arguments are Ansible tags
+TAGS=$( echo "$*" | tr ' ' , )
+
+if [ -z "$ENVDIR" ]; then
     echo "Option -e is required"
     exit 1
 fi
 
-shift $((OPTIND-1))
-TAGS=$( echo "$*" | tr ' ' , )
+if [ ! -d ci ]; then
+    echo "Script must be run from collection's root directory"
+    exit 2
+fi
+
+# Install Ansible collections before dealing with virtual environments for Ansible
+
+# Install collections used in ci
+ansible-galaxy collection install --requirements-file ci/requirements.yml
 
-# Install collections before dealing with Ansible virtual environments
-if [[ -z "$PIP_INSTALL" ]]; then
+# Install this collection
+if [ -z "$PIP_INSTALL" ]; then
     tox -ebuild
-    ansible-galaxy collection install $(ls build_artifact/openstack-cloud-*) --force
+    ansible-galaxy collection install "$(find build_artifact/ -maxdepth 1 -name 'openstack-cloud-*')" --force
     TEST_COLLECTIONS_PATHS=${HOME}/.ansible/collections:$ANSIBLE_COLLECTIONS_PATHS
 else
     pip freeze | grep ansible-collections-openstack
@@ -70,25 +83,22 @@ fi
 
 # We need to source the current tox environment so that Ansible will
 # be setup for the correct python environment.
-source $ENVDIR/bin/activate
+source "$ENVDIR/bin/activate"
 
-if [ ${USE_DEV} -eq 1 ]
-then
-    if [ -d ${ENVDIR}/ansible ]
-    then
+if [ "$USE_DEV" -eq 1 ]; then
+    if [ -d "$ENVDIR/ansible" ]; then
         echo "Using existing Ansible source repo"
     else
         echo "Installing Ansible source repo at $ENVDIR"
-        git clone --recursive https://github.com/ansible/ansible.git ${ENVDIR}/ansible
+        git clone --recursive https://github.com/ansible/ansible.git "$ENVDIR/ansible"
     fi
-    source $ENVDIR/ansible/hacking/env-setup
+    source "$ENVDIR/ansible/hacking/env-setup"
 fi
 
 # Run the shade Ansible tests
 tag_opt=""
-if [ ! -z ${TAGS} ]
-then
-    tag_opt="--tags ${TAGS}"
+if [ -n "$TAGS" ]; then
+    tag_opt="--tags $TAGS"
 fi
 
 # Loop through all ANSIBLE_VAR_ environment variables to allow passing the further
@@ -103,41 +113,42 @@ done
 # Until we have a module that lets us determine the image we want from
 # within a playbook, we have to find the image here and pass it in.
 # We use the openstack client instead of nova client since it can use clouds.yaml.
-IMAGE=`openstack --os-cloud=${CLOUD} image list -f value -c Name | grep cirros | grep -v -e ramdisk -e kernel`
-if [ $? -ne 0 ]
-then
+IMAGE=$(openstack "--os-cloud=$CLOUD" image list -f value -c Name | grep cirros | grep -v -e ramdisk -e kernel)
+if [ -z "$IMAGE" ]; then
   echo "Failed to find Cirros image"
-  exit 1
+  exit 3
 fi
 
 # In case of Octavia enabled:
 _octavia_image_path="/tmp/test-only-amphora-x64-haproxy-ubuntu-bionic.qcow2"
 if systemctl list-units --full -all | grep -Fq "devstack@o-api.service" && \
-  test -f "$_octavia_image_path"
-then
+  test -f "$_octavia_image_path"; then
     # Upload apmhora image for Octavia to test load balancers
     OCTAVIA_AMP_IMAGE_FILE=${OCTAVIA_AMP_IMAGE_FILE:-"$_octavia_image_path"}
     OCTAVIA_AMP_IMAGE_NAME=${OCTAVIA_AMP_IMAGE_NAME:-"test-only-amphora-x64-haproxy-ubuntu-bionic"}
     OCTAVIA_AMP_IMAGE_SIZE=${OCTAVIA_AMP_IMAGE_SIZE:-3}
-    openstack --os-cloud=${CLOUD} image create \
+    openstack "--os-cloud=$CLOUD" image create \
         --container-format bare \
         --disk-format qcow2 \
         --private \
-        --file $OCTAVIA_AMP_IMAGE_FILE \
-        --project service $OCTAVIA_AMP_IMAGE_NAME
-    openstack --os-cloud=${CLOUD} image set --tag amphora $OCTAVIA_AMP_IMAGE_NAME
+        --file "$OCTAVIA_AMP_IMAGE_FILE" \
+        --project service "$OCTAVIA_AMP_IMAGE_NAME"
+    openstack "--os-cloud=$CLOUD" image set --tag amphora "$OCTAVIA_AMP_IMAGE_NAME"
     # End of Octavia preparement
 else
-    tag_opt="$tag_opt --skip-tags loadbalancer"
+    # Run all tasks except for loadbalancer tasks
+    tag_opt+=" --skip-tags loadbalancer"
 fi
 
-# Discover openstackSDK version
+# Discover openstacksdk version
 SDK_VER=$(python -c "import openstack; print(openstack.version.__version__)")
-pushd ci/
-# run tests
+
+cd ci/
+
+# Run tests
 set -o pipefail
+# shellcheck disable=SC2086
 ANSIBLE_COLLECTIONS_PATHS=$TEST_COLLECTIONS_PATHS ansible-playbook \
     -vvv ./run-collection.yml \
     -e "sdk_version=${SDK_VER} cloud=${CLOUD} cloud_alt=${CLOUD_ALT} image=${IMAGE} ${ANSIBLE_VARS}" \
     ${tag_opt} 2>&1 | sudo tee /opt/stack/logs/test_output.log
-popd
-- 
GitLab