@@ -48,44 +48,57 @@ func enforeRoutePodPresence(ctx context.Context, cl client.Client, scheme *runti
48
48
ObjectMeta : metav1.ObjectMeta {Name : fmt .Sprintf ("%s-gw-node" , pod .Spec .NodeName ), Namespace : opts .Namespace },
49
49
}
50
50
51
- _ , err := controllerutil .CreateOrUpdate (ctx , cl , routecfg , func () error {
51
+ _ , err := controllerutil .CreateOrUpdate (ctx , cl , routecfg , forgeRoutePodMutateFunction (internalnode , routecfg , pod , scheme ))
52
+ return err
53
+ }
54
+
55
+ func forgeRoutePodMutateFunction (internalnode * networkingv1alpha1.InternalNode , routecfg * networkingv1alpha1.RouteConfiguration ,
56
+ pod * corev1.Pod , scheme * runtime.Scheme ) controllerutil.MutateFn {
57
+ return func () error {
52
58
if err := controllerutil .SetOwnerReference (internalnode , routecfg , scheme ); err != nil {
53
59
return err
54
60
}
55
61
56
62
routecfg .SetLabels (geneve .ForgeRouteInternalTargetLabels ())
57
63
58
- routecfg .Spec .Table .Name = fmt . Sprintf ( "%s-gw-node" , pod .Spec .NodeName )
64
+ routecfg .Spec .Table .Name = pod .Spec .NodeName
59
65
60
66
if routecfg .Spec .Table .Rules == nil || len (routecfg .Spec .Table .Rules ) == 0 {
61
67
routecfg .Spec .Table .Rules = make ([]networkingv1alpha1.Rule , 1 )
62
68
}
63
69
64
- if routeContainsPod (pod , & routecfg .Spec .Table .Rules [0 ]) {
65
- return nil
70
+ if existingroute , exists := routeContainsPod (pod , & routecfg .Spec .Table .Rules [0 ]); exists {
71
+ updatePodToRoute (pod , internalnode , existingroute )
72
+ } else {
73
+ addPodToRoute (pod , internalnode , & routecfg .Spec .Table .Rules [0 ])
66
74
}
67
75
68
- addPodToRoute (pod , internalnode , & routecfg .Spec .Table .Rules [0 ])
69
76
return nil
70
- })
71
- return err
77
+ }
72
78
}
73
79
74
- func routeContainsPod (pod * corev1.Pod , rule * networkingv1alpha1.Rule ) bool {
80
+ func routeContainsPod (pod * corev1.Pod , rule * networkingv1alpha1.Rule ) ( * networkingv1alpha1. Route , bool ) {
75
81
for i := range rule .Routes {
76
- route := rule .Routes [i ]
77
- if string (* route .Dst ) == fmt .Sprintf ("%s/32" , pod .Status .PodIP ) {
78
- return true
82
+ if string (* rule .Routes [i ].Dst ) == fmt .Sprintf ("%s/32" , pod .Status .PodIP ) {
83
+ return & rule .Routes [i ], true
79
84
}
80
85
}
81
- return false
86
+ return nil , false
82
87
}
83
88
84
89
func addPodToRoute (pod * corev1.Pod , internalnode * networkingv1alpha1.InternalNode , rule * networkingv1alpha1.Rule ) {
85
90
route := networkingv1alpha1.Route {
86
- Dst : ptr .To (networkingv1alpha1 .CIDR (fmt .Sprintf ("%s/32" , pod .Status .PodIP ))),
87
- Dev : & internalnode .Spec .Interface .Gateway .Name ,
88
- Gw : ptr .To (networkingv1alpha1 .IP (fabric .GeneveNodeInterfaceIP )),
91
+ Dst : ptr .To (networkingv1alpha1 .CIDR (fmt .Sprintf ("%s/32" , pod .Status .PodIP ))),
92
+ Dev : & internalnode .Spec .Interface .Gateway .Name ,
93
+ Gw : ptr .To (networkingv1alpha1 .IP (fabric .GeneveNodeInterfaceIP )),
94
+ Onlink : ptr .To (true ),
89
95
}
90
96
rule .Routes = append (rule .Routes , route )
91
97
}
98
+
99
+ func updatePodToRoute (pod * corev1.Pod , internalnode * networkingv1alpha1.InternalNode , route * networkingv1alpha1.Route ) {
100
+ route .Dst = ptr .To (networkingv1alpha1 .CIDR (fmt .Sprintf ("%s/32" , pod .Status .PodIP )))
101
+ route .Dev = & internalnode .Spec .Interface .Gateway .Name
102
+ route .Gw = ptr .To (networkingv1alpha1 .IP (fabric .GeneveNodeInterfaceIP ))
103
+ route .Onlink = ptr .To (true )
104
+ }
0 commit comments