Functional tests via Deckhand container and Docker
Change-Id: Ibe863cd5f647fab060de9e5e6937cbcd8b68d318
This commit is contained in:
parent
7487ba3a34
commit
564b0e08f1
|
@ -98,3 +98,32 @@ At this time, there are no functional tests for policy enforcement
|
||||||
verification. Negative tests will be added at a later date to confirm that
|
verification. Negative tests will be added at a later date to confirm that
|
||||||
a 403 Forbidden is raised for each endpoint that does policy enforcement
|
a 403 Forbidden is raised for each endpoint that does policy enforcement
|
||||||
absent necessary permissions.
|
absent necessary permissions.
|
||||||
|
|
||||||
|
CICD
|
||||||
|
----
|
||||||
|
Since it is important to validate the Deckhand image itself, CICD:
|
||||||
|
|
||||||
|
* Generates the Deckhand image from the new patchset
|
||||||
|
* Runs functional tests against the just-produced Deckhand image
|
||||||
|
|
||||||
|
Deckhand uses the same script -- ``tools/functional-tests.sh`` -- for CICD
|
||||||
|
testing. To test Deckhand against a containerized image, run, for example:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
export DECKHAND_IMAGE=quay.io/attcomdev/deckhand:latest
|
||||||
|
tox -e functional
|
||||||
|
|
||||||
|
Which will result in the following script output:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
Running Deckhand via Docker
|
||||||
|
+ sleep 5
|
||||||
|
+ sudo docker run --rm --net=host -p 9000:9000 -v /opt/stack/deckhand/tmp.oBJ6XScFgC:/etc/deckhand quay.io/attcomdev/deckhand:latest
|
||||||
|
|
||||||
|
.. warning::
|
||||||
|
|
||||||
|
For testing dev changes, it is **not** recommended to follow this approach,
|
||||||
|
as the most up-to-date code is located in the repository itself. Running tests
|
||||||
|
against a remote image will likely result in false positives.
|
||||||
|
|
|
@ -1,5 +1,15 @@
|
||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Meant for capturing output of Deckhand image. This requires that logging
|
||||||
|
# in the image be set up to pipe everything out to stdout/stderr.
|
||||||
|
STDOUT=$(mktemp)
|
||||||
|
# NOTE(fmontei): `DECKHAND_IMAGE` should only be specified if the desire is to
|
||||||
|
# run Deckhand functional tests against a specific Deckhand image, which is
|
||||||
|
# useful for CICD (as validating the image is vital). However, if the
|
||||||
|
# `DECKHAND_IMAGE` is not specified, then this implies that the most current
|
||||||
|
# version of the code should be used, which is in the repo itself.
|
||||||
|
DECKHAND_IMAGE=${DECKHAND_IMAGE:-}
|
||||||
|
|
||||||
function log_section {
|
function log_section {
|
||||||
set +x
|
set +x
|
||||||
echo 1>&2
|
echo 1>&2
|
||||||
|
@ -10,10 +20,22 @@ function log_section {
|
||||||
|
|
||||||
set -ex
|
set -ex
|
||||||
|
|
||||||
|
function cleanup {
|
||||||
|
sudo docker stop $POSTGRES_ID
|
||||||
|
if [ -n "$DECKHAND_ID" ]; then
|
||||||
|
sudo docker stop $DECKHAND_ID
|
||||||
|
fi
|
||||||
|
rm -rf $CONF_DIR
|
||||||
|
rm -f $LOGFILE
|
||||||
|
kill %1
|
||||||
|
}
|
||||||
|
|
||||||
|
trap cleanup EXIT
|
||||||
|
|
||||||
|
|
||||||
log_section Starting Postgres
|
|
||||||
POSTGRES_ID=$(
|
POSTGRES_ID=$(
|
||||||
sudo docker run \
|
sudo docker run \
|
||||||
|
--rm \
|
||||||
--detach \
|
--detach \
|
||||||
--publish :5432 \
|
--publish :5432 \
|
||||||
-e POSTGRES_DB=deckhand \
|
-e POSTGRES_DB=deckhand \
|
||||||
|
@ -22,20 +44,15 @@ POSTGRES_ID=$(
|
||||||
postgres:9.5
|
postgres:9.5
|
||||||
)
|
)
|
||||||
|
|
||||||
function cleanup {
|
|
||||||
sudo docker stop $POSTGRES_ID
|
|
||||||
kill %1
|
|
||||||
}
|
|
||||||
|
|
||||||
trap cleanup EXIT
|
|
||||||
|
|
||||||
POSTGRES_IP=$(
|
POSTGRES_IP=$(
|
||||||
sudo docker inspect \
|
sudo docker inspect \
|
||||||
--format='{{ .NetworkSettings.Networks.bridge.IPAddress }}' \
|
--format='{{ .NetworkSettings.Networks.bridge.IPAddress }}' \
|
||||||
$POSTGRES_ID
|
$POSTGRES_ID
|
||||||
)
|
)
|
||||||
|
|
||||||
CONF_DIR=$(mktemp -d)
|
|
||||||
|
CONF_DIR=$(mktemp -d -p $(pwd))
|
||||||
|
sudo chmod 777 -R $CONF_DIR
|
||||||
|
|
||||||
function gen_config {
|
function gen_config {
|
||||||
log_section Creating config file
|
log_section Creating config file
|
||||||
|
@ -53,7 +70,6 @@ function gen_config {
|
||||||
cat <<EOCONF > $CONF_DIR/deckhand.conf
|
cat <<EOCONF > $CONF_DIR/deckhand.conf
|
||||||
[DEFAULT]
|
[DEFAULT]
|
||||||
debug = true
|
debug = true
|
||||||
log_config_append = $CONF_DIR/logging.conf
|
|
||||||
log_file = deckhand.log
|
log_file = deckhand.log
|
||||||
log_dir = .
|
log_dir = .
|
||||||
use_stderr = true
|
use_stderr = true
|
||||||
|
@ -114,17 +130,33 @@ gen_config
|
||||||
gen_paste
|
gen_paste
|
||||||
gen_policy
|
gen_policy
|
||||||
|
|
||||||
uwsgi \
|
log_section Starting Deckhand image
|
||||||
|
|
||||||
|
if [ -z "$DECKHAND_IMAGE" ]; then
|
||||||
|
echo "Running Deckhand via uwsgi"
|
||||||
|
uwsgi \
|
||||||
--http :9000 \
|
--http :9000 \
|
||||||
-w deckhand.cmd \
|
-w deckhand.cmd \
|
||||||
--callable deckhand_callable \
|
--callable deckhand_callable \
|
||||||
--enable-threads \
|
--enable-threads \
|
||||||
-L \
|
-L \
|
||||||
--pyargv "--config-file $CONF_DIR/deckhand.conf" &
|
--pyargv "--config-file $CONF_DIR/deckhand.conf" &
|
||||||
|
else
|
||||||
|
echo "Running Deckhand via Docker"
|
||||||
|
sudo docker run \
|
||||||
|
--rm \
|
||||||
|
--net=host \
|
||||||
|
-p 9000:9000 \
|
||||||
|
-v $CONF_DIR:/etc/deckhand \
|
||||||
|
$DECKHAND_IMAGE &> $STDOUT &
|
||||||
|
fi
|
||||||
|
|
||||||
# Give the server a chance to come up. Better to poll a health check.
|
# Give the server a chance to come up. Better to poll a health check.
|
||||||
sleep 5
|
sleep 5
|
||||||
|
|
||||||
|
DECKHAND_ID=$(sudo docker ps | grep deckhand | awk '{print $1}')
|
||||||
|
echo $DECKHAND_ID
|
||||||
|
|
||||||
log_section Running tests
|
log_section Running tests
|
||||||
|
|
||||||
ROOTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
ROOTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||||
|
@ -149,6 +181,7 @@ if [ "x$TEST_STATUS" = "x0" ]; then
|
||||||
else
|
else
|
||||||
log_section Deckhand Server Log
|
log_section Deckhand Server Log
|
||||||
cat deckhand.log
|
cat deckhand.log
|
||||||
|
cat $STDOUT
|
||||||
log_section Done FAILURE
|
log_section Done FAILURE
|
||||||
exit $TEST_STATUS
|
exit $TEST_STATUS
|
||||||
fi
|
fi
|
||||||
|
|
2
tox.ini
2
tox.ini
|
@ -11,7 +11,7 @@ setenv = VIRTUAL_ENV={envdir}
|
||||||
OS_TEST_PATH=./deckhand/tests/unit
|
OS_TEST_PATH=./deckhand/tests/unit
|
||||||
LANGUAGE=en_US
|
LANGUAGE=en_US
|
||||||
LC_ALL=en_US.utf-8
|
LC_ALL=en_US.utf-8
|
||||||
passenv = OS_STDOUT_CAPTURE OS_STDERR_CAPTURE OS_TEST_TIMEOUT OS_TEST_LOCK_PATH OS_TEST_PATH http_proxy HTTP_PROXY https_proxy HTTPS_PROXY no_proxy NO_PROXY
|
passenv = OS_STDOUT_CAPTURE OS_STDERR_CAPTURE OS_TEST_TIMEOUT OS_TEST_LOCK_PATH OS_TEST_PATH http_proxy HTTP_PROXY https_proxy HTTPS_PROXY no_proxy NO_PROXY DECKHAND_IMAGE
|
||||||
deps = -r{toxinidir}/requirements.txt
|
deps = -r{toxinidir}/requirements.txt
|
||||||
-r{toxinidir}/test-requirements.txt
|
-r{toxinidir}/test-requirements.txt
|
||||||
commands =
|
commands =
|
||||||
|
|
Loading…
Reference in New Issue