github.com/containers/podman/v2@v2.2.2-0.20210501105131-c1e07d070c4c/pkg/domain/filters/volumes.go (about) 1 package filters 2 3 import ( 4 "strings" 5 6 "github.com/containers/podman/v2/libpod" 7 "github.com/pkg/errors" 8 ) 9 10 func GenerateVolumeFilters(filters map[string][]string) ([]libpod.VolumeFilter, error) { 11 var vf []libpod.VolumeFilter 12 for filter, v := range filters { 13 for _, val := range v { 14 switch filter { 15 case "name": 16 nameVal := val 17 vf = append(vf, func(v *libpod.Volume) bool { 18 return nameVal == v.Name() 19 }) 20 case "driver": 21 driverVal := val 22 vf = append(vf, func(v *libpod.Volume) bool { 23 return v.Driver() == driverVal 24 }) 25 case "scope": 26 scopeVal := val 27 vf = append(vf, func(v *libpod.Volume) bool { 28 return v.Scope() == scopeVal 29 }) 30 case "label": 31 filterArray := strings.SplitN(val, "=", 2) 32 filterKey := filterArray[0] 33 var filterVal string 34 if len(filterArray) > 1 { 35 filterVal = filterArray[1] 36 } else { 37 filterVal = "" 38 } 39 vf = append(vf, func(v *libpod.Volume) bool { 40 for labelKey, labelValue := range v.Labels() { 41 if labelKey == filterKey && ("" == filterVal || labelValue == filterVal) { 42 return true 43 } 44 } 45 return false 46 }) 47 case "opt": 48 filterArray := strings.SplitN(val, "=", 2) 49 filterKey := filterArray[0] 50 var filterVal string 51 if len(filterArray) > 1 { 52 filterVal = filterArray[1] 53 } else { 54 filterVal = "" 55 } 56 vf = append(vf, func(v *libpod.Volume) bool { 57 for labelKey, labelValue := range v.Options() { 58 if labelKey == filterKey && ("" == filterVal || labelValue == filterVal) { 59 return true 60 } 61 } 62 return false 63 }) 64 case "dangling": 65 danglingVal := val 66 invert := false 67 switch strings.ToLower(danglingVal) { 68 case "true", "1": 69 // Do nothing 70 case "false", "0": 71 // Dangling=false requires that we 72 // invert the result of IsDangling. 73 invert = true 74 default: 75 return nil, errors.Errorf("%q is not a valid value for the \"dangling\" filter - must be true or false", danglingVal) 76 } 77 vf = append(vf, func(v *libpod.Volume) bool { 78 dangling, err := v.IsDangling() 79 if err != nil { 80 return false 81 } 82 if invert { 83 return !dangling 84 } 85 return dangling 86 }) 87 default: 88 return nil, errors.Errorf("%q is in an invalid volume filter", filter) 89 } 90 } 91 } 92 return vf, nil 93 }