Browse code

Implement docker volume with standalone client lib.

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

David Calavera authored on 2015/12/05 05:17:23
Showing 2 changed files
1 1
new file mode 100644
... ...
@@ -0,0 +1,62 @@
0
+package lib
1
+
2
+import (
3
+	"encoding/json"
4
+	"net/url"
5
+
6
+	"github.com/docker/docker/api/types"
7
+	"github.com/docker/docker/pkg/parsers/filters"
8
+)
9
+
10
+// VolumeList returns the volumes configured in the docker host.
11
+func (cli *Client) VolumeList(filter filters.Args) (types.VolumesListResponse, error) {
12
+	var volumes types.VolumesListResponse
13
+	var query url.Values
14
+
15
+	if filter.Len() > 0 {
16
+		filterJSON, err := filters.ToParam(filter)
17
+		if err != nil {
18
+			return volumes, err
19
+		}
20
+		query.Set("filters", filterJSON)
21
+	}
22
+	resp, err := cli.GET("/volumes", query, nil)
23
+	if err != nil {
24
+		return volumes, err
25
+	}
26
+	defer ensureReaderClosed(resp)
27
+
28
+	err = json.NewDecoder(resp.body).Decode(&volumes)
29
+	return volumes, err
30
+}
31
+
32
+// VolumeInspect returns the information about a specific volume in the docker host.
33
+func (cli *Client) VolumeInspect(volumeID string) (types.Volume, error) {
34
+	var volume types.Volume
35
+	resp, err := cli.GET("/volumes"+volumeID, nil, nil)
36
+	if err != nil {
37
+		return volume, err
38
+	}
39
+	defer ensureReaderClosed(resp)
40
+	err = json.NewDecoder(resp.body).Decode(&volume)
41
+	return volume, err
42
+}
43
+
44
+// VolumeCreate creates a volume in the docker host.
45
+func (cli *Client) VolumeCreate(options types.VolumeCreateRequest) (types.Volume, error) {
46
+	var volume types.Volume
47
+	resp, err := cli.POST("/volumes/create", nil, options, nil)
48
+	if err != nil {
49
+		return volume, err
50
+	}
51
+	defer ensureReaderClosed(resp)
52
+	err = json.NewDecoder(resp.body).Decode(&volume)
53
+	return volume, err
54
+}
55
+
56
+// VolumeRemove removes a volume from the docker host.
57
+func (cli *Client) VolumeRemove(volumeID string) error {
58
+	resp, err := cli.DELETE("/volumes"+volumeID, nil, nil)
59
+	ensureReaderClosed(resp)
60
+	return err
61
+}
... ...
@@ -5,8 +5,6 @@ import (
5 5
 	"encoding/json"
6 6
 	"fmt"
7 7
 	"io"
8
-	"net/http"
9
-	"net/url"
10 8
 	"text/tabwriter"
11 9
 	"text/template"
12 10
 
... ...
@@ -64,25 +62,11 @@ func (cli *DockerCli) CmdVolumeLs(args ...string) error {
64 64
 		}
65 65
 	}
66 66
 
67
-	v := url.Values{}
68
-	if volFilterArgs.Len() > 0 {
69
-		filterJSON, err := filters.ToParam(volFilterArgs)
70
-		if err != nil {
71
-			return err
72
-		}
73
-		v.Set("filters", filterJSON)
74
-	}
75
-
76
-	resp, err := cli.call("GET", "/volumes?"+v.Encode(), nil, nil)
67
+	volumes, err := cli.client.VolumeList(volFilterArgs)
77 68
 	if err != nil {
78 69
 		return err
79 70
 	}
80 71
 
81
-	var volumes types.VolumesListResponse
82
-	if err := json.NewDecoder(resp.body).Decode(&volumes); err != nil {
83
-		return err
84
-	}
85
-
86 72
 	w := tabwriter.NewWriter(cli.out, 20, 1, 3, ' ', 0)
87 73
 	if !*quiet {
88 74
 		fmt.Fprintf(w, "DRIVER \tVOLUME NAME")
... ...
@@ -127,18 +111,8 @@ func (cli *DockerCli) CmdVolumeInspect(args ...string) error {
127 127
 	var volumes []*types.Volume
128 128
 
129 129
 	for _, name := range cmd.Args() {
130
-		resp, err := cli.call("GET", "/volumes/"+name, nil, nil)
130
+		volume, err := cli.client.VolumeInspect(name)
131 131
 		if err != nil {
132
-			if resp.statusCode != http.StatusNotFound {
133
-				return err
134
-			}
135
-			status = 1
136
-			fmt.Fprintf(cli.err, "Error: No such volume: %s\n", name)
137
-			continue
138
-		}
139
-
140
-		var volume types.Volume
141
-		if err := json.NewDecoder(resp.body).Decode(&volume); err != nil {
142 132
 			fmt.Fprintf(cli.err, "Unable to read inspect data: %v\n", err)
143 133
 			status = 1
144 134
 			break
... ...
@@ -192,24 +166,17 @@ func (cli *DockerCli) CmdVolumeCreate(args ...string) error {
192 192
 	cmd.Require(flag.Exact, 0)
193 193
 	cmd.ParseFlags(args, true)
194 194
 
195
-	volReq := &types.VolumeCreateRequest{
195
+	volReq := types.VolumeCreateRequest{
196 196
 		Driver:     *flDriver,
197 197
 		DriverOpts: flDriverOpts.GetAll(),
198
+		Name:       *flName,
198 199
 	}
199 200
 
200
-	if *flName != "" {
201
-		volReq.Name = *flName
202
-	}
203
-
204
-	resp, err := cli.call("POST", "/volumes/create", volReq, nil)
201
+	vol, err := cli.client.VolumeCreate(volReq)
205 202
 	if err != nil {
206 203
 		return err
207 204
 	}
208 205
 
209
-	var vol types.Volume
210
-	if err := json.NewDecoder(resp.body).Decode(&vol); err != nil {
211
-		return err
212
-	}
213 206
 	fmt.Fprintf(cli.out, "%s\n", vol.Name)
214 207
 	return nil
215 208
 }
... ...
@@ -224,8 +191,7 @@ func (cli *DockerCli) CmdVolumeRm(args ...string) error {
224 224
 
225 225
 	var status = 0
226 226
 	for _, name := range cmd.Args() {
227
-		_, err := cli.call("DELETE", "/volumes/"+name, nil, nil)
228
-		if err != nil {
227
+		if err := cli.client.VolumeRemove(name); err != nil {
229 228
 			fmt.Fprintf(cli.err, "%s\n", err)
230 229
 			status = 1
231 230
 			continue