2 changed files with 179 additions and 0 deletions
@ -0,0 +1,20 @@ |
|||||
|
package main |
||||
|
|
||||
|
import ( |
||||
|
"fmt" |
||||
|
"net/http" |
||||
|
) |
||||
|
|
||||
|
const ( |
||||
|
port = ":8080" |
||||
|
) |
||||
|
|
||||
|
func HelloWorld(w http.ResponseWriter, r *http.Request) { |
||||
|
fmt.Println(w, "Hello, world !") |
||||
|
} |
||||
|
|
||||
|
func main() { |
||||
|
fmt.Printf("Started server on port %v.\n", port) |
||||
|
http.HandleFunc("/", HelloWorld) |
||||
|
http.ListenAndServe(port, nil) |
||||
|
} |
||||
@ -0,0 +1,159 @@ |
|||||
|
#!/bin/bash |
||||
|
# |
||||
|
# The 'run' performs a simple test that verifies the S2I image. |
||||
|
# The main focus here is to exercise the S2I scripts. |
||||
|
# |
||||
|
# For more information see the documentation: |
||||
|
# https://github.com/openshift/source-to-image/blob/master/docs/builder_image.md |
||||
|
# |
||||
|
# IMAGE_NAME specifies a name of the candidate image used for testing. |
||||
|
# The image has to be available before this script is executed. |
||||
|
# |
||||
|
IMAGE_NAME=${IMAGE_NAME-golang-centos-candidate} |
||||
|
|
||||
|
# Determining system utility executables (darwin compatibility check) |
||||
|
READLINK_EXEC="readlink" |
||||
|
MKTEMP_EXEC="mktemp" |
||||
|
if [[ "$OSTYPE" =~ 'darwin' ]]; then |
||||
|
! type -a "greadlink" &>"/dev/null" || READLINK_EXEC="greadlink" |
||||
|
! type -a "gmktemp" &>"/dev/null" || MKTEMP_EXEC="gmktemp" |
||||
|
fi |
||||
|
|
||||
|
test_dir="$($READLINK_EXEC -zf $(dirname "${BASH_SOURCE[0]}"))" |
||||
|
image_dir=$($READLINK_EXEC -zf ${test_dir}/..) |
||||
|
cid_file=$($MKTEMP_EXEC -u --suffix=.cid) |
||||
|
|
||||
|
# Since we built the candidate image locally, we don't want S2I to attempt to pull |
||||
|
# it from Docker hub |
||||
|
s2i_args="--pull-policy=never --loglevel=2" |
||||
|
|
||||
|
# Port the image exposes service to be tested |
||||
|
test_port=8080 |
||||
|
|
||||
|
image_exists() { |
||||
|
docker inspect $1 &>/dev/null |
||||
|
} |
||||
|
|
||||
|
container_exists() { |
||||
|
image_exists $(cat $cid_file) |
||||
|
} |
||||
|
|
||||
|
container_ip() { |
||||
|
if [ ! -z "$DOCKER_HOST" ] && [[ "$OSTYPE" =~ 'darwin' ]]; then |
||||
|
docker-machine ip |
||||
|
else |
||||
|
docker inspect --format="{{ .NetworkSettings.IPAddress }}" $(cat $cid_file) |
||||
|
fi |
||||
|
} |
||||
|
|
||||
|
container_port() { |
||||
|
if [ ! -z "$DOCKER_HOST" ] && [[ "$OSTYPE" =~ 'darwin' ]]; then |
||||
|
docker inspect --format="{{(index .NetworkSettings.Ports \"$test_port/tcp\" 0).HostPort}}" "$(cat "${cid_file}")" |
||||
|
else |
||||
|
echo $test_port |
||||
|
fi |
||||
|
} |
||||
|
|
||||
|
run_s2i_build() { |
||||
|
s2i build --incremental=true ${s2i_args} file://${test_dir}/test-app ${IMAGE_NAME} ${IMAGE_NAME}-testapp |
||||
|
} |
||||
|
|
||||
|
prepare() { |
||||
|
if ! image_exists ${IMAGE_NAME}; then |
||||
|
echo "ERROR: The image ${IMAGE_NAME} must exist before this script is executed." |
||||
|
exit 1 |
||||
|
fi |
||||
|
# s2i build requires the application is a valid 'Git' repository |
||||
|
pushd ${test_dir}/test-app >/dev/null |
||||
|
git init |
||||
|
git config user.email "build@localhost" && git config user.name "builder" |
||||
|
git add -A && git commit -m "Sample commit" |
||||
|
popd >/dev/null |
||||
|
run_s2i_build |
||||
|
} |
||||
|
|
||||
|
run_test_application() { |
||||
|
docker run --rm --cidfile=${cid_file} -p ${test_port} ${IMAGE_NAME}-testapp |
||||
|
} |
||||
|
|
||||
|
cleanup() { |
||||
|
if [ -f $cid_file ]; then |
||||
|
if container_exists; then |
||||
|
docker stop $(cat $cid_file) |
||||
|
fi |
||||
|
fi |
||||
|
if image_exists ${IMAGE_NAME}-testapp; then |
||||
|
docker rmi ${IMAGE_NAME}-testapp |
||||
|
fi |
||||
|
} |
||||
|
|
||||
|
check_result() { |
||||
|
local result="$1" |
||||
|
if [[ "$result" != "0" ]]; then |
||||
|
echo "S2I image '${IMAGE_NAME}' test FAILED (exit code: ${result})" |
||||
|
cleanup |
||||
|
exit $result |
||||
|
fi |
||||
|
} |
||||
|
|
||||
|
wait_for_cid() { |
||||
|
local max_attempts=10 |
||||
|
local sleep_time=1 |
||||
|
local attempt=1 |
||||
|
local result=1 |
||||
|
while [ $attempt -le $max_attempts ]; do |
||||
|
[ -f $cid_file ] && break |
||||
|
echo "Waiting for container to start..." |
||||
|
attempt=$(( $attempt + 1 )) |
||||
|
sleep $sleep_time |
||||
|
done |
||||
|
} |
||||
|
|
||||
|
test_usage() { |
||||
|
echo "Testing 's2i usage'..." |
||||
|
s2i usage ${s2i_args} ${IMAGE_NAME} &>/dev/null |
||||
|
} |
||||
|
|
||||
|
test_connection() { |
||||
|
echo "Testing HTTP connection (http://$(container_ip):$(container_port))" |
||||
|
local max_attempts=10 |
||||
|
local sleep_time=1 |
||||
|
local attempt=1 |
||||
|
local result=1 |
||||
|
while [ $attempt -le $max_attempts ]; do |
||||
|
echo "Sending GET request to http://$(container_ip):$(container_port)/" |
||||
|
response_code=$(curl -s -w %{http_code} -o /dev/null http://$(container_ip):$(container_port)/) |
||||
|
status=$? |
||||
|
if [ $status -eq 0 ]; then |
||||
|
if [ $response_code -eq 200 ]; then |
||||
|
result=0 |
||||
|
fi |
||||
|
break |
||||
|
fi |
||||
|
attempt=$(( $attempt + 1 )) |
||||
|
sleep $sleep_time |
||||
|
done |
||||
|
return $result |
||||
|
} |
||||
|
|
||||
|
# Build the application image twice to ensure the 'save-artifacts' and |
||||
|
# 'restore-artifacts' scripts are working properly |
||||
|
prepare |
||||
|
run_s2i_build |
||||
|
check_result $? |
||||
|
|
||||
|
# Verify the 'usage' script is working properly |
||||
|
test_usage |
||||
|
check_result $? |
||||
|
|
||||
|
# Verify that the HTTP connection can be established to test application container |
||||
|
run_test_application & |
||||
|
|
||||
|
# Wait for the container to write its CID file |
||||
|
wait_for_cid |
||||
|
|
||||
|
test_connection |
||||
|
check_result $? |
||||
|
|
||||
|
cleanup |
||||
|
|
||||
Loading…
Reference in new issue