@@ -14,6 +14,7 @@ import (
14
14
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
15
15
"k8s.io/client-go/tools/cache"
16
16
"k8s.io/klog/v2"
17
+ "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
17
18
18
19
kubeovnv1 "github.com/kubeovn/kube-ovn/pkg/apis/kubeovn/v1"
19
20
"github.com/kubeovn/kube-ovn/pkg/util"
@@ -26,7 +27,7 @@ func (c *Controller) enqueueAddOvnDnatRule(obj interface{}) {
26
27
utilruntime .HandleError (err )
27
28
return
28
29
}
29
- klog .V ( 3 ). Infof ("enqueue add ovn dnat %s" , key )
30
+ klog .Infof ("enqueue add ovn dnat %s" , key )
30
31
c .addOvnDnatRuleQueue .Add (key )
31
32
}
32
33
@@ -37,15 +38,18 @@ func (c *Controller) enqueueUpdateOvnDnatRule(old, new interface{}) {
37
38
utilruntime .HandleError (err )
38
39
return
39
40
}
40
-
41
- oldDnat := old .(* kubeovnv1.OvnDnatRule )
42
41
newDnat := new .(* kubeovnv1.OvnDnatRule )
43
42
if ! newDnat .DeletionTimestamp .IsZero () {
44
- klog .Infof ("enqueue del ovn dnat %s" , key )
45
- c .delOvnDnatRuleQueue .Add (key )
46
- return
43
+ if len (newDnat .Finalizers ) == 0 {
44
+ // avoid delete twice
45
+ return
46
+ } else {
47
+ klog .Infof ("enqueue del ovn dnat %s" , key )
48
+ c .delOvnDnatRuleQueue .Add (key )
49
+ return
50
+ }
47
51
}
48
-
52
+ oldDnat := old .( * kubeovnv1. OvnDnatRule )
49
53
if oldDnat .Spec .OvnEip != newDnat .Spec .OvnEip {
50
54
c .resetOvnEipQueue .Add (oldDnat .Spec .OvnEip )
51
55
}
@@ -67,7 +71,7 @@ func (c *Controller) enqueueDelOvnDnatRule(obj interface{}) {
67
71
utilruntime .HandleError (err )
68
72
return
69
73
}
70
- klog .V ( 3 ). Infof ("enqueue delete ovn dnat %s" , key )
74
+ klog .Infof ("enqueue delete ovn dnat %s" , key )
71
75
c .delOvnDnatRuleQueue .Add (key )
72
76
}
73
77
@@ -212,8 +216,7 @@ func (c *Controller) handleAddOvnDnatRule(key string) error {
212
216
// already ok
213
217
return nil
214
218
}
215
- klog .V (3 ).Infof ("handle add dnat %s" , key )
216
-
219
+ klog .Infof ("handle add dnat %s" , key )
217
220
var internalV4Ip , mac , subnetName string
218
221
if cachedDnat .Spec .IpType == util .Vip {
219
222
internalVip , err := c .virtualIpsLister .Get (cachedDnat .Spec .IpName )
@@ -279,7 +282,7 @@ func (c *Controller) handleAddOvnDnatRule(key string) error {
279
282
return err
280
283
}
281
284
282
- if err = c .handleAddOvnEipFinalizer (cachedEip , util .OvnEipFinalizer ); err != nil {
285
+ if err = c .handleAddOvnEipFinalizer (cachedEip , util .ControllerName ); err != nil {
283
286
klog .Errorf ("failed to add finalizer for ovn eip, %v" , err )
284
287
return err
285
288
}
@@ -290,6 +293,11 @@ func (c *Controller) handleAddOvnDnatRule(key string) error {
290
293
return err
291
294
}
292
295
296
+ if err := c .handleAddOvnDnatFinalizer (cachedDnat , util .ControllerName ); err != nil {
297
+ klog .Errorf ("failed to add finalizer for ovn dnat %s, %v" , cachedDnat .Name , err )
298
+ return err
299
+ }
300
+
293
301
// patch dnat eip relationship
294
302
if err = c .natLabelAndAnnoOvnEip (eipName , cachedDnat .Name , vpcName ); err != nil {
295
303
klog .Errorf ("failed to label dnat '%s' in eip %s, %v" , cachedDnat .Name , eipName , err )
@@ -316,7 +324,7 @@ func (c *Controller) handleAddOvnDnatRule(key string) error {
316
324
}
317
325
318
326
func (c * Controller ) handleDelOvnDnatRule (key string ) error {
319
- klog .V ( 3 ). Infof ("handle del ovn dnat %s" , key )
327
+ klog .Infof ("handle delete ovn dnat %s" , key )
320
328
cachedDnat , err := c .ovnDnatRulesLister .Get (key )
321
329
if err != nil {
322
330
if k8serrors .IsNotFound (err ) {
@@ -325,22 +333,20 @@ func (c *Controller) handleDelOvnDnatRule(key string) error {
325
333
klog .Error (err )
326
334
return err
327
335
}
328
-
329
- eipName := cachedDnat .Spec .OvnEip
330
- if len (eipName ) == 0 {
331
- err := fmt .Errorf ("failed to create fip rule, should set eip" )
332
- klog .Error (err )
333
- return err
334
- }
335
-
336
336
if cachedDnat .Status .Vpc != "" && cachedDnat .Status .V4Eip != "" && cachedDnat .Status .ExternalPort != "" {
337
337
if err = c .DelDnatRule (cachedDnat .Status .Vpc , cachedDnat .Name ,
338
338
cachedDnat .Status .V4Eip , cachedDnat .Status .ExternalPort ); err != nil {
339
- klog .Errorf ("failed to delete dnat, %v" , err )
339
+ klog .Errorf ("failed to delete dnat %s , %v" , key , err )
340
340
return err
341
341
}
342
342
}
343
- c .resetOvnEipQueue .Add (cachedDnat .Spec .OvnEip )
343
+ if err = c .handleDelOvnDnatFinalizer (cachedDnat , util .ControllerName ); err != nil {
344
+ klog .Errorf ("failed to remove finalizer for ovn dnat %s, %v" , cachedDnat .Name , err )
345
+ return err
346
+ }
347
+ if cachedDnat .Spec .OvnEip != "" {
348
+ c .resetOvnEipQueue .Add (cachedDnat .Spec .OvnEip )
349
+ }
344
350
return nil
345
351
}
346
352
@@ -354,7 +360,7 @@ func (c *Controller) handleUpdateOvnDnatRule(key string) error {
354
360
return err
355
361
}
356
362
357
- klog .V ( 3 ). Infof ("handle update dnat %s" , key )
363
+ klog .Infof ("handle update dnat %s" , key )
358
364
var internalV4Ip , mac , subnetName string
359
365
if cachedDnat .Spec .IpType == util .Vip {
360
366
internalVip , err := c .virtualIpsLister .Get (cachedDnat .Spec .IpName )
@@ -421,7 +427,7 @@ func (c *Controller) handleUpdateOvnDnatRule(key string) error {
421
427
422
428
dnat := cachedDnat .DeepCopy ()
423
429
if dnat .Status .Ready {
424
- klog .V ( 3 ). Infof ("dnat change ip, old ip '%s', new ip %s" , dnat .Status .V4Ip , cachedEip .Status .V4Ip )
430
+ klog .Infof ("dnat change ip, old ip '%s', new ip %s" , dnat .Status .V4Ip , cachedEip .Status .V4Ip )
425
431
if err = c .DelDnatRule (dnat .Status .Vpc , dnat .Name , dnat .Status .V4Eip , dnat .Status .ExternalPort ); err != nil {
426
432
klog .Errorf ("failed to delete dnat, %v" , err )
427
433
return err
@@ -612,3 +618,50 @@ func (c *Controller) DelDnatRule(vpcName, dnatName, externalIp, externalPort str
612
618
613
619
return nil
614
620
}
621
+
622
+ func (c * Controller ) handleAddOvnDnatFinalizer (cachedDnat * kubeovnv1.OvnDnatRule , finalizer string ) error {
623
+ if cachedDnat .DeletionTimestamp .IsZero () {
624
+ if util .ContainsString (cachedDnat .Finalizers , finalizer ) {
625
+ return nil
626
+ }
627
+ }
628
+ newDnat := cachedDnat .DeepCopy ()
629
+ controllerutil .AddFinalizer (newDnat , finalizer )
630
+ patch , err := util .GenerateMergePatchPayload (cachedDnat , newDnat )
631
+ if err != nil {
632
+ klog .Errorf ("failed to generate patch payload for ovn dnat '%s', %v" , cachedDnat .Name , err )
633
+ return err
634
+ }
635
+ if _ , err := c .config .KubeOvnClient .KubeovnV1 ().OvnDnatRules ().Patch (context .Background (), cachedDnat .Name ,
636
+ types .MergePatchType , patch , metav1.PatchOptions {}, "" ); err != nil {
637
+ if k8serrors .IsNotFound (err ) {
638
+ return nil
639
+ }
640
+ klog .Errorf ("failed to add finalizer for ovn dnat '%s', %v" , cachedDnat .Name , err )
641
+ return err
642
+ }
643
+ return nil
644
+ }
645
+
646
+ func (c * Controller ) handleDelOvnDnatFinalizer (cachedDnat * kubeovnv1.OvnDnatRule , finalizer string ) error {
647
+ if len (cachedDnat .Finalizers ) == 0 {
648
+ return nil
649
+ }
650
+ var err error
651
+ newDnat := cachedDnat .DeepCopy ()
652
+ controllerutil .RemoveFinalizer (newDnat , finalizer )
653
+ patch , err := util .GenerateMergePatchPayload (cachedDnat , newDnat )
654
+ if err != nil {
655
+ klog .Errorf ("failed to generate patch payload for ovn dnat '%s', %v" , cachedDnat .Name , err )
656
+ return err
657
+ }
658
+ if _ , err := c .config .KubeOvnClient .KubeovnV1 ().OvnDnatRules ().Patch (context .Background (), cachedDnat .Name ,
659
+ types .MergePatchType , patch , metav1.PatchOptions {}, "" ); err != nil {
660
+ if k8serrors .IsNotFound (err ) {
661
+ return nil
662
+ }
663
+ klog .Errorf ("failed to remove finalizer from ovn dnat '%s', %v" , cachedDnat .Name , err )
664
+ return err
665
+ }
666
+ return nil
667
+ }
0 commit comments