mirror of
https://github.com/goharbor/harbor.git
synced 2024-11-30 06:03:45 +01:00
Merge pull request #738 from wemeya/apitest
add test code for log and statistic api
This commit is contained in:
commit
4a6362acaa
@ -59,7 +59,8 @@ install:
|
|||||||
- curl -L https://github.com/docker/compose/releases/download/${DOCKER_COMPOSE_VERSION}/docker-compose-`uname -s`-`uname -m` > docker-compose
|
- curl -L https://github.com/docker/compose/releases/download/${DOCKER_COMPOSE_VERSION}/docker-compose-`uname -s`-`uname -m` > docker-compose
|
||||||
- chmod +x docker-compose
|
- chmod +x docker-compose
|
||||||
- sudo mv docker-compose /usr/local/bin
|
- sudo mv docker-compose /usr/local/bin
|
||||||
- sudo sed -i '$a DOCKER_OPTS=\"$DOCKER_OPTS --insecure-registry 127.0.0.1\"' /etc/default/docker
|
- IP=`ip addr s eth0 |grep "inet "|awk '{print $2}' |awk -F "/" '{print $1}'`
|
||||||
|
- sudo sed -i '$a DOCKER_OPTS=\"--insecure-registry '$IP':5000\"' /etc/default/docker
|
||||||
- sudo service docker restart
|
- sudo service docker restart
|
||||||
- go get github.com/dghubble/sling
|
- go get github.com/dghubble/sling
|
||||||
- go get github.com/stretchr/testify
|
- go get github.com/stretchr/testify
|
||||||
@ -75,10 +76,10 @@ script:
|
|||||||
- docker-compose -f Deploy/docker-compose.test.yml up -d
|
- docker-compose -f Deploy/docker-compose.test.yml up -d
|
||||||
- go list ./... | grep -v -E 'vendor|tests' | xargs -L1 fgt golint
|
- go list ./... | grep -v -E 'vendor|tests' | xargs -L1 fgt golint
|
||||||
- go list ./... | grep -v -E 'vendor|tests' | xargs -L1 go vet
|
- go list ./... | grep -v -E 'vendor|tests' | xargs -L1 go vet
|
||||||
- IP=`ip addr s eth0 |grep "inet "|awk '{print $2}' |awk -F "/" '{print $1}'`
|
|
||||||
- export MYSQL_HOST=$IP
|
- export MYSQL_HOST=$IP
|
||||||
- export REGISTRY_URL=http://$IP:5000
|
- export REGISTRY_URL=$IP:5000
|
||||||
- echo $REGISTRY_URL
|
- echo $REGISTRY_URL
|
||||||
|
- ./tests/pushimage.sh
|
||||||
- ./Deploy/coverage4gotest.sh
|
- ./Deploy/coverage4gotest.sh
|
||||||
- goveralls -coverprofile=profile.cov -service=travis-ci
|
- goveralls -coverprofile=profile.cov -service=travis-ci
|
||||||
|
|
||||||
|
@ -61,6 +61,8 @@ func init() {
|
|||||||
beego.Router("/api/users/:id([0-9]+)/password", &UserAPI{}, "put:ChangePassword")
|
beego.Router("/api/users/:id([0-9]+)/password", &UserAPI{}, "put:ChangePassword")
|
||||||
beego.Router("/api/projects/:id/publicity", &ProjectAPI{}, "put:ToggleProjectPublic")
|
beego.Router("/api/projects/:id/publicity", &ProjectAPI{}, "put:ToggleProjectPublic")
|
||||||
beego.Router("/api/projects/:id([0-9]+)/logs/filter", &ProjectAPI{}, "post:FilterAccessLog")
|
beego.Router("/api/projects/:id([0-9]+)/logs/filter", &ProjectAPI{}, "post:FilterAccessLog")
|
||||||
|
beego.Router("/api/statistics", &StatisticAPI{})
|
||||||
|
beego.Router("/api/logs", &LogAPI{})
|
||||||
|
|
||||||
_ = updateInitPassword(1, "Harbor12345")
|
_ = updateInitPassword(1, "Harbor12345")
|
||||||
|
|
||||||
@ -90,17 +92,13 @@ func request(_sling *sling.Sling, acceptHeader string, authInfo ...usrInfo) (int
|
|||||||
//@return []Search
|
//@return []Search
|
||||||
//func (a api) SearchGet (q string) (apilib.Search, error) {
|
//func (a api) SearchGet (q string) (apilib.Search, error) {
|
||||||
func (a api) SearchGet(q string) (apilib.Search, error) {
|
func (a api) SearchGet(q string) (apilib.Search, error) {
|
||||||
|
|
||||||
_sling := sling.New().Get(a.basePath)
|
_sling := sling.New().Get(a.basePath)
|
||||||
|
|
||||||
// create path and map variables
|
// create path and map variables
|
||||||
path := "/api/search"
|
path := "/api/search"
|
||||||
_sling = _sling.Path(path)
|
_sling = _sling.Path(path)
|
||||||
|
|
||||||
type QueryParams struct {
|
type QueryParams struct {
|
||||||
Query string `url:"q,omitempty"`
|
Query string `url:"q,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
_sling = _sling.QueryStruct(&QueryParams{Query: q})
|
_sling = _sling.QueryStruct(&QueryParams{Query: q})
|
||||||
|
|
||||||
_, body, err := request(_sling, jsonAcceptHeader)
|
_, body, err := request(_sling, jsonAcceptHeader)
|
||||||
@ -118,10 +116,8 @@ func (a api) SearchGet(q string) (apilib.Search, error) {
|
|||||||
func (a api) ProjectsPost(prjUsr usrInfo, project apilib.Project) (int, error) {
|
func (a api) ProjectsPost(prjUsr usrInfo, project apilib.Project) (int, error) {
|
||||||
|
|
||||||
_sling := sling.New().Post(a.basePath)
|
_sling := sling.New().Post(a.basePath)
|
||||||
|
|
||||||
// create path and map variables
|
// create path and map variables
|
||||||
path := "/api/projects/"
|
path := "/api/projects/"
|
||||||
|
|
||||||
_sling = _sling.Path(path)
|
_sling = _sling.Path(path)
|
||||||
|
|
||||||
// body params
|
// body params
|
||||||
@ -140,7 +136,6 @@ func (a api) ProjectsPost(prjUsr usrInfo, project apilib.Project) (int, error) {
|
|||||||
func (a api) UsersUserIDPasswordPut(user usrInfo, userID int32, password apilib.Password) int {
|
func (a api) UsersUserIDPasswordPut(user usrInfo, userID int32, password apilib.Password) int {
|
||||||
|
|
||||||
_sling := sling.New().Put(a.basePath)
|
_sling := sling.New().Put(a.basePath)
|
||||||
|
|
||||||
// create path and map variables
|
// create path and map variables
|
||||||
path := "/api/users/" + fmt.Sprintf("%d", userID) + "/password"
|
path := "/api/users/" + fmt.Sprintf("%d", userID) + "/password"
|
||||||
fmt.Printf("change passwd path: %s\n", path)
|
fmt.Printf("change passwd path: %s\n", path)
|
||||||
@ -149,10 +144,45 @@ func (a api) UsersUserIDPasswordPut(user usrInfo, userID int32, password apilib.
|
|||||||
|
|
||||||
// body params
|
// body params
|
||||||
_sling = _sling.BodyJSON(password)
|
_sling = _sling.BodyJSON(password)
|
||||||
|
|
||||||
httpStatusCode, _, _ := request(_sling, jsonAcceptHeader, user)
|
httpStatusCode, _, _ := request(_sling, jsonAcceptHeader, user)
|
||||||
return httpStatusCode
|
return httpStatusCode
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a api) StatisticGet(user usrInfo) (apilib.StatisticMap, error) {
|
||||||
|
_sling := sling.New().Get(a.basePath)
|
||||||
|
|
||||||
|
// create path and map variables
|
||||||
|
path := "/api/statistics/"
|
||||||
|
fmt.Printf("project statistic path: %s\n", path)
|
||||||
|
_sling = _sling.Path(path)
|
||||||
|
var successPayload = new(apilib.StatisticMap)
|
||||||
|
code, body, err := request(_sling, jsonAcceptHeader, user)
|
||||||
|
if 200 == code && nil == err {
|
||||||
|
err = json.Unmarshal(body, &successPayload)
|
||||||
|
}
|
||||||
|
return *successPayload, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a api) LogGet(user usrInfo, startTime, endTime, lines string) (int, []apilib.AccessLog, error) {
|
||||||
|
_sling := sling.New().Get(a.basePath)
|
||||||
|
|
||||||
|
// create path and map variables
|
||||||
|
path := "/api/logs/"
|
||||||
|
fmt.Printf("logs path: %s\n", path)
|
||||||
|
_sling = _sling.Path(path)
|
||||||
|
type QueryParams struct {
|
||||||
|
StartTime string `url:"start_time,omitempty"`
|
||||||
|
EndTime string `url:"end_time,omitempty"`
|
||||||
|
Lines string `url:"lines,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
_sling = _sling.QueryStruct(&QueryParams{StartTime: startTime, EndTime: endTime, Lines: lines})
|
||||||
|
var successPayload []apilib.AccessLog
|
||||||
|
code, body, err := request(_sling, jsonAcceptHeader, user)
|
||||||
|
if 200 == code && nil == err {
|
||||||
|
err = json.Unmarshal(body, &successPayload)
|
||||||
|
}
|
||||||
|
return code, successPayload, err
|
||||||
}
|
}
|
||||||
|
|
||||||
////Delete a repository or a tag in a repository.
|
////Delete a repository or a tag in a repository.
|
||||||
|
124
api/log_test.go
Normal file
124
api/log_test.go
Normal file
@ -0,0 +1,124 @@
|
|||||||
|
package api
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
"github.com/vmware/harbor/tests/apitests/apilib"
|
||||||
|
"strconv"
|
||||||
|
"testing"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestLogGet(t *testing.T) {
|
||||||
|
|
||||||
|
fmt.Println("Testing Log API")
|
||||||
|
assert := assert.New(t)
|
||||||
|
apiTest := newHarborAPI()
|
||||||
|
|
||||||
|
//prepare for test
|
||||||
|
|
||||||
|
admin := &usrInfo{"admin", "Harbor12345"}
|
||||||
|
var project apilib.Project
|
||||||
|
project.ProjectName = "my_project"
|
||||||
|
project.Public = 1
|
||||||
|
|
||||||
|
//add the project first.
|
||||||
|
fmt.Println("add the project first.")
|
||||||
|
reply, err := apiTest.ProjectsPost(*admin, project)
|
||||||
|
if err != nil {
|
||||||
|
t.Error("Error while creat project", err.Error())
|
||||||
|
t.Log(err)
|
||||||
|
} else {
|
||||||
|
assert.Equal(int(201), reply, "Case 2: Project creation status should be 201")
|
||||||
|
}
|
||||||
|
//case 1: right parameters, expect the right output
|
||||||
|
now := fmt.Sprintf("%v", time.Now().Unix())
|
||||||
|
statusCode, result, err := apiTest.LogGet(*admin, "0", now, "3")
|
||||||
|
if err != nil {
|
||||||
|
t.Error("Error while get log information", err.Error())
|
||||||
|
t.Log(err)
|
||||||
|
} else {
|
||||||
|
assert.Equal(1, len(result), "lines of logs should be equal")
|
||||||
|
assert.Equal(int32(1), result[0].LogId, "LogId should be equal")
|
||||||
|
assert.Equal("my_project/", result[0].RepoName, "RepoName should be equal")
|
||||||
|
assert.Equal("N/A", result[0].RepoTag, "RepoTag should be equal")
|
||||||
|
assert.Equal("create", result[0].Operation, "Operation should be equal")
|
||||||
|
}
|
||||||
|
|
||||||
|
//case 2: wrong format of start_time parameter, expect the wrong output
|
||||||
|
now = fmt.Sprintf("%v", time.Now().Unix())
|
||||||
|
statusCode, result, err = apiTest.LogGet(*admin, "ss", now, "3")
|
||||||
|
if err != nil {
|
||||||
|
t.Error("Error occured while get log information since the format of start_time parameter is not right.", err.Error())
|
||||||
|
t.Log(err)
|
||||||
|
} else {
|
||||||
|
assert.Equal(int(400), statusCode, "Http status code should be 400")
|
||||||
|
}
|
||||||
|
|
||||||
|
//case 3: wrong format of end_time parameter, expect the wrong output
|
||||||
|
statusCode, result, err = apiTest.LogGet(*admin, "0", "cc", "3")
|
||||||
|
if err != nil {
|
||||||
|
t.Error("Error occured while get log information since the format of end_time parameter is not right.", err.Error())
|
||||||
|
t.Log(err)
|
||||||
|
} else {
|
||||||
|
assert.Equal(int(400), statusCode, "Http status code should be 400")
|
||||||
|
}
|
||||||
|
|
||||||
|
//case 4: wrong format of lines parameter, expect the wrong output
|
||||||
|
now = fmt.Sprintf("%v", time.Now().Unix())
|
||||||
|
statusCode, result, err = apiTest.LogGet(*admin, "0", now, "s")
|
||||||
|
if err != nil {
|
||||||
|
t.Error("Error occured while get log information since the format of lines parameter is not right.", err.Error())
|
||||||
|
t.Log(err)
|
||||||
|
} else {
|
||||||
|
assert.Equal(int(400), statusCode, "Http status code should be 400")
|
||||||
|
}
|
||||||
|
|
||||||
|
//case 5: wrong format of lines parameter, expect the wrong output
|
||||||
|
now = fmt.Sprintf("%v", time.Now().Unix())
|
||||||
|
statusCode, result, err = apiTest.LogGet(*admin, "0", now, "-5")
|
||||||
|
if err != nil {
|
||||||
|
t.Error("Error occured while get log information since the format of lines parameter is not right.", err.Error())
|
||||||
|
t.Log(err)
|
||||||
|
} else {
|
||||||
|
assert.Equal(int(400), statusCode, "Http status code should be 400")
|
||||||
|
}
|
||||||
|
|
||||||
|
//case 6: all parameters are null, expect the right output
|
||||||
|
statusCode, result, err = apiTest.LogGet(*admin, "", "", "")
|
||||||
|
if err != nil {
|
||||||
|
t.Error("Error while get log information", err.Error())
|
||||||
|
t.Log(err)
|
||||||
|
} else {
|
||||||
|
assert.Equal(1, len(result), "lines of logs should be equal")
|
||||||
|
assert.Equal(int32(1), result[0].LogId, "LogId should be equal")
|
||||||
|
assert.Equal("my_project/", result[0].RepoName, "RepoName should be equal")
|
||||||
|
assert.Equal("N/A", result[0].RepoTag, "RepoTag should be equal")
|
||||||
|
assert.Equal("create", result[0].Operation, "Operation should be equal")
|
||||||
|
}
|
||||||
|
|
||||||
|
//get the project
|
||||||
|
var projects []apilib.Project
|
||||||
|
httpStatusCode, projects, err := apiTest.ProjectsGet(project.ProjectName, 1)
|
||||||
|
if err != nil {
|
||||||
|
t.Error("Error while search project by proName and isPublic", err.Error())
|
||||||
|
t.Log(err)
|
||||||
|
} else {
|
||||||
|
assert.Equal(int(200), httpStatusCode, "httpStatusCode should be 200")
|
||||||
|
project.ProjectId = projects[0].ProjectId
|
||||||
|
}
|
||||||
|
|
||||||
|
//delete the project
|
||||||
|
projectID := strconv.Itoa(int(project.ProjectId))
|
||||||
|
httpStatusCode, err = apiTest.ProjectsDelete(*admin, projectID)
|
||||||
|
if err != nil {
|
||||||
|
t.Error("Error while delete project", err.Error())
|
||||||
|
t.Log(err)
|
||||||
|
} else {
|
||||||
|
assert.Equal(int(200), httpStatusCode, "Case 1: Project creation status should be 200")
|
||||||
|
//t.Log(result)
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Printf("\n")
|
||||||
|
|
||||||
|
}
|
86
api/statistic_test.go
Normal file
86
api/statistic_test.go
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
package api
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
"github.com/vmware/harbor/tests/apitests/apilib"
|
||||||
|
"strconv"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestStatisticGet(t *testing.T) {
|
||||||
|
|
||||||
|
fmt.Println("Testing Statistic API")
|
||||||
|
assert := assert.New(t)
|
||||||
|
|
||||||
|
apiTest := newHarborAPI()
|
||||||
|
|
||||||
|
//prepare for test
|
||||||
|
|
||||||
|
admin := &usrInfo{"admin", "Harbor12345"}
|
||||||
|
|
||||||
|
var myProCount, pubProCount, totalProCount int32
|
||||||
|
result, err := apiTest.StatisticGet(*admin)
|
||||||
|
if err != nil {
|
||||||
|
t.Error("Error while get statistic information", err.Error())
|
||||||
|
t.Log(err)
|
||||||
|
} else {
|
||||||
|
myProCount = result.MyProjectCount
|
||||||
|
pubProCount = result.PublicProjectCount
|
||||||
|
totalProCount = result.TotalProjectCount
|
||||||
|
}
|
||||||
|
//post project
|
||||||
|
var project apilib.Project
|
||||||
|
project.ProjectName = "statistic_project"
|
||||||
|
project.Public = 1
|
||||||
|
|
||||||
|
//case 2: admin successful login, expect project creation success.
|
||||||
|
fmt.Println("case 2: admin successful login, expect project creation success.")
|
||||||
|
reply, err := apiTest.ProjectsPost(*admin, project)
|
||||||
|
if err != nil {
|
||||||
|
t.Error("Error while creat project", err.Error())
|
||||||
|
t.Log(err)
|
||||||
|
} else {
|
||||||
|
assert.Equal(reply, int(201), "Case 2: Project creation status should be 201")
|
||||||
|
}
|
||||||
|
|
||||||
|
//get and compare
|
||||||
|
result, err = apiTest.StatisticGet(*admin)
|
||||||
|
if err != nil {
|
||||||
|
t.Error("Error while get statistic information", err.Error())
|
||||||
|
t.Log(err)
|
||||||
|
} else {
|
||||||
|
assert.Equal(myProCount+1, result.MyProjectCount, "MyProjectCount should be equal")
|
||||||
|
assert.Equal(int32(2), result.MyRepoCount, "MyRepoCount should be equal")
|
||||||
|
assert.Equal(pubProCount+1, result.PublicProjectCount, "PublicProjectCount should be equal")
|
||||||
|
assert.Equal(int32(2), result.PublicRepoCount, "PublicRepoCount should be equal")
|
||||||
|
assert.Equal(totalProCount+1, result.TotalProjectCount, "TotalProCount should be equal")
|
||||||
|
assert.Equal(int32(2), result.TotalRepoCount, "TotalRepoCount should be equal")
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//get the project
|
||||||
|
var projects []apilib.Project
|
||||||
|
httpStatusCode, projects, err := apiTest.ProjectsGet(project.ProjectName, 1)
|
||||||
|
if err != nil {
|
||||||
|
t.Error("Error while search project by proName and isPublic", err.Error())
|
||||||
|
t.Log(err)
|
||||||
|
} else {
|
||||||
|
assert.Equal(int(200), httpStatusCode, "httpStatusCode should be 200")
|
||||||
|
project.ProjectId = projects[0].ProjectId
|
||||||
|
}
|
||||||
|
|
||||||
|
//delete the project
|
||||||
|
projectID := strconv.Itoa(int(project.ProjectId))
|
||||||
|
httpStatusCode, err = apiTest.ProjectsDelete(*admin, projectID)
|
||||||
|
if err != nil {
|
||||||
|
t.Error("Error while delete project", err.Error())
|
||||||
|
t.Log(err)
|
||||||
|
} else {
|
||||||
|
assert.Equal(int(200), httpStatusCode, "Case 1: Project creation status should be 200")
|
||||||
|
//t.Log(result)
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Printf("\n")
|
||||||
|
|
||||||
|
}
|
@ -11,7 +11,7 @@ services:
|
|||||||
ports:
|
ports:
|
||||||
- 5000:5000
|
- 5000:5000
|
||||||
command:
|
command:
|
||||||
["serve", "/etc/registry/config.yml"]
|
["serve", "/etc/docker/registry/config.yml"]
|
||||||
mysql:
|
mysql:
|
||||||
build: ./db/
|
build: ./db/
|
||||||
restart: always
|
restart: always
|
||||||
|
12
tests/pushimage.sh
Executable file
12
tests/pushimage.sh
Executable file
@ -0,0 +1,12 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
IP=`ip addr s eth0 |grep "inet "|awk '{print $2}' |awk -F "/" '{print $1}'`
|
||||||
|
docker pull hello-world
|
||||||
|
docker pull docker
|
||||||
|
docker login -u admin -p Harbor12345 $IP:5000
|
||||||
|
|
||||||
|
docker tag hello-world $IP:5000/library/hello-world:latest
|
||||||
|
docker push $IP:5000/library/hello-world:latest
|
||||||
|
|
||||||
|
docker tag docker $IP:5000/library/docker:latest
|
||||||
|
docker push $IP:5000/library/docker:latest
|
Loading…
Reference in New Issue
Block a user