github.com/containerd/Containerd@v1.4.13/metadata/adaptors.go (about) 1 /* 2 Copyright The containerd Authors. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package metadata 18 19 import ( 20 "strings" 21 22 "github.com/containerd/containerd/containers" 23 "github.com/containerd/containerd/content" 24 "github.com/containerd/containerd/filters" 25 "github.com/containerd/containerd/images" 26 "github.com/containerd/containerd/leases" 27 "github.com/containerd/containerd/snapshots" 28 ) 29 30 func adaptImage(o interface{}) filters.Adaptor { 31 obj := o.(images.Image) 32 return filters.AdapterFunc(func(fieldpath []string) (string, bool) { 33 if len(fieldpath) == 0 { 34 return "", false 35 } 36 37 switch fieldpath[0] { 38 case "name": 39 return obj.Name, len(obj.Name) > 0 40 case "target": 41 if len(fieldpath) < 2 { 42 return "", false 43 } 44 45 switch fieldpath[1] { 46 case "digest": 47 return obj.Target.Digest.String(), len(obj.Target.Digest) > 0 48 case "mediatype": 49 return obj.Target.MediaType, len(obj.Target.MediaType) > 0 50 } 51 case "labels": 52 return checkMap(fieldpath[1:], obj.Labels) 53 // TODO(stevvooe): Greater/Less than filters would be awesome for 54 // size. Let's do it! 55 case "annotations": 56 return checkMap(fieldpath[1:], obj.Target.Annotations) 57 } 58 59 return "", false 60 }) 61 } 62 func adaptContainer(o interface{}) filters.Adaptor { 63 obj := o.(containers.Container) 64 return filters.AdapterFunc(func(fieldpath []string) (string, bool) { 65 if len(fieldpath) == 0 { 66 return "", false 67 } 68 69 switch fieldpath[0] { 70 case "id": 71 return obj.ID, len(obj.ID) > 0 72 case "runtime": 73 if len(fieldpath) <= 1 { 74 return "", false 75 } 76 77 switch fieldpath[1] { 78 case "name": 79 return obj.Runtime.Name, len(obj.Runtime.Name) > 0 80 default: 81 return "", false 82 } 83 case "image": 84 return obj.Image, len(obj.Image) > 0 85 case "labels": 86 return checkMap(fieldpath[1:], obj.Labels) 87 } 88 89 return "", false 90 }) 91 } 92 93 func adaptContentInfo(info content.Info) filters.Adaptor { 94 return filters.AdapterFunc(func(fieldpath []string) (string, bool) { 95 if len(fieldpath) == 0 { 96 return "", false 97 } 98 99 switch fieldpath[0] { 100 case "digest": 101 return info.Digest.String(), true 102 case "size": 103 // TODO: support size based filtering 104 case "labels": 105 return checkMap(fieldpath[1:], info.Labels) 106 } 107 108 return "", false 109 }) 110 } 111 112 func adaptContentStatus(status content.Status) filters.Adaptor { 113 return filters.AdapterFunc(func(fieldpath []string) (string, bool) { 114 if len(fieldpath) == 0 { 115 return "", false 116 } 117 switch fieldpath[0] { 118 case "ref": 119 return status.Ref, true 120 } 121 122 return "", false 123 }) 124 } 125 126 func adaptLease(lease leases.Lease) filters.Adaptor { 127 return filters.AdapterFunc(func(fieldpath []string) (string, bool) { 128 if len(fieldpath) == 0 { 129 return "", false 130 } 131 132 switch fieldpath[0] { 133 case "id": 134 return lease.ID, len(lease.ID) > 0 135 case "labels": 136 return checkMap(fieldpath[1:], lease.Labels) 137 } 138 139 return "", false 140 }) 141 } 142 143 func adaptSnapshot(info snapshots.Info) filters.Adaptor { 144 return filters.AdapterFunc(func(fieldpath []string) (string, bool) { 145 if len(fieldpath) == 0 { 146 return "", false 147 } 148 149 switch fieldpath[0] { 150 case "kind": 151 switch info.Kind { 152 case snapshots.KindActive: 153 return "active", true 154 case snapshots.KindView: 155 return "view", true 156 case snapshots.KindCommitted: 157 return "committed", true 158 } 159 case "name": 160 return info.Name, true 161 case "parent": 162 return info.Parent, true 163 case "labels": 164 return checkMap(fieldpath[1:], info.Labels) 165 } 166 167 return "", false 168 }) 169 } 170 171 func checkMap(fieldpath []string, m map[string]string) (string, bool) { 172 if len(m) == 0 { 173 return "", false 174 } 175 176 value, ok := m[strings.Join(fieldpath, ".")] 177 return value, ok 178 }