/
engine.go
84 lines (71 loc) · 1.91 KB
/
engine.go
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
package engine
import (
"os"
"sync"
"time"
"github.com/govirtuo/kube-ns-suspender/metrics"
"github.com/rs/zerolog"
v1 "k8s.io/api/core/v1"
)
const (
Running = "Running"
Suspended = "Suspended"
)
type Engine struct {
Logger zerolog.Logger
Mutex sync.Mutex
Wl chan v1.Namespace
MetricsServ metrics.Server
RunningNamespacesList map[string]time.Time
RunningDuration time.Duration
Options Options
}
type Options struct {
WatcherIdle int
RunningDuration string
LogLevel string
TZ string
Prefix string
DryRun, NoKubeWarnings, HumanLogs bool
EmbededUI, WebUIOnly bool
}
// New returns a new engine instance
func New(opt Options) (*Engine, error) {
var err error
e := Engine{
Logger: zerolog.New(os.Stderr).With().Timestamp().Logger(),
Wl: make(chan v1.Namespace, 50),
Options: opt,
}
lvl, err := zerolog.ParseLevel(e.Options.LogLevel)
if err != nil {
return nil, err
}
e.Logger = e.Logger.Level(lvl)
if e.Options.HumanLogs {
e.Logger = e.Logger.Output(zerolog.ConsoleWriter{Out: os.Stderr})
}
if e.Options.Prefix[len(e.Options.Prefix)-1] != '/' {
e.Options.Prefix = e.Options.Prefix + "/"
}
e.RunningDuration, err = time.ParseDuration(opt.RunningDuration)
if err != nil {
return nil, err
}
return &e, nil
}
func flip(i int32) *int32 {
return &i
}
// getTimes takes a suspendAt value and convert its value into minutes, and do
// the same with time.Now().
func getTimes(suspendAt string) (int, int, error) {
suspendTime, err := time.Parse(time.Kitchen, suspendAt)
if err != nil {
return 0, 0, err
}
suspendTimeInt := suspendTime.Minute() + suspendTime.Hour()*60
now := time.Now().Local()
nowInt := now.Minute() + now.Hour()*60
return nowInt, suspendTimeInt, nil
}