123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 |
- // Copyright 2015 go-dockerclient authors. All rights reserved.
- // Use of this source code is governed by a BSD-style
- // license that can be found in the LICENSE file.
- package docker
- import (
- "encoding/json"
- "errors"
- "net/http"
- )
- var (
- // ErrNoSuchVolume is the error returned when the volume does not exist.
- ErrNoSuchVolume = errors.New("no such volume")
- // ErrVolumeInUse is the error returned when the volume requested to be removed is still in use.
- ErrVolumeInUse = errors.New("volume in use and cannot be removed")
- )
- // Volume represents a volume.
- //
- // See https://goo.gl/FZA4BK for more details.
- type Volume struct {
- Name string `json:"Name" yaml:"Name"`
- Driver string `json:"Driver,omitempty" yaml:"Driver,omitempty"`
- Mountpoint string `json:"Mountpoint,omitempty" yaml:"Mountpoint,omitempty"`
- Labels map[string]string `json:"Labels,omitempty" yaml:"Labels,omitempty"`
- }
- // ListVolumesOptions specify parameters to the ListVolumes function.
- //
- // See https://goo.gl/FZA4BK for more details.
- type ListVolumesOptions struct {
- Filters map[string][]string
- }
- // ListVolumes returns a list of available volumes in the server.
- //
- // See https://goo.gl/FZA4BK for more details.
- func (c *Client) ListVolumes(opts ListVolumesOptions) ([]Volume, error) {
- resp, err := c.do("GET", "/volumes?"+queryString(opts), doOptions{})
- if err != nil {
- return nil, err
- }
- defer resp.Body.Close()
- m := make(map[string]interface{})
- if err := json.NewDecoder(resp.Body).Decode(&m); err != nil {
- return nil, err
- }
- var volumes []Volume
- volumesJSON, ok := m["Volumes"]
- if !ok {
- return volumes, nil
- }
- data, err := json.Marshal(volumesJSON)
- if err != nil {
- return nil, err
- }
- if err := json.Unmarshal(data, &volumes); err != nil {
- return nil, err
- }
- return volumes, nil
- }
- // CreateVolumeOptions specify parameters to the CreateVolume function.
- //
- // See https://goo.gl/pBUbZ9 for more details.
- type CreateVolumeOptions struct {
- Name string
- Driver string
- DriverOpts map[string]string
- }
- // CreateVolume creates a volume on the server.
- //
- // See https://goo.gl/pBUbZ9 for more details.
- func (c *Client) CreateVolume(opts CreateVolumeOptions) (*Volume, error) {
- resp, err := c.do("POST", "/volumes/create", doOptions{data: opts})
- if err != nil {
- return nil, err
- }
- defer resp.Body.Close()
- var volume Volume
- if err := json.NewDecoder(resp.Body).Decode(&volume); err != nil {
- return nil, err
- }
- return &volume, nil
- }
- // InspectVolume returns a volume by its name.
- //
- // See https://goo.gl/0g9A6i for more details.
- func (c *Client) InspectVolume(name string) (*Volume, error) {
- resp, err := c.do("GET", "/volumes/"+name, doOptions{})
- if err != nil {
- if e, ok := err.(*Error); ok && e.Status == http.StatusNotFound {
- return nil, ErrNoSuchVolume
- }
- return nil, err
- }
- defer resp.Body.Close()
- var volume Volume
- if err := json.NewDecoder(resp.Body).Decode(&volume); err != nil {
- return nil, err
- }
- return &volume, nil
- }
- // RemoveVolume removes a volume by its name.
- //
- // See https://goo.gl/79GNQz for more details.
- func (c *Client) RemoveVolume(name string) error {
- resp, err := c.do("DELETE", "/volumes/"+name, doOptions{})
- if err != nil {
- if e, ok := err.(*Error); ok {
- if e.Status == http.StatusNotFound {
- return ErrNoSuchVolume
- }
- if e.Status == http.StatusConflict {
- return ErrVolumeInUse
- }
- }
- return nil
- }
- defer resp.Body.Close()
- return nil
- }
|