mirror of
https://github.com/goharbor/harbor
synced 2024-09-21 07:22:20 +00:00
Merge pull request #2821 from ywk253100/170719_integration
Refactor getting project logic according to the change of Admiral's API
This commit is contained in:
commit
e0040a09b6
|
@ -26,6 +26,7 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/vmware/harbor/src/common/models"
|
"github.com/vmware/harbor/src/common/models"
|
||||||
|
"github.com/vmware/harbor/src/common/utils"
|
||||||
er "github.com/vmware/harbor/src/common/utils/error"
|
er "github.com/vmware/harbor/src/common/utils/error"
|
||||||
"github.com/vmware/harbor/src/common/utils/log"
|
"github.com/vmware/harbor/src/common/utils/log"
|
||||||
)
|
)
|
||||||
|
@ -72,14 +73,54 @@ func (p *ProjectManager) Get(projectIDOrName interface{}) (*models.Project, erro
|
||||||
return convert(project)
|
return convert(project)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// get Admiral project with Harbor project ID or name
|
||||||
func (p *ProjectManager) get(projectIDOrName interface{}) (*project, error) {
|
func (p *ProjectManager) get(projectIDOrName interface{}) (*project, error) {
|
||||||
|
// if token is provided, search project from my projects list first
|
||||||
|
if len(p.getToken()) != 0 {
|
||||||
|
project, err := p.getFromMy(projectIDOrName)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if project != nil {
|
||||||
|
return project, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// try to get project from public projects list
|
||||||
|
return p.getFromPublic(projectIDOrName)
|
||||||
|
}
|
||||||
|
|
||||||
|
// call GET /projects?$filter=xxx eq xxx, the API can only filter projects
|
||||||
|
// which the user is a member of
|
||||||
|
func (p *ProjectManager) getFromMy(projectIDOrName interface{}) (*project, error) {
|
||||||
|
return p.getAdmiralProject(projectIDOrName, false)
|
||||||
|
}
|
||||||
|
|
||||||
|
// call GET /projects?public=true&$filter=xxx eq xxx
|
||||||
|
func (p *ProjectManager) getFromPublic(projectIDOrName interface{}) (*project, error) {
|
||||||
|
project, err := p.getAdmiralProject(projectIDOrName, true)
|
||||||
|
if project != nil {
|
||||||
|
// the projects returned by GET /projects?public=true&xxx have no
|
||||||
|
// "public" property, populate it here
|
||||||
|
project.Public = true
|
||||||
|
}
|
||||||
|
return project, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *ProjectManager) getAdmiralProject(projectIDOrName interface{}, public bool) (*project, error) {
|
||||||
m := map[string]string{}
|
m := map[string]string{}
|
||||||
if id, ok := projectIDOrName.(int64); ok {
|
|
||||||
|
id, name, err := utils.ParseProjectIDOrName(projectIDOrName)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if id > 0 {
|
||||||
m["customProperties.__projectIndex"] = strconv.FormatInt(id, 10)
|
m["customProperties.__projectIndex"] = strconv.FormatInt(id, 10)
|
||||||
} else if name, ok := projectIDOrName.(string); ok {
|
|
||||||
m["name"] = name
|
|
||||||
} else {
|
} else {
|
||||||
return nil, fmt.Errorf("unsupported type: %v", projectIDOrName)
|
m["name"] = name
|
||||||
|
}
|
||||||
|
if public {
|
||||||
|
m["public"] = "true"
|
||||||
}
|
}
|
||||||
|
|
||||||
projects, err := p.filter(m)
|
projects, err := p.filter(m)
|
||||||
|
@ -109,7 +150,11 @@ func (p *ProjectManager) filter(m map[string]string) ([]*project, error) {
|
||||||
} else {
|
} else {
|
||||||
query += "&"
|
query += "&"
|
||||||
}
|
}
|
||||||
query += fmt.Sprintf("$filter=%s eq '%s'", k, v)
|
if k == "public" {
|
||||||
|
query += fmt.Sprintf("%s=%s", k, v)
|
||||||
|
} else {
|
||||||
|
query += fmt.Sprintf("$filter=%s eq '%s'", k, v)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(query) == 0 {
|
if len(query) == 0 {
|
||||||
|
@ -208,6 +253,7 @@ func (p *ProjectManager) IsPublic(projectIDOrName interface{}) (bool, error) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, err
|
return false, err
|
||||||
}
|
}
|
||||||
|
|
||||||
if project == nil {
|
if project == nil {
|
||||||
return false, nil
|
return false, nil
|
||||||
}
|
}
|
||||||
|
@ -360,7 +406,7 @@ func (p *ProjectManager) GetAll(query *models.ProjectQueryParam, base ...*models
|
||||||
m["name"] = query.Name
|
m["name"] = query.Name
|
||||||
}
|
}
|
||||||
if query.Public != nil {
|
if query.Public != nil {
|
||||||
m["isPublic"] = strconv.FormatBool(*query.Public)
|
m["public"] = strconv.FormatBool(*query.Public)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -28,7 +28,7 @@ var (
|
||||||
client = http.DefaultClient
|
client = http.DefaultClient
|
||||||
endpoint = "http://127.0.0.1:8282"
|
endpoint = "http://127.0.0.1:8282"
|
||||||
tokenReader = &RawTokenReader{
|
tokenReader = &RawTokenReader{
|
||||||
Token: "",
|
Token: "token",
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -195,7 +195,7 @@ func TestGet(t *testing.T) {
|
||||||
|
|
||||||
// get by invalid ID
|
// get by invalid ID
|
||||||
project, err := pm.Get(int64(0))
|
project, err := pm.Get(int64(0))
|
||||||
assert.Nil(t, err)
|
assert.NotNil(t, err)
|
||||||
assert.Nil(t, project)
|
assert.Nil(t, project)
|
||||||
|
|
||||||
// get by invalid name
|
// get by invalid name
|
||||||
|
@ -223,7 +223,7 @@ func TestIsPublic(t *testing.T) {
|
||||||
assert.False(t, public)
|
assert.False(t, public)
|
||||||
|
|
||||||
// non-exist project
|
// non-exist project
|
||||||
public, err = pm.IsPublic(int64(0))
|
public, err = pm.IsPublic(int64(2))
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
assert.False(t, public)
|
assert.False(t, public)
|
||||||
|
|
||||||
|
@ -271,7 +271,7 @@ func TestExist(t *testing.T) {
|
||||||
assert.False(t, exist)
|
assert.False(t, exist)
|
||||||
|
|
||||||
// non-exist project
|
// non-exist project
|
||||||
exist, err = pm.Exist(int64(0))
|
exist, err = pm.Exist(int64(2))
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
assert.False(t, exist)
|
assert.False(t, exist)
|
||||||
|
|
||||||
|
|
|
@ -131,7 +131,9 @@ func TestPMSPolicyChecker(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
pm := pms.NewProjectManager(http.DefaultClient,
|
pm := pms.NewProjectManager(http.DefaultClient,
|
||||||
admiralEndpoint, nil)
|
admiralEndpoint, &pms.RawTokenReader{
|
||||||
|
Token: "token",
|
||||||
|
})
|
||||||
name := "project_for_test_get_sev_low"
|
name := "project_for_test_get_sev_low"
|
||||||
id, err := pm.Create(&models.Project{
|
id, err := pm.Create(&models.Project{
|
||||||
Name: name,
|
Name: name,
|
||||||
|
|
|
@ -4,4 +4,8 @@
|
||||||
name=admiral
|
name=admiral
|
||||||
port=8282
|
port=8282
|
||||||
docker rm -f $name 2>/dev/null
|
docker rm -f $name 2>/dev/null
|
||||||
docker run -d -p $port:8282 --name $name vmware/admiral:dev
|
docker run -d -p $port:8282 --name $name vmware/admiral:dev
|
||||||
|
|
||||||
|
# solution user token file for test
|
||||||
|
mkdir -p /etc/ui/token/
|
||||||
|
echo "token" > /etc/ui/token/tokens.properties
|
Loading…
Reference in New Issue
Block a user