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  }