mirror of
https://github.com/goharbor/harbor.git
synced 2024-10-03 07:47:54 +02:00
Log error message in server side
Record the errors which are only returned to frontend in the server side for easy debugging.
This commit is contained in:
parent
2844d137d3
commit
ab41977dcf
@ -15,11 +15,12 @@
|
|||||||
package api
|
package api
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"net/http"
|
||||||
|
|
||||||
"github.com/vmware/harbor/src/common"
|
"github.com/vmware/harbor/src/common"
|
||||||
"github.com/vmware/harbor/src/common/dao"
|
"github.com/vmware/harbor/src/common/dao"
|
||||||
"github.com/vmware/harbor/src/common/models"
|
"github.com/vmware/harbor/src/common/models"
|
||||||
"github.com/vmware/harbor/src/common/utils/log"
|
"github.com/vmware/harbor/src/common/utils/log"
|
||||||
"net/http"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// InternalAPI handles request of harbor admin...
|
// InternalAPI handles request of harbor admin...
|
||||||
@ -44,7 +45,8 @@ func (ia *InternalAPI) Prepare() {
|
|||||||
func (ia *InternalAPI) SyncRegistry() {
|
func (ia *InternalAPI) SyncRegistry() {
|
||||||
err := SyncRegistry(ia.ProjectMgr)
|
err := SyncRegistry(ia.ProjectMgr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ia.CustomAbort(http.StatusInternalServerError, "internal error")
|
ia.HandleInternalServerError(err.Error())
|
||||||
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -51,7 +51,8 @@ func (ra *RepJobAPI) Prepare() {
|
|||||||
if len(ra.GetStringFromPath(":id")) != 0 {
|
if len(ra.GetStringFromPath(":id")) != 0 {
|
||||||
id, err := ra.GetInt64FromPath(":id")
|
id, err := ra.GetInt64FromPath(":id")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ra.CustomAbort(http.StatusBadRequest, "ID is invalid")
|
ra.HandleBadRequest(fmt.Sprintf("invalid ID: %s", ra.GetStringFromPath(":id")))
|
||||||
|
return
|
||||||
}
|
}
|
||||||
ra.jobID = id
|
ra.jobID = id
|
||||||
}
|
}
|
||||||
@ -63,7 +64,8 @@ func (ra *RepJobAPI) List() {
|
|||||||
|
|
||||||
policyID, err := ra.GetInt64("policy_id")
|
policyID, err := ra.GetInt64("policy_id")
|
||||||
if err != nil || policyID <= 0 {
|
if err != nil || policyID <= 0 {
|
||||||
ra.CustomAbort(http.StatusBadRequest, "invalid policy_id")
|
ra.HandleBadRequest(fmt.Sprintf("invalid policy_id: %s", ra.GetString("policy_id")))
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
policy, err := core.GlobalController.GetPolicy(policyID)
|
policy, err := core.GlobalController.GetPolicy(policyID)
|
||||||
@ -73,7 +75,8 @@ func (ra *RepJobAPI) List() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if policy.ID == 0 {
|
if policy.ID == 0 {
|
||||||
ra.CustomAbort(http.StatusNotFound, fmt.Sprintf("policy %d not found", policyID))
|
ra.HandleNotFound(fmt.Sprintf("policy %d not found", policyID))
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if !ra.SecurityCtx.HasAllPerm(policy.ProjectIDs[0]) {
|
if !ra.SecurityCtx.HasAllPerm(policy.ProjectIDs[0]) {
|
||||||
@ -95,7 +98,8 @@ func (ra *RepJobAPI) List() {
|
|||||||
if len(startTimeStr) != 0 {
|
if len(startTimeStr) != 0 {
|
||||||
i, err := strconv.ParseInt(startTimeStr, 10, 64)
|
i, err := strconv.ParseInt(startTimeStr, 10, 64)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ra.CustomAbort(http.StatusBadRequest, "invalid start_time")
|
ra.HandleBadRequest(fmt.Sprintf("invalid start_time: %s", startTimeStr))
|
||||||
|
return
|
||||||
}
|
}
|
||||||
t := time.Unix(i, 0)
|
t := time.Unix(i, 0)
|
||||||
query.StartTime = &t
|
query.StartTime = &t
|
||||||
@ -105,7 +109,8 @@ func (ra *RepJobAPI) List() {
|
|||||||
if len(endTimeStr) != 0 {
|
if len(endTimeStr) != 0 {
|
||||||
i, err := strconv.ParseInt(endTimeStr, 10, 64)
|
i, err := strconv.ParseInt(endTimeStr, 10, 64)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ra.CustomAbort(http.StatusBadRequest, "invalid end_time")
|
ra.HandleBadRequest(fmt.Sprintf("invalid end_time: %s", endTimeStr))
|
||||||
|
return
|
||||||
}
|
}
|
||||||
t := time.Unix(i, 0)
|
t := time.Unix(i, 0)
|
||||||
query.EndTime = &t
|
query.EndTime = &t
|
||||||
@ -133,7 +138,8 @@ func (ra *RepJobAPI) List() {
|
|||||||
// Delete ...
|
// Delete ...
|
||||||
func (ra *RepJobAPI) Delete() {
|
func (ra *RepJobAPI) Delete() {
|
||||||
if ra.jobID == 0 {
|
if ra.jobID == 0 {
|
||||||
ra.CustomAbort(http.StatusBadRequest, "id is nil")
|
ra.HandleBadRequest("ID is nil")
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
job, err := dao.GetRepJob(ra.jobID)
|
job, err := dao.GetRepJob(ra.jobID)
|
||||||
@ -143,11 +149,13 @@ func (ra *RepJobAPI) Delete() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if job == nil {
|
if job == nil {
|
||||||
ra.CustomAbort(http.StatusNotFound, fmt.Sprintf("job %d not found", ra.jobID))
|
ra.HandleNotFound(fmt.Sprintf("job %d not found", ra.jobID))
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if job.Status == models.JobPending || job.Status == models.JobRunning {
|
if job.Status == models.JobPending || job.Status == models.JobRunning {
|
||||||
ra.CustomAbort(http.StatusBadRequest, fmt.Sprintf("job is %s, can not be deleted", job.Status))
|
ra.HandleBadRequest(fmt.Sprintf("job is %s, can not be deleted", job.Status))
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if err = dao.DeleteRepJob(ra.jobID); err != nil {
|
if err = dao.DeleteRepJob(ra.jobID); err != nil {
|
||||||
@ -159,7 +167,8 @@ func (ra *RepJobAPI) Delete() {
|
|||||||
// GetLog ...
|
// GetLog ...
|
||||||
func (ra *RepJobAPI) GetLog() {
|
func (ra *RepJobAPI) GetLog() {
|
||||||
if ra.jobID == 0 {
|
if ra.jobID == 0 {
|
||||||
ra.CustomAbort(http.StatusBadRequest, "id is nil")
|
ra.HandleBadRequest("ID is nil")
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
job, err := dao.GetRepJob(ra.jobID)
|
job, err := dao.GetRepJob(ra.jobID)
|
||||||
@ -211,7 +220,8 @@ func (ra *RepJobAPI) StopJobs() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if policy.ID == 0 {
|
if policy.ID == 0 {
|
||||||
ra.CustomAbort(http.StatusNotFound, fmt.Sprintf("policy %d not found", req.PolicyID))
|
ra.HandleNotFound(fmt.Sprintf("policy %d not found", req.PolicyID))
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
jobs, err := dao.GetRepJobs(&models.RepJobQuery{
|
jobs, err := dao.GetRepJobs(&models.RepJobQuery{
|
||||||
|
@ -67,7 +67,8 @@ func (pa *RepPolicyAPI) Get() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if policy.ID == 0 {
|
if policy.ID == 0 {
|
||||||
pa.CustomAbort(http.StatusNotFound, http.StatusText(http.StatusNotFound))
|
pa.HandleNotFound(fmt.Sprintf("policy %d not found", id))
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if !pa.SecurityCtx.HasAllPerm(policy.ProjectIDs[0]) {
|
if !pa.SecurityCtx.HasAllPerm(policy.ProjectIDs[0]) {
|
||||||
@ -94,7 +95,8 @@ func (pa *RepPolicyAPI) List() {
|
|||||||
if len(projectIDStr) > 0 {
|
if len(projectIDStr) > 0 {
|
||||||
projectID, err := strconv.ParseInt(projectIDStr, 10, 64)
|
projectID, err := strconv.ParseInt(projectIDStr, 10, 64)
|
||||||
if err != nil || projectID <= 0 {
|
if err != nil || projectID <= 0 {
|
||||||
pa.CustomAbort(http.StatusBadRequest, "invalid project ID")
|
pa.HandleBadRequest(fmt.Sprintf("invalid project ID: %s", projectIDStr))
|
||||||
|
return
|
||||||
}
|
}
|
||||||
queryParam.ProjectID = projectID
|
queryParam.ProjectID = projectID
|
||||||
}
|
}
|
||||||
@ -208,7 +210,8 @@ func (pa *RepPolicyAPI) Put() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if originalPolicy.ID == 0 {
|
if originalPolicy.ID == 0 {
|
||||||
pa.CustomAbort(http.StatusNotFound, http.StatusText(http.StatusNotFound))
|
pa.HandleNotFound(fmt.Sprintf("policy %d not found", id))
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
policy := &api_models.ReplicationPolicy{}
|
policy := &api_models.ReplicationPolicy{}
|
||||||
@ -287,7 +290,8 @@ func (pa *RepPolicyAPI) Delete() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if policy.ID == 0 {
|
if policy.ID == 0 {
|
||||||
pa.CustomAbort(http.StatusNotFound, http.StatusText(http.StatusNotFound))
|
pa.HandleNotFound(fmt.Sprintf("policy %d not found", id))
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
count, err := dao.GetTotalCountOfRepJobs(&models.RepJobQuery{
|
count, err := dao.GetTotalCountOfRepJobs(&models.RepJobQuery{
|
||||||
|
@ -242,17 +242,19 @@ func (ra *RepositoryAPI) Delete() {
|
|||||||
if len(tag) == 0 {
|
if len(tag) == 0 {
|
||||||
tagList, err := rc.ListTag()
|
tagList, err := rc.ListTag()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
log.Errorf("error occurred while listing tags of %s: %v", repoName, err)
|
||||||
|
|
||||||
if regErr, ok := err.(*registry_error.HTTPError); ok {
|
if regErr, ok := err.(*registry_error.HTTPError); ok {
|
||||||
ra.CustomAbort(regErr.StatusCode, regErr.Detail)
|
ra.CustomAbort(regErr.StatusCode, regErr.Detail)
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Errorf("error occurred while listing tags of %s: %v", repoName, err)
|
|
||||||
ra.CustomAbort(http.StatusInternalServerError, "internal error")
|
ra.CustomAbort(http.StatusInternalServerError, "internal error")
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO remove the logic if the bug of registry is fixed
|
// TODO remove the logic if the bug of registry is fixed
|
||||||
if len(tagList) == 0 {
|
if len(tagList) == 0 {
|
||||||
ra.CustomAbort(http.StatusNotFound, http.StatusText(http.StatusNotFound))
|
ra.HandleNotFound(fmt.Sprintf("no tags found for repository %s", repoName))
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
tags = append(tags, tagList...)
|
tags = append(tags, tagList...)
|
||||||
@ -293,6 +295,7 @@ func (ra *RepositoryAPI) Delete() {
|
|||||||
if regErr.StatusCode == http.StatusNotFound {
|
if regErr.StatusCode == http.StatusNotFound {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
log.Errorf("failed to delete tag %s: %v", t, err)
|
||||||
ra.CustomAbort(regErr.StatusCode, regErr.Detail)
|
ra.CustomAbort(regErr.StatusCode, regErr.Detail)
|
||||||
}
|
}
|
||||||
log.Errorf("error occurred while deleting tag %s:%s: %v", repoName, t, err)
|
log.Errorf("error occurred while deleting tag %s:%s: %v", repoName, t, err)
|
||||||
@ -614,7 +617,8 @@ func (ra *RepositoryAPI) GetManifests() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if version != "v1" && version != "v2" {
|
if version != "v1" && version != "v2" {
|
||||||
ra.CustomAbort(http.StatusBadRequest, "version should be v1 or v2")
|
ra.HandleBadRequest("version should be v1 or v2")
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
projectName, _ := utils.ParseRepository(repoName)
|
projectName, _ := utils.ParseRepository(repoName)
|
||||||
@ -648,11 +652,12 @@ func (ra *RepositoryAPI) GetManifests() {
|
|||||||
|
|
||||||
manifest, err := getManifest(rc, tag, version)
|
manifest, err := getManifest(rc, tag, version)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
log.Errorf("error occurred while getting manifest of %s:%s: %v", repoName, tag, err)
|
||||||
|
|
||||||
if regErr, ok := err.(*registry_error.HTTPError); ok {
|
if regErr, ok := err.(*registry_error.HTTPError); ok {
|
||||||
ra.CustomAbort(regErr.StatusCode, regErr.Detail)
|
ra.CustomAbort(regErr.StatusCode, regErr.Detail)
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Errorf("error occurred while getting manifest of %s:%s: %v", repoName, tag, err)
|
|
||||||
ra.CustomAbort(http.StatusInternalServerError, "internal error")
|
ra.CustomAbort(http.StatusInternalServerError, "internal error")
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -706,7 +711,8 @@ func getManifest(client *registry.Repository,
|
|||||||
func (ra *RepositoryAPI) GetTopRepos() {
|
func (ra *RepositoryAPI) GetTopRepos() {
|
||||||
count, err := ra.GetInt("count", 10)
|
count, err := ra.GetInt("count", 10)
|
||||||
if err != nil || count <= 0 {
|
if err != nil || count <= 0 {
|
||||||
ra.CustomAbort(http.StatusBadRequest, "invalid count")
|
ra.HandleBadRequest(fmt.Sprintf("invalid count: %s", ra.GetString("count")))
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
projectIDs := []int64{}
|
projectIDs := []int64{}
|
||||||
|
@ -42,7 +42,8 @@ func (sj *ScanJobAPI) Prepare() {
|
|||||||
}
|
}
|
||||||
id, err := sj.GetInt64FromPath(":id")
|
id, err := sj.GetInt64FromPath(":id")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
sj.CustomAbort(http.StatusBadRequest, "ID is invalid")
|
sj.HandleBadRequest("invalid ID")
|
||||||
|
return
|
||||||
}
|
}
|
||||||
sj.jobID = id
|
sj.jobID = id
|
||||||
|
|
||||||
|
@ -135,7 +135,8 @@ func (t *TargetAPI) Get() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if target == nil {
|
if target == nil {
|
||||||
t.CustomAbort(http.StatusNotFound, http.StatusText(http.StatusNotFound))
|
t.HandleNotFound(fmt.Sprintf("target %d not found", id))
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
target.Password = ""
|
target.Password = ""
|
||||||
@ -174,7 +175,8 @@ func (t *TargetAPI) Post() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ta != nil {
|
if ta != nil {
|
||||||
t.CustomAbort(http.StatusConflict, "name is already used")
|
t.HandleConflict("name is already used")
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
ta, err = dao.GetRepTargetByEndpoint(target.URL)
|
ta, err = dao.GetRepTargetByEndpoint(target.URL)
|
||||||
@ -184,7 +186,8 @@ func (t *TargetAPI) Post() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ta != nil {
|
if ta != nil {
|
||||||
t.CustomAbort(http.StatusConflict, fmt.Sprintf("the target whose endpoint is %s already exists", target.URL))
|
t.HandleConflict(fmt.Sprintf("the target whose endpoint is %s already exists", target.URL))
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(target.Password) != 0 {
|
if len(target.Password) != 0 {
|
||||||
@ -215,7 +218,8 @@ func (t *TargetAPI) Put() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if target == nil {
|
if target == nil {
|
||||||
t.CustomAbort(http.StatusNotFound, http.StatusText(http.StatusNotFound))
|
t.HandleNotFound(fmt.Sprintf("target %d not found", id))
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(target.Password) != 0 {
|
if len(target.Password) != 0 {
|
||||||
@ -264,7 +268,8 @@ func (t *TargetAPI) Put() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ta != nil {
|
if ta != nil {
|
||||||
t.CustomAbort(http.StatusConflict, "name is already used")
|
t.HandleConflict("name is already used")
|
||||||
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -276,7 +281,8 @@ func (t *TargetAPI) Put() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ta != nil {
|
if ta != nil {
|
||||||
t.CustomAbort(http.StatusConflict, fmt.Sprintf("the target whose endpoint is %s already exists", target.URL))
|
t.HandleConflict(fmt.Sprintf("the target whose endpoint is %s already exists", target.URL))
|
||||||
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -305,7 +311,8 @@ func (t *TargetAPI) Delete() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if target == nil {
|
if target == nil {
|
||||||
t.CustomAbort(http.StatusNotFound, http.StatusText(http.StatusNotFound))
|
t.HandleNotFound(fmt.Sprintf("target %d not found", id))
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
policies, err := dao.GetRepPolicyByTarget(id)
|
policies, err := dao.GetRepPolicyByTarget(id)
|
||||||
@ -315,6 +322,7 @@ func (t *TargetAPI) Delete() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if len(policies) > 0 {
|
if len(policies) > 0 {
|
||||||
|
log.Error("the target is used by policies, can not be deleted")
|
||||||
t.CustomAbort(http.StatusPreconditionFailed, "the target is used by policies, can not be deleted")
|
t.CustomAbort(http.StatusPreconditionFailed, "the target is used by policies, can not be deleted")
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -346,7 +354,8 @@ func (t *TargetAPI) ListPolicies() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if target == nil {
|
if target == nil {
|
||||||
t.CustomAbort(http.StatusNotFound, http.StatusText(http.StatusNotFound))
|
t.HandleNotFound(fmt.Sprintf("target %d not found", id))
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
policies, err := dao.GetRepPolicyByTarget(id)
|
policies, err := dao.GetRepPolicyByTarget(id)
|
||||||
|
@ -292,7 +292,8 @@ func (ua *UserAPI) ChangePassword() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if req.NewPassword == "" {
|
if req.NewPassword == "" {
|
||||||
ua.CustomAbort(http.StatusBadRequest, "please_input_new_password")
|
ua.HandleBadRequest("new password is null")
|
||||||
|
return
|
||||||
}
|
}
|
||||||
updateUser := models.User{UserID: ua.userID, Password: req.NewPassword, Salt: user.Salt}
|
updateUser := models.User{UserID: ua.userID, Password: req.NewPassword, Salt: user.Salt}
|
||||||
err = dao.ChangeUserPassword(updateUser, req.OldPassword)
|
err = dao.ChangeUserPassword(updateUser, req.OldPassword)
|
||||||
|
Loading…
Reference in New Issue
Block a user