-#! /usr/bin/env bash
-
+#!/usr/bin/env bash
# COPYRIGHT NOTICE STARTS HERE
#
-# Copyright 2018 © Samsung Electronics Co., Ltd.
+# Copyright 2018-2021 © Samsung Electronics Co., Ltd.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# limitations under the License.
#
# COPYRIGHT NOTICE ENDS HERE
+###############################################################################
+# This script performs Jenkins Change Verification for ONAP Offline Installer #
+# No parameters are expected #
+###############################################################################
-### This script performs Jenkins Change Verification for ONAP Offline Installer
-# No parameters are expected
-###
-#######################################################################
-# MAIN #
-#######################################################################
-#if ansible was changed
+function prep_ubuntu_16_04_for_molecule() {
+ sudo killall apt apt-get
+ sudo apt-get --assume-yes install software-properties-common
+ sudo add-apt-repository --yes ppa:deadsnakes/ppa
+ sudo apt update
+ sudo apt install --assume-yes python3.8
+ sudo apt install --assume-yes python3.8-venv
+}
- if `git diff HEAD^ HEAD --name-only | grep -q "ansible/test"`;
- then echo "TO DO: FULL ANSIBLE TEST" ;
- else
- ROLE_CHANGES=(`git diff HEAD^ HEAD --name-only | grep "ansible/role" | cut -f 1-3 -d "/" | sort | uniq`)
- if [ -z "${ROLE_CHANGES}" ]; then
- echo "NO ANSIBLE TESTS REQUIRED"
+function run_molecule() {
+ local roles=("$@")
+ local MOLECULE_RC
+ for role in ${roles[@]}
+ do
+ if [ -f ${role}/molecule/default/molecule.yml ]; then
+ ./ansible/test/bin/ci-molecule.sh ${role}
+ MOLECULE_RC=$?
+ if [ ${MOLECULE_RC} -ne "0" ]; then FAILED_ROLES+=(${role}); fi
else
- for i in ${ROLE_CHANGES[@]}
- do
- sudo ./ansible/test/bin/ci-molecule.sh ${i}
- MOLECULE_RC=$?
- if [ ${MOLECULE_RC} -ne "0" ]; then echo "MOLECULE TEST FAILED FOR ${i};";exit 1; fi
- done
+ echo "[WARNING] ---------- THERE ARE NO TESTS DEFINED FOR ${role} ----------"
fi
- fi
+ done
+}
+#######################################################################$
+# MAIN #$
+#######################################################################$
+echo "---------- ONAP OFFLINE INSTALLER - CHANGE VERIFICATION START ----------"
+FAILED_ROLES=()
+ALL_PLAYBOOKS=(`ls -d ansible/test/play-*`) # enumerate all playbook tests for later usage
+# Setup environment
+prep_ubuntu_16_04_for_molecule > ubuntu_preparation.log
-#if build was changed
+# Check for changes in Ansible roles
+ROLE_CHANGES=(`git diff HEAD^ HEAD --name-only ansible/roles | cut -f 1-3 -d "/" | sort -u`)
+if [ -z "${ROLE_CHANGES}" ]; then
+ echo "NO ANSIBLE ROLE TESTS REQUIRED"
+else
+ run_molecule "${ROLE_CHANGES[@]}"
+fi
- if `git diff HEAD^ HEAD --name-only | grep -q "build"`;
- then echo "TO DO: BUILD TEST" ;
+# Check for changes in Molecule tests
+if ! $(git diff HEAD^ HEAD --exit-code --quiet ansible/test); then
+ # If there are any changes in ansible/test area
+ MOLECULE_CHANGES=(`git diff HEAD^ HEAD --name-only ansible/test | grep -v "ansible/test/play-.*/"`)
+ if [ ${#MOLECULE_CHANGES[@]} -gt 0 ]; then
+ # If detected changes that affect all playbook tests - run all
+ run_molecule "${ALL_PLAYBOOKS[@]}"
+ # memorize already tested playbooks
+ TESTED_PLAYBOOKS=${ALL_PLAYBOOKS[@]}
+ else
+ # Changes only in ansible/test/play-* area - run tests only for changed playbook tests
+ PLAYBOOKS=(`git diff HEAD^ HEAD --name-only ansible/test | cut -f 1-3 -d "/" | sort -u`)
+ run_molecule "${PLAYBOOKS[@]}"
+ # memorize already tested playbooks
+ TESTED_PLAYBOOKS=${PLAYBOOKS[@]}
+ fi
+fi
+
+# Check for changes in Ansible playbooks
+PLAYBOOK_CHANGES=(`git diff HEAD^ HEAD --name-only --relative=ansible ansible/*yml | cut -f 1 -d "."`)
+if [ ${#PLAYBOOK_CHANGES[@]} -gt 0 ]; then
+ for playbook in ${PLAYBOOK_CHANGES[@]};
+ do
+ if [ -d ansible/test/play-${playbook} ]; then
+ # If tests for this playbook are defined
+ if [[ ! ${TESTED_PLAYBOOKS[*]} =~ ${playbook} ]]; then
+ # AND weren't already run
+ run_molecule "ansible/test/play-${playbook}"
+ fi
else
- echo "NO BUILD TEST REQUIRED"
+ # Warn that no tests are defined for this playbook
+ echo "[WARNING] ---------- THERE ARE NO TESTS DEFINED FOR ${playbook}.yml PLAYBOOK ----------"
fi
+ done
+fi
-#if documentation was changed
-
- if `git diff HEAD^ HEAD --name-only | grep -q "docs"`;
- then echo "TO DO: DOC TEST";
- else
- echo "NO DOC TEST REQUIRED"
+# Check for changes in Ansible group_vars or libraries
+if ! $(git diff HEAD^ HEAD --exit-code --quiet --relative=ansible/group_vars) || \
+ ! $(git diff HEAD^ HEAD --exit-code --quiet --relative=ansible/library); then
+ # If there are any changes in ansible/{group_vars,libraries}
+ # then run all playbook tests except those that've been
+ # already run
+ for playbook in ${ALL_PLAYBOOKS[@]};
+ do
+ if [[ ! ${TESTED_PLAYBOOKS[*]} =~ ${playbook} ]]; then
+ run_molecule "${playbook}"
fi
+ done
+fi
+
+# if build was changed
+
+if `git diff HEAD^ HEAD --name-only | grep -q "build"`; then
+ echo "TO DO: BUILD TEST" ;
+else
+ echo "NO BUILD TEST REQUIRED"
+fi
+
+# if documentation was changed
+
+if `git diff HEAD^ HEAD --name-only | grep -q "docs"`; then
+ echo "TO DO: DOC TEST";
+else
+ echo "NO DOC TEST REQUIRED"
+fi
+
+# SUMMARY RESULTS
+if [ -z ${FAILED_ROLES} ]; then
+ echo "All verification steps passed"
+else
+ echo "Verification failed for ${FAILED_ROLES[*]}"
+ exit 1
+fi
+echo "---------- ONAP OFFLINE INSTALLER - CHANGE VERIFICATION END ----------"