Update gc api to fix issues found by UI implemention (#5920)

This commit is to update gc api to fix issues found by UI implemention:
1, Return json format of gc schedule
2, Unify capital and small letter
3,Return gc records by desc

Signed-off-by: wang yan <wangyan@vmware.com>
This commit is contained in:
Yan 2018-09-19 14:36:47 +08:00 committed by GitHub
parent 30e71a25de
commit 29ca31cf6c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 115 additions and 6 deletions

View File

@ -90,7 +90,7 @@ func SetAdminJobUUID(id int64, uuid string) error {
// GetTop10AdminJobs ... // GetTop10AdminJobs ...
func GetTop10AdminJobs() ([]*models.AdminJob, error) { func GetTop10AdminJobs() ([]*models.AdminJob, error) {
sql := `select * from admin_job sql := `select * from admin_job
where deleted = false order by update_time limit 10` where deleted = false order by update_time desc limit 10`
jobs := []*models.AdminJob{} jobs := []*models.AdminJob{}
_, err := GetOrmer().Raw(sql).QueryRows(&jobs) _, err := GetOrmer().Raw(sql).QueryRows(&jobs)
return jobs, err return jobs, err

View File

@ -24,6 +24,7 @@ import (
"github.com/goharbor/harbor/src/common/utils" "github.com/goharbor/harbor/src/common/utils"
"github.com/goharbor/harbor/src/common/utils/log" "github.com/goharbor/harbor/src/common/utils/log"
"github.com/goharbor/harbor/src/ui/config" "github.com/goharbor/harbor/src/ui/config"
"time"
) )
const ( const (
@ -50,9 +51,22 @@ type ScheduleParam struct {
// Daily, Weekly, Manual, None // Daily, Weekly, Manual, None
Type string `json:"type"` Type string `json:"type"`
// Optional, only used when type is 'weekly' // Optional, only used when type is 'weekly'
Weekday int8 `json:"Weekday"` Weekday int8 `json:"weekday"`
// The time offset with the UTC 00:00 in seconds // The time offset with the UTC 00:00 in seconds
Offtime int64 `json:"Offtime"` Offtime int64 `json:"offtime"`
}
// GCRep holds the response of query gc
type GCRep struct {
ID int64 `json:"id"`
Name string `json:"job_name"`
Kind string `json:"job_kind"`
Schedule *ScheduleParam `json:"schedule"`
Status string `json:"job_status"`
UUID string `json:"-"`
Deleted bool `json:"deleted"`
CreationTime time.Time `json:"creation_time"`
UpdateTime time.Time `json:"update_time"`
} }
// Valid validates the gc request // Valid validates the gc request

View File

@ -20,6 +20,7 @@ import (
"os" "os"
"strconv" "strconv"
"encoding/json"
"github.com/goharbor/harbor/src/common/dao" "github.com/goharbor/harbor/src/common/dao"
common_http "github.com/goharbor/harbor/src/common/http" common_http "github.com/goharbor/harbor/src/common/http"
common_job "github.com/goharbor/harbor/src/common/job" common_job "github.com/goharbor/harbor/src/common/job"
@ -109,11 +110,22 @@ func (gc *GCAPI) GetGC() {
jobs, err := dao.GetAdminJobs(&common_models.AdminJobQuery{ jobs, err := dao.GetAdminJobs(&common_models.AdminJobQuery{
ID: id, ID: id,
}) })
gcreps := []*models.GCRep{}
for _, job := range jobs {
gcrep, err := convertToGCRep(job)
if err != nil {
gc.HandleInternalServerError(fmt.Sprintf("failed to convert gc response: %v", err))
return
}
gcreps = append(gcreps, &gcrep)
}
if err != nil { if err != nil {
gc.HandleInternalServerError(fmt.Sprintf("failed to get admin jobs: %v", err)) gc.HandleInternalServerError(fmt.Sprintf("failed to get admin jobs: %v", err))
return return
} }
gc.Data["json"] = jobs gc.Data["json"] = gcreps
gc.ServeJSON() gc.ServeJSON()
} }
@ -124,7 +136,16 @@ func (gc *GCAPI) List() {
gc.HandleInternalServerError(fmt.Sprintf("failed to get admin jobs: %v", err)) gc.HandleInternalServerError(fmt.Sprintf("failed to get admin jobs: %v", err))
return return
} }
gc.Data["json"] = jobs gcreps := []*models.GCRep{}
for _, job := range jobs {
gcrep, err := convertToGCRep(job)
if err != nil {
gc.HandleInternalServerError(fmt.Sprintf("failed to convert gc response: %v", err))
return
}
gcreps = append(gcreps, &gcrep)
}
gc.Data["json"] = gcreps
gc.ServeJSON() gc.ServeJSON()
} }
@ -142,7 +163,16 @@ func (gc *GCAPI) Get() {
gc.HandleInternalServerError("Get more than one GC scheduled job, make sure there has only one.") gc.HandleInternalServerError("Get more than one GC scheduled job, make sure there has only one.")
return return
} }
gc.Data["json"] = jobs gcreps := []*models.GCRep{}
for _, job := range jobs {
gcrep, err := convertToGCRep(job)
if err != nil {
gc.HandleInternalServerError(fmt.Sprintf("failed to convert gc response: %v", err))
return
}
gcreps = append(gcreps, &gcrep)
}
gc.Data["json"] = gcreps
gc.ServeJSON() gc.ServeJSON()
} }
@ -230,3 +260,27 @@ func (gc *GCAPI) submitJob(gr *models.GCReq) {
return return
} }
} }
func convertToGCRep(job *common_models.AdminJob) (models.GCRep, error) {
if job == nil {
return models.GCRep{}, nil
}
gcrep := models.GCRep{
ID: job.ID,
Name: job.Name,
Kind: job.Kind,
Status: job.Status,
Deleted: job.Deleted,
CreationTime: job.CreationTime,
UpdateTime: job.UpdateTime,
}
if len(job.Cron) > 0 {
schedule := &models.ScheduleParam{}
if err := json.Unmarshal([]byte(job.Cron), &schedule); err != nil {
return models.GCRep{}, err
}
gcrep.Schedule = schedule
}
return gcrep, nil
}

View File

@ -3,6 +3,8 @@ package api
import ( import (
"testing" "testing"
common_models "github.com/goharbor/harbor/src/common/models"
api_modes "github.com/goharbor/harbor/src/ui/api/models"
"github.com/goharbor/harbor/tests/apitests/apilib" "github.com/goharbor/harbor/tests/apitests/apilib"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
) )
@ -37,3 +39,42 @@ func TestAdminJobGet(t *testing.T) {
assert.Equal(200, code, "Get adminjob status should be 200") assert.Equal(200, code, "Get adminjob status should be 200")
} }
} }
func TestConvertToGCRep(t *testing.T) {
cases := []struct {
input *common_models.AdminJob
expected api_modes.GCRep
}{
{
input: nil,
expected: api_modes.GCRep{},
},
{
input: &common_models.AdminJob{
ID: 1,
Name: "IMAGE_GC",
Kind: "Generic",
Cron: "{\"Type\":\"Manual\",\"Weekday\":0,\"Offtime\":0}",
Status: "pending",
Deleted: false,
},
expected: api_modes.GCRep{
ID: 1,
Name: "IMAGE_GC",
Kind: "Generic",
Schedule: &api_modes.ScheduleParam{
Type: "Manual",
Weekday: 0,
Offtime: 0,
},
Status: "pending",
Deleted: false,
},
},
}
for _, c := range cases {
actual, _ := convertToGCRep(c.input)
assert.EqualValues(t, c.expected, actual)
}
}