mirror of
https://github.com/goharbor/harbor.git
synced 2024-10-27 21:59:38 +01:00
Merge branch 'master' into sync_image
This commit is contained in:
commit
6b81bd27ce
@ -1,14 +1,14 @@
|
|||||||
language: go
|
language: go
|
||||||
|
|
||||||
go:
|
go:
|
||||||
- 1.5.3
|
- 1.6.2
|
||||||
|
|
||||||
go_import_path: github.com/vmware/harbor
|
go_import_path: github.com/vmware/harbor
|
||||||
|
|
||||||
service:
|
service:
|
||||||
- mysql
|
- mysql
|
||||||
|
|
||||||
env: GO15VENDOREXPERIMENT=1 DB_HOST=127.0.0.1 DB_PORT=3306 DB_USR=root DB_PWD=
|
env: DB_HOST=127.0.0.1 DB_PORT=3306 DB_USR=root DB_PWD=
|
||||||
|
|
||||||
install:
|
install:
|
||||||
- sudo apt-get update && sudo apt-get install -y libldap2-dev
|
- sudo apt-get update && sudo apt-get install -y libldap2-dev
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
FROM golang:1.5.1
|
FROM golang:1.6.2
|
||||||
|
|
||||||
MAINTAINER jiangd@vmware.com
|
MAINTAINER jiangd@vmware.com
|
||||||
|
|
||||||
@ -11,7 +11,6 @@ COPY . /go/src/github.com/vmware/harbor
|
|||||||
COPY ./vendor/golang.org /go/src/golang.org
|
COPY ./vendor/golang.org /go/src/golang.org
|
||||||
WORKDIR /go/src/github.com/vmware/harbor/ui
|
WORKDIR /go/src/github.com/vmware/harbor/ui
|
||||||
|
|
||||||
ENV GO15VENDOREXPERIMENT 1
|
|
||||||
RUN go get -d github.com/docker/distribution \
|
RUN go get -d github.com/docker/distribution \
|
||||||
&& go get -d github.com/docker/libtrust \
|
&& go get -d github.com/docker/libtrust \
|
||||||
&& go get -d github.com/go-sql-driver/mysql \
|
&& go get -d github.com/go-sql-driver/mysql \
|
||||||
|
@ -62,6 +62,14 @@ func GetAccessLogs(accessLog models.AccessLog) ([]models.AccessLog, error) {
|
|||||||
sql += ` and u.username like ? `
|
sql += ` and u.username like ? `
|
||||||
queryParam = append(queryParam, accessLog.Username)
|
queryParam = append(queryParam, accessLog.Username)
|
||||||
}
|
}
|
||||||
|
if accessLog.RepoName != "" {
|
||||||
|
sql += ` and a.repo_name = ? `
|
||||||
|
queryParam = append(queryParam, accessLog.RepoName)
|
||||||
|
}
|
||||||
|
if accessLog.RepoTag != "" {
|
||||||
|
sql += ` and a.repo_tag = ? `
|
||||||
|
queryParam = append(queryParam, accessLog.RepoTag)
|
||||||
|
}
|
||||||
if accessLog.Keywords != "" {
|
if accessLog.Keywords != "" {
|
||||||
sql += ` and a.operation in ( `
|
sql += ` and a.operation in ( `
|
||||||
keywordList := strings.Split(accessLog.Keywords, "/")
|
keywordList := strings.Split(accessLog.Keywords, "/")
|
||||||
|
@ -102,6 +102,8 @@ func clearUp(username string) {
|
|||||||
|
|
||||||
const username string = "Tester01"
|
const username string = "Tester01"
|
||||||
const projectName string = "test_project"
|
const projectName string = "test_project"
|
||||||
|
const repoTag string = "test1.1"
|
||||||
|
const repoTag2 string = "test1.2"
|
||||||
const SysAdmin int = 1
|
const SysAdmin int = 1
|
||||||
const projectAdmin int = 2
|
const projectAdmin int = 2
|
||||||
const developer int = 3
|
const developer int = 3
|
||||||
@ -419,6 +421,66 @@ func TestGetAccessLog(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestAddAccessLog(t *testing.T) {
|
||||||
|
var err error
|
||||||
|
var accessLogList []models.AccessLog
|
||||||
|
accessLog := models.AccessLog{
|
||||||
|
UserID: currentUser.UserID,
|
||||||
|
ProjectID: currentProject.ProjectID,
|
||||||
|
RepoName: currentProject.Name + "/",
|
||||||
|
RepoTag: repoTag,
|
||||||
|
GUID: "N/A",
|
||||||
|
Operation: "create",
|
||||||
|
OpTime: time.Now(),
|
||||||
|
}
|
||||||
|
err = AddAccessLog(accessLog)
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("Error occurred in AddAccessLog: %v", err)
|
||||||
|
}
|
||||||
|
accessLogList, err = GetAccessLogs(accessLog)
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("Error occurred in GetAccessLog: %v", err)
|
||||||
|
}
|
||||||
|
if len(accessLogList) != 1 {
|
||||||
|
t.Errorf("The length of accesslog list should be 1, actual: %d", len(accessLogList))
|
||||||
|
}
|
||||||
|
if accessLogList[0].RepoName != projectName+"/" {
|
||||||
|
t.Errorf("The project name does not match, expected: %s, actual: %s", projectName+"/", accessLogList[0].RepoName)
|
||||||
|
}
|
||||||
|
if accessLogList[0].RepoTag != repoTag {
|
||||||
|
t.Errorf("The repo tag does not match, expected: %s, actual: %s", repoTag, accessLogList[0].RepoTag)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestAccessLog(t *testing.T) {
|
||||||
|
var err error
|
||||||
|
var accessLogList []models.AccessLog
|
||||||
|
accessLog := models.AccessLog{
|
||||||
|
UserID: currentUser.UserID,
|
||||||
|
ProjectID: currentProject.ProjectID,
|
||||||
|
RepoName: currentProject.Name + "/",
|
||||||
|
RepoTag: repoTag2,
|
||||||
|
Operation: "create",
|
||||||
|
}
|
||||||
|
err = AccessLog(currentUser.Username, currentProject.Name, currentProject.Name+"/", repoTag2, "create")
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("Error occurred in AccessLog: %v", err)
|
||||||
|
}
|
||||||
|
accessLogList, err = GetAccessLogs(accessLog)
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("Error occurred in GetAccessLog: %v", err)
|
||||||
|
}
|
||||||
|
if len(accessLogList) != 1 {
|
||||||
|
t.Errorf("The length of accesslog list should be 1, actual: %d", len(accessLogList))
|
||||||
|
}
|
||||||
|
if accessLogList[0].RepoName != projectName+"/" {
|
||||||
|
t.Errorf("The project name does not match, expected: %s, actual: %s", projectName+"/", accessLogList[0].RepoName)
|
||||||
|
}
|
||||||
|
if accessLogList[0].RepoTag != repoTag2 {
|
||||||
|
t.Errorf("The repo tag does not match, expected: %s, actual: %s", repoTag2, accessLogList[0].RepoTag)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestProjectExists(t *testing.T) {
|
func TestProjectExists(t *testing.T) {
|
||||||
var exists bool
|
var exists bool
|
||||||
var err error
|
var err error
|
||||||
|
@ -109,7 +109,7 @@ paths:
|
|||||||
tags:
|
tags:
|
||||||
- Products
|
- Products
|
||||||
responses:
|
responses:
|
||||||
200:
|
201:
|
||||||
description: Project created successfully.
|
description: Project created successfully.
|
||||||
400:
|
400:
|
||||||
description: Unsatisfied with constraints of the project creation.
|
description: Unsatisfied with constraints of the project creation.
|
||||||
@ -383,6 +383,28 @@ paths:
|
|||||||
description: User does not have permission of admin role.
|
description: User does not have permission of admin role.
|
||||||
500:
|
500:
|
||||||
description: Unexpected internal errors.
|
description: Unexpected internal errors.
|
||||||
|
post:
|
||||||
|
summary: Creates a new user account.
|
||||||
|
description: |
|
||||||
|
This endpoint is to create a user if the user does not already exist.
|
||||||
|
parameters:
|
||||||
|
- name: user
|
||||||
|
in: body
|
||||||
|
description: New created user.
|
||||||
|
required: true
|
||||||
|
schema:
|
||||||
|
$ref: '#/definitions/User'
|
||||||
|
tags:
|
||||||
|
- Products
|
||||||
|
responses:
|
||||||
|
201:
|
||||||
|
description: User created successfully.
|
||||||
|
400:
|
||||||
|
description: Unsatisfied with constraints of the user creation.
|
||||||
|
403:
|
||||||
|
description: User registration can only be used by admin role user when self-registration is off.
|
||||||
|
500:
|
||||||
|
description: Unexpected internal errors.
|
||||||
/users/{user_id}:
|
/users/{user_id}:
|
||||||
put:
|
put:
|
||||||
summary: Update a registered user to change to be an administrator of Harbor.
|
summary: Update a registered user to change to be an administrator of Harbor.
|
||||||
@ -438,6 +460,37 @@ paths:
|
|||||||
description: User ID does not exist.
|
description: User ID does not exist.
|
||||||
500:
|
500:
|
||||||
description: Unexpected internal errors.
|
description: Unexpected internal errors.
|
||||||
|
/users/{user_id}/password:
|
||||||
|
put:
|
||||||
|
summary: Change the password on a user that already exists.
|
||||||
|
description: |
|
||||||
|
This endpoint is for user to update password. Users with the admin role can change any user's password. Guest users can change only their own password.
|
||||||
|
parameters:
|
||||||
|
- name: user_id
|
||||||
|
in: path
|
||||||
|
type: integer
|
||||||
|
format: int32
|
||||||
|
required: true
|
||||||
|
description: Registered user ID.
|
||||||
|
- name: password
|
||||||
|
in: body
|
||||||
|
description: Password to be updated.
|
||||||
|
required: true
|
||||||
|
schema:
|
||||||
|
$ref: '#/definitions/Password'
|
||||||
|
tags:
|
||||||
|
- Products
|
||||||
|
responses:
|
||||||
|
200:
|
||||||
|
description: Updated password successfully.
|
||||||
|
400:
|
||||||
|
description: Invalid user ID; Old password is blank; New password is blank.
|
||||||
|
401:
|
||||||
|
description: Old password is not correct.
|
||||||
|
403:
|
||||||
|
description: Guests can only change their own account.
|
||||||
|
500:
|
||||||
|
description: Unexpected internal errors.
|
||||||
/repositories:
|
/repositories:
|
||||||
get:
|
get:
|
||||||
summary: Get repositories accompany with relevant project and repo name.
|
summary: Get repositories accompany with relevant project and repo name.
|
||||||
@ -640,6 +693,15 @@ definitions:
|
|||||||
deleted:
|
deleted:
|
||||||
type: integer
|
type: integer
|
||||||
format: int32
|
format: int32
|
||||||
|
Password:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
old_password:
|
||||||
|
type: string
|
||||||
|
description: The user's existing password.
|
||||||
|
new_password:
|
||||||
|
type: string
|
||||||
|
description: New password for marking as to be updated.
|
||||||
AccessLog:
|
AccessLog:
|
||||||
type: object
|
type: object
|
||||||
properties:
|
properties:
|
||||||
|
Loading…
Reference in New Issue
Block a user