func TestImageStreamTagsAdmission(t *testing.T) { defer testutil.DumpEtcdOnFailure(t) kClient, client := setupImageStreamAdmissionTest(t) for i, name := range []string{imagetest.BaseImageWith1LayerDigest, imagetest.BaseImageWith2LayersDigest, imagetest.MiscImageDigest} { imageReference := fmt.Sprintf("openshift/[email protected]%s", name) image := &imageapi.Image{ ObjectMeta: kapi.ObjectMeta{ Name: name, }, DockerImageReference: imageReference, } tag := fmt.Sprintf("tag%d", i+1) err := client.ImageStreamMappings(testutil.Namespace()).Create(&imageapi.ImageStreamMapping{ ObjectMeta: kapi.ObjectMeta{ Name: "src", }, Tag: tag, Image: *image, }) if err != nil { t.Fatal(err) } } limit := kapi.ResourceList{imageapi.ResourceImageStreamTags: resource.MustParse("0")} lrClient := kClient.LimitRanges(testutil.Namespace()) createLimitRangeOfType(t, lrClient, limitRangeName, imageapi.LimitTypeImageStream, limit) t.Logf("trying to create ImageStreamTag referencing isimage exceeding quota %v", limit) ist := &imageapi.ImageStreamTag{ ObjectMeta: kapi.ObjectMeta{ Name: "dest:tag1", }, Tag: &imageapi.TagReference{ Name: "1", From: &kapi.ObjectReference{ Kind: "ImageStreamImage", Name: "[email protected]" + imagetest.BaseImageWith1LayerDigest, }, }, } _, err := client.ImageStreamTags(testutil.Namespace()).Update(ist) if err == nil { t.Fatalf("expected error") } if !quotautil.IsErrorQuotaExceeded(err) { t.Errorf("expected quota exceeded error, got instead: %v", err) } limit = bumpLimit(t, lrClient, limitRangeName, imageapi.ResourceImageStreamTags, "1") t.Logf("trying to create ImageStreamTag referencing isimage below quota %v", limit) ist = &imageapi.ImageStreamTag{ ObjectMeta: kapi.ObjectMeta{ Name: "dest:tag1", }, Tag: &imageapi.TagReference{ Name: "1", From: &kapi.ObjectReference{ Kind: "ImageStreamImage", Name: "[email protected]" + imagetest.BaseImageWith1LayerDigest, }, }, } // we may hit cache with old limit, let's retry in such a case err = retryOnQuotaExceeded(t, 1, func() error { ist, err = client.ImageStreamTags(testutil.Namespace()).Update(ist) return err }) if err != nil { t.Fatalf("unexpected error: %v", err) } t.Logf("trying to create ImageStreamTag exceeding quota %v", limit) ist = &imageapi.ImageStreamTag{ ObjectMeta: kapi.ObjectMeta{ Name: "dest:tag2", }, Tag: &imageapi.TagReference{ Name: "2", From: &kapi.ObjectReference{ Kind: "ImageStreamImage", Name: "[email protected]" + imagetest.BaseImageWith2LayersDigest, }, }, } ist, err = client.ImageStreamTags(testutil.Namespace()).Update(ist) if err == nil { t.Fatalf("expected error") } if !quotautil.IsErrorQuotaExceeded(err) { t.Errorf("expected quota exceeded error, got instead: %v", err) } t.Log("trying to create ImageStreamTag referencing isimage already referenced") ist = &imageapi.ImageStreamTag{ ObjectMeta: kapi.ObjectMeta{ Name: "dest:tag1again", }, Tag: &imageapi.TagReference{ Name: "tag1again", From: &kapi.ObjectReference{ Kind: "ImageStreamImage", Name: "[email protected]" + imagetest.BaseImageWith1LayerDigest, }, }, } _, err = client.ImageStreamTags(testutil.Namespace()).Update(ist) if err != nil { t.Fatalf("unexpected error: %v", err) } t.Log("trying to create ImageStreamTag in a new image stream") ist = &imageapi.ImageStreamTag{ ObjectMeta: kapi.ObjectMeta{ Name: "new:misc", }, Tag: &imageapi.TagReference{ Name: "misc", From: &kapi.ObjectReference{ Kind: "ImageStreamImage", Name: "[email protected]" + imagetest.MiscImageDigest, }, }, } _, err = client.ImageStreamTags(testutil.Namespace()).Update(ist) if err != nil { t.Fatalf("unexpected error: %v", err) } limit = bumpLimit(t, lrClient, limitRangeName, imageapi.ResourceImageStreamTags, "2") t.Logf("trying to create ImageStreamTag referencing istag below quota %v", limit) ist = &imageapi.ImageStreamTag{ ObjectMeta: kapi.ObjectMeta{ Name: "dest:tag2", }, Tag: &imageapi.TagReference{ Name: "2", From: &kapi.ObjectReference{ Kind: "ImageStreamTag", Name: "src:tag2", }, }, } // we may hit cache with old limit, let's retry in such a case err = retryOnQuotaExceeded(t, 1, func() error { ist, err = client.ImageStreamTags(testutil.Namespace()).Update(ist) return err }) if err != nil { t.Fatalf("unexpected error: %v", err) } t.Logf("trying to create ImageStreamTag referencing istag exceeding quota %v", limit) ist = &imageapi.ImageStreamTag{ ObjectMeta: kapi.ObjectMeta{ Name: "dest:tag3", }, Tag: &imageapi.TagReference{ Name: "3", From: &kapi.ObjectReference{ Kind: "ImageStreamTag", Name: "src:tag3", }, }, } _, err = client.ImageStreamTags(testutil.Namespace()).Update(ist) if err == nil { t.Fatal("creating image stream tag should have failed") } if !quotautil.IsErrorQuotaExceeded(err) { t.Fatalf("expected quota exceeded error, not: %v", err) } t.Log("trying to create ImageStreamTag referencing istag already referenced") ist = &imageapi.ImageStreamTag{ ObjectMeta: kapi.ObjectMeta{ Name: "dest:tag2again", }, Tag: &imageapi.TagReference{ Name: "tag2again", From: &kapi.ObjectReference{ Kind: "ImageStreamTag", Name: "src:tag2", }, }, } _, err = client.ImageStreamTags(testutil.Namespace()).Update(ist) if err != nil { t.Fatal(err) } }
func TestImageStreamAdmitSpecUpdate(t *testing.T) { defer testutil.DumpEtcdOnFailure(t) kClient, client := setupImageStreamAdmissionTest(t) for i, name := range []string{imagetest.BaseImageWith1LayerDigest, imagetest.BaseImageWith2LayersDigest} { imageReference := fmt.Sprintf("openshift/[email protected]%s", name) image := &imageapi.Image{ ObjectMeta: kapi.ObjectMeta{ Name: name, }, DockerImageReference: imageReference, } tag := fmt.Sprintf("tag%d", i+1) err := client.ImageStreamMappings(testutil.Namespace()).Create(&imageapi.ImageStreamMapping{ ObjectMeta: kapi.ObjectMeta{ Name: "src", }, Tag: tag, Image: *image, }) if err != nil { t.Fatal(err) } } limit := kapi.ResourceList{ imageapi.ResourceImageStreamTags: resource.MustParse("0"), imageapi.ResourceImageStreamImages: resource.MustParse("0"), } lrClient := kClient.LimitRanges(testutil.Namespace()) createLimitRangeOfType(t, lrClient, limitRangeName, imageapi.LimitTypeImageStream, limit) t.Logf("trying to create a new image stream with a tag exceeding limit %v", limit) _, err := client.ImageStreams(testutil.Namespace()).Create(&imageapi.ImageStream{ ObjectMeta: kapi.ObjectMeta{ Name: "is", }, Spec: imageapi.ImageStreamSpec{ Tags: map[string]imageapi.TagReference{ "tag1": { Name: "tag1", From: &kapi.ObjectReference{ Kind: "ImageStreamTag", Name: "src:tag1", }, }, }, }, }) if err == nil { t.Fatal("unexpected non-error") } if !quotautil.IsErrorQuotaExceeded(err) { t.Errorf("expected quota exceeded error, got instead: %v", err) } for _, res := range []kapi.ResourceName{imageapi.ResourceImageStreamTags, imageapi.ResourceImageStreamImages} { if !strings.Contains(err.Error(), string(res)) { t.Errorf("expected resource %q in error string: %v", res, err) } } limit = bumpLimit(t, lrClient, limitRangeName, imageapi.ResourceImageStreamTags, "1") limit = bumpLimit(t, lrClient, limitRangeName, imageapi.ResourceImageStreamImages, "1") t.Logf("trying to create a new image stream with a tag below limit %v", limit) // we may hit cache with old limit, let's retry in such a case err = retryOnQuotaExceeded(t, 1, func() error { _, err = client.ImageStreams(testutil.Namespace()).Create(&imageapi.ImageStream{ ObjectMeta: kapi.ObjectMeta{ Name: "is", }, Spec: imageapi.ImageStreamSpec{ Tags: map[string]imageapi.TagReference{ "tag1": { Name: "tag1", From: &kapi.ObjectReference{ Kind: "ImageStreamTag", Name: "src:tag1", }, }, }, }, }) return err }) if err != nil { t.Fatalf("unexpected error: %v", err) } t.Logf("adding new tag to image stream spec exceeding limit %v", limit) err = kclient.RetryOnConflict(kclient.DefaultRetry, func() error { is, err := client.ImageStreams(testutil.Namespace()).Get("is") if err != nil { return err } is.Spec.Tags["tag2"] = imageapi.TagReference{ Name: "tag2", From: &kapi.ObjectReference{ Kind: "ImageStreamTag", Name: "src:tag2", }, } _, err = client.ImageStreams(testutil.Namespace()).Update(is) return err }) if err == nil { t.Fatalf("unexpected non-error") } if !quotautil.IsErrorQuotaExceeded(err) { t.Errorf("expected quota exceeded error, got instead: %v", err) } for _, res := range []kapi.ResourceName{imageapi.ResourceImageStreamTags, imageapi.ResourceImageStreamImages} { if !strings.Contains(err.Error(), string(res)) { t.Errorf("expected resource %q in error string: %v", res, err) } } t.Logf("re-tagging the image under different tag") err = kclient.RetryOnConflict(kclient.DefaultRetry, func() error { is, err := client.ImageStreams(testutil.Namespace()).Get("is") if err != nil { return err } is.Spec.Tags["1again"] = imageapi.TagReference{ Name: "1again", From: &kapi.ObjectReference{ Kind: "ImageStreamTag", Name: "src:tag1", }, } _, err = client.ImageStreams(testutil.Namespace()).Update(is) return err }) if err != nil { t.Fatalf("unexpected error: %v", err) } }