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 }