package abi import ( "context" "github.com/containers/podman/v3/libpod" "github.com/containers/podman/v3/libpod/define" "github.com/containers/podman/v3/pkg/domain/entities" "github.com/containers/podman/v3/pkg/domain/entities/reports" "github.com/containers/podman/v3/pkg/domain/filters" "github.com/containers/podman/v3/pkg/domain/infra/abi/parse" "github.com/pkg/errors" ) func (ic *ContainerEngine) VolumeCreate(ctx context.Context, opts entities.VolumeCreateOptions) (*entities.IDOrNameResponse, error) { var ( volumeOptions []libpod.VolumeCreateOption ) if len(opts.Name) > 0 { volumeOptions = append(volumeOptions, libpod.WithVolumeName(opts.Name)) } if len(opts.Driver) > 0 { volumeOptions = append(volumeOptions, libpod.WithVolumeDriver(opts.Driver)) } if len(opts.Label) > 0 { volumeOptions = append(volumeOptions, libpod.WithVolumeLabels(opts.Label)) } if len(opts.Options) > 0 { parsedOptions, err := parse.VolumeOptions(opts.Options) if err != nil { return nil, err } volumeOptions = append(volumeOptions, parsedOptions...) } vol, err := ic.Libpod.NewVolume(ctx, volumeOptions...) if err != nil { return nil, err } return &entities.IDOrNameResponse{IDOrName: vol.Name()}, nil } func (ic *ContainerEngine) VolumeRm(ctx context.Context, namesOrIds []string, opts entities.VolumeRmOptions) ([]*entities.VolumeRmReport, error) { var ( err error vols []*libpod.Volume reports = []*entities.VolumeRmReport{} ) if opts.All { vols, err = ic.Libpod.Volumes() if err != nil { return nil, err } } else { for _, id := range namesOrIds { vol, err := ic.Libpod.LookupVolume(id) if err != nil { reports = append(reports, &entities.VolumeRmReport{ Err: err, Id: id, }) continue } vols = append(vols, vol) } } for _, vol := range vols { reports = append(reports, &entities.VolumeRmReport{ Err: ic.Libpod.RemoveVolume(ctx, vol, opts.Force), Id: vol.Name(), }) } return reports, nil } func (ic *ContainerEngine) VolumeInspect(ctx context.Context, namesOrIds []string, opts entities.InspectOptions) ([]*entities.VolumeInspectReport, []error, error) { var ( err error errs []error vols []*libpod.Volume ) // Note: as with previous implementation, a single failure here // results a return. if opts.All { vols, err = ic.Libpod.GetAllVolumes() if err != nil { return nil, nil, err } } else { for _, v := range namesOrIds { vol, err := ic.Libpod.LookupVolume(v) if err != nil { if errors.Cause(err) == define.ErrNoSuchVolume { errs = append(errs, errors.Errorf("no such volume %s", v)) continue } else { return nil, nil, errors.Wrapf(err, "error inspecting volume %s", v) } } vols = append(vols, vol) } } reports := make([]*entities.VolumeInspectReport, 0, len(vols)) for _, v := range vols { inspectOut, err := v.Inspect() if err != nil { return nil, nil, err } config := entities.VolumeConfigResponse{ InspectVolumeData: *inspectOut, } reports = append(reports, &entities.VolumeInspectReport{VolumeConfigResponse: &config}) } return reports, errs, nil } func (ic *ContainerEngine) VolumePrune(ctx context.Context, options entities.VolumePruneOptions) ([]*reports.PruneReport, error) { filterFuncs, err := filters.GenerateVolumeFilters(options.Filters) if err != nil { return nil, err } return ic.pruneVolumesHelper(ctx, filterFuncs) } func (ic *ContainerEngine) pruneVolumesHelper(ctx context.Context, filterFuncs []libpod.VolumeFilter) ([]*reports.PruneReport, error) { pruned, err := ic.Libpod.PruneVolumes(ctx, filterFuncs) if err != nil { return nil, err } return pruned, nil } func (ic *ContainerEngine) VolumeList(ctx context.Context, opts entities.VolumeListOptions) ([]*entities.VolumeListReport, error) { volumeFilters, err := filters.GenerateVolumeFilters(opts.Filter) if err != nil { return nil, err } vols, err := ic.Libpod.Volumes(volumeFilters...) if err != nil { return nil, err } reports := make([]*entities.VolumeListReport, 0, len(vols)) for _, v := range vols { inspectOut, err := v.Inspect() if err != nil { return nil, err } config := entities.VolumeConfigResponse{ InspectVolumeData: *inspectOut, } reports = append(reports, &entities.VolumeListReport{VolumeConfigResponse: config}) } return reports, nil } // VolumeExists check if a given volume name exists func (ic *ContainerEngine) VolumeExists(ctx context.Context, nameOrID string) (*entities.BoolReport, error) { exists, err := ic.Libpod.HasVolume(nameOrID) if err != nil { return nil, err } return &entities.BoolReport{Value: exists}, nil }