diff --git a/api/replication_job.go b/api/replication_job.go index 380018c7c..7ced0bcac 100644 --- a/api/replication_job.go +++ b/api/replication_job.go @@ -21,6 +21,7 @@ import ( "io/ioutil" "net/http" "strconv" + "time" "github.com/vmware/harbor/dao" "github.com/vmware/harbor/models" @@ -59,6 +60,7 @@ func (ra *RepJobAPI) Prepare() { func (ra *RepJobAPI) List() { var policyID int64 var repository, status string + var startTime, endTime *time.Time var err error policyIDStr := ra.GetString("policy_id") @@ -69,10 +71,36 @@ func (ra *RepJobAPI) List() { } } + endTimeStr := ra.GetString("end_time") + if len(endTimeStr) != 0 { + i, err := strconv.ParseInt(endTimeStr, 10, 64) + if err != nil { + ra.CustomAbort(http.StatusBadRequest, "invalid end_time") + } + t := time.Unix(i, 0) + endTime = &t + } + + startTimeStr := ra.GetString("start_time") + if len(startTimeStr) != 0 { + i, err := strconv.ParseInt(startTimeStr, 10, 64) + if err != nil { + ra.CustomAbort(http.StatusBadRequest, "invalid start_time") + } + t := time.Unix(i, 0) + startTime = &t + } + + if startTime == nil && endTime == nil { + // if start_time and end_time are both null, list jobs of last 10 days + t := time.Now().UTC().AddDate(0, 0, -10) + startTime = &t + } + repository = ra.GetString("repository") status = ra.GetString("status") - jobs, err := dao.FilterRepJobs(policyID, repository, status) + jobs, err := dao.FilterRepJobs(policyID, repository, status, startTime, endTime, 1000) if err != nil { log.Errorf("failed to filter jobs according policy ID %d, repository %s, status %s: %v", policyID, repository, status, err) ra.RenderError(http.StatusInternalServerError, "Failed to query job") diff --git a/dao/dao_test.go b/dao/dao_test.go index 919882f24..5a17986fc 100644 --- a/dao/dao_test.go +++ b/dao/dao_test.go @@ -1180,7 +1180,7 @@ func TestDeleteRepJob(t *testing.T) { } func TestFilterRepJobs(t *testing.T) { - jobs, err := FilterRepJobs(policyID, "", "") + jobs, err := FilterRepJobs(policyID, "", "", nil, nil, 1000) if err != nil { log.Errorf("Error occured in FilterRepJobs: %v, policy ID: %d", err, policyID) return diff --git a/dao/replication_job.go b/dao/replication_job.go index 6de5af82d..f0d4782cd 100644 --- a/dao/replication_job.go +++ b/dao/replication_job.go @@ -311,7 +311,8 @@ func GetRepJobByPolicy(policyID int64) ([]*models.RepJob, error) { } // FilterRepJobs filters jobs by repo and policy ID -func FilterRepJobs(policyID int64, repository, status string) ([]*models.RepJob, error) { +func FilterRepJobs(policyID int64, repository, status string, startTime, + endTime *time.Time, limit int) ([]*models.RepJob, error) { o := GetOrmer() qs := o.QueryTable(new(models.RepJob)) @@ -324,6 +325,21 @@ func FilterRepJobs(policyID int64, repository, status string) ([]*models.RepJob, if len(status) != 0 { qs = qs.Filter("Status__icontains", status) } + + if startTime != nil { + fmt.Printf("%v\n", startTime) + qs = qs.Filter("CreationTime__gte", startTime) + } + + if endTime != nil { + fmt.Printf("%v\n", endTime) + qs = qs.Filter("CreationTime__lte", endTime) + } + + if limit != 0 { + qs = qs.Limit(limit) + } + qs = qs.OrderBy("-CreationTime") var jobs []*models.RepJob