From e4d42deb752e8e87027b8b9d192a9218e616a2f0 Mon Sep 17 00:00:00 2001 From: Wenkai Yin Date: Mon, 30 Mar 2020 10:10:12 +0800 Subject: [PATCH] Make sure the tag filter have the same behavior for empty value and * Fixes #11233, make sure the tag filter have the same behavior for empty value and * Signed-off-by: Wenkai Yin --- src/controller/artifact/controller.go | 33 ++++++++++++++++------ src/controller/artifact/controller_test.go | 1 + 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/src/controller/artifact/controller.go b/src/controller/artifact/controller.go index ddc474edc..cd03a0673 100644 --- a/src/controller/artifact/controller.go +++ b/src/controller/artifact/controller.go @@ -415,18 +415,33 @@ func (c *controller) copyDeeply(ctx context.Context, srcRepo, reference, dstRepo digest := srcArt.Digest // check the existence of artifact in the destination repository - dstArt, err := c.GetByReference(ctx, dstRepo, digest, option) - if err == nil { - // return conflict error if the root parent artifact already exists under the destination repository - if isRoot { + if isRoot { + // for the root artifact, check the existence by calling "Count()" + // which finds the artifact based on all parent artifacts to avoid + // the issue: https://github.com/goharbor/harbor/issues/11222 + n, err := c.artMgr.Count(ctx, &q.Query{ + Keywords: map[string]interface{}{ + "RepositoryName": dstRepo, + "Digest": digest, + }, + }) + if err != nil { + return 0, err + } + if n > 0 { return 0, errors.New(nil).WithCode(errors.ConflictCode). WithMessage("the artifact %s@%s already exists", dstRepo, digest) } - // the child artifact already under the destination repository, skip - return dstArt.ID, nil - } - if !errors.IsErr(err, errors.NotFoundCode) { - return 0, err + } else { + // for the child artifact, check the existence by calling "GetByReference" directly + dstArt, err := c.GetByReference(ctx, dstRepo, digest, option) + if err == nil { + // the child artifact already under the destination repository, skip + return dstArt.ID, nil + } + if !errors.IsErr(err, errors.NotFoundCode) { + return 0, err + } } // the artifact doesn't exist under the destination repository, continue to copy diff --git a/src/controller/artifact/controller_test.go b/src/controller/artifact/controller_test.go index 312e9b2d2..a519ada3e 100644 --- a/src/controller/artifact/controller_test.go +++ b/src/controller/artifact/controller_test.go @@ -414,6 +414,7 @@ func (c *controllerTestSuite) TestCopy() { RepositoryID: 1, Name: "library/hello-world", }, nil) + c.artMgr.On("Count").Return(0, nil) c.artMgr.On("GetByDigest").Return(nil, errors.NotFoundError(nil)) c.tagCtl.On("List").Return([]*tag.Tag{ {