mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
90 lines
1.8 KiB
Go
90 lines
1.8 KiB
Go
|
package service // import "github.com/docker/docker/volume/service"
|
||
|
|
||
|
import (
|
||
|
"github.com/docker/docker/api/types/filters"
|
||
|
"github.com/docker/docker/volume"
|
||
|
)
|
||
|
|
||
|
// By is an interface which is used to implement filtering on volumes.
|
||
|
type By interface {
|
||
|
isBy()
|
||
|
}
|
||
|
|
||
|
// ByDriver is `By` that filters based on the driver names that are passed in
|
||
|
func ByDriver(drivers ...string) By {
|
||
|
return byDriver(drivers)
|
||
|
}
|
||
|
|
||
|
type byDriver []string
|
||
|
|
||
|
func (byDriver) isBy() {}
|
||
|
|
||
|
// ByReferenced is a `By` that filters based on if the volume has references
|
||
|
type ByReferenced bool
|
||
|
|
||
|
func (ByReferenced) isBy() {}
|
||
|
|
||
|
// And creates a `By` combining all the passed in bys using AND logic.
|
||
|
func And(bys ...By) By {
|
||
|
and := make(andCombinator, 0, len(bys))
|
||
|
for _, by := range bys {
|
||
|
and = append(and, by)
|
||
|
}
|
||
|
return and
|
||
|
}
|
||
|
|
||
|
type andCombinator []By
|
||
|
|
||
|
func (andCombinator) isBy() {}
|
||
|
|
||
|
// Or creates a `By` combining all the passed in bys using OR logic.
|
||
|
func Or(bys ...By) By {
|
||
|
or := make(orCombinator, 0, len(bys))
|
||
|
for _, by := range bys {
|
||
|
or = append(or, by)
|
||
|
}
|
||
|
return or
|
||
|
}
|
||
|
|
||
|
type orCombinator []By
|
||
|
|
||
|
func (orCombinator) isBy() {}
|
||
|
|
||
|
// CustomFilter is a `By` that is used by callers to provide custom filtering
|
||
|
// logic.
|
||
|
type CustomFilter filterFunc
|
||
|
|
||
|
func (CustomFilter) isBy() {}
|
||
|
|
||
|
// FromList returns a By which sets the initial list of volumes to use
|
||
|
func FromList(ls *[]volume.Volume, by By) By {
|
||
|
return &fromList{by: by, ls: ls}
|
||
|
}
|
||
|
|
||
|
type fromList struct {
|
||
|
by By
|
||
|
ls *[]volume.Volume
|
||
|
}
|
||
|
|
||
|
func (fromList) isBy() {}
|
||
|
|
||
|
func byLabelFilter(filter filters.Args) By {
|
||
|
return CustomFilter(func(v volume.Volume) bool {
|
||
|
dv, ok := v.(volume.DetailedVolume)
|
||
|
if !ok {
|
||
|
return false
|
||
|
}
|
||
|
|
||
|
labels := dv.Labels()
|
||
|
if !filter.MatchKVList("label", labels) {
|
||
|
return false
|
||
|
}
|
||
|
if filter.Contains("label!") {
|
||
|
if filter.MatchKVList("label!", labels) {
|
||
|
return false
|
||
|
}
|
||
|
}
|
||
|
return true
|
||
|
})
|
||
|
}
|