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  }