rvykydal / rpms / anaconda

Forked from rpms/anaconda 5 years ago
Clone
e26cbb0
#!/bin/sh
e26cbb0
e26cbb0
usage () {
e26cbb0
    cat <
e26cbb0
e26cbb0
    $0  [-c] [-a <ARTIFACTS DIR>]
e26cbb0
e26cbb0
    Run gating tests on test runners provisioned by linchpin and deployed with ansible,
e26cbb0
    syncing artifacts to localhost.
e26cbb0
e26cbb0
   -c  Run configuration check.
e26cbb0
   -a  Local host directory for fetching artifacts from test runner.
e26cbb0
HELP_USAGE
e26cbb0
}
e26cbb0
e26cbb0
CHECK_ONLY="no"
e26cbb0
ARTIFACTS_VAR=""
e26cbb0
e26cbb0
while getopts "ca:" opt; do
e26cbb0
    case $opt in
e26cbb0
        c)
e26cbb0
            # Run only configuration check
e26cbb0
            CHECK_ONLY="yes"
e26cbb0
            ;;
e26cbb0
        a)
e26cbb0
            # Set up directory for fetching artifacts
e26cbb0
            ARTIFACTS_VAR="local_artifacts=${OPTARG}"
e26cbb0
            ;;
e26cbb0
        *)
e26cbb0
            echo "Usage:"
e26cbb0
            usage
e26cbb0
            exit 1
e26cbb0
            ;;
e26cbb0
    esac
e26cbb0
done
e26cbb0
e26cbb0
DEFAULT_CRED_FILENAME="clouds.yml"
e26cbb0
CRED_DIR="${HOME}/.config/linchpin"
e26cbb0
CRED_FILE_PATH=${CRED_DIR}/${DEFAULT_CRED_FILENAME}
e26cbb0
TOPOLOGY_FILE_PATH="linchpin/topologies/gating-test.yml"
3188ae5
ANSIBLE_CFG_PATH="remote_config/ansible.cfg"
e26cbb0
e26cbb0
CHECK_RESULT=0
e26cbb0
e26cbb0
e26cbb0
############################## Check the configuration
e26cbb0
e26cbb0
echo
e26cbb0
echo "========= Dependencies are installed"
e26cbb0
echo "linchpin and ansible are required to be installed."
e26cbb0
echo "For linchpin installation instructions see:"
e26cbb0
echo "https://linchpin.readthedocs.io/en/latest/installation.html"
e26cbb0
echo
e26cbb0
e26cbb0
if ! type ansible &> /dev/null; then
e26cbb0
    echo "=> FAILED: ansible package is not installed"
e26cbb0
    CHECK_RESULT=1
e26cbb0
else
e26cbb0
    echo "=> OK: ansible is installed"
e26cbb0
fi
e26cbb0
e26cbb0
if ! type linchpin &> /dev/null; then
e26cbb0
    echo "=> FAILED: linchpin is not installed"
e26cbb0
    CHECK_RESULT=1
e26cbb0
else
e26cbb0
    echo "=> OK: linchpin is installed"
e26cbb0
fi
e26cbb0
e26cbb0
e26cbb0
echo
e26cbb0
echo "========= Linchpin cloud credentials configuration"
e26cbb0
echo "The credentials file for linchpin provisioner should be in ${CRED_DIR}"
e26cbb0
echo "The name of the file and the profile to be used is defined by"
e26cbb0
echo "   resource_groups.credentials variables in the topology file"
e26cbb0
echo "   (${TOPOLOGY_FILE_PATH})"
e26cbb0
echo
e26cbb0
e26cbb0
config_changed=0
e26cbb0
if [[ -f ${TOPOLOGY_FILE_PATH} ]]; then
e26cbb0
    grep -q 'filename:.*'${DEFAULT_CRED_FILENAME} ${TOPOLOGY_FILE_PATH}
e26cbb0
    config_changed=$?
e26cbb0
fi
e26cbb0
e26cbb0
if [[ ${config_changed} -eq 0 ]]; then
e26cbb0
    if [[ -f ${CRED_FILE_PATH} ]]; then
e26cbb0
        echo "=> OK: ${CRED_FILE_PATH} exists"
