| 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 |
| }) |
| } |