
Namespace keys used by client for uncompressed Signed-off-by: Derek McGowan <derek@mcgstyle.net>
114 lines
2.4 KiB
Go
114 lines
2.4 KiB
Go
package metadata
|
|
|
|
import (
|
|
"strings"
|
|
|
|
"github.com/containerd/containerd/containers"
|
|
"github.com/containerd/containerd/content"
|
|
"github.com/containerd/containerd/filters"
|
|
"github.com/containerd/containerd/images"
|
|
)
|
|
|
|
func adaptImage(o interface{}) filters.Adaptor {
|
|
obj := o.(images.Image)
|
|
return filters.AdapterFunc(func(fieldpath []string) (string, bool) {
|
|
if len(fieldpath) == 0 {
|
|
return "", false
|
|
}
|
|
|
|
switch fieldpath[0] {
|
|
case "name":
|
|
return obj.Name, len(obj.Name) > 0
|
|
case "target":
|
|
if len(fieldpath) < 2 {
|
|
return "", false
|
|
}
|
|
|
|
switch fieldpath[1] {
|
|
case "digest":
|
|
return obj.Target.Digest.String(), len(obj.Target.Digest) > 0
|
|
case "mediatype":
|
|
return obj.Target.MediaType, len(obj.Target.MediaType) > 0
|
|
}
|
|
case "labels":
|
|
return checkMap(fieldpath[1:], obj.Labels)
|
|
// TODO(stevvooe): Greater/Less than filters would be awesome for
|
|
// size. Let's do it!
|
|
}
|
|
|
|
return "", false
|
|
})
|
|
}
|
|
func adaptContainer(o interface{}) filters.Adaptor {
|
|
obj := o.(containers.Container)
|
|
return filters.AdapterFunc(func(fieldpath []string) (string, bool) {
|
|
if len(fieldpath) == 0 {
|
|
return "", false
|
|
}
|
|
|
|
switch fieldpath[0] {
|
|
case "id":
|
|
return obj.ID, len(obj.ID) > 0
|
|
case "runtime":
|
|
if len(fieldpath) <= 1 {
|
|
return "", false
|
|
}
|
|
|
|
switch fieldpath[1] {
|
|
case "name":
|
|
return obj.Runtime.Name, len(obj.Runtime.Name) > 0
|
|
default:
|
|
return "", false
|
|
}
|
|
case "image":
|
|
return obj.Image, len(obj.Image) > 0
|
|
case "labels":
|
|
return checkMap(fieldpath[1:], obj.Labels)
|
|
}
|
|
|
|
return "", false
|
|
})
|
|
}
|
|
|
|
func adaptContentInfo(info content.Info) filters.Adaptor {
|
|
return filters.AdapterFunc(func(fieldpath []string) (string, bool) {
|
|
if len(fieldpath) == 0 {
|
|
return "", false
|
|
}
|
|
|
|
switch fieldpath[0] {
|
|
case "digest":
|
|
return info.Digest.String(), true
|
|
case "size":
|
|
// TODO: support size based filtering
|
|
case "labels":
|
|
return checkMap(fieldpath[1:], info.Labels)
|
|
}
|
|
|
|
return "", false
|
|
})
|
|
}
|
|
|
|
func adaptContentStatus(status content.Status) filters.Adaptor {
|
|
return filters.AdapterFunc(func(fieldpath []string) (string, bool) {
|
|
if len(fieldpath) == 0 {
|
|
return "", false
|
|
}
|
|
switch fieldpath[0] {
|
|
case "ref":
|
|
return status.Ref, true
|
|
}
|
|
|
|
return "", false
|
|
})
|
|
}
|
|
|
|
func checkMap(fieldpath []string, m map[string]string) (string, bool) {
|
|
if len(m) == 0 {
|
|
return "", false
|
|
}
|
|
|
|
value, ok := m[strings.Join(fieldpath, ".")]
|
|
return value, ok
|
|
}
|