Browse code

Implement docker network with standalone client lib.

Signed-off-by: David Calavera <david.calavera@gmail.com>

David Calavera authored on 2015/12/05 01:33:00
Showing 3 changed files
1 1
new file mode 100644
... ...
@@ -0,0 +1,67 @@
0
+package lib
1
+
2
+import (
3
+	"encoding/json"
4
+
5
+	"github.com/docker/docker/api/types"
6
+)
7
+
8
+// NetworkCreate creates a new network in the docker host.
9
+func (cli *Client) NetworkCreate(options types.NetworkCreate) (types.NetworkCreateResponse, error) {
10
+	var response types.NetworkCreateResponse
11
+	serverResp, err := cli.POST("/networks/create", nil, options, nil)
12
+	if err != nil {
13
+		return response, err
14
+	}
15
+
16
+	json.NewDecoder(serverResp.body).Decode(&response)
17
+	ensureReaderClosed(serverResp)
18
+	return response, err
19
+}
20
+
21
+// NetworkRemove removes an existent network from the docker host.
22
+func (cli *Client) NetworkRemove(networkID string) error {
23
+	resp, err := cli.DELETE("/networks/"+networkID, nil, nil)
24
+	ensureReaderClosed(resp)
25
+	return err
26
+}
27
+
28
+// NetworkConnect connects a container to an existent network in the docker host.
29
+func (cli *Client) NetworkConnect(networkID, containerID string) error {
30
+	nc := types.NetworkConnect{containerID}
31
+	resp, err := cli.POST("/networks/"+networkID+"/connect", nil, nc, nil)
32
+	ensureReaderClosed(resp)
33
+	return err
34
+}
35
+
36
+// NetworkDisconnect disconnects a container from an existent network in the docker host.
37
+func (cli *Client) NetworkDisconnect(networkID, containerID string) error {
38
+	nc := types.NetworkConnect{containerID}
39
+	resp, err := cli.POST("/networks/"+networkID+"/disconnect", nil, nc, nil)
40
+	ensureReaderClosed(resp)
41
+	return err
42
+}
43
+
44
+// NetworkList returns the list of networks configured in the docker host.
45
+func (cli *Client) NetworkList() ([]types.NetworkResource, error) {
46
+	var networkResources []types.NetworkResource
47
+	resp, err := cli.GET("/networks", nil, nil)
48
+	if err != nil {
49
+		return networkResources, err
50
+	}
51
+	defer ensureReaderClosed(resp)
52
+	err = json.NewDecoder(resp.body).Decode(&networkResources)
53
+	return networkResources, err
54
+}
55
+
56
+// NetworkInspect returns the information for a specific network configured in the docker host.
57
+func (cli *Client) NetworkInspect(networkID string) (types.NetworkResource, error) {
58
+	var networkResource types.NetworkResource
59
+	resp, err := cli.GET("/networks/"+networkID, nil, nil)
60
+	if err != nil {
61
+		return networkResource, err
62
+	}
63
+	defer ensureReaderClosed(resp)
64
+	err = json.NewDecoder(resp.body).Decode(&networkResource)
65
+	return networkResource, err
66
+}
... ...
@@ -148,7 +148,11 @@ func encodeData(data interface{}) (*bytes.Buffer, error) {
148 148
 	return params, nil
149 149
 }
150 150
 
