github.com/containers/podman/v2@v2.2.2-0.20210501105131-c1e07d070c4c/pkg/domain/infra/abi/volumes.go (about)

     1  package abi
     2  
     3  import (
     4  	"context"
     5  
     6  	"github.com/containers/podman/v2/libpod"
     7  	"github.com/containers/podman/v2/libpod/define"
     8  	"github.com/containers/podman/v2/pkg/domain/entities"
     9  	"github.com/containers/podman/v2/pkg/domain/filters"
    10  	"github.com/containers/podman/v2/pkg/domain/infra/abi/parse"
    11  	"github.com/pkg/errors"
    12  )
    13  
    14  func (ic *ContainerEngine) VolumeCreate(ctx context.Context, opts entities.VolumeCreateOptions) (*entities.IDOrNameResponse, error) {
    15  	var (
    16  		volumeOptions []libpod.VolumeCreateOption
    17  	)
    18  	if len(opts.Name) > 0 {
    19  		volumeOptions = append(volumeOptions, libpod.WithVolumeName(opts.Name))
    20  	}
    21  	if len(opts.Driver) > 0 {
    22  		volumeOptions = append(volumeOptions, libpod.WithVolumeDriver(opts.Driver))
    23  	}
    24  	if len(opts.Label) > 0 {
    25  		volumeOptions = append(volumeOptions, libpod.WithVolumeLabels(opts.Label))
    26  	}
    27  	if len(opts.Options) > 0 {
    28  		parsedOptions, err := parse.VolumeOptions(opts.Options)
    29  		if err != nil {
    30  			return nil, err
    31  		}
    32  		volumeOptions = append(volumeOptions, parsedOptions...)
    33  	}
    34  	vol, err := ic.Libpod.NewVolume(ctx, volumeOptions...)
    35  	if err != nil {
    36  		return nil, err
    37  	}
    38  	return &entities.IDOrNameResponse{IDOrName: vol.Name()}, nil
    39  }
    40  
    41  func (ic *ContainerEngine) VolumeRm(ctx context.Context, namesOrIds []string, opts entities.VolumeRmOptions) ([]*entities.VolumeRmReport, error) {
    42  	var (
    43  		err     error
    44  		vols    []*libpod.Volume
    45  		reports = []*entities.VolumeRmReport{}
    46  	)
    47  
    48  	if opts.All {
    49  		vols, err = ic.Libpod.Volumes()
    50  		if err != nil {
    51  			return nil, err
    52  		}
    53  	} else {
    54  		for _, id := range namesOrIds {
    55  			vol, err := ic.Libpod.LookupVolume(id)
    56  			if err != nil {
    57  				reports = append(reports, &entities.VolumeRmReport{
    58  					Err: err,
    59  					Id:  id,
    60  				})
    61  				continue
    62  			}
    63  			vols = append(vols, vol)
    64  		}
    65  	}
    66  	for _, vol := range vols {
    67  		reports = append(reports, &entities.VolumeRmReport{
    68  			Err: ic.Libpod.RemoveVolume(ctx, vol, opts.Force),
    69  			Id:  vol.Name(),
    70  		})
    71  	}
    72  	return reports, nil
    73  }
    74  
    75  func (ic *ContainerEngine) VolumeInspect(ctx context.Context, namesOrIds []string, opts entities.InspectOptions) ([]*entities.VolumeInspectReport, []error, error) {
    76  	var (
    77  		err  error
    78  		errs []error
    79  		vols []*libpod.Volume
    80  	)
    81  
    82  	// Note: as with previous implementation, a single failure here
    83  	// results a return.
    84  	if opts.All {
    85  		vols, err = ic.Libpod.GetAllVolumes()
    86  		if err != nil {
    87  			return nil, nil, err
    88  		}
    89  	} else {
    90  		for _, v := range namesOrIds {
    91  			vol, err := ic.Libpod.LookupVolume(v)
    92  			if err != nil {
    93  				if errors.Cause(err) == define.ErrNoSuchVolume {
    94  					errs = append(errs, errors.Errorf("no such volume %s", v))
    95  					continue
    96  				} else {
    97  					return nil, nil, errors.Wrapf(err, "error inspecting volume %s", v)
    98  				}
    99  			}
   100  			vols = append(vols, vol)
   101  		}
   102  	}
   103  	reports := make([]*entities.VolumeInspectReport, 0, len(vols))
   104  	for _, v := range vols {
   105  		var uid, gid int
   106  		uid, err = v.UID()
   107  		if err != nil {
   108  			return nil, nil, err
   109  		}
   110  		gid, err = v.GID()
   111  		if err != nil {
   112  			return nil, nil, err
   113  		}
   114  		config := entities.VolumeConfigResponse{
   115  			Name:       v.Name(),
   116  			Driver:     v.Driver(),
   117  			Mountpoint: v.MountPoint(),
   118  			CreatedAt:  v.CreatedTime(),
   119  			Labels:     v.Labels(),
   120  			Scope:      v.Scope(),
   121  			Options:    v.Options(),
   122  			UID:        uid,
   123  			GID:        gid,
   124  		}
   125  		reports = append(reports, &entities.VolumeInspectReport{VolumeConfigResponse: &config})
   126  	}
   127  	return reports, errs, nil
   128  }
   129  
   130  func (ic *ContainerEngine) VolumePrune(ctx context.Context) ([]*entities.VolumePruneReport, error) {
   131  	return ic.pruneVolumesHelper(ctx)
   132  }
   133  
   134  func (ic *ContainerEngine) pruneVolumesHelper(ctx context.Context) ([]*entities.VolumePruneReport, error) {
   135  	pruned, err := ic.Libpod.PruneVolumes(ctx)
   136  	if err != nil {
   137  		return nil, err
   138  	}
   139  	reports := make([]*entities.VolumePruneReport, 0, len(pruned))
   140  	for k, v := range pruned {
   141  		reports = append(reports, &entities.VolumePruneReport{
   142  			Err: v,
   143  			Id:  k,
   144  		})
   145  	}
   146  	return reports, nil
   147  }
   148  
   149  func (ic *ContainerEngine) VolumeList(ctx context.Context, opts entities.VolumeListOptions) ([]*entities.VolumeListReport, error) {
   150  	volumeFilters, err := filters.GenerateVolumeFilters(opts.Filter)
   151  	if err != nil {
   152  		return nil, err
   153  	}
   154  	vols, err := ic.Libpod.Volumes(volumeFilters...)
   155  	if err != nil {
   156  		return nil, err
   157  	}
   158  	reports := make([]*entities.VolumeListReport, 0, len(vols))
   159  	for _, v := range vols {
   160  		var uid, gid int
   161  		uid, err = v.UID()
   162  		if err != nil {
   163  			return nil, err
   164  		}
   165  		gid, err = v.GID()
   166  		if err != nil {
   167  			return nil, err
   168  		}
   169  		config := entities.VolumeConfigResponse{
   170  			Name:       v.Name(),
   171  			Driver:     v.Driver(),
   172  			Mountpoint: v.MountPoint(),
   173  			CreatedAt:  v.CreatedTime(),
   174  			Labels:     v.Labels(),
   175  			Scope:      v.Scope(),
   176  			Options:    v.Options(),
   177  			UID:        uid,
   178  			GID:        gid,
   179  		}
   180  		reports = append(reports, &entities.VolumeListReport{VolumeConfigResponse: config})
   181  	}
   182  	return reports, nil
   183  }