Explorar el Código

feat: support schedule rule terminated status (#2127)

* support terminate status

Signed-off-by: yisaer <disxiaofei@163.com>

* fix test

Signed-off-by: yisaer <disxiaofei@163.com>

---------

Signed-off-by: yisaer <disxiaofei@163.com>
Song Gao hace 1 año
padre
commit
1db351dfd7
Se han modificado 2 ficheros con 64 adiciones y 2 borrados
  1. 31 2
      internal/topo/rule/ruleState.go
  2. 33 0
      internal/topo/rule/ruleState_test.go

+ 31 - 2
internal/topo/rule/ruleState.go

@@ -402,7 +402,11 @@ func (rs *RuleState) GetState() (string, error) {
 				result = "Running"
 			case context.Canceled:
 				if rs.Rule.IsScheduleRule() && rs.cronState.isInSchedule {
-					result = "Stopped: waiting for next schedule."
+					if isAfterTimeRanges(conf.GetNow(), rs.Rule.Options.CronDatetimeRange) {
+						result = "Stopped: schedule terminated."
+					} else {
+						result = "Stopped: waiting for next schedule."
+					}
 				} else {
 					result = "Stopped: canceled manually."
 				}
@@ -413,7 +417,11 @@ func (rs *RuleState) GetState() (string, error) {
 			}
 		} else {
 			if rs.cronState.isInSchedule {
-				result = "Stopped: waiting for next schedule."
+				if isAfterTimeRanges(conf.GetNow(), rs.Rule.Options.CronDatetimeRange) {
+					result = "Stopped: schedule terminated."
+				} else {
+					result = "Stopped: waiting for next schedule."
+				}
 			} else {
 				result = "Stopped: canceled manually."
 			}
@@ -455,3 +463,24 @@ func isInScheduleRange(now time.Time, start string, end string) (bool, error) {
 	}
 	return false, nil
 }
+
+func isAfterTimeRanges(now time.Time, ranges []api.DatetimeRange) bool {
+	if len(ranges) < 1 {
+		return false
+	}
+	for _, r := range ranges {
+		isAfter, err := isAfterTimeRange(now, r.End)
+		if err != nil || !isAfter {
+			return false
+		}
+	}
+	return true
+}
+
+func isAfterTimeRange(now time.Time, end string) (bool, error) {
+	e, err := time.Parse(layout, end)
+	if err != nil {
+		return false, err
+	}
+	return now.After(e), nil
+}

+ 33 - 0
internal/topo/rule/ruleState_test.go

@@ -558,6 +558,7 @@ func TestScheduleRuleInRange(t *testing.T) {
 	}
 	const ruleStarted = "Running"
 	const ruleStopped = "Stopped: waiting for next schedule."
+	const ruleTerminated = "Stopped: schedule terminated."
 	func() {
 		rs, err := NewRuleState(r)
 		if err != nil {
@@ -615,4 +616,36 @@ func TestScheduleRuleInRange(t *testing.T) {
 			return
 		}
 	}()
+
+	r.Options.CronDatetimeRange = []api.DatetimeRange{
+		{
+			Begin: before.Format(layout),
+			End:   before.Format(layout),
+		},
+	}
+	func() {
+		rs, err := NewRuleState(r)
+		if err != nil {
+			t.Error(err)
+			return
+		}
+		if err := rs.startScheduleRule(); err != nil {
+			t.Error(err)
+			return
+		}
+		time.Sleep(500 * time.Millisecond)
+		state, err := rs.GetState()
+		if err != nil {
+			t.Errorf("get rule state error: %v", err)
+			return
+		}
+		if state != ruleTerminated {
+			t.Errorf("rule state mismatch: exp=%v, got=%v", ruleTerminated, state)
+			return
+		}
+		if !rs.cronState.isInSchedule {
+			t.Error("cron state should be in schedule")
+			return
+		}
+	}()
 }