diff options
author | Scott Moser <smoser@brickies.net> | 2017-06-14 09:33:54 -0400 |
---|---|---|
committer | Scott Moser <smoser@brickies.net> | 2017-06-14 14:29:23 -0400 |
commit | 55a006afca73633c607c537dee62097e85011443 (patch) | |
tree | b591e38156f624949979b1e3f81b662b9feaed2f /tools/run-centos | |
parent | 744e648eaf6325758282ef23bffcc4194faa6bac (diff) | |
download | vyos-cloud-init-55a006afca73633c607c537dee62097e85011443.tar.gz vyos-cloud-init-55a006afca73633c607c537dee62097e85011443.zip |
tools/run-centos: cleanups and move to using read-dependencies
These changes are all in an effort to get tools/run-centos using
read-dependencies rather than the 'setup-centos' script with a separate
set of dependencies listed.
- tools/read-dependencies: support taking multiple --requirements
options. This allows run-centos to get both test and build
dependencies. Ultimately, I think it might be nicer for
read-dependencies to take a list of "goals" (build, test, run or
test-tox) rather than having the caller need to know to provide
multiple --requirements.
- packages/pkg-deps.json: drop the version on the sudo package.
centos 6 has newer (1.8.6p3) version than listed, so its not a problem.
- test_handler_disk_setup.py: a test case here was using assertLogs
which is not present in the version of unittest2 that is available in
centos 6 epel. We just adjust it to use with_logs = True.
- tools/run-cents:
- improve usage with example
- add 'inside_as_cd' to provide the dir you want to cd first to.
- avoid the intermediate tarball on disk in the container.
- add 'prep' subcommand and use it to install pre-dependencies.
- use read-dependencies.
Diffstat (limited to 'tools/run-centos')
-rwxr-xr-x | tools/run-centos | 142 |
1 files changed, 99 insertions, 43 deletions
diff --git a/tools/run-centos b/tools/run-centos index de21d756..99ba6be0 100755 --- a/tools/run-centos +++ b/tools/run-centos @@ -14,17 +14,22 @@ errorrc() { local r=$?; error "$@" "ret=$r"; return $r; } Usage() { cat <<EOF -Usage: ${0##*/} [ options ] CentOS version +Usage: ${0##*/} [ options ] version This utility can makes it easier to run tests, build rpm and source rpm generation inside a LXC of the specified version of CentOS. + version is major release number (6 or 7) + options: -a | --artifact keep .rpm artifacts -k | --keep keep container after tests -r | --rpm build .rpm -s | --srpm build .src.rpm -u | --unittest run unit tests + + Example: + * ${0##*/} --rpm --srpm --unittest 6 EOF } @@ -48,6 +53,10 @@ inside_as() { # executes cmd with args inside container as user in users home dir. local name="$1" user="$2" shift 2 + if [ "$user" = "root" ]; then + inside "$name" "$@" + return + fi local stuffed="" b64="" stuffed=$(getopt --shell sh --options "" -- -- "$@") stuffed=${stuffed# -- } @@ -56,6 +65,12 @@ inside_as() { 'cd; eval set -- "$(echo '$b64' | base64 --decode)" && exec "$@"' } +inside_as_cd() { + local name="$1" user="$2" dir="$3" + shift 3 + inside_as "$name" "$user" sh -c 'cd "$0" && exec "$@"' "$dir" "$@" +} + inside() { local name="$1" shift @@ -63,26 +78,52 @@ inside() { } inject_cloud_init(){ - local name="$1" - tarball_name='cloud-init.tar.gz' - top_d=$(git rev-parse --show-toplevel) || - fail "failed to get top level" - cd "$top_d" || - fail "failed to cd to git top dir" - tar_folder=${PWD##*/} - cd .. - tar -czf "$TEMP_D/$tarball_name" "$tar_folder" || - fail "failed: creating tarball_name" - cd "$tar_folder" || - fail "failed: changing directory" - - user='centos' - tarball="/home/$user/$tarball_name" - inside "$name" useradd "$user" - lxc file push "$TEMP_D/$tarball_name" "$name/home/$user"/ - inside "$name" chown "$user:$user" "$tarball" - inside_as "$name" "$user" tar -C "/home/$user" -xzf "$tarball" || - fail "failed: extracting tarball" + # take current cloud-init git dir and put it inside $name at + # ~$user/cloud-init. + local name="$1" user="$2" top_d="" dname="" pstat="" + top_d=$(git rev-parse --show-toplevel) || { + errorrc "Failed to get git top level in $PWD"; + return + } + dname=$(basename "${top_d}") || return + debug 1 "collecting ${top_d} ($dname) into user $user in $name." + tar -C "${top_d}/.." -cpf - "$dname" | + inside_as "$name" "$user" sh -ec ' + dname=$1 + rm -Rf "$dname" + tar -xpf - + [ "$dname" = "cloud-init" ] || mv "$dname" cloud-init' \ + extract "$dname" + [ "${PIPESTATUS[*]}" = "0 0" ] || { + error "Failed to push tarball of '$top_d' into $name" \ + " for user $user (dname=$dname)" + return 1 + } + return 0 +} + +prep() { + # we need some very basic things not present in the container. + # - git + # - tar (CentOS 6 lxc container does not have it) + # - python-argparse (or python3) + local needed="" pair="" pkg="" cmd="" needed="" + for pair in tar:tar git:git; do + pkg=${pair#*:} + cmd=${pair%%:*} + command -v $cmd >/dev/null 2>&1 || needed="${needed} $pkg" + done + if ! command -v python3; then + python -c "import argparse" >/dev/null 2>&1 || + needed="${needed} python-argparse" + fi + needed=${needed# } + if [ -z "$needed" ]; then + error "No prep packages needed" + return 0 + fi + error "Installing prep packages: ${needed}" + yum install --assumeyes ${needed} } start_container() { @@ -121,8 +162,8 @@ delete_container() { } main() { - local short_opts="ahkrsuv:" - local long_opts="artifact,help,keep,rpm,srpm,unittest,verbose:" + local short_opts="ahkrsuv" + local long_opts="artifact,help,keep,rpm,srpm,unittest,verbose" local getopt_out="" getopt_out=$(getopt --name "${0##*/}" \ --options "${short_opts}" --long "${long_opts}" -- "$@") && @@ -149,60 +190,70 @@ main() { [ $# -eq 1 ] || { bad_Usage "ERROR: Must provide version!"; return; } version="$1" + case "$version" in + 6|7) :;; + *) error "Expected version of 6 or 7, not '$version'"; return;; + esac TEMP_D=$(mktemp -d "${TMPDIR:-/tmp}/${0##*/}.XXXXXX") || fail "failed to make tempdir" trap cleanup EXIT # program starts here - local uuid="" name="" + local uuid="" name="" user="ci-test" cdir="" + cdir="/home/$user/cloud-init" uuid=$(uuidgen -t) || { error "no uuidgen"; return 1; } name="cloud-init-centos-${uuid%%-*}" start_container "images:centos/$version" "$name" - # CentOS 6 does not come with tar - if [ "$version" = "6" ]; then - inside "$name" yum install --assumeyes tar || { - errorrc "FAIL: yum install tar failed"; - } - fi + + # prep the container (install very basic dependencies) + inside "$name" bash -s prep <"$0" || + { errorrc "Failed to prep container $name"; return; } + + # add the user + inside "$name" useradd "$user" debug 1 "inserting cloud-init" - inject_cloud_init "$name" || { + inject_cloud_init "$name" "$user" || { errorrc "FAIL: injecting cloud-init into $name failed." return } - # install dependencies - debug 1 "installing dependencies" - inside "$name" /bin/sh <tools/setup-centos || - fail "failed: setting up container $name" + inside_as_cd "$name" root "$cdir" \ + ./tools/read-dependencies \ + --requirements-file=requirements.txt \ + --requirements-file=test-requirements.txt \ + --distro=centos --install || { + errorrc "FAIL: failed to install dependencies with read-dependencies" + return + } - local errors=0 do_cd="cd $tar_folder" - inside_as "$name" "$user" sh -ec "$do_cd; git checkout .; git status" || + local errors=0 + inside_as_cd "$name" "$user" "$cdir" \ + sh -ec "git checkout .; git status" || { errorrc "git checkout failed."; errors=$(($errors+1)); } if [ -n "$unittest" ]; then debug 1 "running unit tests." - inside_as "$name" "$user" sh -ec "$do_cd; nosetests tests/unittests" || + inside_as_cd "$name" "$user" "$cdir" nosetests tests/unittests || { errorrc "nosetests failed."; errors=$(($errors+1)); } fi if [ -n "$srpm" ]; then debug 1 "building srpm." - inside_as "$name" "$user" sh -ec "$do_cd; ./packages/brpm --srpm" || + inside_as_cd "$name" "$user" "$cdir" ./packages/brpm --srpm || { errorrc "brpm --srpm."; errors=$(($errors+1)); } fi if [ -n "$rpm" ]; then debug 1 "building rpm." - inside_as "$name" "$user" sh -ec "$do_cd; ./packages/brpm" || + inside_as_cd "$name" "$user" "$cdir" ./packages/brpm || { errorrc "brpm failed."; errors=$(($errors+1)); } fi if [ -n "$artifact" ]; then - cmd="ls /home/$user/$tar_folder/*.rpm" - for built_rpm in $(lxc exec "$name" -- sh -c "$cmd"); do + for built_rpm in $(inside "$name" sh -c "echo $cdir/*.rpm"); do lxc file pull "$name/$built_rpm" . done fi @@ -214,5 +265,10 @@ main() { return 0 } -main "$@" +if [ "$1" = "prep" ]; then + shift + prep "$@" +else + main "$@" +fi # vi: ts=4 expandtab |