dotcloud/docker

View on GitHub
volume/service/by.go

Summary

Maintainability
A
0 mins
Test Coverage
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
    })
}