github.com/containers/podman/v2@v2.2.2-0.20210501105131-c1e07d070c4c/pkg/bindings/volumes/volumes.go (about) 1 package volumes 2 3 import ( 4 "context" 5 "net/http" 6 "net/url" 7 "strconv" 8 "strings" 9 10 "github.com/containers/podman/v2/pkg/bindings" 11 "github.com/containers/podman/v2/pkg/domain/entities" 12 jsoniter "github.com/json-iterator/go" 13 ) 14 15 // Create creates a volume given its configuration. 16 func Create(ctx context.Context, config entities.VolumeCreateOptions) (*entities.VolumeConfigResponse, error) { 17 var ( 18 v entities.VolumeConfigResponse 19 ) 20 conn, err := bindings.GetClient(ctx) 21 if err != nil { 22 return nil, err 23 } 24 createString, err := jsoniter.MarshalToString(config) 25 if err != nil { 26 return nil, err 27 } 28 stringReader := strings.NewReader(createString) 29 response, err := conn.DoRequest(stringReader, http.MethodPost, "/volumes/create", nil, nil) 30 if err != nil { 31 return nil, err 32 } 33 return &v, response.Process(&v) 34 } 35 36 // Inspect returns low-level information about a volume. 37 func Inspect(ctx context.Context, nameOrID string) (*entities.VolumeConfigResponse, error) { 38 var ( 39 inspect entities.VolumeConfigResponse 40 ) 41 conn, err := bindings.GetClient(ctx) 42 if err != nil { 43 return nil, err 44 } 45 response, err := conn.DoRequest(nil, http.MethodGet, "/volumes/%s/json", nil, nil, nameOrID) 46 if err != nil { 47 return &inspect, err 48 } 49 return &inspect, response.Process(&inspect) 50 } 51 52 // List returns the configurations for existing volumes in the form of a slice. Optionally, filters 53 // can be used to refine the list of volumes. 54 func List(ctx context.Context, filters map[string][]string) ([]*entities.VolumeListReport, error) { 55 var ( 56 vols []*entities.VolumeListReport 57 ) 58 conn, err := bindings.GetClient(ctx) 59 if err != nil { 60 return nil, err 61 } 62 params := url.Values{} 63 if len(filters) > 0 { 64 strFilters, err := bindings.FiltersToString(filters) 65 if err != nil { 66 return nil, err 67 } 68 params.Set("filters", strFilters) 69 } 70 response, err := conn.DoRequest(nil, http.MethodGet, "/volumes/json", params, nil) 71 if err != nil { 72 return vols, err 73 } 74 return vols, response.Process(&vols) 75 } 76 77 // Prune removes unused volumes from the local filesystem. 78 func Prune(ctx context.Context) ([]*entities.VolumePruneReport, error) { 79 var ( 80 pruned []*entities.VolumePruneReport 81 ) 82 conn, err := bindings.GetClient(ctx) 83 if err != nil { 84 return nil, err 85 } 86 response, err := conn.DoRequest(nil, http.MethodPost, "/volumes/prune", nil, nil) 87 if err != nil { 88 return nil, err 89 } 90 return pruned, response.Process(&pruned) 91 } 92 93 // Remove deletes the given volume from storage. The optional force parameter 94 // is used to remove a volume even if it is being used by a container. 95 func Remove(ctx context.Context, nameOrID string, force *bool) error { 96 conn, err := bindings.GetClient(ctx) 97 if err != nil { 98 return err 99 } 100 params := url.Values{} 101 if force != nil { 102 params.Set("force", strconv.FormatBool(*force)) 103 } 104 response, err := conn.DoRequest(nil, http.MethodDelete, "/volumes/%s", params, nil, nameOrID) 105 if err != nil { 106 return err 107 } 108 return response.Process(nil) 109 }