mirror of
https://github.com/goharbor/harbor.git
synced 2024-11-28 05:05:19 +01:00
Merge pull request #11333 from ywk253100/200325_copy
Update the existence checking logic when copying artifact
This commit is contained in:
commit
d187a8e69e
@ -415,19 +415,34 @@ func (c *controller) copyDeeply(ctx context.Context, srcRepo, reference, dstRepo
|
|||||||
digest := srcArt.Digest
|
digest := srcArt.Digest
|
||||||
|
|
||||||
// check the existence of artifact in the destination repository
|
// 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).
|
return 0, errors.New(nil).WithCode(errors.ConflictCode).
|
||||||
WithMessage("the artifact %s@%s already exists", dstRepo, digest)
|
WithMessage("the artifact %s@%s already exists", dstRepo, digest)
|
||||||
}
|
}
|
||||||
|
} 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
|
// the child artifact already under the destination repository, skip
|
||||||
return dstArt.ID, nil
|
return dstArt.ID, nil
|
||||||
}
|
}
|
||||||
if !errors.IsErr(err, errors.NotFoundCode) {
|
if !errors.IsErr(err, errors.NotFoundCode) {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// the artifact doesn't exist under the destination repository, continue to copy
|
// the artifact doesn't exist under the destination repository, continue to copy
|
||||||
// copy child artifacts if contains any
|
// copy child artifacts if contains any
|
||||||
|
@ -414,6 +414,7 @@ func (c *controllerTestSuite) TestCopy() {
|
|||||||
RepositoryID: 1,
|
RepositoryID: 1,
|
||||||
Name: "library/hello-world",
|
Name: "library/hello-world",
|
||||||
}, nil)
|
}, nil)
|
||||||
|
c.artMgr.On("Count").Return(0, nil)
|
||||||
c.artMgr.On("GetByDigest").Return(nil, errors.NotFoundError(nil))
|
c.artMgr.On("GetByDigest").Return(nil, errors.NotFoundError(nil))
|
||||||
c.tagCtl.On("List").Return([]*tag.Tag{
|
c.tagCtl.On("List").Return([]*tag.Tag{
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user