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