forked from kubeup/archon
-
Notifications
You must be signed in to change notification settings - Fork 0
/
initializer.go
125 lines (104 loc) · 2.73 KB
/
initializer.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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
package initializer
import (
"fmt"
"github.com/golang/glog"
//"k8s.io/kubernetes/pkg/api"
"k8s.io/apimachinery/pkg/runtime"
"kubeup.com/archon/pkg/clientset"
)
var (
ErrSkip = fmt.Errorf("This initializer will not process this resource")
)
type Object interface {
runtime.Object
GetInitializers() []string
SetInitializers([]string)
GetFinalizers() []string
SetFinalizers([]string)
}
type Initializer interface {
Token() string
Initialize(Object) (Object, error, bool)
Finalize(Object) (Object, error, bool)
//ResolveConflict(old runtime.Object, new runtime.Object) (runtime.Object, error)
}
type InitializerMap map[string]Initializer
type InitializerManager struct {
initializers InitializerMap
kubeClient clientset.Interface
}
func NewInitializerManager(list []Initializer, kubeClient clientset.Interface) (im *InitializerManager, err error) {
imap := make(InitializerMap)
for _, i := range list {
imap[i.Token()] = i
}
return &InitializerManager{
initializers: imap,
kubeClient: kubeClient,
}, nil
}
func (im *InitializerManager) Initialize(obj Object) (updatedObj Object, err error, retry bool) {
tokens := obj.GetInitializers()
glog.Infof("Initializer manager is initializing %v", tokens)
for _, token := range tokens {
init, ok := im.initializers[token]
if !ok {
glog.Infof("%s is not managed by initializer manager. will skip", token)
continue
}
glog.Infof("Initializer manager is initializing %v", token)
updatedObj, err, retry = init.Initialize(obj)
if err == ErrSkip {
continue
} else if err != nil {
glog.Errorf("Initializer error: %v", err)
return
}
break
}
return
}
func (im *InitializerManager) Finalize(obj Object) (updatedObj Object, err error, retry bool) {
tokens := obj.GetFinalizers()
glog.Infof("Initializer manager is finalizing %v", tokens)
for _, token := range tokens {
init, ok := im.initializers[token]
if !ok {
glog.Infof("%s is not managed by initializer manager. will skip", token)
continue
}
glog.Infof("Initializer manager is finalizing %v", token)
updatedObj, err, retry = init.Finalize(obj)
if err == ErrSkip {
continue
} else if err != nil {
glog.Errorf("Finalizer error: %v", err)
return nil, err, true
}
break
}
return
}
func (im *InitializerManager) FinalizeAll(obj Object) (updatedObj Object, err error, retry bool) {
retrys := 3
var obj2 Object
for retrys > 0 {
tokens := obj.GetFinalizers()
if len(tokens) == 0 {
break
}
obj2, err, retry = im.Finalize(obj)
if err != nil {
retrys -= 1
glog.Errorf("Unable to finalize object: %v", err)
} else if obj2 == nil {
glog.Warningf("Finalizer didn't return an update Object")
} else {
obj = obj2
}
}
if err == nil {
updatedObj = obj
}
return
}