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 }