github.com/containers/podman/v4@v4.9.4/pkg/bindings/volumes/volumes.go (about) 1 package volumes 2 3 import ( 4 "context" 5 "net/http" 6 "strings" 7 8 "github.com/containers/podman/v4/pkg/bindings" 9 "github.com/containers/podman/v4/pkg/domain/entities" 10 "github.com/containers/podman/v4/pkg/domain/entities/reports" 11 jsoniter "github.com/json-iterator/go" 12 ) 13 14 // Create creates a volume given its configuration. 15 func Create(ctx context.Context, config entities.VolumeCreateOptions, options *CreateOptions) (*entities.VolumeConfigResponse, error) { 16 var ( 17 v entities.VolumeConfigResponse 18 ) 19 if options == nil { 20 options = new(CreateOptions) 21 } 22 _ = options 23 conn, err := bindings.GetClient(ctx) 24 if err != nil { 25 return nil, err 26 } 27 createString, err := jsoniter.MarshalToString(config) 28 if err != nil { 29 return nil, err 30 } 31 stringReader := strings.NewReader(createString) 32 response, err := conn.DoRequest(ctx, stringReader, http.MethodPost, "/volumes/create", nil, nil) 33 if err != nil { 34 return nil, err 35 } 36 defer response.Body.Close() 37 38 return &v, response.Process(&v) 39 } 40 41 // Inspect returns low-level information about a volume. 42 func Inspect(ctx context.Context, nameOrID string, options *InspectOptions) (*entities.VolumeConfigResponse, error) { 43 var ( 44 inspect entities.VolumeConfigResponse 45 ) 46 if options == nil { 47 options = new(InspectOptions) 48 } 49 _ = options 50 conn, err := bindings.GetClient(ctx) 51 if err != nil { 52 return nil, err 53 } 54 response, err := conn.DoRequest(ctx, nil, http.MethodGet, "/volumes/%s/json", nil, nil, nameOrID) 55 if err != nil { 56 return &inspect, err 57 } 58 defer response.Body.Close() 59 60 return &inspect, response.Process(&inspect) 61 } 62 63 // List returns the configurations for existing volumes in the form of a slice. Optionally, filters 64 // can be used to refine the list of volumes. 65 func List(ctx context.Context, options *ListOptions) ([]*entities.VolumeListReport, error) { 66 var ( 67 vols []*entities.VolumeListReport 68 ) 69 conn, err := bindings.GetClient(ctx) 70 if err != nil { 71 return nil, err 72 } 73 params, err := options.ToParams() 74 if err != nil { 75 return nil, err 76 } 77 response, err := conn.DoRequest(ctx, nil, http.MethodGet, "/volumes/json", params, nil) 78 if err != nil { 79 return vols, err 80 } 81 defer response.Body.Close() 82 83 return vols, response.Process(&vols) 84 } 85 86 // Prune removes unused volumes from the local filesystem. 87 func Prune(ctx context.Context, options *PruneOptions) ([]*reports.PruneReport, error) { 88 var ( 89 pruned []*reports.PruneReport 90 ) 91 conn, err := bindings.GetClient(ctx) 92 if err != nil { 93 return nil, err 94 } 95 params, err := options.ToParams() 96 if err != nil { 97 return nil, err 98 } 99 response, err := conn.DoRequest(ctx, nil, http.MethodPost, "/volumes/prune", params, nil) 100 if err != nil { 101 return nil, err 102 } 103 defer response.Body.Close() 104 105 return pruned, response.Process(&pruned) 106 } 107 108 // Remove deletes the given volume from storage. The optional force parameter 109 // is used to remove a volume even if it is being used by a container. 110 func Remove(ctx context.Context, nameOrID string, options *RemoveOptions) error { 111 conn, err := bindings.GetClient(ctx) 112 if err != nil { 113 return err 114 } 115 params, err := options.ToParams() 116 if err != nil { 117 return err 118 } 119 response, err := conn.DoRequest(ctx, nil, http.MethodDelete, "/volumes/%s", params, nil, nameOrID) 120 if err != nil { 121 return err 122 } 123 defer response.Body.Close() 124 125 return response.Process(nil) 126 } 127 128 // Exists returns true if a given volume exists 129 func Exists(ctx context.Context, nameOrID string, options *ExistsOptions) (bool, error) { 130 conn, err := bindings.GetClient(ctx) 131 if err != nil { 132 return false, err 133 } 134 response, err := conn.DoRequest(ctx, nil, http.MethodGet, "/volumes/%s/exists", nil, nil, nameOrID) 135 if err != nil { 136 return false, err 137 } 138 defer response.Body.Close() 139 140 return response.IsSuccess(), nil 141 }