-
Notifications
You must be signed in to change notification settings - Fork 57
Expand file tree
/
Copy pathduration.go
More file actions
67 lines (57 loc) · 1.64 KB
/
duration.go
File metadata and controls
67 lines (57 loc) · 1.64 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
package rules
import (
"fmt"
"os"
"time"
"github.com/sirupsen/logrus"
v1 "k8s.io/api/core/v1"
)
const (
ruleDuration = "duration"
envMaxDuration = "MAX_DURATION"
annotationMaxDuration = annotationPrefix + "/max-duration"
)
var _ Rule = (*duration)(nil)
type duration struct {
duration time.Duration
}
func (rule *duration) load() (bool, string, error) {
explicit := explicitLoad(ruleDuration)
value, hasDefault := os.LookupEnv(envMaxDuration)
if !explicit && !hasDefault {
return false, "", nil
}
duration, err := time.ParseDuration(value)
if !explicit && err != nil {
return false, "", fmt.Errorf("invalid max duration: %s", err)
}
rule.duration = duration
if rule.duration != 0 {
return true, fmt.Sprintf("maximum run duration %s", value), nil
}
return true, fmt.Sprint("maximum run duration (no default)"), nil
}
func (rule *duration) ShouldReap(pod v1.Pod) (bool, string) {
duration := rule.duration
annotationValue := pod.Annotations[annotationMaxDuration]
if annotationValue != "" {
annotationDuration, err := time.ParseDuration(annotationValue)
if err == nil {
duration = annotationDuration
} else {
logrus.Warnf("pod %s has invalid max duration annotation: %s", pod.Name, err)
}
}
if duration == 0 {
return false, ""
}
podStartTime := pod.Status.StartTime
if podStartTime == nil {
return false, ""
}
startTime := time.Unix(podStartTime.Unix(), 0) // convert to standard go time
cutoffTime := time.Now().Add(-1 * duration)
runningDuration := time.Now().Sub(startTime)
message := fmt.Sprintf("has been running for %s", runningDuration.String())
return startTime.Before(cutoffTime), message
}