From 83edd3a996c506b6a1988d0c68214e9a849397d8 Mon Sep 17 00:00:00 2001 From: Pavel Raiskup Date: Thu, 23 Oct 2014 15:13:36 +0200 Subject: controller: autoconfiscate First part of converting controller to autoconf/automake solution. * .gitignore: New gitignore; autotools ignores. * Makefile.am: New file. * get_machine: Renamed to template bin/dtf-get-machine.in. * bin/dtf-get-machine.in: New template based on get_machine. * run_remote: Renamed to template bin/dtf-run-remote.in. * bin/dtf-run-remote.in: New binary template from run_remote. * build: New bootstrap like helper script (git-only). * configure.ac: New file. * etc/dtf.sh.in: Likewise. * ansible_helpers/wait-for-ssh: Renamed to libexec/dtf-wait-for-ssh. * share/dtf-controller/parse_credsfile: Reworked script for parsing OS credentials. * parse_credsfile: Moved to share/dtf-controller. * libexec/dtf-wait-for-ssh: Renamed from wait-for-ssh. * ansible/*: Moved into share/dtf-controller/ansible/*. * share/dtf-controller/ansible/vars/generated-vars.yml.in: New template file exporting configure-time variables into playbooks. --- controller/.gitignore | 10 ++ controller/Makefile.am | 37 +++++++ controller/ansible/dummy-wrapper.yml | 7 -- controller/ansible/fedora.yml | 64 ------------ controller/ansible/include/additional-packages.yml | 6 -- controller/ansible/include/beakerlib.yml | 1 - controller/ansible/include/download-results.yml | 5 - controller/ansible/include/prepare-testenv.yml | 3 - controller/ansible/run_include | 19 ---- controller/ansible_helpers/wait-for-ssh | 11 -- controller/bin/dtf-get-machine.in | 87 ++++++++++++++++ controller/bin/dtf-run-remote.in | 111 ++++++++++++++++++++ controller/build | 11 ++ controller/configure.ac | 35 +++++++ controller/etc/dtf.sh.in | 3 + controller/get_machine | 87 ---------------- controller/libexec/dtf-wait-for-ssh | 11 ++ controller/parse_credsfile | 16 --- controller/run_remote | 116 --------------------- .../share/dtf-controller/ansible/dummy-wrapper.yml | 7 ++ .../dtf-controller/ansible/playbooks/fedora.yml | 68 ++++++++++++ .../playbooks/include/additional-packages.yml | 6 ++ .../ansible/playbooks/include/beakerlib.yml | 1 + .../ansible/playbooks/include/download-results.yml | 5 + .../ansible/playbooks/include/prepare-testenv.yml | 3 + .../share/dtf-controller/ansible/run_include | 19 ++++ .../ansible/vars/generated-vars.yml.in | 4 + controller/share/dtf-controller/parse_credsfile | 31 ++++++ 28 files changed, 449 insertions(+), 335 deletions(-) create mode 100644 controller/.gitignore create mode 100644 controller/Makefile.am delete mode 100644 controller/ansible/dummy-wrapper.yml delete mode 100644 controller/ansible/fedora.yml delete mode 100644 controller/ansible/include/additional-packages.yml delete mode 100644 controller/ansible/include/beakerlib.yml delete mode 100644 controller/ansible/include/download-results.yml delete mode 100644 controller/ansible/include/prepare-testenv.yml delete mode 100755 controller/ansible/run_include delete mode 100755 controller/ansible_helpers/wait-for-ssh create mode 100644 controller/bin/dtf-get-machine.in create mode 100644 controller/bin/dtf-run-remote.in create mode 100755 controller/build create mode 100644 controller/configure.ac create mode 100644 controller/etc/dtf.sh.in delete mode 100755 controller/get_machine create mode 100755 controller/libexec/dtf-wait-for-ssh delete mode 100644 controller/parse_credsfile delete mode 100755 controller/run_remote create mode 100644 controller/share/dtf-controller/ansible/dummy-wrapper.yml create mode 100644 controller/share/dtf-controller/ansible/playbooks/fedora.yml create mode 100644 controller/share/dtf-controller/ansible/playbooks/include/additional-packages.yml create mode 100644 controller/share/dtf-controller/ansible/playbooks/include/beakerlib.yml create mode 100644 controller/share/dtf-controller/ansible/playbooks/include/download-results.yml create mode 100644 controller/share/dtf-controller/ansible/playbooks/include/prepare-testenv.yml create mode 100755 controller/share/dtf-controller/ansible/run_include create mode 100644 controller/share/dtf-controller/ansible/vars/generated-vars.yml.in create mode 100644 controller/share/dtf-controller/parse_credsfile diff --git a/controller/.gitignore b/controller/.gitignore new file mode 100644 index 0000000..0ce42e7 --- /dev/null +++ b/controller/.gitignore @@ -0,0 +1,10 @@ +.* +build-aux +config.* +dtf.sh +dtf-get-machine +dtf-run-remote +generated-vars.yml +Makefile +Makefile.in +stamp-h1 diff --git a/controller/Makefile.am b/controller/Makefile.am new file mode 100644 index 0000000..4df5e25 --- /dev/null +++ b/controller/Makefile.am @@ -0,0 +1,37 @@ +bin_SCRIPTS = bin/dtf-run-remote bin/dtf-get-machine + +sysconf_DATA = etc/dtf.sh + +pkgdata_DATA = ./share/dtf-controller/parse_credsfile + +libexec_SCRIPTS = libexec/dtf-wait-for-ssh + +ansiblevarsdir = $(pkgdatadir)/ansible/vars +ansibleplaybooksdir = $(pkgdatadir)/ansible/playbooks + +ansiblevars_DATA = share/dtf-controller/ansible/vars/generated-vars.yml + +dtfplaybookdir = $(pkgdatadir)/ansible/playbooks +ansibleplaybooks_DATA = share/dtf-controller/ansible/playbooks/fedora.yml + +share/dtf-controller/ansible/vars/generated-vars.yml: \ + share/dtf-controller/ansible/vars/generated-vars.yml.in .dep + $(INSTANTIATE) + +.dep: $(c_s) + touch .dep + +bin/dtf-run-remote: bin/dtf-run-remote.in .dep + $(INSTANTIATE_SCRIPT) + +bin/dtf-get-machine: bin/dtf-get-machine.in .dep + $(INSTANTIATE_SCRIPT) + +etc/dtf.sh: etc/dtf.sh.in .dep + $(INSTANTIATE) + +GENERATED_FILES = $(bin_SCRIPTS) \ + $(sysconf_DATA) \ + share/dtf-controller/ansible/vars/generated-vars.yml + +CLEANFILES = $(GENERATED_FILES) diff --git a/controller/ansible/dummy-wrapper.yml b/controller/ansible/dummy-wrapper.yml deleted file mode 100644 index 524b0ea..0000000 --- a/controller/ansible/dummy-wrapper.yml +++ /dev/null @@ -1,7 +0,0 @@ -- name: "dummy-wrapper" - hosts: "{{ target }}" - remote_user: root - gather_facts: False - - tasks: - - include: "{{ include_file }}" diff --git a/controller/ansible/fedora.yml b/controller/ansible/fedora.yml deleted file mode 100644 index cc64eac..0000000 --- a/controller/ansible/fedora.yml +++ /dev/null @@ -1,64 +0,0 @@ -- name: self-standing testsuite - remote_user: root - gather_facts: False - hosts: localhost - vars_files: - - "{{ opt_credsfile }}" - - tasks: - - name: generate builder name - local_action: shell echo `dd if=/dev/urandom bs=1k count=10 | md5sum ; echo DBTESTS` - register: vm_name - - - debug: msg="osusername={{ os_username }}" - - - name: spin it up - local_action: nova_compute auth_url={{os_auth_url}} - flavor_id={{os_flavor_id}} image_id="{{ os_image_id }}" key_name={{ os_keypair }} - login_password={{os_nova_password}} login_tenant_name="{{os_tenant_name}}" - login_username={{os_username}} security_groups={{os_security_group}} - wait=yes name="{{vm_name.stdout}}" wait_for=600 - register: nova - - - debug: msg="{{ nova.info.addresses }}" - - # This is ugly as hell... Hopefully nothing will be changing. - - local_action: command echo "{{ nova.info.addresses[os_network_dev][1].addr }}" - register: machine_ip - - - debug: msg="{{ machine_ip.stdout }}" - - - name: wait for the host to be hot - local_action: wait_for host={{ machine_ip.stdout }} port=22 delay=5 timeout=600 - - - local_action: shell ../ansible_helpers/wait-for-ssh "root@{{ machine_ip.stdout }}" - - - name: add it to the special group - local_action: add_host hostname={{ machine_ip.stdout }} - groupname=temp_group - -- hosts: temp_group - user: root - gather_facts: False - tasks: - - copy: src={{ opt_workdir }}/{{ opt_testsuite_name }}.tar.gz - dest=/root/{{ opt_testsuite_name }}.tar.gz - - - include: include/beakerlib.yml - - - include: include/prepare-testenv.yml - - - include: include/additional-packages.yml - when: dtf_rpm_files_list is defined - - - shell: cd /root && tar -xf {{ opt_testsuite_name }}.tar.gz - - - shell: cd /root/{{ opt_testsuite_name }}&& ./run &>/var/tmp/dtf-run.overview - register: test_result - ignore_errors: yes - - - include: include/download-results.yml - - - name: stop the vm - shell: echo "not implemented yet" - when: test_result.rc == 0 diff --git a/controller/ansible/include/additional-packages.yml b/controller/ansible/include/additional-packages.yml deleted file mode 100644 index f821255..0000000 --- a/controller/ansible/include/additional-packages.yml +++ /dev/null @@ -1,6 +0,0 @@ -- local_action: shell cat "{{ dtf_rpm_files_list }}" | xargs -n 100 - register: additional_packages - -- debug: msg="{{ additional_packages.stdout }}" - -- shell: yum install -y {{ additional_packages.stdout }} diff --git a/controller/ansible/include/beakerlib.yml b/controller/ansible/include/beakerlib.yml deleted file mode 100644 index 0461f25..0000000 --- a/controller/ansible/include/beakerlib.yml +++ /dev/null @@ -1 +0,0 @@ -- yum: conf_file=https://beaker-project.org/yum/beaker-server-Fedora.repo state=present name=beakerlib diff --git a/controller/ansible/include/download-results.yml b/controller/ansible/include/download-results.yml deleted file mode 100644 index 4404e08..0000000 --- a/controller/ansible/include/download-results.yml +++ /dev/null @@ -1,5 +0,0 @@ -- shell: cp -f /var/tmp/dtf-run.overview /var/tmp/dtf/ - -- shell: cd /var/tmp ; tar -czf dtf.tar.gz dtf - -- fetch: src=/var/tmp/dtf.tar.gz dest="{{ opt_workdir }}/" flat=yes diff --git a/controller/ansible/include/prepare-testenv.yml b/controller/ansible/include/prepare-testenv.yml deleted file mode 100644 index a63e51a..0000000 --- a/controller/ansible/include/prepare-testenv.yml +++ /dev/null @@ -1,3 +0,0 @@ -- yum: state=present name=postgresql-server - -- yum: state=present name=postgresql-upgrade diff --git a/controller/ansible/run_include b/controller/ansible/run_include deleted file mode 100755 index 4e84c7d..0000000 --- a/controller/ansible/run_include +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/bash - -export ANSIBLE_HOST_KEY_CHECKING=False - -workdir="$(dirname "${BASH_SOURCE[0]}")" -workdir=$(readlink -f "$workdir") - -export playbook=$(readlink -f "$1") - -( set -x - cd "$workdir" - - ansible-playbook -i "$workdir/../config/hosts" \ - --extra-vars "include_file=$playbook" \ - --extra-vars "script_name=dummy" \ - --extra-vars "opt_workdir=/tmp/dtf-$(date +%H%M%S%N)" \ - --extra-vars "target=host" \ - "dummy-wrapper.yml" -) diff --git a/controller/ansible_helpers/wait-for-ssh b/controller/ansible_helpers/wait-for-ssh deleted file mode 100755 index eb3880a..0000000 --- a/controller/ansible_helpers/wait-for-ssh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash -x - -where="$1" - -test -z "$where" && echo >&2 "no host specified" && exit 1 - -while [ 1 ]; do - ssh -o StrictHostKeyChecking=no -q $where exit &>/dev/null && exit 0 -done - -exit 1 diff --git a/controller/bin/dtf-get-machine.in b/controller/bin/dtf-get-machine.in new file mode 100644 index 0000000..0d7c567 --- /dev/null +++ b/controller/bin/dtf-get-machine.in @@ -0,0 +1,87 @@ +#!/bin/bash + +die() { echo "$@" ; exit 1 ; } +info() { echo " * $@" ; } + +opt_openstack_instance=os1 +opt_distro=fedora +opt_distro_version=20 + +function show_help() +{ +cat <&2 +Usage: $0 OPTION + +Script is aimed to help sysadmin. + +Options: + --distro=NAME Distro name, like fedora + --distro-version=VERSION E.g. 20 for Fedora 20 + --openstack-instance=ID + --name=NAME Name of the machine +EOHELP +test -n "$1" && exit "$1" +} + +boot() +( + set -o pipefail + nova boot "$1" --poll \ + --image "$2" \ + --flavor "$3" \ + --security-groups "$os_security_group" \ + --key-name "$os_keypair" \ + | grep "| id " | cut -d\| -f 3 | xargs -n 1 +) + +get_ip() +( + id="$1" + set -o pipefail + nova show "$id" | grep ' network ' \ + | cut -d\| -f 3 | cut -d, -f2 | xargs -n 1 +) + + +longopts="distro:,distro-version:,openstack-instance:,name:" +ARGS=$(getopt -o "" -l "help,$longopts" -n "$0" -- "$@") \ + || exit 1 +eval set -- "$ARGS" + +while true; do + case "$1" in + --distro|--distro-version|--openstack-instance|--name) + opt=$(sed -e 's/^--//' -e 's/[^[a-zA-Z0-9]/_/g'<<<"$1") + eval "opt_$opt=\"${2,,}\"" + shift 2 + ;; + + --help) + show_help 0 + ;; + + --) + shift + break; + esac +done + +. "@pkgdatadir@/parse_credsfile" "$opt_openstack_instance" || exit 1 +. ./config/os/"$opt_openstack_instance.sh" || exit 1 + +image_version=$opt_distro$opt_distro_version +image=${os_image_ids[$image_version]} +flavor=${os_flavor_ids[$image_version]} + +test -z "$image" && die "no image for '$image_version'" +test -z "$flavor" && die "no flavor for '$image_version'" +test -z "$opt_name" && opt_name="testing-$image" + +info "booting machine $image_version from $image" + +machine=$(boot "$opt_name" "$image" "$flavor") + +info "machine id: $machine" + +ip=$(get_ip "$machine") +info "ip: $ip" diff --git a/controller/bin/dtf-run-remote.in b/controller/bin/dtf-run-remote.in new file mode 100644 index 0000000..276ad40 --- /dev/null +++ b/controller/bin/dtf-run-remote.in @@ -0,0 +1,111 @@ +#!/bin/bash + +. "@sysconfdir@/dtf.sh" || exit 1 + +longopts="verbose,help,force,testid:,listonly" + +run_playbook=${run_playbook-@ansibleplaybooksdir@/fedora.yml} + +opt_workdir= +opt_distro=fedora +opt_openstack_instance="$DTF_OPENSTACK_ID" +opt_distro_ver=20 +opt_extra_rpms= +opt_taskdir= + +die() { echo >&2 "$@" ; exit 1 ; } + +longopts="distro:,distro-version:,workdir:,openstack-instance:,extra-rpms-file:" +longopts+=",taskdir:" +ARGS=$(getopt -o "v" -l "$longopts" -n "getopt" -- "$@") \ + || exit 1 +eval set -- "$ARGS" + +while true; do + case "$1" in + --taskdir) + opt=$(sed -e 's/^--//' -e 's/[^[a-zA-Z0-9]/_/g'<<<"$1") + eval "opt_$opt=\"${2,,}\"" + shift 2 + ;; + + --distro) + opt_distro="$2" + shift 2 + ;; + + --distro-version) + opt_distro_ver="$2" + shift 2 + ;; + + --openstack-instance) + opt_openstack_instance="$2" + shift 2 + ;; + + --workdir) + # where the remote results are fetched into + opt_workdir="$2" + shift 2 + ;; + + --extra-rpms-file) + opt_extra_rpms="$(readlink -f "$2")" + shift 2 + ;; + + --) + shift + break + ;; + esac +done + +test -z "$opt_taskdir" && die "you must specify --taskdir" + +credsfile="$HOME/.dtf/private/os/$opt_openstack_instance.yml" +test ! -f "$credsfile" && die "file '$credsfile' not found" + +config_os_file="$HOME/.dtf/os/$opt_openstack_instance.sh" +test ! -r "$config_os_file" && die "file '$config_os_file' not found" +. "$config_os_file" + +config_os_id="$opt_distro$opt_distro_ver" + +workdir_prereq() +{ + if test -z "$opt_workdir"; then + opt_workdir="$(mktemp -d "/tmp/dtf-remoterun-workdir-XXXXXX")" \ + || die "can't create workdir '$opt_workdir'" + echo "temporary workdir created: $opt_workdir" + elif test ! -d "$opt_workdir"; then + mkdir -p "$opt_workdir" || die "can't create workdir '$opt_workdir'" + fi +} + +tarball() +( + testsuite_name="$(basename "$opt_taskdir")" + echo "$testsuite_name" + "$opt_taskdir/run" --dist | gzip > "$opt_workdir/$testsuite_name.tar.gz" +) + +workdir_prereq + +testsuite_name="$(tarball)" || die "can not create dist tarball" + +export ANSIBLE_HOST_KEY_CHECKING=False +ansible-playbook "$run_playbook" \ + --extra-vars "opt_generated_vars=@ansiblevarsdir@/generated-vars.yml" \ + --extra-vars "opt_distro=$opt_distro" \ + --extra-vars "opt_distro_ver=$opt_distro_ver" \ + --extra-vars "opt_workdir=$opt_workdir" \ + --extra-vars "opt_credsfile=$credsfile" \ + --extra-vars "os_flavor_id=${os_flavor_ids[$config_os_id]}" \ + --extra-vars "os_image_id=${os_image_ids[$config_os_id]}" \ + --extra-vars "os_keypair=${os_keypair}" \ + --extra-vars "os_security_group=${os_security_group}" \ + --extra-vars "os_network_dev=${os_network_dev}" \ + --extra-vars "opt_testsuite_name=${testsuite_name}" \ + --extra-vars "${opt_extra_rpms:+dtf_rpm_files_list=$opt_extra_rpms}" diff --git a/controller/build b/controller/build new file mode 100755 index 0000000..a57f1b9 --- /dev/null +++ b/controller/build @@ -0,0 +1,11 @@ +#!/bin/bash + +if test ! -f Makefile; then + if test ! -f configure; then + autoreconf -vfi + fi || exit 1 + + ./configure --with-git +fi || exit 1 + +make diff --git a/controller/configure.ac b/controller/configure.ac new file mode 100644 index 0000000..819680a --- /dev/null +++ b/controller/configure.ac @@ -0,0 +1,35 @@ +AC_INIT([dtf-controller], [0.9], [pavel@raiskup.cz]) +AC_CONFIG_AUX_DIR([build-aux]) +AM_INIT_AUTOMAKE([foreign -Wall -Werror]) +AM_SILENT_RULES([yes]) +AC_PROG_CC +AC_CONFIG_HEADERS([config.h]) +AC_CONFIG_FILES([Makefile]) + +AC_PATH_PROG([SED], [sed]) +m4_define([sed_subst_var_pattern], [ -e 's|@$1[[@]]|\$($1)|g' \\]) +SED_RULES="\\ +sed_subst_var_pattern(ansibleplaybooksdir) +sed_subst_var_pattern(ansiblevarsdir) +sed_subst_var_pattern(bindir) +sed_subst_var_pattern(docdir) +sed_subst_var_pattern(libdir) +sed_subst_var_pattern(libexecdir) +sed_subst_var_pattern(pkgdatadir) +sed_subst_var_pattern(pkgname) +sed_subst_var_pattern(prefix) +sed_subst_var_pattern(sysconfdir) +sed_subst_var_pattern(top_srcdir) + -e 's|@__FILE__[[@]]|\$@|g'" +SED_CALL="\$(SED) \$(SED_RULES)" +m4_pattern_allow(AM_V_GEN) +INSTANTIATE="\$(AM_V_GEN){ test ! -f \$@ || rm -f \$@ ; } && \$(SED_CALL) \$< > \$@ && chmod -w \$@" +INSTANTIATE_SCRIPT="\$(INSTANTIATE) && chmod +x \$@" +c_s='$(top_srcdir)/config.status' +AC_SUBST([SED_RULES]) +AC_SUBST([SED_CALL]) +AC_SUBST([INSTANTIATE]) +AC_SUBST([INSTANTIATE_SCRIPT]) +AC_SUBST([c_s]) + +AC_OUTPUT diff --git a/controller/etc/dtf.sh.in b/controller/etc/dtf.sh.in new file mode 100644 index 0000000..b6c7b15 --- /dev/null +++ b/controller/etc/dtf.sh.in @@ -0,0 +1,3 @@ +# test + +. @sysconfdir@/dtf.conf.d/*.sh 2>/dev/null || : diff --git a/controller/get_machine b/controller/get_machine deleted file mode 100755 index 7121114..0000000 --- a/controller/get_machine +++ /dev/null @@ -1,87 +0,0 @@ -#!/bin/bash - -die() { echo "$@" ; exit 1 ; } -info() { echo " * $@" ; } - -opt_openstack_instance=os1 -opt_distro=fedora -opt_distro_version=20 - -function show_help() -{ -cat <&2 -Usage: $0 OPTION - -Script is aimed to help sysadmin. - -Options: - --distro=NAME Distro name, like fedora - --distro-version=VERSION E.g. 20 for Fedora 20 - --openstack-instance=ID - --name=NAME Name of the machine -EOHELP -test -n "$1" && exit "$1" -} - -boot() -( - set -o pipefail - nova boot "$1" --poll \ - --image "$2" \ - --flavor "$3" \ - --security-groups "$os_security_group" \ - --key-name "$os_keypair" \ - | grep "| id " | cut -d\| -f 3 | xargs -n 1 -) - -get_ip() -( - id="$1" - set -o pipefail - nova show "$id" | grep ' network ' \ - | cut -d\| -f 3 | cut -d, -f2 | xargs -n 1 -) - - -longopts="distro:,distro-version:,openstack-instance:,name:" -ARGS=$(getopt -o "" -l "help,$longopts" -n "$0" -- "$@") \ - || exit 1 -eval set -- "$ARGS" - -while true; do - case "$1" in - --distro|--distro-version|--openstack-instance|--name) - opt=$(sed -e 's/^--//' -e 's/[^[a-zA-Z0-9]/_/g'<<<"$1") - eval "opt_$opt=\"${2,,}\"" - shift 2 - ;; - - --help) - show_help 0 - ;; - - --) - shift - break; - esac -done - -. ./parse_credsfile "$opt_openstack_instance" || exit 1 -. ./config/os/"$opt_openstack_instance.sh" || exit 1 - -image_version=$opt_distro$opt_distro_version -image=${os_image_ids[$image_version]} -flavor=${os_flavor_ids[$image_version]} - -test -z "$image" && die "no image for '$image_version'" -test -z "$flavor" && die "no flavor for '$image_version'" -test -z "$opt_name" && opt_name="testing-$image" - -info "booting machine $image_version from $image" - -machine=$(boot "$opt_name" "$image" "$flavor") - -info "machine id: $machine" - -ip=$(get_ip "$machine") -info "ip: $ip" diff --git a/controller/libexec/dtf-wait-for-ssh b/controller/libexec/dtf-wait-for-ssh new file mode 100755 index 0000000..eb3880a --- /dev/null +++ b/controller/libexec/dtf-wait-for-ssh @@ -0,0 +1,11 @@ +#!/bin/bash -x + +where="$1" + +test -z "$where" && echo >&2 "no host specified" && exit 1 + +while [ 1 ]; do + ssh -o StrictHostKeyChecking=no -q $where exit &>/dev/null && exit 0 +done + +exit 1 diff --git a/controller/parse_credsfile b/controller/parse_credsfile deleted file mode 100644 index 4cf8e58..0000000 --- a/controller/parse_credsfile +++ /dev/null @@ -1,16 +0,0 @@ -___os_confdir=$(cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd -P) - -credsfile="$___os_confdir/private/os/$1.yml" - -while read line; do - if [[ "$line" =~ ^([a-zA-Z0-9_]*):\ ?(.*)$ ]]; then - key="${BASH_REMATCH[1]}" - if test "$key" = os_nova_password; then - key=os_password - fi - eval set ${BASH_REMATCH[2]} - eval export "${key^^}"="\"$@\"" - fi -done < "$credsfile" - -# vi: syntax=sh diff --git a/controller/run_remote b/controller/run_remote deleted file mode 100755 index 0b405aa..0000000 --- a/controller/run_remote +++ /dev/null @@ -1,116 +0,0 @@ -#!/bin/bash - -srcdir=$(cd -P -- "$(dirname -- "$0")" && pwd -P) || exit 1 - -. "$srcdir/config/config.sh" || { - echo >&2 "sorry, but $srcdir/config/config.sh not found" - exit 1 -} - -longopts="verbose,help,force,testid:,listonly" - -run_playbook=${run_playbook-$srcdir/ansible/fedora.yml} - -opt_workdir= -opt_distro=fedora -opt_openstack_instance="$DTF_OPENSTACK_ID" -opt_distro_ver=20 -opt_extra_rpms= -opt_taskdir= - -die() { echo >&2 "$@" ; exit 1 ; } - -longopts="distro:,distro-version:,workdir:,openstack-instance:,extra-rpms-file:" -longopts+=",taskdir:" -ARGS=$(getopt -o "v" -l "$longopts" -n "getopt" -- "$@") \ - || exit 1 -eval set -- "$ARGS" - -while true; do - case "$1" in - --taskdir) - opt=$(sed -e 's/^--//' -e 's/[^[a-zA-Z0-9]/_/g'<<<"$1") - eval "opt_$opt=\"${2,,}\"" - shift 2 - ;; - - --distro) - opt_distro="$2" - shift 2 - ;; - - --distro-version) - opt_distro_ver="$2" - shift 2 - ;; - - --openstack-instance) - opt_openstack_instance="$2" - shift 2 - ;; - - --workdir) - # where the remote results are fetched into - opt_workdir="$2" - shift 2 - ;; - - --extra-rpms-file) - opt_extra_rpms="$(readlink -f "$2")" - shift 2 - ;; - - --) - shift - break - ;; - esac -done - -test -z "$opt_taskdir" && die "you must specify --taskdir" - -credsfile="$(readlink -f "$srcdir/private/os/$opt_openstack_instance.yml")" -test -z "$credsfile" && die "--ansible-creds option must be specified" -test ! -f "$credsfile" && die "file $credsfile not found" - -config_os_file="$(readlink -f "$srcdir/config/os/$opt_openstack_instance.sh")" -test ! -r "$config_os_file" && die "file $config_os_file not found" -. "$config_os_file" - -config_os_id="$opt_distro$opt_distro_ver" - -workdir_prereq() -{ - if test -z "$opt_workdir"; then - opt_workdir="$(mktemp -d "/tmp/dtf-remoterun-workdir-XXXXXX")" \ - || die "can't create workdir '$opt_workdir'" - echo "temporary workdir created: $opt_workdir" - elif test ! -d "$opt_workdir"; then - mkdir -p "$opt_workdir" || die "can't create workdir '$opt_workdir'" - fi -} - -tarball() -( - testsuite_name="$(basename "$opt_taskdir")" - echo "$testsuite_name" - "$opt_taskdir/run" --dist | gzip > "$opt_workdir/$testsuite_name.tar.gz" -) - -workdir_prereq - -testsuite_name="$(tarball)" || die "can not create dist tarball" - -export ANSIBLE_HOST_KEY_CHECKING=False -ansible-playbook "$run_playbook" \ - --extra-vars "opt_distro=$opt_distro" \ - --extra-vars "opt_distro_ver=$opt_distro_ver" \ - --extra-vars "opt_workdir=$opt_workdir" \ - --extra-vars "opt_credsfile=$credsfile" \ - --extra-vars "os_flavor_id=${os_flavor_ids[$config_os_id]}" \ - --extra-vars "os_image_id=${os_image_ids[$config_os_id]}" \ - --extra-vars "os_keypair=${os_keypair}" \ - --extra-vars "os_security_group=${os_security_group}" \ - --extra-vars "os_network_dev=${os_network_dev}" \ - --extra-vars "opt_testsuite_name=${testsuite_name}" \ - --extra-vars "${opt_extra_rpms:+dtf_rpm_files_list=$opt_extra_rpms}" diff --git a/controller/share/dtf-controller/ansible/dummy-wrapper.yml b/controller/share/dtf-controller/ansible/dummy-wrapper.yml new file mode 100644 index 0000000..524b0ea --- /dev/null +++ b/controller/share/dtf-controller/ansible/dummy-wrapper.yml @@ -0,0 +1,7 @@ +- name: "dummy-wrapper" + hosts: "{{ target }}" + remote_user: root + gather_facts: False + + tasks: + - include: "{{ include_file }}" diff --git a/controller/share/dtf-controller/ansible/playbooks/fedora.yml b/controller/share/dtf-controller/ansible/playbooks/fedora.yml new file mode 100644 index 0000000..215e048 --- /dev/null +++ b/controller/share/dtf-controller/ansible/playbooks/fedora.yml @@ -0,0 +1,68 @@ +- name: self-standing testsuite + remote_user: root + gather_facts: False + hosts: localhost + vars_files: + - "{{ opt_credsfile }}" + - "{{ opt_generated_vars }}" + + tasks: + - name: generate builder name + local_action: shell echo `dd if=/dev/urandom bs=1k count=10 | md5sum ; echo DBTESTS` + register: vm_name + + - debug: msg="osusername={{ os_username }}" + + - name: spin it up + local_action: nova_compute auth_url={{os_auth_url}} + flavor_id={{os_flavor_id}} image_id="{{ os_image_id }}" key_name={{ os_keypair }} + login_password={{os_nova_password}} login_tenant_name="{{os_tenant_name}}" + login_username={{os_username}} security_groups={{os_security_group}} + wait=yes name="{{vm_name.stdout}}" wait_for=600 + register: nova + + - debug: msg="{{ nova.info.addresses }}" + + # This is ugly as hell... Hopefully nothing will be changing. + - local_action: command echo "{{ nova.info.addresses[os_network_dev][1].addr }}" + register: machine_ip + + - debug: msg="{{ machine_ip.stdout }}" + + - name: wait for the host to be hot + local_action: wait_for host={{ machine_ip.stdout }} port=22 delay=5 timeout=600 + + - local_action: shell {{ config_libexecdir }}/dtf-wait-for-ssh "root@{{ machine_ip.stdout }}" + + - name: add it to the special group + local_action: add_host hostname={{ machine_ip.stdout }} + groupname=temp_group + +- hosts: temp_group + user: root + gather_facts: False + vars_files: + - "{{ opt_credsfile }}" + - "{{ opt_generated_vars }}" + tasks: + - copy: src={{ opt_workdir }}/{{ opt_testsuite_name }}.tar.gz + dest=/root/{{ opt_testsuite_name }}.tar.gz + + - include: "{{ config_ansibleplaybooksdir }}/include/beakerlib.yml" + + - include: "{{ config_ansibleplaybooksdir }}/include/prepare-testenv.yml" + + - include: "{{ config_ansibleplaybooksdir }}/include/additional-packages.yml" + when: dtf_rpm_files_list is defined + + - shell: cd /root && tar -xf {{ opt_testsuite_name }}.tar.gz + + - shell: cd /root/{{ opt_testsuite_name }}&& ./run &>/var/tmp/dtf-run.overview + register: test_result + ignore_errors: yes + + - include: "{{ config_ansibleplaybooksdir }}/include/download-results.yml" + + - name: stop the vm + shell: echo "not implemented yet" + when: test_result.rc == 0 diff --git a/controller/share/dtf-controller/ansible/playbooks/include/additional-packages.yml b/controller/share/dtf-controller/ansible/playbooks/include/additional-packages.yml new file mode 100644 index 0000000..f821255 --- /dev/null +++ b/controller/share/dtf-controller/ansible/playbooks/include/additional-packages.yml @@ -0,0 +1,6 @@ +- local_action: shell cat "{{ dtf_rpm_files_list }}" | xargs -n 100 + register: additional_packages + +- debug: msg="{{ additional_packages.stdout }}" + +- shell: yum install -y {{ additional_packages.stdout }} diff --git a/controller/share/dtf-controller/ansible/playbooks/include/beakerlib.yml b/controller/share/dtf-controller/ansible/playbooks/include/beakerlib.yml new file mode 100644 index 0000000..0461f25 --- /dev/null +++ b/controller/share/dtf-controller/ansible/playbooks/include/beakerlib.yml @@ -0,0 +1 @@ +- yum: conf_file=https://beaker-project.org/yum/beaker-server-Fedora.repo state=present name=beakerlib diff --git a/controller/share/dtf-controller/ansible/playbooks/include/download-results.yml b/controller/share/dtf-controller/ansible/playbooks/include/download-results.yml new file mode 100644 index 0000000..4404e08 --- /dev/null +++ b/controller/share/dtf-controller/ansible/playbooks/include/download-results.yml @@ -0,0 +1,5 @@ +- shell: cp -f /var/tmp/dtf-run.overview /var/tmp/dtf/ + +- shell: cd /var/tmp ; tar -czf dtf.tar.gz dtf + +- fetch: src=/var/tmp/dtf.tar.gz dest="{{ opt_workdir }}/" flat=yes diff --git a/controller/share/dtf-controller/ansible/playbooks/include/prepare-testenv.yml b/controller/share/dtf-controller/ansible/playbooks/include/prepare-testenv.yml new file mode 100644 index 0000000..a63e51a --- /dev/null +++ b/controller/share/dtf-controller/ansible/playbooks/include/prepare-testenv.yml @@ -0,0 +1,3 @@ +- yum: state=present name=postgresql-server + +- yum: state=present name=postgresql-upgrade diff --git a/controller/share/dtf-controller/ansible/run_include b/controller/share/dtf-controller/ansible/run_include new file mode 100755 index 0000000..4e84c7d --- /dev/null +++ b/controller/share/dtf-controller/ansible/run_include @@ -0,0 +1,19 @@ +#!/bin/bash + +export ANSIBLE_HOST_KEY_CHECKING=False + +workdir="$(dirname "${BASH_SOURCE[0]}")" +workdir=$(readlink -f "$workdir") + +export playbook=$(readlink -f "$1") + +( set -x + cd "$workdir" + + ansible-playbook -i "$workdir/../config/hosts" \ + --extra-vars "include_file=$playbook" \ + --extra-vars "script_name=dummy" \ + --extra-vars "opt_workdir=/tmp/dtf-$(date +%H%M%S%N)" \ + --extra-vars "target=host" \ + "dummy-wrapper.yml" +) diff --git a/controller/share/dtf-controller/ansible/vars/generated-vars.yml.in b/controller/share/dtf-controller/ansible/vars/generated-vars.yml.in new file mode 100644 index 0000000..e33e974 --- /dev/null +++ b/controller/share/dtf-controller/ansible/vars/generated-vars.yml.in @@ -0,0 +1,4 @@ +--- +config_bindir: @bindir@ +config_libexecdir: @libexecdir@ +config_ansibleplaybooksdir: @ansibleplaybooksdir@ diff --git a/controller/share/dtf-controller/parse_credsfile b/controller/share/dtf-controller/parse_credsfile new file mode 100644 index 0000000..2379e18 --- /dev/null +++ b/controller/share/dtf-controller/parse_credsfile @@ -0,0 +1,31 @@ +___perform_parsing() +{ + unset OS_USERNAME + local credsfile="$HOME/.dtf/private/os/$1.yml" + + if test -z "$1"; then + echo >&2 "argument expected: OpenStack ID" + return 1 + fi + + if test ! -f "$credsfile"; then + echo >&2 "file '$credsfile' not found" + return 1 + fi + + while read line; do + if [[ "$line" =~ ^([a-zA-Z0-9_]*):\ ?(.*)$ ]]; then + key="${BASH_REMATCH[1]}" + if test "$key" = os_nova_password; then + key=os_password + fi + eval set ${BASH_REMATCH[2]} + eval export "${key^^}"="\"$@\"" + fi + done < "$credsfile" +} + +unset OS_AUTH_URL OS_PASSWORD OS_TENANT_ID OS_TENANT_NAME OS_USERNAME +___perform_parsing "$@" + +# # vi: syntax=sh -- cgit