Signed-off-by: David Calavera <david.calavera@gmail.com>
| 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 |