From 5205bd2367fea641ecd058c67c4500661e4de18d Mon Sep 17 00:00:00 2001 From: wemeya Date: Mon, 13 Jun 2016 18:51:14 +0800 Subject: [PATCH 01/11] change url for toggle project --- docs/swagger.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/swagger.yaml b/docs/swagger.yaml index e4c274984..150960b0e 100644 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -119,7 +119,7 @@ paths: description: Project name already exists. 500: description: Unexpected internal errors. - /projects/{project_id}: + /projects/{project_id}/pulicity: put: summary: Update properties for a selected project. description: | From a2c073e8f97e2985159ac8d100be20f8ec6a59be Mon Sep 17 00:00:00 2001 From: wemeya Date: Tue, 14 Jun 2016 18:03:20 +0800 Subject: [PATCH 02/11] change url error --- docs/swagger.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/swagger.yaml b/docs/swagger.yaml index 150960b0e..671d6fd8d 100644 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -119,7 +119,7 @@ paths: description: Project name already exists. 500: description: Unexpected internal errors. - /projects/{project_id}/pulicity: + /projects/{project_id}/publicity: put: summary: Update properties for a selected project. description: | From 5f6b53b93bd108bce8e692c9098aa94da6053876 Mon Sep 17 00:00:00 2001 From: yhua123 Date: Wed, 15 Jun 2016 11:02:33 +0800 Subject: [PATCH 03/11] Update .travis.yml 1 change docker default login method from https to http 2 run test preparation --- .travis.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.travis.yml b/.travis.yml index 9251eb585..705fe6909 100644 --- a/.travis.yml +++ b/.travis.yml @@ -58,6 +58,8 @@ install: - curl -L https://github.com/docker/compose/releases/download/${DOCKER_COMPOSE_VERSION}/docker-compose-`uname -s`-`uname -m` > docker-compose - chmod +x docker-compose - sudo mv docker-compose /usr/local/bin + - sudo sed -i '$a DOCKER_OPTS=\"$DOCKER_OPTS --insecure-registry 127.0.0.1\"' /etc/default/docker + - sudo service docker restart - go get github.com/dghubble/sling - go get github.com/stretchr/testify @@ -78,4 +80,5 @@ script: # test for API + - sudo ./tests/testprepare.sh - go test -v ./tests/apitests From fc92df0d17b967b77bdc47d3c459442641db150c Mon Sep 17 00:00:00 2001 From: yhua123 Date: Wed, 15 Jun 2016 11:19:10 +0800 Subject: [PATCH 04/11] Update testprepare.sh change docker login address to localhost --- tests/testprepare.sh | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/tests/testprepare.sh b/tests/testprepare.sh index 0d9a30ce2..747ab3c93 100755 --- a/tests/testprepare.sh +++ b/tests/testprepare.sh @@ -1,11 +1,10 @@ -IP=`ip addr s eth0 |grep "inet "|awk '{print $2}' |awk -F "/" '{print $1}'` -#echo $IP docker pull hello-world docker pull docker -#docker login -u admin -p Harbor12345 $IP +docker login -u admin -p Harbor12345 127.0.0.1 -docker tag hello-world $IP/library/hello-world -docker push $IP/library/hello-world +docker tag hello-world 127.0.0.1/library/hello-world +docker push 127.0.0.1/library/hello-world + +docker tag docker 127.0.0.1/library/docker +docker push 127.0.0.1/library/docker -docker tag docker $IP/library/docker -docker push $IP/library/docker From f1b5ee1522b83b7669b3be3cf22cafa00323759a Mon Sep 17 00:00:00 2001 From: yhua123 Date: Wed, 15 Jun 2016 11:20:34 +0800 Subject: [PATCH 05/11] Create hbapidelrpo_test.go add new test case for delete repo API --- tests/apitests/hbapidelrpo_test.go | 130 +++++++++++++++++++++++++++++ 1 file changed, 130 insertions(+) create mode 100644 tests/apitests/hbapidelrpo_test.go diff --git a/tests/apitests/hbapidelrpo_test.go b/tests/apitests/hbapidelrpo_test.go new file mode 100644 index 000000000..e769a9160 --- /dev/null +++ b/tests/apitests/hbapidelrpo_test.go @@ -0,0 +1,130 @@ +package HarborAPItest + +import ( + "fmt" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/vmware/harbor/tests/apitests/apilib" +) + +func TestRepositoryDelete(t *testing.T) { + fmt.Println("Test for Project Delete (ProjectDelete) API\n") + assert := assert.New(t) + + //prepare for test + adminEr := &HarborAPI.UsrInfo{"admin", "Harbor1234"} + admin := &HarborAPI.UsrInfo{"admin", "Harbor12345"} + prjUsr := &HarborAPI.UsrInfo{"unknown", "unknown"} + + fmt.Println("Checking repository status...\n") + apiTest := HarborAPI.NewHarborAPI() + var searchResault HarborAPI.Search + searchResault, err := apiTest.SearchGet("library") + //fmt.Printf("%+v\n", resault) + + if err != nil { + t.Error("Error while search project or repository", err.Error()) + t.Log(err) + } else { + //assert.Equal(searchResault.Repositories[0].RepoName, "library/docker", "1st repo name should be") + if !assert.Equal(searchResault.Repositories[0].RepoName, "library/docker", "1st repo name should be") { + t.Error("fail to find repo 'library/docker'", err.Error()) + t.Log(err) + } else { + fmt.Println("repo 'library/docker' exit\n") + } + //assert.Equal(searchResault.Repositories[1].RepoName, "library/hello-world", "2nd repo name should be") + if !assert.Equal(searchResault.Repositories[1].RepoName, "library/hello-world", "2nd repo name should be") { + t.Error("fail to find repo 'library/hello-world'", err.Error()) + t.Log(err) + } else { + fmt.Println("repo 'library/hello-world' exit\n") + } + + //t.Log(resault) + } + + //case 1: admin login fail, expect repo delete fail. + fmt.Println("case 1: admin login fail, expect repo delete fail.") + + resault, err := apiTest.HarborLogin(*adminEr) + if err != nil { + t.Error("Error while admin login", err.Error()) + t.Log(err) + } else { + assert.Equal(resault, int(401), "Admin login status should be 401") + //t.Log(resault) + } + if resault != 401 { + t.Log(resault) + } else { + prjUsr = adminEr + } + + resault, err = apiTest.RepositoriesDelete(*prjUsr, "library/docker", "") + if err != nil { + t.Error("Error while delete repository", err.Error()) + t.Log(err) + } else { + assert.Equal(resault, int(401), "Case 1: Repository delete status should be 401") + //t.Log(resault) + } + + //case 2: admin successful login, expect repository delete success. + fmt.Println("case 2: admin successful login, expect repository delete success.") + resault, err = apiTest.HarborLogin(*admin) + if err != nil { + t.Error("Error while admin login", err.Error()) + t.Log(err) + } else { + assert.Equal(resault, int(200), "Admin login status should be 200") + //t.Log(resault) + } + if resault != 200 { + t.Log(resault) + } else { + prjUsr = admin + } + + resault, err = apiTest.RepositoriesDelete(*prjUsr, "library/docker", "") + if err != nil { + t.Error("Error while delete repository", err.Error()) + t.Log(err) + } else { + if assert.Equal(resault, int(200), "Case 2: Repository delete status should be 200") { + fmt.Println("Repository 'library/docker' delete success.") + } + //t.Log(resault) + } + + resault, err = apiTest.RepositoriesDelete(*prjUsr, "library/hello-world", "") + if err != nil { + t.Error("Error while delete repository", err.Error()) + t.Log(err) + } else { + if assert.Equal(resault, int(200), "Case 2: Repository delete status should be 200") { + fmt.Println("Repository 'hello-world' delete success.") + } + //t.Log(resault) + } + + //case 3: delete one repo not exit, expect repo delete fail. + fmt.Println("case 3: delete one repo not exit, expect repo delete fail.") + + resault, err = apiTest.RepositoriesDelete(*prjUsr, "library/hello-world", "") + if err != nil { + t.Error("Error while delete repository", err.Error()) + t.Log(err) + } else { + if assert.Equal(resault, int(404), "Case 3: Repository delete status should be 404") { + fmt.Println("Repository 'hello-world' not exit.") + } + //t.Log(resault) + } + + //if resault.Response.StatusCode != 200 { + // t.Log(resault.Response) + //} + +} From 7ae8d54f724566d347f241d99a710c2db83e1ccb Mon Sep 17 00:00:00 2001 From: yhua123 Date: Wed, 15 Jun 2016 12:14:45 +0800 Subject: [PATCH 06/11] Update .travis.yml add sudo before hostcfg --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 705fe6909..b86e1adae 100644 --- a/.travis.yml +++ b/.travis.yml @@ -29,9 +29,9 @@ env: HARBOR_ADMIN_PASSWD: Harbor12345 before_install: - - ./tests/hostcfg.sh + - sudo ./tests/hostcfg.sh - cd Deploy - - ./prepare + - sudo ./prepare - cd .. install: From ca16841c51d2ef06e25ad7a3d542675393c9b1d9 Mon Sep 17 00:00:00 2001 From: yhua123 Date: Wed, 15 Jun 2016 12:39:31 +0800 Subject: [PATCH 07/11] Update hostcfg.sh review Deploy/harbor.cfg --- tests/hostcfg.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/hostcfg.sh b/tests/hostcfg.sh index d25c9dfec..15fdb71a4 100755 --- a/tests/hostcfg.sh +++ b/tests/hostcfg.sh @@ -2,3 +2,4 @@ IP=`ip addr s eth0 |grep "inet "|awk '{print $2}' |awk -F "/" '{print $1}'` #echo $IP sed "s/reg.mydomain.com/$IP/" -i Deploy/harbor.cfg +cat Deploy/harbor.cfg From f3ed963c75ac0f19419e9284988ba97689527c96 Mon Sep 17 00:00:00 2001 From: yhua123 Date: Wed, 15 Jun 2016 12:50:00 +0800 Subject: [PATCH 08/11] Update hostcfg.sh sudo --- tests/hostcfg.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/hostcfg.sh b/tests/hostcfg.sh index 15fdb71a4..6decb7eea 100755 --- a/tests/hostcfg.sh +++ b/tests/hostcfg.sh @@ -1,5 +1,5 @@ #!/bin/bash IP=`ip addr s eth0 |grep "inet "|awk '{print $2}' |awk -F "/" '{print $1}'` -#echo $IP -sed "s/reg.mydomain.com/$IP/" -i Deploy/harbor.cfg +echo $IP +sudo sed "s/reg.mydomain.com/$IP/" -i Deploy/harbor.cfg cat Deploy/harbor.cfg From 7fbdf4e01800bed6d7065f58b9d35d2f663b3b90 Mon Sep 17 00:00:00 2001 From: yhua123 Date: Wed, 15 Jun 2016 12:57:04 +0800 Subject: [PATCH 09/11] Update hostcfg.sh change reg.mydomain.com to reg.mydomain.org --- tests/hostcfg.sh | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/tests/hostcfg.sh b/tests/hostcfg.sh index 6decb7eea..daf8bbdc7 100755 --- a/tests/hostcfg.sh +++ b/tests/hostcfg.sh @@ -1,5 +1,4 @@ #!/bin/bash IP=`ip addr s eth0 |grep "inet "|awk '{print $2}' |awk -F "/" '{print $1}'` -echo $IP -sudo sed "s/reg.mydomain.com/$IP/" -i Deploy/harbor.cfg -cat Deploy/harbor.cfg +#echo $IP +sudo sed "s/reg.mydomain.org/$IP/" -i Deploy/harbor.cfg From fc8fbbcb983568874a3da0b3bb419ccfb731664f Mon Sep 17 00:00:00 2001 From: Wenkai Yin Date: Wed, 15 Jun 2016 13:31:00 +0800 Subject: [PATCH 10/11] bug fix: modify the implements of checking whether project name is in lower case --- api/project.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/api/project.go b/api/project.go index 073fcdab0..75ba05342 100644 --- a/api/project.go +++ b/api/project.go @@ -18,6 +18,7 @@ package api import ( "fmt" "net/http" + "strings" "unicode" "github.com/vmware/harbor/dao" @@ -294,10 +295,10 @@ func validateProjectReq(req projectReq) error { if isContainIllegalChar(req.ProjectName, []string{"~", "-", "$", "\\", "[", "]", "{", "}", "(", ")", "&", "^", "%", "*", "<", ">", "\"", "'", "/", "?", "@"}) { return fmt.Errorf("project name contains illegal characters") } - for _, v := range pn { - if !unicode.IsLower(v) { - return fmt.Errorf("project name must be in lower case") - } + + if pn != strings.ToLower(pn) { + return fmt.Errorf("project name must be in lower case") } + return nil } From 836598f5c9551a46afe6587e21c5728a7cd43246 Mon Sep 17 00:00:00 2001 From: Wenkai Yin Date: Wed, 15 Jun 2016 13:42:19 +0800 Subject: [PATCH 11/11] remove useless import --- api/project.go | 1 - api/utils.go | 3 +++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/api/project.go b/api/project.go index 75ba05342..3d57abb02 100644 --- a/api/project.go +++ b/api/project.go @@ -19,7 +19,6 @@ import ( "fmt" "net/http" "strings" - "unicode" "github.com/vmware/harbor/dao" "github.com/vmware/harbor/models" diff --git a/api/utils.go b/api/utils.go index fead92469..e0f5d13cc 100644 --- a/api/utils.go +++ b/api/utils.go @@ -59,11 +59,13 @@ func listRoles(userID int, projectID int64) ([]models.Role, error) { roles := make([]models.Role, 0, 1) isSysAdmin, err := dao.IsAdminRole(userID) if err != nil { + log.Errorf("failed to determine whether the user %d is system admin: %v", userID, err) return roles, err } if isSysAdmin { role, err := dao.GetRoleByID(models.PROJECTADMIN) if err != nil { + log.Errorf("failed to get role %d: %v", models.PROJECTADMIN, err) return roles, err } roles = append(roles, *role) @@ -72,6 +74,7 @@ func listRoles(userID int, projectID int64) ([]models.Role, error) { rs, err := dao.GetUserProjectRoles(userID, projectID) if err != nil { + log.Errorf("failed to get user %d 's roles for project %d: %v", userID, projectID, err) return roles, err } roles = append(roles, rs...)