Prechádzať zdrojové kódy

Merge remote-tracking branch 'upstream/master'

Baptiste Donaux 9 rokov pred
rodič
commit
6b88365465

+ 2 - 2
Makefile

@@ -2,8 +2,8 @@
 .PHONY : test
 
 update-dependencies:
-	docker pull jwilder/docker-gen:latest
-	docker pull nginx:latest
+	docker pull jwilder/docker-gen:0.7.0
+	docker pull nginx:1.9.12
 	docker pull python:3
 	docker pull rancher/socat-docker:latest
 	docker pull appropriate/curl:latest

+ 6 - 5
test/default-host.bats

@@ -4,10 +4,7 @@ load test_helpers
 function setup {
 	# make sure to stop any web container before each test so we don't
 	# have any unexpected contaiener running with VIRTUAL_HOST or VIRUTAL_PORT set
-	CIDS=( $(docker ps -q --filter "label=bats-type=web") )
-	if [ ${#CIDS[@]} -gt 0 ]; then
-		docker stop ${CIDS[@]} >&2
-	fi
+	stop_bats_containers web
 }
 
 
@@ -20,7 +17,7 @@ function setup {
 	# WHEN nginx-proxy runs with DEFAULT_HOST set to web.bats
 	run nginxproxy $SUT_CONTAINER -v /var/run/docker.sock:/tmp/docker.sock:ro -e DEFAULT_HOST=web.bats
 	assert_success
-	docker_wait_for_log $SUT_CONTAINER 3 "Watching docker events"
+	docker_wait_for_log $SUT_CONTAINER 9 "Watching docker events"
 
 	# THEN querying the proxy without Host header → 200
 	run curl_container $SUT_CONTAINER / --head
@@ -30,3 +27,7 @@ function setup {
 	run curl_container $SUT_CONTAINER / --head --header "Host: something.I.just.made.up"
 	assert_output -l 0 $'HTTP/1.1 200 OK\r'
 }
+
+@test "[$TEST_FILE] stop all bats containers" {
+	stop_bats_containers
+}

+ 12 - 6
test/docker.bats

@@ -14,7 +14,7 @@ load test_helpers
 	# WHEN nginx-proxy runs on our docker host using the default unix socket 
 	run nginxproxy $SUT_CONTAINER -v /var/run/docker.sock:/tmp/docker.sock:ro
 	assert_success
-	docker_wait_for_log $SUT_CONTAINER 3 "Watching docker events"
+	docker_wait_for_log $SUT_CONTAINER 9 "Watching docker events"
 
 	# THEN
 	assert_nginxproxy_behaves $SUT_CONTAINER
@@ -27,7 +27,7 @@ load test_helpers
 	# WHEN nginx-proxy runs on our docker host using a custom unix socket 
 	run nginxproxy $SUT_CONTAINER -v /var/run/docker.sock:/f00.sock:ro -e DOCKER_HOST=unix:///f00.sock
 	assert_success
-	docker_wait_for_log $SUT_CONTAINER 3 "Watching docker events"
+	docker_wait_for_log $SUT_CONTAINER 9 "Watching docker events"
 
 	# THEN
 	assert_nginxproxy_behaves $SUT_CONTAINER
@@ -44,7 +44,7 @@ load test_helpers
 	# WHEN nginx-proxy runs on our docker host using tcp to connect to our docker host
 	run nginxproxy $SUT_CONTAINER -e DOCKER_HOST="tcp://bats-docker-tcp:2375" --link bats-docker-tcp:bats-docker-tcp
 	assert_success
-	docker_wait_for_log $SUT_CONTAINER 3 "Watching docker events"
+	docker_wait_for_log $SUT_CONTAINER 9 "Watching docker events"
 	
 	# THEN
 	assert_nginxproxy_behaves $SUT_CONTAINER
@@ -57,28 +57,30 @@ load test_helpers
 
 	# GIVEN a simple nginx container
 	run docker run -d \
+		--label bats-type="nginx" \
 		--name bats-nginx \
 		-v /etc/nginx/conf.d/ \
 		-v /etc/nginx/certs/ \
 		nginx:latest
 	assert_success
-	run retry 5 1s docker run appropriate/curl --silent --fail --head http://$(docker_ip bats-nginx)/
+	run retry 5 1s docker run --label bats-type="curl" appropriate/curl --silent --fail --head http://$(docker_ip bats-nginx)/
 	assert_output -l 0 $'HTTP/1.1 200 OK\r'
 
 	# WHEN docker-gen runs on our docker host
 	run docker run -d \
+		--label bats-type="docker-gen" \
 		--name bats-docker-gen \
 		-v /var/run/docker.sock:/tmp/docker.sock:ro \
 		-v $BATS_TEST_DIRNAME/../nginx.tmpl:/etc/docker-gen/templates/nginx.tmpl:ro \
 		--volumes-from bats-nginx \
-		jwilder/docker-gen:latest \
+		jwilder/docker-gen:0.7.0 \
 			-notify-sighup bats-nginx \
 			-watch \
 			-only-exposed \
 			/etc/docker-gen/templates/nginx.tmpl \
 			/etc/nginx/conf.d/default.conf
 	assert_success
-	docker_wait_for_log bats-docker-gen 6 "Watching docker events"
+	docker_wait_for_log bats-docker-gen 9 "Watching docker events"
 	
 	# Give some time to the docker-gen container to notify bats-nginx so it 
 	# reloads its config
@@ -94,6 +96,10 @@ load test_helpers
 	assert_nginxproxy_behaves bats-nginx
 }
 
+@test "[$TEST_FILE] stop all bats containers" {
+	stop_bats_containers
+}
+
 
 # $1 nginx-proxy container
 function assert_nginxproxy_behaves {

+ 7 - 1
test/lib/docker_helpers.bash

@@ -13,6 +13,11 @@ function docker_ip {
 	docker inspect --format '{{ .NetworkSettings.IPAddress }}' $1
 }
 
+# get the ip of docker container $1
+function docker_id {
+	docker inspect --format '{{ .ID }}' $1
+}
+
 # get the running state of container $1
 # → true/false
 # fails if the container does not exist
@@ -52,9 +57,10 @@ function docker_tcp {
 	local container_name="$1"
 	docker_clean $container_name
 	docker run -d \
+		--label bats-type="socat" \
 		--name $container_name \
 		--expose 2375 \
 		-v /var/run/docker.sock:/var/run/docker.sock \
 		rancher/socat-docker
-	docker run --link "$container_name:docker" docker:1.9 version
+	docker run --label bats-type="docker" --link "$container_name:docker" docker:1.9 version
 }

+ 8 - 5
test/multiple-hosts.bats

@@ -5,22 +5,21 @@ SUT_CONTAINER=bats-nginx-proxy-${TEST_FILE}
 function setup {
 	# make sure to stop any web container before each test so we don't
 	# have any unexpected contaiener running with VIRTUAL_HOST or VIRUTAL_PORT set
-	CIDS=( $(docker ps -q --filter "label=bats-type=web") )
-	if [ ${#CIDS[@]} -gt 0 ]; then
-		docker stop ${CIDS[@]} >&2
-	fi
+	stop_bats_containers web
 }
 
 
 @test "[$TEST_FILE] start a nginx-proxy container" {
 	run nginxproxy $SUT_CONTAINER -v /var/run/docker.sock:/tmp/docker.sock:ro
 	assert_success
-	docker_wait_for_log $SUT_CONTAINER 3 "Watching docker events"
+	docker_wait_for_log $SUT_CONTAINER 9 "Watching docker events"
 }
 
 @test "[$TEST_FILE] nginx-proxy forwards requests for 2 hosts" {
 	# WHEN a container runs a web server with VIRTUAL_HOST set for multiple hosts
 	prepare_web_container bats-multiple-hosts-1 80 -e VIRTUAL_HOST=multiple-hosts-1-A.bats,multiple-hosts-1-B.bats
+	dockergen_wait_for_event $SUT_CONTAINER start bats-multiple-hosts-1
+	sleep 1
 
 	# THEN querying the proxy without Host header → 503
 	run curl_container $SUT_CONTAINER / --head
@@ -38,3 +37,7 @@ function setup {
 	run curl_container $SUT_CONTAINER /data --header 'Host: multiple-hosts-1-B.bats'
 	assert_output "answer from port 80"
 }
+
+@test "[$TEST_FILE] stop all bats containers" {
+	stop_bats_containers
+}

+ 12 - 5
test/multiple-ports.bats

@@ -5,10 +5,7 @@ SUT_CONTAINER=bats-nginx-proxy-${TEST_FILE}
 function setup {
 	# make sure to stop any web container before each test so we don't
 	# have any unexpected contaiener running with VIRTUAL_HOST or VIRUTAL_PORT set
-	CIDS=( $(docker ps -q --filter "label=bats-type=web") )
-	if [ ${#CIDS[@]} -gt 0 ]; then
-		docker stop ${CIDS[@]} >&2
-	fi
+	stop_bats_containers web
 }
 
 
@@ -16,13 +13,15 @@ function setup {
 	# GIVEN nginx-proxy
 	run nginxproxy $SUT_CONTAINER -v /var/run/docker.sock:/tmp/docker.sock:ro
 	assert_success
-	docker_wait_for_log $SUT_CONTAINER 3 "Watching docker events"
+	docker_wait_for_log $SUT_CONTAINER 9 "Watching docker events"
 }
 
 
 @test "[$TEST_FILE] nginx-proxy defaults to the service running on port 80" {
 	# WHEN
 	prepare_web_container bats-web-${TEST_FILE}-1 "80 90" -e VIRTUAL_HOST=web.bats
+	dockergen_wait_for_event $SUT_CONTAINER start bats-web-${TEST_FILE}-1
+	sleep 1
 
 	# THEN
 	assert_response_is_from_port 80
@@ -32,6 +31,8 @@ function setup {
 @test "[$TEST_FILE] VIRTUAL_PORT=90 while port 80 is also exposed" {
 	# GIVEN
 	prepare_web_container bats-web-${TEST_FILE}-2 "80 90" -e VIRTUAL_HOST=web.bats -e VIRTUAL_PORT=90
+	dockergen_wait_for_event $SUT_CONTAINER start bats-web-${TEST_FILE}-2
+	sleep 1
 
 	# THEN
 	assert_response_is_from_port 90
@@ -41,11 +42,17 @@ function setup {
 @test "[$TEST_FILE] single exposed port != 80" {
 	# GIVEN
 	prepare_web_container bats-web-${TEST_FILE}-3 1234 -e VIRTUAL_HOST=web.bats
+	dockergen_wait_for_event $SUT_CONTAINER start bats-web-${TEST_FILE}-3
+	sleep 1
 
 	# THEN
 	assert_response_is_from_port 1234
 }
 
+@test "[$TEST_FILE] stop all bats containers" {
+	stop_bats_containers
+}
+
 
 # assert querying nginx-proxy provides a response from the expected port of the web container
 # $1 port we are expecting an response from

+ 35 - 2
test/test_helpers.bash

@@ -33,6 +33,7 @@ function nginxproxy {
 	shift
 	docker_clean $container_name \
 	&& docker run -d \
+		--label bats-type="nginx-proxy" \
 		--name $container_name \
 		"$@" \
 		$SUT_IMAGE \
@@ -66,7 +67,7 @@ function curl_container {
 	local -r container=$1
 	local -r path=$2
 	shift 2
-	docker run appropriate/curl --silent \
+	docker run --label bats-type="curl" appropriate/curl --silent \
 		--connect-timeout 5 \
 		--max-time 20 \
 		"$@" \
@@ -128,7 +129,39 @@ function prepare_web_container {
 	# THEN querying directly port works
 	IFS=$' \t\n' # See https://github.com/sstephenson/bats/issues/89
 	for port in $ports; do
-		run retry 5 1s docker run appropriate/curl --silent --fail http://$(docker_ip $container_name):$port/data
+		run retry 5 1s docker run --label bats-type="curl" appropriate/curl --silent --fail http://$(docker_ip $container_name):$port/data
 		assert_output "answer from port $port"
 	done
 }
+
+# stop all containers with the "bats-type" label (matching the optionally supplied value)
+#
+# $1 optional label value
+function stop_bats_containers {
+	local -r value=$1
+
+	if [ -z "$value" ]; then
+		CIDS=( $(docker ps -q --filter "label=bats-type") )
+	else
+		CIDS=( $(docker ps -q --filter "label=bats-type=$value") )
+	fi
+
+	if [ ${#CIDS[@]} -gt 0 ]; then
+		docker stop ${CIDS[@]} >&2
+	fi
+}
+
+# wait for a docker-gen container to receive a specified event from a
+# container with the specified ID/name
+#
+# $1 docker-gen container name
+# $2 event
+# $3 ID/name of container to receive event from
+function dockergen_wait_for_event {
+	local -r container=$1
+	local -r event=$2
+	local -r other=$3
+	local -r did=$(docker_id "$other")
+	docker_wait_for_log "$container" 9 "Received event $event for container ${did:0:12}"
+}
+

+ 12 - 5
test/wildcard-hosts.bats

@@ -5,10 +5,7 @@ SUT_CONTAINER=bats-nginx-proxy-${TEST_FILE}
 function setup {
 	# make sure to stop any web container before each test so we don't
 	# have any unexpected contaiener running with VIRTUAL_HOST or VIRUTAL_PORT set
-	CIDS=( $(docker ps -q --filter "label=bats-type=web") )
-	if [ ${#CIDS[@]} -gt 0 ]; then
-		docker stop ${CIDS[@]} >&2
-	fi
+	stop_bats_containers web
 }
 
 
@@ -16,13 +13,15 @@ function setup {
 	# GIVEN
 	run nginxproxy $SUT_CONTAINER -v /var/run/docker.sock:/tmp/docker.sock:ro
 	assert_success
-	docker_wait_for_log $SUT_CONTAINER 3 "Watching docker events"
+	docker_wait_for_log $SUT_CONTAINER 9 "Watching docker events"
 }
 
 
 @test "[$TEST_FILE] VIRTUAL_HOST=*.wildcard.bats" {
 	# WHEN
 	prepare_web_container bats-wildcard-hosts-1 80 -e VIRTUAL_HOST=*.wildcard.bats
+	dockergen_wait_for_event $SUT_CONTAINER start bats-wildcard-hosts-1
+	sleep 1
 
 	# THEN
 	assert_200 f00.wildcard.bats
@@ -33,6 +32,8 @@ function setup {
 @test "[$TEST_FILE] VIRTUAL_HOST=wildcard.bats.*" {
 	# WHEN
 	prepare_web_container bats-wildcard-hosts-2 80 -e VIRTUAL_HOST=wildcard.bats.*
+	dockergen_wait_for_event $SUT_CONTAINER start bats-wildcard-hosts-2
+	sleep 1
 
 	# THEN
 	assert_200 wildcard.bats.f00
@@ -43,6 +44,8 @@ function setup {
 @test "[$TEST_FILE] VIRTUAL_HOST=~^foo\.bar\..*\.bats" {
 	# WHEN
 	prepare_web_container bats-wildcard-hosts-2 80 -e VIRTUAL_HOST=~^foo\.bar\..*\.bats
+	dockergen_wait_for_event $SUT_CONTAINER start bats-wildcard-hosts-2
+	sleep 1
 
 	# THEN
 	assert_200 foo.bar.whatever.bats
@@ -51,6 +54,10 @@ function setup {
 
 }
 
+@test "[$TEST_FILE] stop all bats containers" {
+	stop_bats_containers
+}
+
 
 # assert that querying nginx-proxy with the given Host header produces a `HTTP 200` response
 # $1 Host HTTP header to use when querying nginx-proxy