From 786c7ed69eba6bccb68d0cdeb5714aed0ceb8ef5 Mon Sep 17 00:00:00 2001 From: Clayton Coleman Date: Tue, 14 Aug 2018 16:31:53 -0400 Subject: [PATCH] Update openshift image layers API --- .../registry/imagestream/etcd/etcd.go | 3 ++ test/extended/images/layers.go | 38 +++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/pkg/image/apiserver/registry/imagestream/etcd/etcd.go b/pkg/image/apiserver/registry/imagestream/etcd/etcd.go index 3e2ef07aa334..bd201f558469 100644 --- a/pkg/image/apiserver/registry/imagestream/etcd/etcd.go +++ b/pkg/image/apiserver/registry/imagestream/etcd/etcd.go @@ -206,6 +206,9 @@ func addImageStreamLayersFromCache(isl *imageapi.ImageStreamLayers, is *imageapi obj, _, _ := index.GetByKey(item.Image) entry, ok := obj.(*ImageLayers) if !ok { + if _, ok := isl.Images[item.Image]; !ok { + isl.Images[item.Image] = imageapi.ImageBlobReferences{ImageMissing: true} + } missing = append(missing, item.Image) continue } diff --git a/test/extended/images/layers.go b/test/extended/images/layers.go index 332f12cec3f4..ec92ee4cdd33 100644 --- a/test/extended/images/layers.go +++ b/test/extended/images/layers.go @@ -34,6 +34,44 @@ var _ = g.Describe("[Feature:ImageLayers] Image layer subresource", func() { oc = exutil.NewCLI("image-layers", exutil.KubeConfigPath()) + g.It("should identify a deleted image as missing", func() { + client := imageclientset.NewForConfigOrDie(oc.AdminConfig()).Image() + _, err := client.ImageStreams(oc.Namespace()).Create(&imageapi.ImageStream{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test", + }, + }) + o.Expect(err).NotTo(o.HaveOccurred()) + _, err = client.ImageStreamMappings(oc.Namespace()).Create(&imageapi.ImageStreamMapping{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test", + }, + Image: imageapi.Image{ + ObjectMeta: metav1.ObjectMeta{ + Name: "an_image_to_be_deleted", + }, + DockerImageReference: "example.com/random/image:latest", + }, + Tag: "missing", + }) + o.Expect(err).NotTo(o.HaveOccurred()) + err = client.Images().Delete("an_image_to_be_deleted", nil) + o.Expect(err).NotTo(o.HaveOccurred()) + err = wait.PollImmediate(time.Second, time.Minute, func() (bool, error) { + layers, err := client.ImageStreams(oc.Namespace()).Layers("test", metav1.GetOptions{}) + if err != nil { + return false, err + } + ref, ok := layers.Images["an_image_to_be_deleted"] + if !ok { + return false, nil + } + o.Expect(ref.ImageMissing).To(o.BeTrue()) + return true, nil + }) + o.Expect(err).NotTo(o.HaveOccurred()) + }) + g.It("should return layers from tagged images", func() { ns = []string{oc.Namespace()} client := imageclientset.NewForConfigOrDie(oc.UserConfig()).Image()