@@ -47,10 +47,51 @@ type cniPodNetworkProperty struct {
47
47
type cniPodNetworks []cniPodNetwork
48
48
49
49
const (
50
- maxRetries = 5
51
- retryDelay = 1 * time .Second
50
+ maxRetries = 60
51
+ retryDelay = 10 * time .Second
52
52
)
53
53
54
+ // Process will take a element from the FIFO queue and attempt to process it (either add or remove network)
55
+ func (c * Controller ) Process (e * Event ) {
56
+ var err error
57
+ switch e .opType {
58
+ case Add :
59
+ for i := 0 ; i < maxRetries ; i ++ {
60
+ err = c .cniPlugin .AddNetwork (e .data .(* cni.Parameters ))
61
+ if err == nil {
62
+ if i > 0 {
63
+ glog .Infof ("Succeeded adding network %+v after %d attempt" , e .data , i )
64
+ } else {
65
+ glog .V (5 ).Infof ("Succeeded adding network %+v on first attempt" , e .data )
66
+ }
67
+ return
68
+ }
69
+ glog .Warningf ("Failed adding network %+v... retrying %d/%d. err:%v" , e .data , i + 1 , maxRetries , err )
70
+ time .Sleep (retryDelay )
71
+ }
72
+ glog .Errorf ("Failed adding network %+v after %d attempt. err:%v" , e .data , maxRetries , err )
73
+
74
+ case Delete :
75
+ for i := 0 ; i < maxRetries ; i ++ {
76
+ err = c .cniPlugin .DeleteNetwork (e .data .(* cni.Parameters ))
77
+ if err == nil {
78
+ if i > 0 {
79
+ glog .Infof ("Succeeded deleting network %+v after %d attempt" , e .data , i )
80
+ } else {
81
+ glog .V (5 ).Infof ("Succeeded deleting network %+v on first attempt" , e .data )
82
+ }
83
+ return
84
+ }
85
+ glog .Warningf ("Failed deleting network %+v... retrying %d/%d. err:%v" , e .data , i + 1 , maxRetries , err )
86
+ time .Sleep (retryDelay )
87
+ }
88
+ glog .Errorf ("Failed deleting network %+v after %d attempt. err:%v" , e .data , maxRetries , err )
89
+
90
+ default :
91
+ glog .Errorf ("processing invalid operation type value in event %+v" , e )
92
+ }
93
+ }
94
+
54
95
func getNetworkSet (networks string ) (gset.GSet , error ) {
55
96
nets := cniPodNetworks {}
56
97
netSetBuilder := gset .NewBuilder ()
@@ -122,19 +163,8 @@ func (c *Controller) addNetwork(podObj *apiv1.Pod, networkName string, np cniPod
122
163
return err
123
164
}
124
165
125
- for i := 0 ; i < maxRetries ; i ++ {
126
- err = c .cniPlugin .AddNetwork (cniParams )
127
- if err == nil {
128
- if i > 0 {
129
- glog .V (4 ).Infof ("Succeeded adding network %s on Pod %s after %d attempt" , networkName , podObj .ObjectMeta .Name , i )
130
- }
131
- break
132
- }
133
- glog .Warningf ("Failed adding network %s on Pod %s... retrying %d/%d. err:%v" , networkName , podObj .ObjectMeta .Name , i + 1 , maxRetries , err )
134
- time .Sleep (retryDelay )
135
- }
136
-
137
- return err
166
+ c .eventQueue .Enqueue (& Event {opType : Add , data : cniParams })
167
+ return nil
138
168
}
139
169
140
170
func (c * Controller ) delNetwork (podObj * apiv1.Pod , networkName string , np cniPodNetworkProperty ) error {
@@ -147,19 +177,8 @@ func (c *Controller) delNetwork(podObj *apiv1.Pod, networkName string, np cniPod
147
177
return err
148
178
}
149
179
150
- for i := 0 ; i < maxRetries ; i ++ {
151
- err = c .cniPlugin .DeleteNetwork (cniParams )
152
- if err == nil {
153
- if i > 0 {
154
- glog .V (4 ).Infof ("Succeeded deleting network %s on Pod %s after %d attempt" , networkName , podObj .ObjectMeta .Name , i )
155
- }
156
- break
157
- }
158
- glog .Warningf ("Failed deleting network %s on Pod %s... retrying %d/%d. err:%v" , networkName , podObj .ObjectMeta .Name , i + 1 , maxRetries , err )
159
- time .Sleep (retryDelay )
160
- }
161
-
162
- return err
180
+ c .eventQueue .Enqueue (& Event {opType : Delete , data : cniParams })
181
+ return nil
163
182
}
164
183
165
184
func (c * Controller ) podUpdated (oldObj , newObj interface {}) {
@@ -207,6 +226,7 @@ func (c *Controller) podUpdated(oldObj, newObj interface{}) {
207
226
np := cniPodNetworkProperty {}
208
227
for _ , n := range nets {
209
228
np .IfMAC = n .IfMAC
229
+ np .IsPrimary = n .IsPrimary
210
230
err := c .delNetwork (newPod , n .NetworkName , np )
211
231
if err != nil {
212
232
glog .Errorf ("Failed to delete network %s on pod %s" , n .NetworkName , podName )
@@ -223,15 +243,38 @@ func (c *Controller) podUpdated(oldObj, newObj interface{}) {
223
243
np := cniPodNetworkProperty {}
224
244
for _ , n := range nets {
225
245
np .IfMAC = n .IfMAC
246
+ np .IsPrimary = n .IsPrimary
226
247
err := c .addNetwork (newPod , n .NetworkName , np )
227
248
if err != nil {
228
- glog .V ( 4 ). Infof ("Failed to add network %s on pod %s" , n .NetworkName , podName )
249
+ glog .Errorf ("Failed to add network %s on pod %s" , n .NetworkName , podName )
229
250
}
230
251
}
231
252
}
232
253
}
233
254
255
+ func (c * Controller ) eventQueueWorker () {
256
+ for {
257
+ c .eventQueue .cond .L .Lock ()
258
+
259
+ for c .eventQueue .q .Len () == 0 {
260
+ c .eventQueue .cond .Wait ()
261
+ }
262
+
263
+ ev := c .eventQueue .Dequeue ()
264
+ c .eventQueue .cond .L .Unlock ()
265
+
266
+ if ev != nil {
267
+ glog .V (5 ).Infof ("Processing event:" , ev )
268
+ c .Process (ev )
269
+ }
270
+ }
271
+ }
272
+
234
273
func (c * Controller ) watchPods (ctx context.Context , nodeName string ) (cache.Controller , error ) {
274
+
275
+ // Initialize the worker queue
276
+ go c .eventQueueWorker ()
277
+
235
278
// Currently there is no field selector for a Pod annotation
236
279
// https://github.com/kubernetes/kubernetes/blob/master/pkg/registry/core/pod/strategy.go
237
280
fs := fields.Set {
0 commit comments