forked from rancher/rancher
-
Notifications
You must be signed in to change notification settings - Fork 0
/
interval.go
62 lines (56 loc) · 1.54 KB
/
interval.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
package multiclusterapp
import (
"context"
"github.com/rancher/rancher/pkg/namespace"
"github.com/rancher/rancher/pkg/ticker"
"github.com/rancher/types/apis/management.cattle.io/v3"
"github.com/sirupsen/logrus"
"sync"
"time"
)
type IntervalData struct {
interval int
cancelFunc context.CancelFunc
}
var mcAppTickerData map[string]*IntervalData
var mcAppDataLock = sync.Mutex{}
func storeContext(cctx context.Context, mcapp *v3.MultiClusterApp, mcApps v3.MultiClusterAppInterface) {
if mcapp.Spec.UpgradeStrategy.RollingUpdate == nil {
return
}
set := mcapp.Spec.UpgradeStrategy.RollingUpdate.Interval
if set == 0 {
return
}
defer mcAppDataLock.Unlock()
mcAppDataLock.Lock()
if data, ok := mcAppTickerData[mcapp.Name]; ok {
if data.interval == set {
return
}
data.interval = set
data.cancelFunc()
delete(mcAppTickerData, mcapp.Name)
}
ctx, cancel := context.WithCancel(cctx)
go startTicker(ctx, set, mcApps, mcapp.Name)
mcAppTickerData[mcapp.Name] = &IntervalData{
interval: set,
cancelFunc: cancel,
}
}
func deleteContext(mcappName string) {
mcAppDataLock.Lock()
if data, ok := mcAppTickerData[mcappName]; ok {
data.cancelFunc()
delete(mcAppTickerData, mcappName)
}
mcAppDataLock.Unlock()
}
func startTicker(ctx context.Context, set int, mcApps v3.MultiClusterAppInterface, name string) {
interval := time.Duration(set) * time.Second
for range ticker.Context(ctx, interval) {
logrus.Debugf("mcappTicker: interval %v enqueue %s", set, name)
mcApps.Controller().Enqueue(namespace.GlobalNamespace, name)
}
}