bridge.bats 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287
  1. # -*- mode: sh -*-
  2. #!/usr/bin/env bats
  3. load helpers
  4. function test_single_network_connectivity() {
  5. local nw_name start end
  6. nw_name=${1}
  7. start=1
  8. end=${2}
  9. # Create containers and connect them to the network
  10. for i in `seq ${start} ${end}`;
  11. do
  12. dnet_cmd $(inst_id2port 1) container create container_${i}
  13. net_connect 1 container_${i} ${nw_name}
  14. done
  15. # Now test connectivity between all the containers using service names
  16. for i in `seq ${start} ${end}`;
  17. do
  18. if [ "${nw_name}" != "internal" ]; then
  19. runc $(dnet_container_name 1 bridge) $(get_sbox_id 1 container_${i}) \
  20. "ping -c 1 www.google.com"
  21. fi
  22. for j in `seq ${start} ${end}`;
  23. do
  24. if [ "$i" -eq "$j" ]; then
  25. continue
  26. fi
  27. runc $(dnet_container_name 1 bridge) $(get_sbox_id 1 container_${i}) \
  28. "ping -c 1 container_${j}"
  29. done
  30. done
  31. if [ -n "$3" ]; then
  32. return
  33. fi
  34. # Teardown the container connections and the network
  35. for i in `seq ${start} ${end}`;
  36. do
  37. net_disconnect 1 container_${i} ${nw_name}
  38. dnet_cmd $(inst_id2port 1) container rm container_${i}
  39. done
  40. }
  41. @test "Test default bridge network" {
  42. echo $(docker ps)
  43. test_single_network_connectivity bridge 3
  44. }
  45. @test "Test default network dnet restart" {
  46. echo $(docker ps)
  47. for iter in `seq 1 2`;
  48. do
  49. test_single_network_connectivity bridge 3
  50. if [ "$iter" -eq 1 ]; then
  51. docker restart dnet-1-bridge
  52. wait_for_dnet $(inst_id2port 1) dnet-1-bridge
  53. fi
  54. done
  55. }
  56. @test "Test default network dnet ungraceful restart" {
  57. echo $(docker ps)
  58. for iter in `seq 1 2`;
  59. do
  60. if [ "$iter" -eq 1 ]; then
  61. test_single_network_connectivity bridge 3 skip
  62. docker restart dnet-1-bridge
  63. wait_for_dnet $(inst_id2port 1) dnet-1-bridge
  64. else
  65. test_single_network_connectivity bridge 3
  66. fi
  67. done
  68. }
  69. @test "Test bridge network" {
  70. echo $(docker ps)
  71. dnet_cmd $(inst_id2port 1) network create -d bridge singlehost
  72. test_single_network_connectivity singlehost 3
  73. dnet_cmd $(inst_id2port 1) network rm singlehost
  74. }
  75. @test "Test bridge network dnet restart" {
  76. echo $(docker ps)
  77. dnet_cmd $(inst_id2port 1) network create -d bridge singlehost
  78. for iter in `seq 1 2`;
  79. do
  80. test_single_network_connectivity singlehost 3
  81. if [ "$iter" -eq 1 ]; then
  82. docker restart dnet-1-bridge
  83. wait_for_dnet $(inst_id2port 1) dnet-1-bridge
  84. fi
  85. done
  86. dnet_cmd $(inst_id2port 1) network rm singlehost
  87. }
  88. @test "Test bridge network dnet ungraceful restart" {
  89. echo $(docker ps)
  90. dnet_cmd $(inst_id2port 1) network create -d bridge singlehost
  91. for iter in `seq 1 2`;
  92. do
  93. if [ "$iter" -eq 1 ]; then
  94. test_single_network_connectivity singlehost 3 skip
  95. docker restart dnet-1-bridge
  96. wait_for_dnet $(inst_id2port 1) dnet-1-bridge
  97. else
  98. test_single_network_connectivity singlehost 3
  99. fi
  100. done
  101. dnet_cmd $(inst_id2port 1) network rm singlehost
  102. }
  103. @test "Test multiple bridge networks" {
  104. echo $(docker ps)
  105. start=1
  106. end=3
  107. for i in `seq ${start} ${end}`;
  108. do
  109. dnet_cmd $(inst_id2port 1) container create container_${i}
  110. for j in `seq ${start} ${end}`;
  111. do
  112. if [ "$i" -eq "$j" ]; then
  113. continue
  114. fi
  115. if [ "$i" -lt "$j" ]; then
  116. dnet_cmd $(inst_id2port 1) network create -d bridge sh${i}${j}
  117. nw=sh${i}${j}
  118. else
  119. nw=sh${j}${i}
  120. fi
  121. osvc="svc${i}${j}"
  122. dnet_cmd $(inst_id2port 1) service publish ${osvc}.${nw}
  123. dnet_cmd $(inst_id2port 1) service attach container_${i} ${osvc}.${nw}
  124. done
  125. done
  126. for i in `seq ${start} ${end}`;
  127. do
  128. echo ${i1}
  129. for j in `seq ${start} ${end}`;
  130. do
  131. echo ${j1}
  132. if [ "$i" -eq "$j" ]; then
  133. continue
  134. fi
  135. osvc="svc${j}${i}"
  136. echo "pinging ${osvc}"
  137. dnet_cmd $(inst_id2port 1) service ls
  138. runc $(dnet_container_name 1 bridge) $(get_sbox_id 1 container_${i}) "cat /etc/hosts"
  139. runc $(dnet_container_name 1 bridge) $(get_sbox_id 1 container_${i}) "ping -c 1 ${osvc}"
  140. done
  141. done
  142. svcs=(
  143. 0,0
  144. 2,3
  145. 1,3
  146. 1,2
  147. )
  148. echo "Test connectivity failure"
  149. for i in `seq ${start} ${end}`;
  150. do
  151. IFS=, read a b <<<"${svcs[$i]}"
  152. osvc="svc${a}${b}"
  153. echo "pinging ${osvc}"
  154. runc_nofail $(dnet_container_name 1 bridge) $(get_sbox_id 1 container_${i}) "ping -c 1 ${osvc}"
  155. [ "${status}" -ne 0 ]
  156. done
  157. for i in `seq ${start} ${end}`;
  158. do
  159. for j in `seq ${start} ${end}`;
  160. do
  161. if [ "$i" -eq "$j" ]; then
  162. continue
  163. fi
  164. if [ "$i" -lt "$j" ]; then
  165. nw=sh${i}${j}
  166. else
  167. nw=sh${j}${i}
  168. fi
  169. osvc="svc${i}${j}"
  170. dnet_cmd $(inst_id2port 1) service detach container_${i} ${osvc}.${nw}
  171. dnet_cmd $(inst_id2port 1) service unpublish ${osvc}.${nw}
  172. done
  173. dnet_cmd $(inst_id2port 1) container rm container_${i}
  174. done
  175. for i in `seq ${start} ${end}`;
  176. do
  177. for j in `seq ${start} ${end}`;
  178. do
  179. if [ "$i" -eq "$j" ]; then
  180. continue
  181. fi
  182. if [ "$i" -lt "$j" ]; then
  183. dnet_cmd $(inst_id2port 1) network rm sh${i}${j}
  184. fi
  185. done
  186. done
  187. }
  188. @test "Test bridge network alias support" {
  189. dnet_cmd $(inst_id2port 1) network create -d bridge br1
  190. dnet_cmd $(inst_id2port 1) container create container_1
  191. net_connect 1 container_1 br1 container_2:c2
  192. dnet_cmd $(inst_id2port 1) container create container_2
  193. net_connect 1 container_2 br1
  194. runc $(dnet_container_name 1 bridge) $(get_sbox_id 1 container_1) "ping -c 1 container_2"
  195. runc $(dnet_container_name 1 bridge) $(get_sbox_id 1 container_1) "ping -c 1 c2"
  196. net_disconnect 1 container_1 br1
  197. net_disconnect 1 container_2 br1
  198. dnet_cmd $(inst_id2port 1) container rm container_1
  199. dnet_cmd $(inst_id2port 1) container rm container_2
  200. dnet_cmd $(inst_id2port 1) network rm br1
  201. }
  202. @test "Test bridge network global alias support" {
  203. dnet_cmd $(inst_id2port 1) network create -d bridge br1
  204. dnet_cmd $(inst_id2port 1) network create -d bridge br2
  205. dnet_cmd $(inst_id2port 1) container create container_1
  206. net_connect 1 container_1 br1 : c1
  207. dnet_cmd $(inst_id2port 1) container create container_2
  208. net_connect 1 container_2 br1 : shared
  209. dnet_cmd $(inst_id2port 1) container create container_3
  210. net_connect 1 container_3 br1 : shared
  211. runc $(dnet_container_name 1 bridge) $(get_sbox_id 1 container_2) "ping -c 1 container_1"
  212. runc $(dnet_container_name 1 bridge) $(get_sbox_id 1 container_2) "ping -c 1 c1"
  213. runc $(dnet_container_name 1 bridge) $(get_sbox_id 1 container_1) "ping -c 1 container_2"
  214. runc $(dnet_container_name 1 bridge) $(get_sbox_id 1 container_1) "ping -c 1 shared"
  215. net_disconnect 1 container_2 br1
  216. dnet_cmd $(inst_id2port 1) container rm container_2
  217. runc $(dnet_container_name 1 bridge) $(get_sbox_id 1 container_1) "ping -c 1 container_3"
  218. runc $(dnet_container_name 1 bridge) $(get_sbox_id 1 container_1) "ping -c 1 shared"
  219. net_disconnect 1 container_1 br1
  220. dnet_cmd $(inst_id2port 1) container rm container_1
  221. net_disconnect 1 container_3 br1
  222. dnet_cmd $(inst_id2port 1) container rm container_3
  223. dnet_cmd $(inst_id2port 1) network rm br1
  224. }
  225. @test "Test bridge network internal network" {
  226. echo $(docker ps)
  227. dnet_cmd $(inst_id2port 1) network create -d bridge --internal internal
  228. dnet_cmd $(inst_id2port 1) container create container_1
  229. # connects to internal network, confirm it can't communicate with outside world
  230. net_connect 1 container_1 internal
  231. run runc $(dnet_container_name 1 bridge) $(get_sbox_id 1 container_1) "ping -c 1 8.8.8.8"
  232. [[ "$output" == *"1 packets transmitted, 0 packets received, 100% packet loss"* ]]
  233. net_disconnect 1 container_1 internal
  234. # connects to bridge network, confirm it can communicate with outside world
  235. net_connect 1 container_1 bridge
  236. runc $(dnet_container_name 1 bridge) $(get_sbox_id 1 container_1) "ping -c 1 8.8.8.8"
  237. net_disconnect 1 container_1 bridge
  238. dnet_cmd $(inst_id2port 1) container rm container_1
  239. # test communications within internal network
  240. test_single_network_connectivity internal 3
  241. dnet_cmd $(inst_id2port 1) network rm internal
  242. }