e26cbb0
    else
e26cbb0
        echo "=> FAILED: ${CRED_FILE_PATH} does not exist"
e26cbb0
        CHECK_RESULT=1
e26cbb0
    fi
e26cbb0
else
e26cbb0
    echo "=> NOT CHECKING: seems like this has been configured in a different way"
e26cbb0
fi
e26cbb0
e26cbb0
e26cbb0
echo
e26cbb0
echo "========== Deployment ssh key configuration"
e26cbb0
echo "The ssh key used for deployment with ansible has to be defined by"
e26cbb0
echo "private_key_file variable in ${ANSIBLE_CFG_PATH}"
e26cbb0
echo "and match the key used for provisioning of the machines with linchpin"
e26cbb0
echo "which is defined by resource_groups.resource_definitions.keypair variable"
e26cbb0
echo "in topology file (${TOPOLOGY_FILE_PATH})."
e26cbb0
echo
e26cbb0
e26cbb0
e26cbb0
deployment_key_defined_line=$(grep 'private_key_file.*=.*[^\S]' ${ANSIBLE_CFG_PATH})
e26cbb0
if [[ -n "${deployment_key_defined_line}" ]]; then
e26cbb0
    echo "=> OK: ${ANSIBLE_CFG_PATH}: ${deployment_key_defined_line}"
e26cbb0
else
e26cbb0
    echo "=> FAILED: deployment ssh key not defined in ${ANSIBLE_CFG_PATH}"
e26cbb0
    CHECK_RESULT=1
e26cbb0
fi
e26cbb0
e26cbb0
linchpin_keypair=$(grep "keypair:" ${TOPOLOGY_FILE_PATH} | uniq)
e26cbb0
echo "=> INFO: should be the same key as ${TOPOLOGY_FILE_PATH}: ${linchpin_keypair}"
e26cbb0
e26cbb0
e26cbb0
if [[ ${CHECK_RESULT} -ne 0 ]]; then
e26cbb0
echo
e26cbb0
echo "=> Configuration check FAILED, see FAILED messages above."
e26cbb0
echo
e26cbb0
fi
e26cbb0
e26cbb0
if [[ ${CHECK_ONLY} == "yes" || ${CHECK_RESULT} -ne 0 ]]; then
e26cbb0
    exit ${CHECK_RESULT}
e26cbb0
fi
e26cbb0
e26cbb0
e26cbb0
############################## Run the tests
e26cbb0
e26cbb0
set -x
e26cbb0
e26cbb0
### Clean the linchpin generated inventory
e26cbb0
rm -rf linchpin/inventories/*.inventory
e26cbb0
e26cbb0
### Provision test runner
e26cbb0
linchpin -v --workspace linchpin -p linchpin/PinFile -c linchpin/linchpin.conf up
e26cbb0
e26cbb0
### Pass inventory generated by linchpin to ansible
3188ae5
cp linchpin/inventories/*.inventory remote_config/inventory/linchpin.inventory
3188ae5
63b7f2a
### Use ansible configuration for running tests on remote host
3188ae5
export ANSIBLE_CONFIG=${ANSIBLE_CFG_PATH}
e26cbb0
e26cbb0
### Configure remote user for playbooks
63b7f2a
# By default root is used but it can be fedora or cloud-user for cloud images
e26cbb0
for USER in root fedora cloud-user; do
e26cbb0
  ansible-playbook --extra-vars="remote_user=$USER" check_and_set_remote_user.yml
e26cbb0
done
e26cbb0
63b7f2a
### Prepare test runner
e26cbb0
ansible-playbook prepare-test-runner.yml
63b7f2a
### Run test on test runner (supply artifacts variable which is testing system's job)
e26cbb0
ansible-playbook --extra-vars="artifacts=./artifacts" tests.yml
e26cbb0
### Gather artifacts (into /tmp/artifacts by default)
e26cbb0
ansible-playbook --extra-vars="${ARTIFACTS_VAR}" clean-test-runner.yml
e26cbb0
e26cbb0
### Destroy the test runner
e26cbb0
linchpin -v --workspace linchpin -p linchpin/PinFile -c linchpin/linchpin.conf destroy
e26cbb0