From 648b325a59af3b0b6acc58d79e2550c9dfed3fe1 Mon Sep 17 00:00:00 2001 From: sslypushenko Date: Wed, 8 Feb 2017 12:10:35 +0200 Subject: [PATCH] Add scripts for running refstack-client in docker Prerequisites: Linux host with Docker installed. Usage: ./docker/env_build - script removes previous container if eny and builds an updated `refstack-client` image ./docker/env_up - script setups environment in container if is the first run and joins to shell in this container Basic usage example: 1) Checkout repository 2) Run ./docker/env_build.sh 3) Run ./docker/env_up.sh ... You will get Bash console in the prepared dockerized environment. 4) Run ./docker/env_up.sh to get back to shell in the env 5) Run ./docker/env_build.sh to rebuild image and spin a new env container. NOTE: These scripts are safe to run locally. Change-Id: I51e34a5d130d9595ead948f7ddb0db840527a797 --- .dockerignore | 17 ++++++++++++++++ docker/Dockerfile | 17 ++++++++++++++++ docker/env_build.sh | 21 +++++++++++++++++++ docker/env_up.sh | 35 ++++++++++++++++++++++++++++++++ setup_env | 49 ++++++++++++++++++++++++++------------------- 5 files changed, 118 insertions(+), 21 deletions(-) create mode 100644 .dockerignore create mode 100644 docker/Dockerfile create mode 100755 docker/env_build.sh create mode 100755 docker/env_up.sh diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..1adacdd --- /dev/null +++ b/.dockerignore @@ -0,0 +1,17 @@ +*.egg* +*.py[cod] +.coverage +.cache +.tox/ +.venv/ +AUTHORS +ChangeLog +build/ +cover/ +dist +.git/ +venv/ +.venv/ +.tempest/ +htmlcov/ +test-reports/ \ No newline at end of file diff --git a/docker/Dockerfile b/docker/Dockerfile new file mode 100644 index 0000000..4b41832 --- /dev/null +++ b/docker/Dockerfile @@ -0,0 +1,17 @@ +FROM ubuntu:16.04 + +RUN apt-get update && \ + apt-get install -y sudo curl vim less tar + +ARG UID +ARG GID +ENV DEV_USER=ubuntu COLUMNS=120 + +RUN [ ! $(grep ":${GID}:" /etc/group) ] && groupadd -g ${GID:-1000} ${DEV_USER} + +RUN useradd -g ${DEV_USER} -u ${UID:-1000} -s /bin/bash -d /home/${DEV_USER} -m ${DEV_USER} && \ + ( umask 226 && echo "${DEV_USER} ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/50_${DEV_USER} ) + +USER ${DEV_USER} +WORKDIR /home/${DEV_USER} + diff --git a/docker/env_build.sh b/docker/env_build.sh new file mode 100755 index 0000000..9466f67 --- /dev/null +++ b/docker/env_build.sh @@ -0,0 +1,21 @@ +#!/bin/bash -x + +if [ "$EUID" -eq 0 ] + then echo "This script should not be runned with sudo!" + exit +fi + +docker ps &> /dev/null; (( $? != 0 )) && echo 'Docker should be accessible without sudo ' + + +CONTAINER_NAME=refstack_client + +if [ $( docker ps -a -q --filter name=${CONTAINER_NAME} ) ]; then + docker rm -f $( docker ps -a -q --filter name=${CONTAINER_NAME} ) +fi + +docker build -t ${CONTAINER_NAME} \ + --build-arg UID=$( id -u $USER ) \ + --build-arg GID=$( id -g $USER ) \ + --file $( git rev-parse --show-toplevel )/docker/Dockerfile \ + $( git rev-parse --show-toplevel ) diff --git a/docker/env_up.sh b/docker/env_up.sh new file mode 100755 index 0000000..04cafc8 --- /dev/null +++ b/docker/env_up.sh @@ -0,0 +1,35 @@ +#!/bin/bash -x + +if [ "$EUID" -eq 0 ] + then echo "This script should not be runned with sudo!" + exit +fi + +docker ps &> /dev/null; (( $? != 0 )) && echo 'Docker should be accessible without sudo ' + +CONTAINER_NAME=refstack_client + +if [ ! $( docker ps -q --filter name=${CONTAINER_NAME} ) ]; then + ENV_CONTAINER=$( docker ps -a -q --filter name=${CONTAINER_NAME} ) + if [ ${ENV_CONTAINER} ]; then + docker start -a -i $ENV_CONTAINER + exit 0 + fi + + docker run \ + --dns=8.8.8.8 \ + -i -t \ + --name ${CONTAINER_NAME}\ + -v $( git rev-parse --show-toplevel ):/home/ubuntu/refstack-client \ + -e REFSTACK_CLIENT_TEMPEST_DIR=/home/ubuntu/tempest \ + ${CONTAINER_NAME} bash -c '~/refstack-client/setup_env -q && bash' +fi + +ENV_CONTAINER=$( docker ps -q --filter name=${CONTAINER_NAME} ) +[[ ! ${ENV_CONTAINER} ]] && exit 1 + +[[ $* ]] && { + docker exec ${ENV_CONTAINER} $* +} || { + docker exec -i -t ${ENV_CONTAINER} bash +} diff --git a/setup_env b/setup_env index ced33d0..476ef09 100755 --- a/setup_env +++ b/setup_env @@ -12,8 +12,9 @@ function usage { echo "" echo " -h Print this usage message" echo " -c Tempest test runner commit. You can specify SHA or branch here" - echo " -t Tempest test runner tag. You can specify tag here" echo " If no commit or tag is specified, tempest will be install from commit" + echo " -q Run quietly. If .tempest folder exists, refstack-client is considered as installed" + echo " -t Tempest test runner tag. You can specify tag here" echo " ${CHECKOUT_POINT}" exit 1 } @@ -29,7 +30,7 @@ function check_tag { # By default tempest uses commit ${CHECKOUT_POINT} -while getopts c:t:h FLAG; do +while getopts c:t:qh FLAG; do case ${FLAG} in c) CHECKOUT_POINT=${OPTARG} @@ -37,6 +38,9 @@ while getopts c:t:h FLAG; do t) CHECKOUT_POINT="-q ${OPTARG}" ;; + q) #show help + QUIET_MODE=true + ;; h) #show help usage ;; @@ -46,9 +50,25 @@ while getopts c:t:h FLAG; do ;; esac done -shift $((OPTIND-1)) # This tells getopts to move on to the next argument. # Install git +WORKDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +TEMPEST_DIR=${REFSTACK_CLIENT_TEMPEST_DIR:-${WORKDIR}/.tempest} + +# Checkout tempest on specified tag +if [ -d "${TEMPEST_DIR}" ]; then + [ ${QUIET_MODE} ] && echo 'Looks like RefStack client is already installed' && exit 0 + while true; do + read -p "Existing tempest installation found. We should remove it. All data from previous test runs will be deleted. Continue (y/n) ?" yn + case ${yn} in + [Yy]* ) rm -rf ${TEMPEST_DIR}; break;; + [Nn]* ) exit 1;; + * ) echo "Please answer yes or no.";; + esac + done +fi + if [ -n "$(command -v apt-get)" ]; then # For apt-get-based Linux distributions (Ubuntu, Debian) # If we run script in container we need sudo @@ -81,21 +101,8 @@ else exit 1 fi -WORKDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" - -# Checkout tempest on specified tag -if [ -d "${WORKDIR}/.tempest" ]; then - while true; do - read -p "Existing tempest installation found. We should remove it. All data from previous test runs will be deleted. Continue (y/n) ?" yn - case ${yn} in - [Yy]* ) rm -rf ${WORKDIR}/.tempest; break;; - [Nn]* ) exit 1;; - * ) echo "Please answer yes or no.";; - esac - done -fi -git clone https://github.com/openstack/tempest.git ${WORKDIR}/.tempest -cd ${WORKDIR}/.tempest +git clone https://github.com/openstack/tempest.git ${TEMPEST_DIR} +cd ${TEMPEST_DIR} git checkout $CHECKOUT_POINT || if [ $? -ne 0 ]; then exit 1; fi cd ${WORKDIR} @@ -146,15 +153,15 @@ if [ -d ${WORKDIR}/.venv ]; then rm -rf ${WORKDIR}/.venv fi python virtualenv.py ${WORKDIR}/.venv --python="${PYPATH}" -python virtualenv.py ${WORKDIR}/.tempest/.venv --python="${PYPATH}" +python virtualenv.py ${TEMPEST_DIR}/.venv --python="${PYPATH}" cd .. rm -rf virtualenv-${VENV_VERSION} rm virtualenv-${VENV_VERSION}.tar.gz ${WORKDIR}/.venv/bin/python -m pip install -r ${WORKDIR}/requirements.txt -${WORKDIR}/.tempest/.venv/bin/python -m pip install -r ${WORKDIR}/.tempest/requirements.txt +${TEMPEST_DIR}/.venv/bin/python -m pip install -r ${TEMPEST_DIR}/requirements.txt # Add additional packages to find more tests by tempest # Note: Since there are no requirements in tempest-additional-requirements.txt by default, # this line is commented out to prevent errors from being returned. Uncomment this line if # there are requirements in tempest-additonal-requirements.txt. -#${WORKDIR}/.tempest/.venv/bin/pip install -r ${WORKDIR}/tempest-additional-requirements.txt +# ${TEMPEST_DIR}/.venv/bin/pip install -r ${WORKDIR}/tempest-additional-requirements.txt