functional-test.sh 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. #!/bin/bash
  2. ETCD_IMG="quay.io/coreos/etcd:v3.0.3"
  3. FLANNEL_NET="10.10.0.0/16"
  4. usage() {
  5. echo "$0 FLANNEL-DOCKER-IMAGE"
  6. echo
  7. echo "Run end-to-end tests by bringing up two flannel instances"
  8. echo "and having them ping each other"
  9. echo
  10. echo "NOTE: this script depends on Docker 1.9.0 or higher"
  11. exit 1
  12. }
  13. version_check() {
  14. required=$1
  15. actual=$2
  16. err_prefix=$3
  17. req_maj=$(echo $required | cut -d . -f 1)
  18. req_min=$(echo $required | cut -d . -f 2)
  19. act_maj=$(echo $actual | cut -d . -f 1)
  20. act_min=$(echo $actual | cut -d . -f 2)
  21. if [ $act_maj -lt $req_maj ] || ( [ $act_maj -eq $req_maj ] && [ $act_min -lt $req_min ] ); then
  22. echo "$err_prefix: required=$required, found=$actual"
  23. exit 1
  24. fi
  25. }
  26. docker_version_check() {
  27. ver=$(docker version -f '{{.Server.Version}}')
  28. version_check "1.9" $ver
  29. }
  30. run_test() {
  31. backend=$1
  32. flannel_conf="{ \"Network\": \"$FLANNEL_NET\", \"Backend\": { \"Type\": \"${backend}\" } }"
  33. # etcd might take a bit to come up
  34. while ! docker run --rm -it --entrypoint=/usr/local/bin/etcdctl $ETCD_IMG \
  35. --endpoints=$etcd_endpt set /coreos.com/network/config "$flannel_conf"
  36. do
  37. sleep 1
  38. done
  39. echo flannel config written
  40. # rm any old flannel container that maybe running, ignore error as it might not exist
  41. docker rm -f flannel-e2e-test-flannel1 2>/dev/null
  42. docker run --name=flannel-e2e-test-flannel1 -d --privileged --entrypoint=/opt/bin/flanneld $flannel_img --etcd-endpoints=$etcd_endpt
  43. if [ $? -ne 0 ]; then
  44. exit 1
  45. fi
  46. # rm any old flannel container that maybe running, ignore error as it might not exist
  47. docker rm -f flannel-e2e-test-flannel2 2>/dev/null
  48. docker run --name=flannel-e2e-test-flannel2 -d --privileged --entrypoint=/opt/bin/flanneld $flannel_img --etcd-endpoints=$etcd_endpt
  49. if [ $? -ne 0 ]; then
  50. exit 1
  51. fi
  52. echo flannels running
  53. # wait an arbitrary amount to have flannels come up
  54. sleep 5
  55. # add a dummy interface with $FLANNEL_SUBNET so we have a known working IP to ping
  56. ping_dest=$(docker "exec" --privileged flannel-e2e-test-flannel1 /bin/sh -c '\
  57. source /run/flannel/subnet.env &&
  58. ip link add name dummy0 type dummy && \
  59. ip addr add $FLANNEL_SUBNET dev dummy0 && \
  60. ip link set dummy0 up && \
  61. echo $FLANNEL_SUBNET | cut -f 1 -d "/" ')
  62. docker exec -it --privileged flannel-e2e-test-flannel2 /bin/ping -c 5 $ping_dest
  63. exit_code=$?
  64. # Uncomment to debug (you can nsenter)
  65. #if [ $exit_code -eq "1" ]; then
  66. # sleep 10000
  67. #fi
  68. echo "Test for backend=$backend: exit=$exit_code"
  69. docker stop flannel-e2e-test-flannel1 flannel-e2e-test-flannel2 >/dev/null
  70. if [ $exit_code -ne 0 ]; then
  71. # Print flannel logs to help debug
  72. echo "------ flannel server (one being pinged) log -------"
  73. docker logs flannel-e2e-test-flannel1
  74. echo
  75. echo "------ flannel client (one doing the ping) log -------"
  76. docker logs flannel-e2e-test-flannel2
  77. echo
  78. fi
  79. docker rm flannel-e2e-test-flannel1 flannel-e2e-test-flannel2 >/dev/null
  80. return $exit_code
  81. }
  82. if [ $# -ne 1 ]; then
  83. usage
  84. fi
  85. flannel_img=$1
  86. # Check that docker is new enough
  87. docker_version_check
  88. docker0=$(ip -o -f inet addr show docker0 | grep -Po 'inet \K[\d.]+')
  89. etcd_endpt="http://$docker0:2379"
  90. docker rm -f flannel-e2e-test-etcd 2>/dev/null
  91. docker run --name=flannel-e2e-test-etcd -d -p 2379:2379 --entrypoint /usr/local/bin/etcd $ETCD_IMG --listen-client-urls http://0.0.0.0:2379 --advertise-client-urls $etcd_endpt
  92. if [ $? -ne 0 ]; then
  93. exit 1
  94. fi
  95. echo etcd launched
  96. global_exit_code=0
  97. backends=${BACKEND:-"udp vxlan host-gw"}
  98. for backend in $backends; do
  99. echo
  100. echo "=== BACKEND: $backend ==============================================="
  101. if ! run_test $backend; then
  102. global_exit_code=1
  103. fi
  104. done
  105. docker stop flannel-e2e-test-etcd >/dev/null
  106. if [ $global_exit_code -eq 0 ]; then
  107. echo
  108. echo "ALL TESTS PASSED"
  109. else
  110. # Print etcd logs to help debug
  111. echo "------ etcd log -------"
  112. docker logs $etcd
  113. echo
  114. echo "TEST(S) FAILED"
  115. fi
  116. docker rm flannel-e2e-test-etcd 2>/dev/null
  117. exit $global_exit_code