Signed-off-by: He Xiaoxi <tossmilestone@gmail.com>
| ... | ... |
@@ -100,6 +100,24 @@ func (e ambigousResultsError) Error() string {
|
| 100 | 100 |
|
| 101 | 101 |
func (ambigousResultsError) InvalidParameter() {}
|
| 102 | 102 |
|
| 103 |
+type conflictError struct {
|
|
| 104 |
+ cause error |
|
| 105 |
+} |
|
| 106 |
+ |
|
| 107 |
+func (e conflictError) Error() string {
|
|
| 108 |
+ return e.cause.Error() |
|
| 109 |
+} |
|
| 110 |
+ |
|
| 111 |
+func (e conflictError) Cause() error {
|
|
| 112 |
+ return e.cause |
|
| 113 |
+} |
|
| 114 |
+ |
|
| 115 |
+func (e conflictError) Conflict() {}
|
|
| 116 |
+ |
|
| 117 |
+func nameConflict(name string) error {
|
|
| 118 |
+ return conflictError{libnetwork.NetworkNameError(name)}
|
|
| 119 |
+} |
|
| 120 |
+ |
|
| 103 | 121 |
func (n *networkRouter) getNetwork(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
| 104 | 122 |
if err := httputils.ParseForm(r); err != nil {
|
| 105 | 123 |
return err |
| ... | ... |
@@ -225,7 +243,7 @@ func (n *networkRouter) postNetworkCreate(ctx context.Context, w http.ResponseWr |
| 225 | 225 |
} |
| 226 | 226 |
|
| 227 | 227 |
if nws, err := n.cluster.GetNetworksByName(create.Name); err == nil && len(nws) > 0 {
|
| 228 |
- return libnetwork.NetworkNameError(create.Name) |
|
| 228 |
+ return nameConflict(create.Name) |
|
| 229 | 229 |
} |
| 230 | 230 |
|
| 231 | 231 |
nw, err := n.backend.CreateNetwork(create) |
| ... | ... |
@@ -235,7 +253,7 @@ func (n *networkRouter) postNetworkCreate(ctx context.Context, w http.ResponseWr |
| 235 | 235 |
// check if user defined CheckDuplicate, if set true, return err |
| 236 | 236 |
// otherwise prepare a warning message |
| 237 | 237 |
if create.CheckDuplicate {
|
| 238 |
- return libnetwork.NetworkNameError(create.Name) |
|
| 238 |
+ return nameConflict(create.Name) |
|
| 239 | 239 |
} |
| 240 | 240 |
warning = libnetwork.NetworkNameError(create.Name).Error() |
| 241 | 241 |
} |
| ... | ... |
@@ -35,7 +35,7 @@ func (s *DockerSuite) TestAPINetworkCreateDelete(c *check.C) {
|
| 35 | 35 |
CheckDuplicate: true, |
| 36 | 36 |
}, |
| 37 | 37 |
} |
| 38 |
- id := createNetwork(c, config, true) |
|
| 38 |
+ id := createNetwork(c, config, http.StatusCreated) |
|
| 39 | 39 |
c.Assert(isNetworkAvailable(c, name), checker.Equals, true) |
| 40 | 40 |
|
| 41 | 41 |
// delete the network and make sure it is deleted |
| ... | ... |
@@ -60,14 +60,14 @@ func (s *DockerSuite) TestAPINetworkCreateCheckDuplicate(c *check.C) {
|
| 60 | 60 |
} |
| 61 | 61 |
|
| 62 | 62 |
// Creating a new network first |
| 63 |
- createNetwork(c, configOnCheck, true) |
|
| 63 |
+ createNetwork(c, configOnCheck, http.StatusCreated) |
|
| 64 | 64 |
c.Assert(isNetworkAvailable(c, name), checker.Equals, true) |
| 65 | 65 |
|
| 66 | 66 |
// Creating another network with same name and CheckDuplicate must fail |
| 67 |
- createNetwork(c, configOnCheck, false) |
|
| 67 |
+ createNetwork(c, configOnCheck, http.StatusConflict) |
|
| 68 | 68 |
|
| 69 | 69 |
// Creating another network with same name and not CheckDuplicate must succeed |
| 70 |
- createNetwork(c, configNotCheck, true) |
|
| 70 |
+ createNetwork(c, configNotCheck, http.StatusCreated) |
|
| 71 | 71 |
} |
| 72 | 72 |
|
| 73 | 73 |
func (s *DockerSuite) TestAPINetworkFilter(c *check.C) {
|
| ... | ... |
@@ -114,7 +114,7 @@ func (s *DockerSuite) TestAPINetworkInspect(c *check.C) {
|
| 114 | 114 |
Options: map[string]string{"foo": "bar", "opts": "dopts"},
|
| 115 | 115 |
}, |
| 116 | 116 |
} |
| 117 |
- id0 := createNetwork(c, config, true) |
|
| 117 |
+ id0 := createNetwork(c, config, http.StatusCreated) |
|
| 118 | 118 |
c.Assert(isNetworkAvailable(c, "br0"), checker.Equals, true) |
| 119 | 119 |
|
| 120 | 120 |
nr = getNetworkResource(c, id0) |
| ... | ... |
@@ -137,7 +137,7 @@ func (s *DockerSuite) TestAPINetworkConnectDisconnect(c *check.C) {
|
| 137 | 137 |
config := types.NetworkCreateRequest{
|
| 138 | 138 |
Name: name, |
| 139 | 139 |
} |
| 140 |
- id := createNetwork(c, config, true) |
|
| 140 |
+ id := createNetwork(c, config, http.StatusCreated) |
|
| 141 | 141 |
nr := getNetworkResource(c, id) |
| 142 | 142 |
c.Assert(nr.Name, checker.Equals, name) |
| 143 | 143 |
c.Assert(nr.ID, checker.Equals, id) |
| ... | ... |
@@ -185,7 +185,7 @@ func (s *DockerSuite) TestAPINetworkIPAMMultipleBridgeNetworks(c *check.C) {
|
| 185 | 185 |
IPAM: ipam0, |
| 186 | 186 |
}, |
| 187 | 187 |
} |
| 188 |
- id0 := createNetwork(c, config0, true) |
|
| 188 |
+ id0 := createNetwork(c, config0, http.StatusCreated) |
|
| 189 | 189 |
c.Assert(isNetworkAvailable(c, "test0"), checker.Equals, true) |
| 190 | 190 |
|
| 191 | 191 |
ipam1 := &network.IPAM{
|
| ... | ... |
@@ -200,7 +200,7 @@ func (s *DockerSuite) TestAPINetworkIPAMMultipleBridgeNetworks(c *check.C) {
|
| 200 | 200 |
IPAM: ipam1, |
| 201 | 201 |
}, |
| 202 | 202 |
} |
| 203 |
- createNetwork(c, config1, false) |
|
| 203 |
+ createNetwork(c, config1, http.StatusForbidden) |
|
| 204 | 204 |
c.Assert(isNetworkAvailable(c, "test1"), checker.Equals, false) |
| 205 | 205 |
|
| 206 | 206 |
ipam2 := &network.IPAM{
|
| ... | ... |
@@ -215,20 +215,20 @@ func (s *DockerSuite) TestAPINetworkIPAMMultipleBridgeNetworks(c *check.C) {
|
| 215 | 215 |
IPAM: ipam2, |
| 216 | 216 |
}, |
| 217 | 217 |
} |
| 218 |
- createNetwork(c, config2, true) |
|
| 218 |
+ createNetwork(c, config2, http.StatusCreated) |
|
| 219 | 219 |
c.Assert(isNetworkAvailable(c, "test2"), checker.Equals, true) |
| 220 | 220 |
|
| 221 | 221 |
// remove test0 and retry to create test1 |
| 222 | 222 |
deleteNetwork(c, id0, true) |
| 223 |
- createNetwork(c, config1, true) |
|
| 223 |
+ createNetwork(c, config1, http.StatusCreated) |
|
| 224 | 224 |
c.Assert(isNetworkAvailable(c, "test1"), checker.Equals, true) |
| 225 | 225 |
|
| 226 | 226 |
// for networks w/o ipam specified, docker will choose proper non-overlapping subnets |
| 227 |
- createNetwork(c, types.NetworkCreateRequest{Name: "test3"}, true)
|
|
| 227 |
+ createNetwork(c, types.NetworkCreateRequest{Name: "test3"}, http.StatusCreated)
|
|
| 228 | 228 |
c.Assert(isNetworkAvailable(c, "test3"), checker.Equals, true) |
| 229 |
- createNetwork(c, types.NetworkCreateRequest{Name: "test4"}, true)
|
|
| 229 |
+ createNetwork(c, types.NetworkCreateRequest{Name: "test4"}, http.StatusCreated)
|
|
| 230 | 230 |
c.Assert(isNetworkAvailable(c, "test4"), checker.Equals, true) |
| 231 |
- createNetwork(c, types.NetworkCreateRequest{Name: "test5"}, true)
|
|
| 231 |
+ createNetwork(c, types.NetworkCreateRequest{Name: "test5"}, http.StatusCreated)
|
|
| 232 | 232 |
c.Assert(isNetworkAvailable(c, "test5"), checker.Equals, true) |
| 233 | 233 |
|
| 234 | 234 |
for i := 1; i < 6; i++ {
|
| ... | ... |
@@ -251,9 +251,8 @@ func createDeletePredefinedNetwork(c *check.C, name string) {
|
| 251 | 251 |
CheckDuplicate: true, |
| 252 | 252 |
}, |
| 253 | 253 |
} |
| 254 |
- shouldSucceed := false |
|
| 255 |
- createNetwork(c, config, shouldSucceed) |
|
| 256 |
- deleteNetwork(c, name, shouldSucceed) |
|
| 254 |
+ createNetwork(c, config, http.StatusForbidden) |
|
| 255 |
+ deleteNetwork(c, name, false) |
|
| 257 | 256 |
} |
| 258 | 257 |
|
| 259 | 258 |
func isNetworkAvailable(c *check.C, name string) bool {
|
| ... | ... |
@@ -307,22 +306,22 @@ func getNetworkResource(c *check.C, id string) *types.NetworkResource {
|
| 307 | 307 |
return &nr |
| 308 | 308 |
} |
| 309 | 309 |
|
| 310 |
-func createNetwork(c *check.C, config types.NetworkCreateRequest, shouldSucceed bool) string {
|
|
| 310 |
+func createNetwork(c *check.C, config types.NetworkCreateRequest, expectedStatusCode int) string {
|
|
| 311 | 311 |
resp, body, err := request.Post("/networks/create", request.JSONBody(config))
|
| 312 | 312 |
c.Assert(err, checker.IsNil) |
| 313 | 313 |
defer resp.Body.Close() |
| 314 |
- if !shouldSucceed {
|
|
| 315 |
- c.Assert(resp.StatusCode, checker.Not(checker.Equals), http.StatusCreated) |
|
| 316 |
- return "" |
|
| 317 |
- } |
|
| 318 | 314 |
|
| 319 |
- c.Assert(resp.StatusCode, checker.Equals, http.StatusCreated) |
|
| 315 |
+ c.Assert(resp.StatusCode, checker.Equals, expectedStatusCode) |
|
| 320 | 316 |
|
| 321 |
- var nr types.NetworkCreateResponse |
|
| 322 |
- err = json.NewDecoder(body).Decode(&nr) |
|
| 323 |
- c.Assert(err, checker.IsNil) |
|
| 317 |
+ if expectedStatusCode == http.StatusCreated {
|
|
| 318 |
+ var nr types.NetworkCreateResponse |
|
| 319 |
+ err = json.NewDecoder(body).Decode(&nr) |
|
| 320 |
+ c.Assert(err, checker.IsNil) |
|
| 324 | 321 |
|
| 325 |
- return nr.ID |
|
| 322 |
+ return nr.ID |
|
| 323 |
+ } else {
|
|
| 324 |
+ return "" |
|
| 325 |
+ } |
|
| 326 | 326 |
} |
| 327 | 327 |
|
| 328 | 328 |
func connectNetwork(c *check.C, nid, cid string) {
|