From 7ed7b27bc48ec8411b7c833dbc9c393cc10d7cad Mon Sep 17 00:00:00 2001
From: Mark Goddard <mark@stackhpc.com>
Date: Thu, 4 Jul 2019 11:57:17 +0100
Subject: [PATCH] Add retries to ansible galaxy install for all envs

Galaxy install often fails in CI, scuppering an otherwise good run.

Change-Id: I3d02afe33cdf32b1d285bd4bdc4a8074883113ca
---
 dev/functions                   |  2 +-
 tools/ansible-galaxy-retried.sh | 15 +++++++++++++++
 tox.ini                         |  6 +++---
 3 files changed, 19 insertions(+), 4 deletions(-)
 create mode 100755 tools/ansible-galaxy-retried.sh

diff --git a/dev/functions b/dev/functions
index f9ee17d5..286874f7 100644
--- a/dev/functions
+++ b/dev/functions
@@ -473,7 +473,7 @@ function tenks_deploy {
     install_venv "${TENKS_VENV_PATH}" "$tenks_path"
     source ${TENKS_VENV_PATH:-$HOME/tenks-test-venv}/bin/activate
 
-    ansible-galaxy install \
+    ${KAYOBE_SOURCE_PATH}/tools/ansible-galaxy-retried.sh install \
         --role-file="$tenks_path/requirements.yml" \
         --roles-path="$tenks_path/ansible/roles/"
 
diff --git a/tools/ansible-galaxy-retried.sh b/tools/ansible-galaxy-retried.sh
new file mode 100755
index 00000000..4082f98e
--- /dev/null
+++ b/tools/ansible-galaxy-retried.sh
@@ -0,0 +1,15 @@
+#!/bin/bash
+
+set -e
+
+GALAXY_RETRIES=${GALAXY_RETRIES:-3}
+
+for i in $(seq 1 $GALAXY_RETRIES); do
+    if ansible-galaxy "${@}"; then
+        exit 0
+    fi
+    echo "Ansible Galaxy command failed. Retrying"
+done
+
+echo "Failed to execute: ansible-galaxy ${@}"
+exit 1
diff --git a/tox.ini b/tox.ini
index 3c4a3bd7..0519802d 100644
--- a/tox.ini
+++ b/tox.ini
@@ -51,7 +51,7 @@ usedevelop = True
 sitepackages = True
 commands =
     # Install ansible role dependencies from Galaxy.
-    ansible-galaxy install \
+    {toxinidir}/tools/ansible-galaxy-retried.sh install \
         -r {toxinidir}/requirements.yml \
         -p {toxinidir}/ansible/roles
     {toxinidir}/tools/test-ansible.sh {posargs}
@@ -67,7 +67,7 @@ whitelist_externals =
     bash
 commands =
     # Install ansible role dependencies from Galaxy.
-    ansible-galaxy install \
+    {toxinidir}/tools/ansible-galaxy-retried.sh install \
         -r {toxinidir}/requirements.yml \
         -p {toxinidir}/ansible/roles
     bash -c "source {envdir}/bin/activate && {toxinidir}/tools/test-molecule.sh {posargs}"
@@ -80,7 +80,7 @@ commands = ansible-lint ansible/*.yaml
 basepython = python3
 commands =
     # Install ansible role dependencies from Galaxy.
-    ansible-galaxy install \
+    {toxinidir}/tools/ansible-galaxy-retried.sh install \
         -r {toxinidir}/requirements.yml \
         -p {toxinidir}/ansible/roles
     # Perform an Ansible syntax check. Skip some playbooks which require extra
-- 
GitLab