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  }