Browse code

Fix returned error code for network creation from 500 to 409

Signed-off-by: He Xiaoxi <tossmilestone@gmail.com>

He Xiaoxi authored on 2017/09/29 11:13:44
Showing 2 changed files
... ...
@@ -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) {