github.com/hanks177/podman/v4@v4.1.3-0.20220613032544-16d90015bc83/pkg/domain/filters/volumes.go (about)

     1  package filters
     2  
     3  import (
     4  	"net/url"
     5  	"strings"
     6  
     7  	"github.com/hanks177/podman/v4/libpod"
     8  	"github.com/hanks177/podman/v4/pkg/util"
     9  	"github.com/pkg/errors"
    10  )
    11  
    12  func GenerateVolumeFilters(filters url.Values) ([]libpod.VolumeFilter, error) {
    13  	var vf []libpod.VolumeFilter
    14  	for filter, v := range filters {
    15  		for _, val := range v {
    16  			switch filter {
    17  			case "name":
    18  				nameVal := val
    19  				vf = append(vf, func(v *libpod.Volume) bool {
    20  					return nameVal == v.Name()
    21  				})
    22  			case "driver":
    23  				driverVal := val
    24  				vf = append(vf, func(v *libpod.Volume) bool {
    25  					return v.Driver() == driverVal
    26  				})
    27  			case "scope":
    28  				scopeVal := val
    29  				vf = append(vf, func(v *libpod.Volume) bool {
    30  					return v.Scope() == scopeVal
    31  				})
    32  			case "label":
    33  				filter := val
    34  				vf = append(vf, func(v *libpod.Volume) bool {
    35  					return util.MatchLabelFilters([]string{filter}, v.Labels())
    36  				})
    37  			case "opt":
    38  				filterArray := strings.SplitN(val, "=", 2)
    39  				filterKey := filterArray[0]
    40  				var filterVal string
    41  				if len(filterArray) > 1 {
    42  					filterVal = filterArray[1]
    43  				} else {
    44  					filterVal = ""
    45  				}
    46  				vf = append(vf, func(v *libpod.Volume) bool {
    47  					for labelKey, labelValue := range v.Options() {
    48  						if labelKey == filterKey && (filterVal == "" || labelValue == filterVal) {
    49  							return true
    50  						}
    51  					}
    52  					return false
    53  				})
    54  			case "until":
    55  				f, err := createUntilFilterVolumeFunction(val)
    56  				if err != nil {
    57  					return nil, err
    58  				}
    59  				vf = append(vf, f)
    60  			case "dangling":
    61  				danglingVal := val
    62  				invert := false
    63  				switch strings.ToLower(danglingVal) {
    64  				case "true", "1":
    65  					// Do nothing
    66  				case "false", "0":
    67  					// Dangling=false requires that we
    68  					// invert the result of IsDangling.
    69  					invert = true
    70  				default:
    71  					return nil, errors.Errorf("%q is not a valid value for the \"dangling\" filter - must be true or false", danglingVal)
    72  				}
    73  				vf = append(vf, func(v *libpod.Volume) bool {
    74  					dangling, err := v.IsDangling()
    75  					if err != nil {
    76  						return false
    77  					}
    78  					if invert {
    79  						return !dangling
    80  					}
    81  					return dangling
    82  				})
    83  			default:
    84  				return nil, errors.Errorf("%q is an invalid volume filter", filter)
    85  			}
    86  		}
    87  	}
    88  	return vf, nil
    89  }
    90  
    91  func GeneratePruneVolumeFilters(filters url.Values) ([]libpod.VolumeFilter, error) {
    92  	var vf []libpod.VolumeFilter
    93  	for filter, v := range filters {
    94  		for _, val := range v {
    95  			filterVal := val
    96  			switch filter {
    97  			case "label":
    98  				vf = append(vf, func(v *libpod.Volume) bool {
    99  					return util.MatchLabelFilters([]string{filterVal}, v.Labels())
   100  				})
   101  			case "until":
   102  				f, err := createUntilFilterVolumeFunction(filterVal)
   103  				if err != nil {
   104  					return nil, err
   105  				}
   106  				vf = append(vf, f)
   107  			default:
   108  				return nil, errors.Errorf("%q is an invalid volume filter", filter)
   109  			}
   110  		}
   111  	}
   112  	return vf, nil
   113  }
   114  
   115  func createUntilFilterVolumeFunction(filter string) (libpod.VolumeFilter, error) {
   116  	until, err := util.ComputeUntilTimestamp([]string{filter})
   117  	if err != nil {
   118  		return nil, err
   119  	}
   120  	return func(v *libpod.Volume) bool {
   121  		if !until.IsZero() && v.CreatedTime().Before(until) {
   122  			return true
   123  		}
   124  		return false
   125  	}, nil
   126  }