151
+<<<<<<< HEAD
151 152
 func ensureReaderClosed(response *ServerResponse) {
153
+=======
154
+func ensureReaderClosed(response *serverResponse) {
155
+>>>>>>> 9c13063... Implement docker network with standalone client lib.
152 156
 	if response != nil && response.body != nil {
153 157
 		response.body.Close()
154 158
 	}
... ...
@@ -6,7 +6,6 @@ import (
6 6
 	"fmt"
7 7
 	"io"
8 8
 	"net"
9
-	"net/http"
10 9
 	"strings"
11 10
 	"text/tabwriter"
12 11
 	"text/template"
... ...
@@ -76,12 +75,8 @@ func (cli *DockerCli) CmdNetworkCreate(args ...string) error {
76 76
 		Options:        flOpts.GetAll(),
77 77
 		CheckDuplicate: true,
78 78
 	}
79
-	obj, _, err := readBody(cli.call("POST", "/networks/create", nc, nil))
80
-	if err != nil {
81
-		return err
82
-	}
83
-	var resp types.NetworkCreateResponse
84
-	err = json.Unmarshal(obj, &resp)
79
+
80
+	resp, err := cli.client.NetworkCreate(nc)
85 81
 	if err != nil {
86 82
 		return err
87 83
 	}
... ...
@@ -95,15 +90,13 @@ func (cli *DockerCli) CmdNetworkCreate(args ...string) error {
95 95
 func (cli *DockerCli) CmdNetworkRm(args ...string) error {
96 96
 	cmd := Cli.Subcmd("network rm", []string{"NETWORK [NETWORK...]"}, "Deletes one or more networks", false)
97 97
 	cmd.Require(flag.Min, 1)
98
-	err := cmd.ParseFlags(args, true)
99
-	if err != nil {
98
+	if err := cmd.ParseFlags(args, true); err != nil {
100 99
 		return err
101 100
 	}
102 101
 
103 102
 	status := 0
104 103
 	for _, net := range cmd.Args() {
105
-		_, _, err = readBody(cli.call("DELETE", "/networks/"+net, nil, nil))
106
-		if err != nil {
104
+		if err := cli.client.NetworkRemove(net); err != nil {
107 105
 			fmt.Fprintf(cli.err, "%s\n", err)
108 106
 			status = 1
109 107
 			continue
... ...
@@ -121,14 +114,11 @@ func (cli *DockerCli) CmdNetworkRm(args ...string) error {
121 121
 func (cli *DockerCli) CmdNetworkConnect(args ...string) error {
122 122
 	cmd := Cli.Subcmd("network connect", []string{"NETWORK CONTAINER"}, "Connects a container to a network", false)
123 123
 	cmd.Require(flag.Exact, 2)
124
-	err := cmd.ParseFlags(args, true)
125
-	if err != nil {
124
+	if err := cmd.ParseFlags(args, true); err != nil {
126 125
 		return err
127 126
 	}
128 127
 
129
-	nc := types.NetworkConnect{Container: cmd.Arg(1)}
130
-	_, _, err = readBody(cli.call("POST", "/networks/"+cmd.Arg(0)+"/connect", nc, nil))
131
-	return err
128
+	return cli.client.NetworkConnect(cmd.Arg(0), cmd.Arg(1))
132 129
 }
133 130
 
134 131
 // CmdNetworkDisconnect disconnects a container from a network
... ...
@@ -137,14 +127,11 @@ func (cli *DockerCli) CmdNetworkConnect(args ...string) error {
137 137
 func (cli *DockerCli) CmdNetworkDisconnect(args ...string) error {
138 138
 	cmd := Cli.Subcmd("network disconnect", []string{"NETWORK CONTAINER"}, "Disconnects container from a network", false)
139 139
 	cmd.Require(flag.Exact, 2)
140
-	err := cmd.ParseFlags(args, true)
141
-	if err != nil {
140
+	if err := cmd.ParseFlags(args, true); err != nil {
142 141
 		return err
143 142
 	}
144 143
 
145
-	nc := types.NetworkConnect{Container: cmd.Arg(1)}
146
-	_, _, err = readBody(cli.call("POST", "/networks/"+cmd.Arg(0)+"/disconnect", nc, nil))
147
-	return err
144
+	return cli.client.NetworkDisconnect(cmd.Arg(0), cmd.Arg(1))
148 145
 }
149 146
 
150 147
 // CmdNetworkLs lists all the netorks managed by docker daemon
... ...
@@ -156,18 +143,11 @@ func (cli *DockerCli) CmdNetworkLs(args ...string) error {
156 156
 	noTrunc := cmd.Bool([]string{"-no-trunc"}, false, "Do not truncate the output")
157 157
 
158 158
 	cmd.Require(flag.Exact, 0)
159
-	err := cmd.ParseFlags(args, true)
160
-
161
-	if err != nil {
162
-		return err
163
-	}
164
-	obj, _, err := readBody(cli.call("GET", "/networks", nil, nil))
165
-	if err != nil {
159
+	if err := cmd.ParseFlags(args, true); err != nil {
166 160
 		return err
167 161
 	}
168 162
 
169
-	var networkResources []types.NetworkResource
170
-	err = json.Unmarshal(obj, &networkResources)
163
+	networkResources, err := cli.client.NetworkList()
171 164
 	if err != nil {
172 165
 		return err
173 166
 	}
... ...
@@ -225,31 +205,19 @@ func (cli *DockerCli) CmdNetworkInspect(args ...string) error {
225 225
 	var networks []types.NetworkResource
226 226
 	buf := new(bytes.Buffer)
227 227
 	for _, name := range cmd.Args() {
228
-		obj, statusCode, err := readBody(cli.call("GET", "/networks/"+name, nil, nil))
228
+		networkResource, err := cli.client.NetworkInspect(name)
229 229
 		if err != nil {
230
-			if statusCode == http.StatusNotFound {
231
-				fmt.Fprintf(cli.err, "Error: No such network: %s\n", name)
232
-			} else {
233
-				fmt.Fprintf(cli.err, "%s\n", err)
234
-			}
235
-			status = 1
236
-			continue
237
-		}
238
-		var networkResource types.NetworkResource
239
-		if err := json.NewDecoder(bytes.NewReader(obj)).Decode(&networkResource); err != nil {
240
-			return err
230
+			fmt.Fprintf(cli.err, "%s\n", err)
231
+			return Cli.StatusError{StatusCode: 1}
241 232
 		}
242
-
243 233
 		if tmpl == nil {
244 234
 			networks = append(networks, networkResource)
245 235
 			continue
246 236
 		}
247 237
 
248 238
 		if err := tmpl.Execute(buf, &networkResource); err != nil {
249
-			if err := tmpl.Execute(buf, &networkResource); err != nil {
250
-				fmt.Fprintf(cli.err, "%s\n", err)
251
-				return Cli.StatusError{StatusCode: 1}
252
-			}
239
+			fmt.Fprintf(cli.err, "%s\n", err)
240
+			return Cli.StatusError{StatusCode: 1}
253 241
 		}
254 242
 		buf.WriteString("\n")
255 243
 	}