github.com/darciopacifico/docker@v1.9.0-rc1/integration-cli/docker_api_network_test.go (about) 1 package main 2 3 import ( 4 "encoding/json" 5 "fmt" 6 "net" 7 "net/http" 8 "net/url" 9 "strings" 10 11 "github.com/docker/docker/api/types" 12 "github.com/docker/docker/daemon/network" 13 "github.com/docker/docker/pkg/parsers/filters" 14 "github.com/go-check/check" 15 ) 16 17 func (s *DockerSuite) TestApiNetworkGetDefaults(c *check.C) { 18 // By default docker daemon creates 3 networks. check if they are present 19 defaults := []string{"bridge", "host", "none"} 20 for _, nn := range defaults { 21 c.Assert(isNetworkAvailable(c, nn), check.Equals, true) 22 } 23 } 24 25 func (s *DockerSuite) TestApiNetworkCreateDelete(c *check.C) { 26 // Create a network 27 name := "testnetwork" 28 config := types.NetworkCreate{ 29 Name: name, 30 CheckDuplicate: true, 31 } 32 id := createNetwork(c, config, true) 33 c.Assert(isNetworkAvailable(c, name), check.Equals, true) 34 35 // POST another network with same name and CheckDuplicate must fail 36 createNetwork(c, config, false) 37 38 // delete the network and make sure it is deleted 39 deleteNetwork(c, id, true) 40 c.Assert(isNetworkAvailable(c, name), check.Equals, false) 41 } 42 43 func (s *DockerSuite) TestApiNetworkFilter(c *check.C) { 44 nr := getNetworkResource(c, getNetworkIDByName(c, "bridge")) 45 c.Assert(nr.Name, check.Equals, "bridge") 46 } 47 48 func (s *DockerSuite) TestApiNetworkInspect(c *check.C) { 49 // Inspect default bridge network 50 nr := getNetworkResource(c, "bridge") 51 c.Assert(nr.Name, check.Equals, "bridge") 52 53 // run a container and attach it to the default bridge network 54 out, _ := dockerCmd(c, "run", "-d", "--name", "test", "busybox", "top") 55 containerID := strings.TrimSpace(out) 56 containerIP := findContainerIP(c, "test") 57 58 // inspect default bridge network again and make sure the container is connected 59 nr = getNetworkResource(c, nr.ID) 60 c.Assert(nr.Driver, check.Equals, "bridge") 61 c.Assert(nr.Scope, check.Equals, "local") 62 c.Assert(nr.IPAM.Driver, check.Equals, "default") 63 c.Assert(len(nr.Containers), check.Equals, 1) 64 c.Assert(nr.Containers[containerID], check.NotNil) 65 66 ip, _, err := net.ParseCIDR(nr.Containers[containerID].IPv4Address) 67 c.Assert(err, check.IsNil) 68 c.Assert(ip.String(), check.Equals, containerIP) 69 70 // IPAM configuration inspect 71 ipam := network.IPAM{ 72 Driver: "default", 73 Config: []network.IPAMConfig{{Subnet: "172.28.0.0/16", IPRange: "172.28.5.0/24", Gateway: "172.28.5.254"}}, 74 } 75 config := types.NetworkCreate{ 76 Name: "br0", 77 Driver: "bridge", 78 IPAM: ipam, 79 } 80 id0 := createNetwork(c, config, true) 81 c.Assert(isNetworkAvailable(c, "br0"), check.Equals, true) 82 83 nr = getNetworkResource(c, id0) 84 c.Assert(len(nr.IPAM.Config), check.Equals, 1) 85 c.Assert(nr.IPAM.Config[0].Subnet, check.Equals, "172.28.0.0/16") 86 c.Assert(nr.IPAM.Config[0].IPRange, check.Equals, "172.28.5.0/24") 87 c.Assert(nr.IPAM.Config[0].Gateway, check.Equals, "172.28.5.254") 88 // delete the network and make sure it is deleted 89 deleteNetwork(c, id0, true) 90 c.Assert(isNetworkAvailable(c, "br0"), check.Equals, false) 91 } 92 93 func (s *DockerSuite) TestApiNetworkConnectDisconnect(c *check.C) { 94 // Create test network 95 name := "testnetwork" 96 config := types.NetworkCreate{ 97 Name: name, 98 } 99 id := createNetwork(c, config, true) 100 nr := getNetworkResource(c, id) 101 c.Assert(nr.Name, check.Equals, name) 102 c.Assert(nr.ID, check.Equals, id) 103 c.Assert(len(nr.Containers), check.Equals, 0) 104 105 // run a container 106 out, _ := dockerCmd(c, "run", "-d", "--name", "test", "busybox", "top") 107 containerID := strings.TrimSpace(out) 108 109 // connect the container to the test network 110 connectNetwork(c, nr.ID, containerID) 111 112 // inspect the network to make sure container is connected 113 nr = getNetworkResource(c, nr.ID) 114 c.Assert(len(nr.Containers), check.Equals, 1) 115 c.Assert(nr.Containers[containerID], check.NotNil) 116 117 // check if container IP matches network inspect 118 ip, _, err := net.ParseCIDR(nr.Containers[containerID].IPv4Address) 119 c.Assert(err, check.IsNil) 120 containerIP := findContainerIP(c, "test") 121 c.Assert(ip.String(), check.Equals, containerIP) 122 123 // disconnect container from the network 124 disconnectNetwork(c, nr.ID, containerID) 125 nr = getNetworkResource(c, nr.ID) 126 c.Assert(nr.Name, check.Equals, name) 127 c.Assert(len(nr.Containers), check.Equals, 0) 128 129 // delete the network 130 deleteNetwork(c, nr.ID, true) 131 } 132 133 func (s *DockerSuite) TestApiNetworkIpamMultipleBridgeNetworks(c *check.C) { 134 // test0 bridge network 135 ipam0 := network.IPAM{ 136 Driver: "default", 137 Config: []network.IPAMConfig{{Subnet: "192.178.0.0/16", IPRange: "192.178.128.0/17", Gateway: "192.178.138.100"}}, 138 } 139 config0 := types.NetworkCreate{ 140 Name: "test0", 141 Driver: "bridge", 142 IPAM: ipam0, 143 } 144 id0 := createNetwork(c, config0, true) 145 c.Assert(isNetworkAvailable(c, "test0"), check.Equals, true) 146 147 ipam1 := network.IPAM{ 148 Driver: "default", 149 Config: []network.IPAMConfig{{Subnet: "192.178.128.0/17", Gateway: "192.178.128.1"}}, 150 } 151 // test1 bridge network overlaps with test0 152 config1 := types.NetworkCreate{ 153 Name: "test1", 154 Driver: "bridge", 155 IPAM: ipam1, 156 } 157 createNetwork(c, config1, false) 158 c.Assert(isNetworkAvailable(c, "test1"), check.Equals, false) 159 160 ipam2 := network.IPAM{ 161 Driver: "default", 162 Config: []network.IPAMConfig{{Subnet: "192.169.0.0/16", Gateway: "192.169.100.100"}}, 163 } 164 // test2 bridge network does not overlap 165 config2 := types.NetworkCreate{ 166 Name: "test2", 167 Driver: "bridge", 168 IPAM: ipam2, 169 } 170 createNetwork(c, config2, true) 171 c.Assert(isNetworkAvailable(c, "test2"), check.Equals, true) 172 173 // remove test0 and retry to create test1 174 deleteNetwork(c, id0, true) 175 createNetwork(c, config1, true) 176 c.Assert(isNetworkAvailable(c, "test1"), check.Equals, true) 177 178 // for networks w/o ipam specified, docker will choose proper non-overlapping subnets 179 createNetwork(c, types.NetworkCreate{Name: "test3"}, true) 180 c.Assert(isNetworkAvailable(c, "test3"), check.Equals, true) 181 createNetwork(c, types.NetworkCreate{Name: "test4"}, true) 182 c.Assert(isNetworkAvailable(c, "test4"), check.Equals, true) 183 createNetwork(c, types.NetworkCreate{Name: "test5"}, true) 184 c.Assert(isNetworkAvailable(c, "test5"), check.Equals, true) 185 186 for i := 1; i < 6; i++ { 187 deleteNetwork(c, fmt.Sprintf("test%d", i), true) 188 } 189 } 190 191 func isNetworkAvailable(c *check.C, name string) bool { 192 status, body, err := sockRequest("GET", "/networks", nil) 193 c.Assert(status, check.Equals, http.StatusOK) 194 c.Assert(err, check.IsNil) 195 196 nJSON := []types.NetworkResource{} 197 err = json.Unmarshal(body, &nJSON) 198 c.Assert(err, check.IsNil) 199 200 for _, n := range nJSON { 201 if n.Name == name { 202 return true 203 } 204 } 205 return false 206 } 207 208 func getNetworkIDByName(c *check.C, name string) string { 209 var ( 210 v = url.Values{} 211 filterArgs = filters.Args{} 212 ) 213 filterArgs["name"] = []string{name} 214 filterJSON, err := filters.ToParam(filterArgs) 215 c.Assert(err, check.IsNil) 216 v.Set("filters", filterJSON) 217 218 status, body, err := sockRequest("GET", "/networks?"+v.Encode(), nil) 219 c.Assert(status, check.Equals, http.StatusOK) 220 c.Assert(err, check.IsNil) 221 222 nJSON := []types.NetworkResource{} 223 err = json.Unmarshal(body, &nJSON) 224 c.Assert(err, check.IsNil) 225 c.Assert(len(nJSON), check.Equals, 1) 226 227 return nJSON[0].ID 228 } 229 230 func getNetworkResource(c *check.C, id string) *types.NetworkResource { 231 _, obj, err := sockRequest("GET", "/networks/"+id, nil) 232 c.Assert(err, check.IsNil) 233 234 nr := types.NetworkResource{} 235 err = json.Unmarshal(obj, &nr) 236 c.Assert(err, check.IsNil) 237 238 return &nr 239 } 240 241 func createNetwork(c *check.C, config types.NetworkCreate, shouldSucceed bool) string { 242 status, resp, err := sockRequest("POST", "/networks/create", config) 243 if !shouldSucceed { 244 c.Assert(status, check.Not(check.Equals), http.StatusCreated) 245 return "" 246 } 247 248 c.Assert(status, check.Equals, http.StatusCreated) 249 c.Assert(err, check.IsNil) 250 251 var nr types.NetworkCreateResponse 252 err = json.Unmarshal(resp, &nr) 253 c.Assert(err, check.IsNil) 254 255 return nr.ID 256 } 257 258 func connectNetwork(c *check.C, nid, cid string) { 259 config := types.NetworkConnect{ 260 Container: cid, 261 } 262 263 status, _, err := sockRequest("POST", "/networks/"+nid+"/connect", config) 264 c.Assert(status, check.Equals, http.StatusOK) 265 c.Assert(err, check.IsNil) 266 } 267 268 func disconnectNetwork(c *check.C, nid, cid string) { 269 config := types.NetworkConnect{ 270 Container: cid, 271 } 272 273 status, _, err := sockRequest("POST", "/networks/"+nid+"/disconnect", config) 274 c.Assert(status, check.Equals, http.StatusOK) 275 c.Assert(err, check.IsNil) 276 } 277 278 func deleteNetwork(c *check.C, id string, shouldSucceed bool) { 279 status, _, err := sockRequest("DELETE", "/networks/"+id, nil) 280 if !shouldSucceed { 281 c.Assert(status, check.Not(check.Equals), http.StatusOK) 282 c.Assert(err, check.NotNil) 283 return 284 } 285 c.Assert(status, check.Equals, http.StatusOK) 286 c.Assert(err, check.IsNil) 287 }