fix(retention) fix retention repository with slash

Signed-off-by: Ziming Zhang <zziming@vmware.com>
This commit is contained in:
Ziming Zhang 2020-04-24 19:49:38 +08:00 committed by Ziming
parent 6dfe504325
commit 97a7a6dc35
6 changed files with 41 additions and 20 deletions

View File

@ -16,11 +16,10 @@ package artifact
import (
"fmt"
"net/url"
cmodels "github.com/goharbor/harbor/src/common/models"
"github.com/goharbor/harbor/src/common/utils"
"github.com/goharbor/harbor/src/controller/tag"
"github.com/goharbor/harbor/src/lib/encode/repository"
"github.com/goharbor/harbor/src/pkg/artifact"
"github.com/goharbor/harbor/src/server/v2.0/models"
)
@ -41,7 +40,7 @@ func (artifact *Artifact) SetAdditionLink(addition, version string) {
projectName, repo := utils.ParseRepository(artifact.RepositoryName)
// encode slash as %252F
repo = url.PathEscape(url.PathEscape(repo))
repo = repository.Encode(repo)
href := fmt.Sprintf("/api/%s/projects/%s/repositories/%s/artifacts/%s/additions/%s", version, projectName, repo, artifact.Digest, addition)
artifact.AdditionLinks[addition] = &AdditionLink{HREF: href, Absolute: false}

View File

@ -14,6 +14,7 @@ require (
github.com/beego/i18n v0.0.0-20140604031826-e87155e8f0c0
github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932 // indirect
github.com/bmatcuk/doublestar v1.1.1
github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869
github.com/bugsnag/bugsnag-go v1.5.2 // indirect
github.com/bugsnag/panicwrap v1.2.0 // indirect
github.com/casbin/casbin v1.7.0

View File

@ -0,0 +1,8 @@
package repository
import "net/url"
// Encode encode the repository name
func Encode(repo string) string {
return url.PathEscape(url.PathEscape(repo))
}

View File

@ -0,0 +1,11 @@
package repository
import (
"github.com/stretchr/testify/assert"
"testing"
)
func TestEncode(t *testing.T) {
repo := "library/ns1/busybox"
assert.Equal(t, "library%252Fns1%252Fbusybox", Encode(repo))
}

View File

@ -17,10 +17,12 @@ package core
import (
"fmt"
modelsv2 "github.com/goharbor/harbor/src/controller/artifact"
"github.com/goharbor/harbor/src/lib/encode/repository"
)
func (c *client) ListAllArtifacts(project, repository string) ([]*modelsv2.Artifact, error) {
url := c.buildURL(fmt.Sprintf("/api/v2.0/projects/%s/repositories/%s/artifacts", project, repository)) // should query only tag
func (c *client) ListAllArtifacts(project, repo string) ([]*modelsv2.Artifact, error) {
repo = repository.Encode(repo)
url := c.buildURL(fmt.Sprintf("/api/v2.0/projects/%s/repositories/%s/artifacts", project, repo))
var arts []*modelsv2.Artifact
if err := c.httpclient.GetAndIteratePagination(url, &arts); err != nil {
return nil, err
@ -28,13 +30,14 @@ func (c *client) ListAllArtifacts(project, repository string) ([]*modelsv2.Artif
return arts, nil
}
func (c *client) DeleteArtifact(project, repository, digest string) error {
// /projects/{project_name}/repositories/{repository_name}/artifacts/{reference}
url := c.buildURL(fmt.Sprintf("/api/v2.0/projects/%s/repositories/%s/artifacts/%s", project, repository, digest))
func (c *client) DeleteArtifact(project, repo, digest string) error {
repo = repository.Encode(repo)
url := c.buildURL(fmt.Sprintf("/api/v2.0/projects/%s/repositories/%s/artifacts/%s", project, repo, digest))
return c.httpclient.Delete(url)
}
func (c *client) DeleteArtifactRepository(project, repository string) error {
url := c.buildURL(fmt.Sprintf("/api/repositories/%s/%s", project, repository))
func (c *client) DeleteArtifactRepository(project, repo string) error {
repo = repository.Encode(repo)
url := c.buildURL(fmt.Sprintf("/api/repositories/%s/%s", project, repo))
return c.httpclient.Delete(url)
}

View File

@ -16,11 +16,10 @@ package v2
import (
"fmt"
"net/url"
"github.com/goharbor/harbor/src/common/models"
"github.com/goharbor/harbor/src/common/utils"
"github.com/goharbor/harbor/src/controller/artifact"
"github.com/goharbor/harbor/src/lib/encode/repository"
"github.com/goharbor/harbor/src/replication/adapter/harbor/base"
"github.com/goharbor/harbor/src/replication/model"
)
@ -45,11 +44,11 @@ func (c *client) listRepositories(project *base.Project) ([]*model.Repository, e
return repos, nil
}
func (c *client) listArtifacts(repository string) ([]*model.Artifact, error) {
project, repository := utils.ParseRepository(repository)
repository = url.PathEscape(url.PathEscape(repository))
func (c *client) listArtifacts(repo string) ([]*model.Artifact, error) {
project, repo := utils.ParseRepository(repo)
repo = repository.Encode(repo)
url := fmt.Sprintf("%s/projects/%s/repositories/%s/artifacts?with_label=true",
c.BasePath(), project, repository)
c.BasePath(), project, repo)
artifacts := []*artifact.Artifact{}
if err := c.C.GetAndIteratePagination(url, &artifacts); err != nil {
return nil, err
@ -71,10 +70,10 @@ func (c *client) listArtifacts(repository string) ([]*model.Artifact, error) {
return arts, nil
}
func (c *client) deleteTag(repository, tag string) error {
project, repository := utils.ParseRepository(repository)
repository = url.PathEscape(url.PathEscape(repository))
func (c *client) deleteTag(repo, tag string) error {
project, repo := utils.ParseRepository(repo)
repo = repository.Encode(repo)
url := fmt.Sprintf("%s/projects/%s/repositories/%s/artifacts/%s/tags/%s",
c.BasePath(), project, repository, tag, tag)
c.BasePath(), project, repo, tag, tag)
return c.C.Delete(url)
}