Merge pull request #2656 from ywk253100/170628_pms

Update test cases of PMS project manager
This commit is contained in:
Daniel Jiang 2017-06-28 16:05:51 +08:00 committed by GitHub
commit e5e5e75768
3 changed files with 32 additions and 27 deletions

View File

@ -92,14 +92,14 @@ func (a *AuthContext) HasAllPerm(project string) bool {
// GetMyProjects returns all projects which the user is a member of // GetMyProjects returns all projects which the user is a member of
func (a *AuthContext) GetMyProjects() ([]string, error) { func (a *AuthContext) GetMyProjects() ([]string, error) {
existence := map[string]string{} existence := map[string]bool{}
projects := []string{} projects := []string{}
for _, list := range a.Projects { for _, list := range a.Projects {
for _, p := range list { for _, p := range list {
if len(existence[p]) > 0 { if existence[p] {
continue continue
} }
existence[p] = p existence[p] = true
projects = append(projects, p) projects = append(projects, p)
} }
@ -107,9 +107,19 @@ func (a *AuthContext) GetMyProjects() ([]string, error) {
return projects, nil return projects, nil
} }
// GetByToken gets the user's auth context, if the username is not provided // GetByToken ...
func GetByToken(url, token string) (*AuthContext, error) {
return get(url, token)
}
// GetAuthCtxOfUser gets the user's auth context
func GetAuthCtxOfUser(url, token string, username string) (*AuthContext, error) {
return get(url, token, username)
}
// get the user's auth context, if the username is not provided
// get the default auth context of the token // get the default auth context of the token
func GetByToken(url, token string, username ...string) (*AuthContext, error) { func get(url, token string, username ...string) (*AuthContext, error) {
principalID := "" principalID := ""
if len(username) > 0 { if len(username) > 0 {
principalID = username[0] principalID = username[0]
@ -138,7 +148,7 @@ func GetByToken(url, token string, username ...string) (*AuthContext, error) {
return ctx, nil return ctx, nil
} }
// Login ... // Login with credential and returns token, auth context and error
func Login(url, username, password string) (string, *AuthContext, error) { func Login(url, username, password string) (string, *AuthContext, error) {
data, err := json.Marshal(&struct { data, err := json.Marshal(&struct {
Username string `json:"username"` Username string `json:"username"`

View File

@ -24,7 +24,6 @@ import (
"net/http" "net/http"
"strconv" "strconv"
"strings" "strings"
"time"
"github.com/vmware/harbor/src/common" "github.com/vmware/harbor/src/common"
"github.com/vmware/harbor/src/common/models" "github.com/vmware/harbor/src/common/models"
@ -55,7 +54,7 @@ type project struct {
CustomProperties map[string]string `json:"customProperties"` CustomProperties map[string]string `json:"customProperties"`
Administrators []*user `json:"administrators"` Administrators []*user `json:"administrators"`
Developers []*user `json:"members"` Developers []*user `json:"members"`
Guests []*user `json:"guests"` // TODO the json name needs to be modified according to the API Guests []*user `json:"viewers"`
} }
// NewProjectManager returns an instance of ProjectManager // NewProjectManager returns an instance of ProjectManager
@ -81,7 +80,7 @@ func (p *ProjectManager) Get(projectIDOrName interface{}) (*models.Project, erro
func (p *ProjectManager) get(projectIDOrName interface{}) (*project, error) { func (p *ProjectManager) get(projectIDOrName interface{}) (*project, error) {
m := map[string]string{} m := map[string]string{}
if id, ok := projectIDOrName.(int64); ok { if id, ok := projectIDOrName.(int64); ok {
m["customProperties.__harborId"] = strconv.FormatInt(id, 10) m["customProperties.__projectIndex"] = strconv.FormatInt(id, 10)
} else if name, ok := projectIDOrName.(string); ok { } else if name, ok := projectIDOrName.(string); ok {
m["name"] = name m["name"] = name
} else { } else {
@ -162,14 +161,14 @@ func convert(p *project) (*models.Project, error) {
project.Public = 1 project.Public = 1
} }
value := p.CustomProperties["__harborId"] value := p.CustomProperties["__projectIndex"]
if len(value) == 0 { if len(value) == 0 {
return nil, fmt.Errorf("property __harborId is null") return nil, fmt.Errorf("property __projectIndex is null")
} }
id, err := strconv.ParseInt(value, 10, 64) id, err := strconv.ParseInt(value, 10, 64)
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to parse __harborId %s to int64: %v", value, err) return nil, fmt.Errorf("failed to parse __projectIndex %s to int64: %v", value, err)
} }
project.ProjectID = id project.ProjectID = id
@ -308,7 +307,7 @@ func (p *ProjectManager) GetPublic() ([]*models.Project, error) {
// GetByMember ... // GetByMember ...
func (p *ProjectManager) GetByMember(username string) ([]*models.Project, error) { func (p *ProjectManager) GetByMember(username string) ([]*models.Project, error) {
projects := []*models.Project{} projects := []*models.Project{}
ctx, err := authcontext.GetByToken(p.endpoint, p.token, username) ctx, err := authcontext.GetAuthCtxOfUser(p.endpoint, p.token, username)
if err != nil { if err != nil {
return projects, err return projects, err
} }
@ -341,9 +340,6 @@ func (p *ProjectManager) Create(pro *models.Project) (int64, error) {
proj.CustomProperties["__preventVulnerableImagesFromRunningSeverity"] = pro.PreventVulnerableImagesFromRunningSeverity proj.CustomProperties["__preventVulnerableImagesFromRunningSeverity"] = pro.PreventVulnerableImagesFromRunningSeverity
proj.CustomProperties["__automaticallyScanImagesOnPush"] = strconv.FormatBool(pro.AutomaticallyScanImagesOnPush) proj.CustomProperties["__automaticallyScanImagesOnPush"] = strconv.FormatBool(pro.AutomaticallyScanImagesOnPush)
// TODO remove the logic if Admiral generates the harborId
proj.CustomProperties["__harborId"] = strconv.FormatInt(time.Now().UnixNano(), 10)
data, err := json.Marshal(proj) data, err := json.Marshal(proj)
if err != nil { if err != nil {
return 0, err return 0, err

View File

@ -34,16 +34,16 @@ func TestConvert(t *testing.T) {
assert.Nil(t, err) assert.Nil(t, err)
assert.Nil(t, pro) assert.Nil(t, pro)
//project without property __harborId //project without property __projectIndex
p := &project{} p := &project{}
pro, err = convert(p) pro, err = convert(p)
assert.NotNil(t, err) assert.NotNil(t, err)
assert.Nil(t, pro) assert.Nil(t, pro)
//project with invalid __harborId //project with invalid __projectIndex
p = &project{ p = &project{
CustomProperties: map[string]string{ CustomProperties: map[string]string{
"__harborId": "invalid_value", "__projectIndex": "invalid_value",
}, },
} }
pro, err = convert(p) pro, err = convert(p)
@ -85,7 +85,7 @@ func TestConvert(t *testing.T) {
Name: "test", Name: "test",
Public: true, Public: true,
CustomProperties: map[string]string{ CustomProperties: map[string]string{
"__harborId": "1", "__projectIndex": "1",
"__enableContentTrust": "true", "__enableContentTrust": "true",
"__preventVulnerableImagesFromRunning": "true", "__preventVulnerableImagesFromRunning": "true",
"__preventVulnerableImagesFromRunningSeverity": "medium", "__preventVulnerableImagesFromRunningSeverity": "medium",
@ -118,7 +118,7 @@ func TestParse(t *testing.T) {
"id": "41427587-70e9-4671-9a9e-b9def0a07bb7", "id": "41427587-70e9-4671-9a9e-b9def0a07bb7",
"name": "project02", "name": "project02",
"customProperties": { "customProperties": {
"__harborId": "2", "__projectIndex": "2",
"__enableContentTrust": "true", "__enableContentTrust": "true",
"__preventVulnerableImagesFromRunning": "true", "__preventVulnerableImagesFromRunning": "true",
"__preventVulnerableImagesFromRunningSeverity": "medium", "__preventVulnerableImagesFromRunningSeverity": "medium",
@ -140,7 +140,7 @@ func TestParse(t *testing.T) {
"id": "default-project", "id": "default-project",
"name": "default-project", "name": "default-project",
"customProperties": { "customProperties": {
"__harborId": "2", "__projectIndex": "2",
"__enableContentTrust": "true", "__enableContentTrust": "true",
"__preventVulnerableImagesFromRunning": "true", "__preventVulnerableImagesFromRunning": "true",
"__preventVulnerableImagesFromRunningSeverity": "medium", "__preventVulnerableImagesFromRunningSeverity": "medium",
@ -374,8 +374,6 @@ func TestCreate(t *testing.T) {
assert.True(t, project.AutomaticallyScanImagesOnPush) assert.True(t, project.AutomaticallyScanImagesOnPush)
} }
// TODO get the case back after Admiral'API is fixed
/*
func TestDelete(t *testing.T) { func TestDelete(t *testing.T) {
pm := NewProjectManager(endpoint, token) pm := NewProjectManager(endpoint, token)
@ -401,7 +399,7 @@ func TestDelete(t *testing.T) {
err = pm.Delete(name) err = pm.Delete(name)
assert.Nil(t, err) assert.Nil(t, err)
} }
*/
func TestUpdate(t *testing.T) { func TestUpdate(t *testing.T) {
pm := NewProjectManager(endpoint, token) pm := NewProjectManager(endpoint, token)
err := pm.Update(nil, nil) err := pm.Update(nil, nil)
@ -490,9 +488,10 @@ func TestGetTotal(t *testing.T) {
assert.Equal(t, total1+1, total2) assert.Equal(t, total1+1, total2)
} }
// TODO add test case
func TestGetHasReadPerm(t *testing.T) { func TestGetHasReadPerm(t *testing.T) {
pm := NewProjectManager(endpoint, token)
_, err := pm.GetHasReadPerm()
assert.NotNil(t, err)
} }
func delete(t *testing.T, id int64) { func delete(t *testing.T, id int64) {