Skip to content

Commit 43153ef

Browse files
committed
Remove libnetwork dependency
- Add IPAMData struct - Fix response functions - Fix wonky IPAM structs Signed-off-by: Dave Tucker <dave@dtucker.co.uk>
1 parent d33002a commit 43153ef

File tree

2 files changed

+154
-13
lines changed

2 files changed

+154
-13
lines changed

api.go

Lines changed: 33 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@ import (
66
"net"
77
"net/http"
88
"os"
9-
10-
"github.com/docker/libnetwork/driverapi"
119
)
1210

1311
const (
@@ -41,8 +39,15 @@ type Driver interface {
4139
type CreateNetworkRequest struct {
4240
NetworkID string
4341
Options map[string]interface{}
44-
IpV4Data []driverapi.IPAMData
45-
ipV6Data []driverapi.IPAMData
42+
IPv4Data []IPAMData
43+
IPv6Data []IPAMData
44+
}
45+
46+
type IPAMData struct {
47+
AddressSpace string
48+
Pool *net.IPNet
49+
Gateway *net.IPNet
50+
AuxAddresses map[string]*net.IPNet
4651
}
4752

4853
type DeleteNetworkRequest struct {
@@ -133,8 +138,9 @@ func (h *Handler) initMux() {
133138

134139
h.mux.HandleFunc(createNetworkPath, func(w http.ResponseWriter, r *http.Request) {
135140
req := &CreateNetworkRequest{}
136-
err := decodeRequest(w, r, req)
141+
err := decodeRequest(r, req)
137142
if err != nil {
143+
badRequestResponse(w)
138144
return
139145
}
140146
err = h.driver.CreateNetwork(req)
@@ -146,8 +152,9 @@ func (h *Handler) initMux() {
146152
})
147153
h.mux.HandleFunc(deleteNetworkPath, func(w http.ResponseWriter, r *http.Request) {
148154
req := &DeleteNetworkRequest{}
149-
err := decodeRequest(w, r, req)
155+
err := decodeRequest(r, req)
150156
if err != nil {
157+
badRequestResponse(w)
151158
return
152159
}
153160
err = h.driver.DeleteNetwork(req)
@@ -159,8 +166,9 @@ func (h *Handler) initMux() {
159166
})
160167
h.mux.HandleFunc(createEndpointPath, func(w http.ResponseWriter, r *http.Request) {
161168
req := &CreateEndpointRequest{}
162-
err := decodeRequest(w, r, req)
169+
err := decodeRequest(r, req)
163170
if err != nil {
171+
badRequestResponse(w)
164172
return
165173
}
166174
err = h.driver.CreateEndpoint(req)
@@ -172,8 +180,9 @@ func (h *Handler) initMux() {
172180
})
173181
h.mux.HandleFunc(deleteEndpointPath, func(w http.ResponseWriter, r *http.Request) {
174182
req := &DeleteEndpointRequest{}
175-
err := decodeRequest(w, r, req)
183+
err := decodeRequest(r, req)
176184
if err != nil {
185+
badRequestResponse(w)
177186
return
178187
}
179188
err = h.driver.DeleteEndpoint(req)
@@ -185,8 +194,9 @@ func (h *Handler) initMux() {
185194
})
186195
h.mux.HandleFunc(joinPath, func(w http.ResponseWriter, r *http.Request) {
187196
req := &JoinRequest{}
188-
err := decodeRequest(w, r, req)
197+
err := decodeRequest(r, req)
189198
if err != nil {
199+
badRequestResponse(w)
190200
return
191201
}
192202
res, err := h.driver.Join(req)
@@ -198,8 +208,9 @@ func (h *Handler) initMux() {
198208
})
199209
h.mux.HandleFunc(leavePath, func(w http.ResponseWriter, r *http.Request) {
200210
req := &LeaveRequest{}
201-
err := decodeRequest(w, r, req)
211+
err := decodeRequest(r, req)
202212
if err != nil {
213+
badRequestResponse(w)
203214
return
204215
}
205216
err = h.driver.Leave(req)
@@ -255,28 +266,37 @@ func (h *Handler) listenAndServe(proto, addr, group string) error {
255266
return server.Serve(l)
256267
}
257268

258-
func decodeRequest(w http.ResponseWriter, r *http.Request, req interface{}) error {
269+
func decodeRequest(r *http.Request, req interface{}) error {
259270
if err := json.NewDecoder(r.Body).Decode(req); err != nil {
260-
http.Error(w, err.Error(), http.StatusBadRequest)
261271
return err
262272
}
263273
return nil
264274
}
265275

276+
func badRequestResponse(w http.ResponseWriter) {
277+
w.Header().Set("Content-Type", defaultContentTypeV1_1)
278+
w.WriteHeader(http.StatusBadRequest)
279+
json.NewEncoder(w).Encode(map[string]string{
280+
"Err": "Failed to decode request",
281+
})
282+
}
283+
266284
func errorResponse(w http.ResponseWriter, err error) {
267285
w.Header().Set("Content-Type", defaultContentTypeV1_1)
286+
w.WriteHeader(http.StatusInternalServerError)
268287
json.NewEncoder(w).Encode(map[string]string{
269288
"Err": err.Error(),
270289
})
271-
w.WriteHeader(http.StatusInternalServerError)
272290
}
273291

274292
func objectResponse(w http.ResponseWriter, obj interface{}) {
275293
w.Header().Set("Content-Type", defaultContentTypeV1_1)
294+
w.WriteHeader(http.StatusOK)
276295
json.NewEncoder(w).Encode(obj)
277296
}
278297

279298
func successResponse(w http.ResponseWriter) {
280299
w.Header().Set("Content-Type", defaultContentTypeV1_1)
281300
w.WriteHeader(http.StatusOK)
301+
fmt.Fprintln(w, "")
282302
}

api_test.go

Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
package dknet
2+
3+
import (
4+
"bytes"
5+
"encoding/json"
6+
"io/ioutil"
7+
"net/http"
8+
"testing"
9+
10+
. "gopkg.in/check.v1"
11+
)
12+
13+
type TestDriver struct {
14+
Driver
15+
}
16+
17+
func (t *TestDriver) CreateNetwork(r *CreateNetworkRequest) error {
18+
return nil
19+
}
20+
21+
func (t *TestDriver) DeleteNetwork(r *DeleteNetworkRequest) error {
22+
return nil
23+
}
24+
25+
func (t *TestDriver) CreateEndpoint(r *CreateEndpointRequest) error {
26+
return nil
27+
}
28+
29+
func (t *TestDriver) DeleteEndpoint(r *DeleteEndpointRequest) error {
30+
return nil
31+
}
32+
33+
func (t *TestDriver) Join(r *JoinRequest) (*JoinResponse, error) {
34+
return &JoinResponse{}, nil
35+
}
36+
37+
func (t *TestDriver) Leave(r *LeaveRequest) error {
38+
return nil
39+
}
40+
41+
// Hook up gocheck into the "go test" runner.
42+
func Test(t *testing.T) { TestingT(t) }
43+
44+
type MySuite struct {
45+
h *Handler
46+
}
47+
48+
var _ = Suite(&MySuite{})
49+
50+
func (s *MySuite) SetUpSuite(c *C) {
51+
d := &TestDriver{}
52+
s.h = NewHandler(d)
53+
go s.h.ServeTCP("test", ":8080")
54+
}
55+
56+
func (s *MySuite) TestActivate(c *C) {
57+
response, err := http.Get("http://localhost:8080/Plugin.Activate")
58+
if err != nil {
59+
c.Fatal(err)
60+
}
61+
defer response.Body.Close()
62+
body, err := ioutil.ReadAll(response.Body)
63+
64+
c.Assert(string(body), Equals, defaultImplementationManifest+"\n")
65+
66+
}
67+
68+
func (s *MySuite) TestCapabilitiesExchange(c *C) {
69+
response, err := http.Get("http://localhost:8080/NetworkDriver.GetCapabilities")
70+
if err != nil {
71+
c.Fatal(err)
72+
}
73+
defer response.Body.Close()
74+
body, err := ioutil.ReadAll(response.Body)
75+
76+
c.Assert(string(body), Equals, defaultScope+"\n")
77+
78+
}
79+
80+
func (s *MySuite) TestCreateNetwork400(c *C) {
81+
response, err := http.Post("http://localhost:8080/NetworkDriver.CreateNetwork",
82+
defaultContentTypeV1_1,
83+
nil)
84+
if err != nil {
85+
c.Fatal(err)
86+
}
87+
defer response.Body.Close()
88+
body, err := ioutil.ReadAll(response.Body)
89+
90+
c.Assert(response.StatusCode, Equals, http.StatusBadRequest)
91+
c.Assert(string(body), Equals, `{"Err":"Failed to decode request"}`+"\n")
92+
93+
}
94+
95+
func (s *MySuite) TestCreateNetwork200(c *C) {
96+
request := CreateNetworkRequest{
97+
NetworkID: "test",
98+
IPv4Data: []IPAMData{
99+
IPAMData{AddressSpace: "172.18.0.0/16"},
100+
},
101+
}
102+
103+
data, err := json.Marshal(request)
104+
if err != nil {
105+
c.Fatal(err)
106+
}
107+
108+
response, err := http.Post("http://localhost:8080/NetworkDriver.CreateNetwork",
109+
defaultContentTypeV1_1,
110+
bytes.NewBuffer(data),
111+
)
112+
if err != nil {
113+
c.Fatal(err)
114+
}
115+
defer response.Body.Close()
116+
body, err := ioutil.ReadAll(response.Body)
117+
118+
c.Assert(response.StatusCode, Equals, http.StatusOK)
119+
c.Assert(string(body), Equals, "\n")
120+
121+
}

0 commit comments

Comments
 (0)