@@ -14,12 +14,9 @@ import (
14
14
"github.com/bpineau/katafygio/pkg/event"
15
15
16
16
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
17
- "k8s.io/apimachinery/pkg/runtime"
18
17
"k8s.io/apimachinery/pkg/runtime/schema"
19
- "k8s.io/apimachinery/pkg/watch"
20
18
"k8s.io/client-go/discovery"
21
19
"k8s.io/client-go/dynamic"
22
- "k8s.io/client-go/tools/cache"
23
20
)
24
21
25
22
const discoveryInterval = 60 * time .Second
@@ -36,17 +33,13 @@ type Observer struct {
36
33
}
37
34
38
35
type gvk struct {
39
- group string
40
- version string
41
- kind string
42
- gv schema.GroupVersion
43
- ar metav1.APIResource
36
+ groupVersion schema.GroupVersion
37
+ apiResource metav1.APIResource
44
38
}
45
39
46
40
type resources map [string ]* gvk
47
41
48
- // New returns a new observer, that will watch for api resource kinds
49
- // and create new controllers for each one.
42
+ // New returns a new observer, that will watch API resources and create controllers
50
43
func New (config * config.KfConfig , notif * event.Notifier ) * Observer {
51
44
return & Observer {
52
45
config : config ,
@@ -72,7 +65,7 @@ func (c *Observer) Start() *Observer {
72
65
for {
73
66
err := c .refresh ()
74
67
if err != nil {
75
- c .config .Logger .Errorf ("Failed to refresh : %v" , err )
68
+ c .config .Logger .Errorf ("Refresh failed : %v" , err )
76
69
}
77
70
78
71
select {
@@ -92,8 +85,8 @@ func (c *Observer) Stop() {
92
85
93
86
close (c .stop )
94
87
95
- for _ , c := range c .ctrls {
96
- c .Stop ()
88
+ for _ , ct := range c .ctrls {
89
+ ct .Stop ()
97
90
}
98
91
99
92
<- c .done
@@ -110,30 +103,27 @@ func (c *Observer) refresh() error {
110
103
continue
111
104
}
112
105
113
- cl , err := c .cpool .ClientForGroupVersionKind (res .gv .WithKind (res .kind ))
106
+ kind := res .apiResource .Kind
107
+ gk := res .groupVersion .WithKind (kind )
108
+ cname := strings .ToLower (kind )
109
+
110
+ cl , err := c .cpool .ClientForGroupVersionKind (gk )
114
111
if err != nil {
115
- return fmt .Errorf ("failed to get a cpool for %s" , name )
112
+ return fmt .Errorf ("failed to get a client for %s" , name )
116
113
}
117
114
118
- client := cl .Resource (res .ar .DeepCopy (), metav1 .NamespaceAll )
119
-
120
- selector := metav1.ListOptions {LabelSelector : c .config .Filter }
121
- lw := & cache.ListWatch {
122
- ListFunc : func (options metav1.ListOptions ) (runtime.Object , error ) {
123
- return client .List (selector )
124
- },
125
- WatchFunc : func (options metav1.ListOptions ) (watch.Interface , error ) {
126
- return client .Watch (selector )
127
- },
128
- }
115
+ client := cl .Resource (res .apiResource .DeepCopy (), metav1 .NamespaceAll )
129
116
130
- c .ctrls [name ] = controller .New (lw , c .notif , strings . ToLower ( res . ar . Kind ) , c .config )
117
+ c .ctrls [name ] = controller .New (client , c .notif , cname , c .config )
131
118
go c .ctrls [name ].Start ()
132
119
}
133
120
134
121
return nil
135
122
}
136
123
124
+ // The api-server may expose a resource under several API groups, for backward
125
+ // compatibility. We'll want to ignore lower priorities "cohabitations":
126
+ // cf. kubernetes/cmd/kube-apiserver/app/server.go
137
127
var preferredVersions = map [string ]string {
138
128
"apps:deployment" : "extensions:deployment" ,
139
129
"apps:daemonset" : "extensions:daemonset" ,
@@ -149,12 +139,12 @@ func (c *Observer) expandAndFilterAPIResources(groups []*metav1.APIResourceList)
149
139
for _ , group := range groups {
150
140
gv , err := schema .ParseGroupVersion (group .GroupVersion )
151
141
if err != nil {
152
- c .config .Logger .Errorf ("api-server sent an unparsable group version: %v" , err )
142
+ c .config .Logger .Errorf ("unparsable group version: %v" , err )
153
143
continue
154
144
}
155
145
156
146
for _ , ar := range group .APIResources {
157
- // remove subresources (like job/status or deployments/scale )
147
+ // remove subresources (like job/status)
158
148
if strings .ContainsRune (ar .Name , '/' ) {
159
149
continue
160
150
}
@@ -169,13 +159,13 @@ func (c *Observer) expandAndFilterAPIResources(groups []*metav1.APIResourceList)
169
159
continue
170
160
}
171
161
172
- resource := & gvk {group : gv .Group , version : gv .Version , kind : ar .Kind , gv : gv , ar : ar }
173
- resources [strings .ToLower (gv .Group + ":" + ar .Kind )] = resource
162
+ resources [strings .ToLower (gv .Group + ":" + ar .Kind )] = & gvk {
163
+ groupVersion : gv ,
164
+ apiResource : ar ,
165
+ }
174
166
}
175
167
}
176
168
177
- // remove lower priorities "cohabitations". cf. kubernetes/cmd/kube-apiserver/app/server.go
178
- // (the api-server may expose a resource under several api groups, for backward compat)
179
169
for preferred , obsolete := range preferredVersions {
180
170
if _ , ok := resources [preferred ]; ok {
181
171
delete (resources , obsolete )
@@ -186,8 +176,9 @@ func (c *Observer) expandAndFilterAPIResources(groups []*metav1.APIResourceList)
186
176
}
187
177
188
178
func isExcluded (excluded []string , name string ) bool {
179
+ lname := strings .ToLower (name )
189
180
for _ , ctl := range excluded {
190
- if strings .Compare (strings . ToLower ( name ) , strings .ToLower (ctl )) == 0 {
181
+ if strings .Compare (lname , strings .ToLower (ctl )) == 0 {
191
182
return true
192
183
}
193
184
}
0 commit comments