summaryrefslogtreecommitdiffstats
path: root/pkg/v1/partial/index.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/v1/partial/index.go')
-rw-r--r--pkg/v1/partial/index.go85
1 files changed, 85 insertions, 0 deletions
diff --git a/pkg/v1/partial/index.go b/pkg/v1/partial/index.go
new file mode 100644
index 0000000..f17f274
--- /dev/null
+++ b/pkg/v1/partial/index.go
@@ -0,0 +1,85 @@
+// Copyright 2020 Google LLC All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package partial
+
+import (
+ "fmt"
+
+ v1 "github.com/google/go-containerregistry/pkg/v1"
+ "github.com/google/go-containerregistry/pkg/v1/match"
+)
+
+// FindManifests given a v1.ImageIndex, find the manifests that fit the matcher.
+func FindManifests(index v1.ImageIndex, matcher match.Matcher) ([]v1.Descriptor, error) {
+ // get the actual manifest list
+ indexManifest, err := index.IndexManifest()
+ if err != nil {
+ return nil, fmt.Errorf("unable to get raw index: %w", err)
+ }
+ manifests := []v1.Descriptor{}
+ // try to get the root of our image
+ for _, manifest := range indexManifest.Manifests {
+ if matcher(manifest) {
+ manifests = append(manifests, manifest)
+ }
+ }
+ return manifests, nil
+}
+
+// FindImages given a v1.ImageIndex, find the images that fit the matcher. If a Descriptor
+// matches the provider Matcher, but the referenced item is not an Image, ignores it.
+// Only returns those that match the Matcher and are images.
+func FindImages(index v1.ImageIndex, matcher match.Matcher) ([]v1.Image, error) {
+ matches := []v1.Image{}
+ manifests, err := FindManifests(index, matcher)
+ if err != nil {
+ return nil, err
+ }
+ for _, desc := range manifests {
+ // if it is not an image, ignore it
+ if !desc.MediaType.IsImage() {
+ continue
+ }
+ img, err := index.Image(desc.Digest)
+ if err != nil {
+ return nil, err
+ }
+ matches = append(matches, img)
+ }
+ return matches, nil
+}
+
+// FindIndexes given a v1.ImageIndex, find the indexes that fit the matcher. If a Descriptor
+// matches the provider Matcher, but the referenced item is not an Index, ignores it.
+// Only returns those that match the Matcher and are indexes.
+func FindIndexes(index v1.ImageIndex, matcher match.Matcher) ([]v1.ImageIndex, error) {
+ matches := []v1.ImageIndex{}
+ manifests, err := FindManifests(index, matcher)
+ if err != nil {
+ return nil, err
+ }
+ for _, desc := range manifests {
+ if !desc.MediaType.IsIndex() {
+ continue
+ }
+ // if it is not an index, ignore it
+ idx, err := index.ImageIndex(desc.Digest)
+ if err != nil {
+ return nil, err
+ }
+ matches = append(matches, idx)
+ }
+ return matches, nil
+}