From b0f6000f16f7bfb3198d15f4698b90f0d142046a Mon Sep 17 00:00:00 2001 From: Ziming Zhang Date: Mon, 29 Jul 2019 17:22:55 +0800 Subject: [PATCH 1/4] fix tag retention api bug Signed-off-by: Ziming Zhang Change-Id: Id01b3a00ee0fa18cb5b9e4a74bb61a76d7d29709 --- src/pkg/retention/dao/retention.go | 1 + src/pkg/retention/manager.go | 4 ++++ src/pkg/retention/policy/models.go | 2 +- 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/pkg/retention/dao/retention.go b/src/pkg/retention/dao/retention.go index bce0042b0..9bdb104c4 100644 --- a/src/pkg/retention/dao/retention.go +++ b/src/pkg/retention/dao/retention.go @@ -127,6 +127,7 @@ func ListExecutions(policyID int64, query *q.Query) ([]*models.RetentionExecutio qs := o.QueryTable(new(models.RetentionExecution)) qs = qs.Filter("policy_id", policyID) + qs = qs.OrderBy("-id") if query != nil { qs = qs.Limit(query.PageSize, (query.PageNumber-1)*query.PageSize) } diff --git a/src/pkg/retention/manager.go b/src/pkg/retention/manager.go index 5af100650..8052f7e77 100644 --- a/src/pkg/retention/manager.go +++ b/src/pkg/retention/manager.go @@ -66,6 +66,7 @@ type DefaultManager struct { func (d *DefaultManager) CreatePolicy(p *policy.Metadata) (int64, error) { p1 := &models.RetentionPolicy{} p1.ScopeLevel = p.Scope.Level + p1.ScopeReference = p.Scope.Reference p1.TriggerKind = p.Trigger.Kind data, _ := json.Marshal(p) p1.Data = string(data) @@ -79,6 +80,7 @@ func (d *DefaultManager) UpdatePolicy(p *policy.Metadata) error { p1 := &models.RetentionPolicy{} p1.ID = p.ID p1.ScopeLevel = p.Scope.Level + p1.ScopeReference = p.Scope.Reference p1.TriggerKind = p.Trigger.Kind p.ID = 0 data, _ := json.Marshal(p) @@ -142,6 +144,7 @@ func (d *DefaultManager) ListExecutions(policyID int64, query *q.Query) ([]*Exec e1.Status = e.Status e1.StartTime = e.StartTime e1.EndTime = e.EndTime + e1.DryRun = e.DryRun execs1 = append(execs1, e1) } return execs1, nil @@ -159,6 +162,7 @@ func (d *DefaultManager) GetExecution(eid int64) (*Execution, error) { e1.Status = e.Status e1.StartTime = e.StartTime e1.EndTime = e.EndTime + e1.DryRun = e.DryRun return e1, nil } diff --git a/src/pkg/retention/policy/models.go b/src/pkg/retention/policy/models.go index 4d1374e88..7fd48c205 100644 --- a/src/pkg/retention/policy/models.go +++ b/src/pkg/retention/policy/models.go @@ -59,7 +59,7 @@ type Metadata struct { // Valid Valid func (m *Metadata) Valid(v *validation.Validation) { - if m.Trigger.Kind == TriggerKindSchedule { + if m.Trigger != nil && m.Trigger.Kind == TriggerKindSchedule { if m.Trigger.Settings == nil { _ = v.SetError("Trigger.Settings", "Trigger.Settings is required") } else { From 7cc29f0b90e4b60b5a148429f269fca330e38f07 Mon Sep 17 00:00:00 2001 From: Ziming Zhang Date: Mon, 29 Jul 2019 18:36:51 +0800 Subject: [PATCH 2/4] fix tag retention api bug Signed-off-by: Ziming Zhang Change-Id: I2c295090de34d133671c01422a6812fa426e9be7 --- src/pkg/retention/dao/models/retention.go | 6 ---- src/pkg/retention/dao/retention.go | 38 +++++++++++++++++++---- src/pkg/retention/dao/retention_test.go | 2 -- 3 files changed, 32 insertions(+), 14 deletions(-) diff --git a/src/pkg/retention/dao/models/retention.go b/src/pkg/retention/dao/models/retention.go index b0864a36a..36b17aaa6 100644 --- a/src/pkg/retention/dao/models/retention.go +++ b/src/pkg/retention/dao/models/retention.go @@ -45,12 +45,6 @@ type RetentionExecution struct { StartTime time.Time EndTime time.Time `orm:"-"` Status string `orm:"-"` - Total int `orm:"-"` - Succeed int `orm:"-"` - Failed int `orm:"-"` - InProgress int `orm:"-"` - Stopped int `orm:"-"` - Pending int `orm:"-"` } // RetentionTask ... diff --git a/src/pkg/retention/dao/retention.go b/src/pkg/retention/dao/retention.go index 9bdb104c4..e0e397db6 100644 --- a/src/pkg/retention/dao/retention.go +++ b/src/pkg/retention/dao/retention.go @@ -3,7 +3,9 @@ package dao import ( "errors" "fmt" + "github.com/astaxie/beego/orm" "github.com/goharbor/harbor/src/common/dao" + jobmodels "github.com/goharbor/harbor/src/common/models" "github.com/goharbor/harbor/src/pkg/retention/dao/models" "github.com/goharbor/harbor/src/pkg/retention/q" ) @@ -93,21 +95,45 @@ func GetExecution(id int64) (*models.RetentionExecution, error) { // fillStatus the priority is InProgress Stopped Failed Succeed func fillStatus(exec *models.RetentionExecution) error { o := dao.GetOrmer() + var r orm.Params if _, err := o.Raw("select status, count(*) num from retention_task where execution_id = ? group by status", exec.ID). - RowsToStruct(exec, "status", "num"); err != nil { + RowsToMap(&r, "status", "num"); err != nil { return err } - exec.Total = exec.Pending + exec.InProgress + exec.Succeed + exec.Failed + exec.Stopped - if exec.Total == 0 { + var ( + total, running, succeed, failed, stopped int + ) + for k, v := range r { + total += v.(int) + switch k { + case jobmodels.JobScheduled: + running += 1 + case jobmodels.JobPending: + running += 1 + case jobmodels.JobRunning: + running += 1 + case jobmodels.JobRetrying: + running += 1 + case jobmodels.JobFinished: + succeed += 1 + case jobmodels.JobCanceled: + stopped += 1 + case jobmodels.JobStopped: + stopped += 1 + case jobmodels.JobError: + failed += 1 + } + } + if total == 0 { exec.Status = models.ExecutionStatusSucceed exec.EndTime = exec.StartTime return nil } - if exec.Pending+exec.InProgress > 0 { + if running > 0 { exec.Status = models.ExecutionStatusInProgress - } else if exec.Stopped > 0 { + } else if stopped > 0 { exec.Status = models.ExecutionStatusStopped - } else if exec.Failed > 0 { + } else if failed > 0 { exec.Status = models.ExecutionStatusFailed } else { exec.Status = models.ExecutionStatusSucceed diff --git a/src/pkg/retention/dao/retention_test.go b/src/pkg/retention/dao/retention_test.go index fede25da8..df7c757c7 100644 --- a/src/pkg/retention/dao/retention_test.go +++ b/src/pkg/retention/dao/retention_test.go @@ -159,10 +159,8 @@ func TestExecution(t *testing.T) { e := &models.RetentionExecution{ PolicyID: policyID, - Status: "Running", DryRun: false, Trigger: "manual", - Total: 10, StartTime: time.Now(), } id, err := CreateExecution(e) From e8f9f5855020fd59e1a54d4b59fe315d98e50a02 Mon Sep 17 00:00:00 2001 From: Ziming Zhang Date: Mon, 29 Jul 2019 19:29:03 +0800 Subject: [PATCH 3/4] fix tag retention api bug Signed-off-by: Ziming Zhang Change-Id: I26bb4aade70f35132a345a945fa19d35e8c92571 --- src/pkg/retention/dao/retention.go | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/pkg/retention/dao/retention.go b/src/pkg/retention/dao/retention.go index e0e397db6..e51cb42d4 100644 --- a/src/pkg/retention/dao/retention.go +++ b/src/pkg/retention/dao/retention.go @@ -107,21 +107,21 @@ func fillStatus(exec *models.RetentionExecution) error { total += v.(int) switch k { case jobmodels.JobScheduled: - running += 1 + running += v.(int) case jobmodels.JobPending: - running += 1 + running += v.(int) case jobmodels.JobRunning: - running += 1 + running += v.(int) case jobmodels.JobRetrying: - running += 1 + running += v.(int) case jobmodels.JobFinished: - succeed += 1 + succeed += v.(int) case jobmodels.JobCanceled: - stopped += 1 + stopped += v.(int) case jobmodels.JobStopped: - stopped += 1 + stopped += v.(int) case jobmodels.JobError: - failed += 1 + failed += v.(int) } } if total == 0 { From 81950980bda81b8bf4fe5306321d63c8ca6657ef Mon Sep 17 00:00:00 2001 From: Ziming Date: Tue, 30 Jul 2019 08:33:32 +0800 Subject: [PATCH 4/4] fix ci --- src/pkg/retention/dao/models/retention.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/pkg/retention/dao/models/retention.go b/src/pkg/retention/dao/models/retention.go index 36b17aaa6..c0eba65a0 100644 --- a/src/pkg/retention/dao/models/retention.go +++ b/src/pkg/retention/dao/models/retention.go @@ -41,10 +41,10 @@ type RetentionExecution struct { PolicyID int64 `orm:"column(policy_id)"` DryRun bool // manual, scheduled - Trigger string - StartTime time.Time - EndTime time.Time `orm:"-"` - Status string `orm:"-"` + Trigger string + StartTime time.Time + EndTime time.Time `orm:"-"` + Status string `orm:"-"` } // RetentionTask ...