cloud-init-dev team mailing list archive
-
cloud-init-dev team
-
Mailing list archive
-
Message #03179
Re: [Merge] ~smoser/cloud-init:feature/run-opensuse into cloud-init:master
Diff comments:
> diff --git a/tools/read-dependencies b/tools/read-dependencies
> index 2a64868..08ef3bf 100755
> --- a/tools/read-dependencies
> +++ b/tools/read-dependencies
> @@ -35,7 +35,7 @@ DISTRO_INSTALL_PKG_CMD = {
> 'redhat': ['yum', 'install', '--assumeyes'],
> 'debian': ['apt', 'install', '-y'],
> 'ubuntu': ['apt', 'install', '-y'],
> - 'opensuse': ['zypper', 'install'],
> + 'opensuse': ['zypper', '--non-interactive', 'install'],
It seems like they certainly should be (to me). If you agree, then we should probably file a bug with lxc and have them build the keys in. Your suggestion on how the right way to do that would be good to have.
> 'suse': ['zypper', 'install']
> }
>
> diff --git a/tools/run-opensuse b/tools/run-opensuse
> new file mode 100755
> index 0000000..e974f8c
> --- /dev/null
> +++ b/tools/run-opensuse
> @@ -0,0 +1,273 @@
> +#!/bin/bash
> +# This file is part of cloud-init. See LICENSE file for license information.
> +
> +set -u
> +
> +VERBOSITY=0
> +TEMP_D=""
> +KEEP=false
> +CONTAINER=""
> +
> +error() { echo "$@" 1>&2; }
> +fail() { [ $# -eq 0 ] || error "$@"; exit 1; }
> +errorrc() { local r=$?; error "$@" "ret=$r"; return $r; }
> +
> +Usage() {
> + cat <<EOF
> +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 OpenSuSE
> +
> + version is major release number (42.3)
ok. so i'll just make it take 42.X or 42. if just 42, then it will (hard coded) pick 42.3 for now.
> +
> + 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 42.3
> +EOF
> +}
> +
> +bad_Usage() { Usage 1>&2; [ $# -eq 0 ] || error "$@"; return 1; }
> +cleanup() {
> + if [ -n "$CONTAINER" -a "$KEEP" = "false" ]; then
> + delete_container "$CONTAINER"
> + fi
> + [ -z "${TEMP_D}" -o ! -d "${TEMP_D}" ] || rm -Rf "${TEMP_D}"
> +}
> +
> +debug() {
> + local level=${1}; shift;
> + [ "${level}" -gt "${VERBOSITY}" ] && return
> + error "${@}"
> +}
> +
> +
> +inside_as() {
> + # inside_as(container_name, user, cmd[, args])
> + # 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# -- }
> + b64=$(printf "%s\n" "$stuffed" | base64 --wrap=0)
> + inside "$name" su "$user" -c \
> + '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
> + echo "$name": "$@" 1>&2
> + lxc exec "$name" -- "$@"
> +}
> +
> +inject_cloud_init(){
> + # 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}"
> + zypper --non-interactive --gpg-auto-import-keys install \
> + --auto-agree-with-licenses ${needed}
> +}
> +
> +start_container() {
> + local src="$1" name="$2"
> + debug 1 "starting container $name from '$src'"
> + lxc launch "$src" "$name" || {
> + errorrc "Failed to start container '$name' from '$src'";
> + return
> + }
> + CONTAINER=$name
> +
> + local out="" ret=""
> + debug 1 "waiting for networking"
> + out=$(inside "$name" sh -c '
> + i=0
> + while [ $i -lt 60 ]; do
> + getent hosts opensuse.org && exit 0
> + sleep 2
> + done' 2>&1)
> + ret=$?
> + if [ $ret -ne 0 ]; then
> + error "Waiting for network in container '$name' failed. [$ret]"
> + error "$out"
> + return $ret
> + fi
> +
> + #if [ ! -z "${http_proxy-}" ]; then
> + #debug 1 "configuring proxy ${http_proxy}"
> + #inside "$name" sh -c "echo proxy=$http_proxy >> /etc/yum.conf"
> + #fi
> +}
> +
> +delete_container() {
> + debug 1 "removing container $1 [--keep to keep]"
> + lxc delete --force "$1"
> +}
> +
> +main() {
> + 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}" -- "$@") &&
> + eval set -- "${getopt_out}" ||
> + { bad_Usage; return; }
> +
> + local cur="" next=""
> + local artifact="" keep="" rpm="" srpm="" unittest="" version=""
> +
> + while [ $# -ne 0 ]; do
> + cur="${1:-}"; next="${2:-}";
> + case "$cur" in
> + -a|--artifact) artifact=1;;
> + -h|--help) Usage ; exit 0;;
> + -k|--keep) KEEP=true;;
> + -r|--rpm) rpm=1;;
> + -s|--srpm) srpm=1;;
> + -u|--unittest) unittest=1;;
> + -v|--verbose) VERBOSITY=$((${VERBOSITY}+1));;
> + --) shift; break;;
> + esac
> + shift;
> + done
> +
> + [ $# -eq 1 ] || { bad_Usage "ERROR: Must provide version!"; return; }
> + version="$1"
> + case "$version" in
> + 42.*) version="42.3";;
> + *) error "Expected version of 42.*, 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="" user="ci-test" cdir=""
> + cdir="/home/$user/cloud-init"
> + uuid=$(uuidgen -t) || { error "no uuidgen"; return 1; }
> + name="cloud-init-opensuse-${uuid%%-*}"
> +
> + start_container "images:opensuse/$version" "$name"
> +
> + # 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 --create-home "$user"
> +
> + debug 1 "inserting cloud-init"
> + inject_cloud_init "$name" "$user" || {
> + errorrc "FAIL: injecting cloud-init into $name failed."
> + return
> + }
> +
> + inside_as_cd "$name" root "$cdir" \
> + ./tools/read-dependencies --distro=opensuse --test-distro || {
> + errorrc "FAIL: failed to install dependencies with read-dependencies"
> + return
> + }
> +
> + 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_cd "$name" "$user" "$cdir" nosetests tests/unittests ||
> + { errorrc "nosetests failed."; errors=$(($errors+1)); }
> + fi
> +
> + if [ -n "$srpm" ]; then
> + debug 1 "building 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_cd "$name" "$user" "$cdir" ./packages/brpm ||
> + { errorrc "brpm failed."; errors=$(($errors+1)); }
> + fi
> +
> + if [ -n "$artifact" ]; then
> + for built_rpm in $(inside "$name" sh -c "echo $cdir/*.rpm"); do
> + lxc file pull "$name/$built_rpm" .
> + done
> + fi
> +
> + if [ "$errors" != "0" ]; then
> + error "there were $errors errors."
> + return 1
> + fi
> + return 0
> +}
> +
> +if [ "${1:-}" = "prep" ]; then
> + shift
> + prep "$@"
> +else
> + main "$@"
> +fi
> +# vi: ts=4 expandtab
--
https://code.launchpad.net/~smoser/cloud-init/+git/cloud-init/+merge/329650
Your team cloud-init commiters is requested to review the proposed merge of ~smoser/cloud-init:feature/run-opensuse into cloud-init:master.
References