• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

kubeovn / kube-ovn / 22338268342

24 Feb 2026 05:41AM UTC coverage: 23.077% (+0.02%) from 23.057%
22338268342

push

github

web-flow
fix: avoid OVN northd "No path for static route" warning on startup (#6323)

During controller startup, default gateway static routes (0.0.0.0/0 and
::/0) were added to the OVN logical router before the join subnet's
Logical Router Port was created, causing OVN northd to warn about
unreachable next hops.

This fix ensures routes are only added after the join subnet's OVN
Logical Switch and LRP exist:

1. Remove addNodeGatewayStaticRoute() call from syncNodeRoutes() which
   runs during init phase before any OVN logical switches are created.

2. Add LogicalSwitchExists check in handleAddOrUpdateVpc() to requeue
   the VPC if the join subnet's logical switch is not yet ready, avoiding
   the race between VPC worker and Subnet worker.

3. Remove redundant addNodeGatewayStaticRoute() call from handleAddNode()
   since handleAddOrUpdateVpc() already manages default route reconciliation
   as part of VPC route diffing. Also remove the now-unused function.

Signed-off-by: Mengxin Liu <liumengxinfly@gmail.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

0 of 8 new or added lines in 1 file covered. (0.0%)

92 existing lines in 2 files now uncovered.

12539 of 54336 relevant lines covered (23.08%)

0.27 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.72
/pkg/controller/init.go
1
package controller
2

3
import (
4
        "context"
5
        "errors"
6
        "fmt"
7
        "maps"
8
        "strings"
9
        "time"
10

11
        "github.com/scylladb/go-set/strset"
12
        v1 "k8s.io/api/core/v1"
13
        k8serrors "k8s.io/apimachinery/pkg/api/errors"
14
        metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
15
        "k8s.io/apimachinery/pkg/labels"
16
        "k8s.io/apimachinery/pkg/types"
17
        "k8s.io/client-go/tools/cache"
18
        "k8s.io/klog/v2"
19
        "sigs.k8s.io/controller-runtime/pkg/client"
20
        "sigs.k8s.io/controller-runtime/pkg/client/config"
21
        "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
22

23
        kubeovnv1 "github.com/kubeovn/kube-ovn/pkg/apis/kubeovn/v1"
24
        "github.com/kubeovn/kube-ovn/pkg/ovs"
25
        "github.com/kubeovn/kube-ovn/pkg/ovsdb/ovnnb"
26
        "github.com/kubeovn/kube-ovn/pkg/util"
27
)
28

29
func (c *Controller) InitOVN() error {
×
30
        var err error
×
31

×
32
        // migrate vendor externalIDs to kube-ovn resources created in versions prior to v1.15.0
×
33
        // this must run before ACL cleanup to ensure existing resources are properly tagged
×
34
        if err = c.OVNNbClient.MigrateVendorExternalIDs(); err != nil {
×
35
                klog.Errorf("failed to migrate vendor externalIDs: %v", err)
×
36
                return err
×
37
        }
×
38

39
        // migrate tier field of ACL rules created in versions prior to v1.13.0
40
        // after upgrading, the tier field has a default value of zero, which is not the value used in versions >= v1.13.0
41
        // we need to migrate the tier field to the correct value
42
        if err = c.OVNNbClient.MigrateACLTier(); err != nil {
×
43
                klog.Errorf("failed to migrate ACL tier: %v", err)
×
44
                return err
×
45
        }
×
46

47
        // clean all no parent key acls
48
        if err = c.OVNNbClient.CleanNoParentKeyAcls(); err != nil {
×
49
                klog.Errorf("failed to clean all no parent key acls: %v", err)
×
50
                return err
×
51
        }
×
52

53
        if err = c.InitDefaultVpc(); err != nil {
×
54
                klog.Errorf("init default vpc failed: %v", err)
×
55
                return err
×
56
        }
×
57

58
        if err = c.initClusterRouter(); err != nil {
×
59
                klog.Errorf("init cluster router failed: %v", err)
×
60
                return err
×
61
        }
×
62

63
        if c.config.EnableLb {
×
64
                if err = c.initLoadBalancer(); err != nil {
×
65
                        klog.Errorf("init load balancer failed: %v", err)
×
66
                        return err
×
67
                }
×
68
        }
69

70
        if err = c.initDefaultVlan(); err != nil {
×
71
                klog.Errorf("init default vlan failed: %v", err)
×
72
                return err
×
73
        }
×
74

75
        if err = c.initNodeSwitch(); err != nil {
×
76
                klog.Errorf("init node switch failed: %v", err)
×
77
                return err
×
78
        }
×
79

80
        if err = c.initDefaultLogicalSwitch(); err != nil {
×
81
                klog.Errorf("init default switch failed: %v", err)
×
82
                return err
×
83
        }
×
84

85
        return nil
×
86
}
87

88
func (c *Controller) InitDefaultVpc() error {
×
89
        cachedVpc, err := c.vpcsLister.Get(c.config.ClusterRouter)
×
90
        if err != nil {
×
91
                if !k8serrors.IsNotFound(err) {
×
92
                        klog.Errorf("failed to get default vpc %q: %v", c.config.ClusterRouter, err)
×
93
                        return err
×
94
                }
×
95
                // create default vpc
96
                vpc := &kubeovnv1.Vpc{
×
97
                        ObjectMeta: metav1.ObjectMeta{Name: c.config.ClusterRouter},
×
98
                }
×
99
                cachedVpc, err = c.config.KubeOvnClient.KubeovnV1().Vpcs().Create(context.Background(), vpc, metav1.CreateOptions{})
×
100
                if err != nil {
×
101
                        klog.Errorf("failed to create default vpc %q: %v", c.config.ClusterRouter, err)
×
102
                        return err
×
103
                }
×
104
        }
105

106
        // update default vpc status
107
        vpc := cachedVpc.DeepCopy()
×
108
        if !vpc.Status.Default || !vpc.Status.Standby ||
×
109
                vpc.Status.Router != c.config.ClusterRouter ||
×
110
                vpc.Status.DefaultLogicalSwitch != c.config.DefaultLogicalSwitch {
×
111
                vpc.Status.Standby = true
×
112
                vpc.Status.Default = true
×
113
                vpc.Status.Router = c.config.ClusterRouter
×
114
                vpc.Status.DefaultLogicalSwitch = c.config.DefaultLogicalSwitch
×
115

×
116
                if _, err = c.config.KubeOvnClient.KubeovnV1().Vpcs().UpdateStatus(context.Background(), vpc, metav1.UpdateOptions{}); err != nil {
×
117
                        klog.Errorf("failed to update default vpc %q: %v", c.config.ClusterRouter, err)
×
118
                        return err
×
119
                }
×
120
        }
121

122
        return nil
×
123
}
124

125
// InitDefaultLogicalSwitch init the default logical switch for ovn network
126
func (c *Controller) initDefaultLogicalSwitch() error {
×
127
        subnet, err := c.subnetsLister.Get(c.config.DefaultLogicalSwitch)
×
128
        if err == nil {
×
129
                if subnet != nil && util.CheckProtocol(c.config.DefaultCIDR) != util.CheckProtocol(subnet.Spec.CIDRBlock) {
×
130
                        // single-stack upgrade to dual-stack
×
131
                        if util.CheckProtocol(c.config.DefaultCIDR) == kubeovnv1.ProtocolDual {
×
132
                                subnet := subnet.DeepCopy()
×
133
                                subnet.Spec.CIDRBlock = c.config.DefaultCIDR
×
134
                                if _, err = c.formatSubnet(subnet); err != nil {
×
135
                                        klog.Errorf("init format subnet %s failed: %v", c.config.DefaultLogicalSwitch, err)
×
136
                                        return err
×
137
                                }
×
138
                        }
139
                }
140
                return nil
×
141
        }
142

143
        if !k8serrors.IsNotFound(err) {
×
144
                klog.Errorf("get default subnet %s failed: %v", c.config.DefaultLogicalSwitch, err)
×
145
                return err
×
146
        }
×
147

148
        defaultSubnet := kubeovnv1.Subnet{
×
149
                ObjectMeta: metav1.ObjectMeta{Name: c.config.DefaultLogicalSwitch},
×
150
                Spec: kubeovnv1.SubnetSpec{
×
151
                        Vpc:                 c.config.ClusterRouter,
×
152
                        Default:             true,
×
153
                        Provider:            util.OvnProvider,
×
154
                        CIDRBlock:           c.config.DefaultCIDR,
×
155
                        Gateway:             c.config.DefaultGateway,
×
156
                        GatewayNode:         "",
×
157
                        DisableGatewayCheck: !c.config.DefaultGatewayCheck,
×
158
                        ExcludeIps:          strings.Split(c.config.DefaultExcludeIps, ","),
×
159
                        NatOutgoing:         true,
×
160
                        GatewayType:         kubeovnv1.GWDistributedType,
×
161
                        Protocol:            util.CheckProtocol(c.config.DefaultCIDR),
×
162
                        EnableLb:            &c.config.EnableLb,
×
163
                },
×
164
        }
×
165
        if c.config.NetworkType == util.NetworkTypeVlan {
×
166
                defaultSubnet.Spec.Vlan = c.config.DefaultVlanName
×
167
                if c.config.DefaultLogicalGateway && c.config.DefaultU2OInterconnection {
×
168
                        err = errors.New("logicalGateway and u2oInterconnection can't be opened at the same time")
×
169
                        klog.Error(err)
×
170
                        return err
×
171
                }
×
172
                defaultSubnet.Spec.LogicalGateway = c.config.DefaultLogicalGateway
×
173
                defaultSubnet.Spec.U2OInterconnection = c.config.DefaultU2OInterconnection
×
174
        }
175

176
        if _, err = c.config.KubeOvnClient.KubeovnV1().Subnets().Create(context.Background(), &defaultSubnet, metav1.CreateOptions{}); err != nil {
×
177
                klog.Errorf("failed to create default subnet %q: %v", c.config.DefaultLogicalSwitch, err)
×
178
                return err
×
179
        }
×
180
        return nil
×
181
}
182

183
// InitNodeSwitch init node switch to connect host and pod
184
func (c *Controller) initNodeSwitch() error {
×
185
        subnet, err := c.subnetsLister.Get(c.config.NodeSwitch)
×
186
        if err == nil {
×
187
                if util.CheckProtocol(c.config.NodeSwitchCIDR) == kubeovnv1.ProtocolDual && util.CheckProtocol(subnet.Spec.CIDRBlock) != kubeovnv1.ProtocolDual {
×
188
                        // single-stack upgrade to dual-stack
×
189
                        subnet := subnet.DeepCopy()
×
190
                        subnet.Spec.CIDRBlock = c.config.NodeSwitchCIDR
×
191
                        if _, err = c.formatSubnet(subnet); err != nil {
×
192
                                klog.Errorf("init format subnet %s failed: %v", c.config.NodeSwitch, err)
×
193
                                return err
×
194
                        }
×
195
                } else {
×
196
                        c.config.NodeSwitchCIDR = subnet.Spec.CIDRBlock
×
197
                }
×
198
                return nil
×
199
        }
200

201
        if !k8serrors.IsNotFound(err) {
×
202
                klog.Errorf("get node subnet %s failed: %v", c.config.NodeSwitch, err)
×
203
                return err
×
204
        }
×
205

206
        nodeSubnet := kubeovnv1.Subnet{
×
207
                ObjectMeta: metav1.ObjectMeta{Name: c.config.NodeSwitch},
×
208
                Spec: kubeovnv1.SubnetSpec{
×
209
                        Vpc:                    c.config.ClusterRouter,
×
210
                        Default:                false,
×
211
                        Provider:               util.OvnProvider,
×
212
                        CIDRBlock:              c.config.NodeSwitchCIDR,
×
213
                        Gateway:                c.config.NodeSwitchGateway,
×
214
                        GatewayNode:            "",
×
215
                        ExcludeIps:             strings.Split(c.config.NodeSwitchGateway, ","),
×
216
                        Protocol:               util.CheckProtocol(c.config.NodeSwitchCIDR),
×
217
                        DisableInterConnection: true,
×
218
                },
×
219
        }
×
220

×
221
        if _, err = c.config.KubeOvnClient.KubeovnV1().Subnets().Create(context.Background(), &nodeSubnet, metav1.CreateOptions{}); err != nil {
×
222
                klog.Errorf("failed to create node subnet %q: %v", c.config.NodeSwitch, err)
×
223
                return err
×
224
        }
×
225
        return nil
×
226
}
227

228
// InitClusterRouter init cluster router to connect different logical switches
229
func (c *Controller) initClusterRouter() error {
×
230
        if err := c.OVNNbClient.CreateLogicalRouter(c.config.ClusterRouter); err != nil {
×
231
                klog.Errorf("create logical router %s failed: %v", c.config.ClusterRouter, err)
×
232
                return err
×
233
        }
×
234

235
        lr, err := c.OVNNbClient.GetLogicalRouter(c.config.ClusterRouter, false)
×
236
        if err != nil {
×
237
                klog.Errorf("get logical router %s failed: %v", c.config.ClusterRouter, err)
×
238
                return err
×
239
        }
×
240

241
        lrOptions := make(map[string]string, len(lr.Options))
×
242
        maps.Copy(lrOptions, lr.Options)
×
243
        lrOptions["mac_binding_age_threshold"] = "300"
×
244
        lrOptions["dynamic_neigh_routers"] = "true"
×
245
        if !maps.Equal(lr.Options, lrOptions) {
×
246
                lr.Options = lrOptions
×
247
                if err = c.OVNNbClient.UpdateLogicalRouter(lr, &lr.Options); err != nil {
×
248
                        klog.Errorf("update logical router %s failed: %v", c.config.ClusterRouter, err)
×
249
                        return err
×
250
                }
×
251
        }
252

253
        return nil
×
254
}
255

256
func (c *Controller) initLB(name, protocol string, sessionAffinity bool) error {
×
257
        protocol = strings.ToLower(protocol)
×
258

×
259
        var (
×
260
                selectFields string
×
261
                err          error
×
262
        )
×
263

×
264
        if sessionAffinity {
×
265
                selectFields = ovnnb.LoadBalancerSelectionFieldsIPSrc
×
266
        }
×
267

268
        if err = c.OVNNbClient.CreateLoadBalancer(name, protocol, selectFields); err != nil {
×
269
                klog.Errorf("create load balancer %s: %v", name, err)
×
270
                return err
×
271
        }
×
272

273
        if sessionAffinity {
×
274
                if err = c.OVNNbClient.SetLoadBalancerAffinityTimeout(name, util.DefaultServiceSessionStickinessTimeout); err != nil {
×
275
                        klog.Errorf("failed to set affinity timeout of %s load balancer %s: %v", protocol, name, err)
×
276
                        return err
×
277
                }
×
278
        }
279

280
        err = c.OVNNbClient.SetLoadBalancerPreferLocalBackend(name, c.config.EnableOVNLBPreferLocal)
×
281
        if err != nil {
×
282
                klog.Errorf("failed to set prefer local backend for load balancer %s: %v", name, err)
×
283
                return err
×
284
        }
×
285

286
        return nil
×
287
}
288

289
// InitLoadBalancer init the default tcp and udp cluster loadbalancer
290
func (c *Controller) initLoadBalancer() error {
×
291
        vpcs, err := c.vpcsLister.List(labels.Everything())
×
292
        if err != nil {
×
293
                klog.Errorf("failed to list vpc: %v", err)
×
294
                return err
×
295
        }
×
296

297
        for _, cachedVpc := range vpcs {
×
298
                vpc := cachedVpc.DeepCopy()
×
299
                vpcLb := c.GenVpcLoadBalancer(vpc.Name)
×
300
                if err = c.initLB(vpcLb.TCPLoadBalancer, string(v1.ProtocolTCP), false); err != nil {
×
301
                        klog.Error(err)
×
302
                        return err
×
303
                }
×
304
                if err = c.initLB(vpcLb.TCPSessLoadBalancer, string(v1.ProtocolTCP), true); err != nil {
×
305
                        klog.Error(err)
×
306
                        return err
×
307
                }
×
308
                if err = c.initLB(vpcLb.UDPLoadBalancer, string(v1.ProtocolUDP), false); err != nil {
×
309
                        klog.Error(err)
×
310
                        return err
×
311
                }
×
312
                if err = c.initLB(vpcLb.UDPSessLoadBalancer, string(v1.ProtocolUDP), true); err != nil {
×
313
                        klog.Error(err)
×
314
                        return err
×
315
                }
×
316
                if err = c.initLB(vpcLb.SctpLoadBalancer, string(v1.ProtocolSCTP), false); err != nil {
×
317
                        klog.Error(err)
×
318
                        return err
×
319
                }
×
320
                if err = c.initLB(vpcLb.SctpSessLoadBalancer, string(v1.ProtocolSCTP), true); err != nil {
×
321
                        klog.Error(err)
×
322
                        return err
×
323
                }
×
324

325
                vpc.Status.TCPLoadBalancer = vpcLb.TCPLoadBalancer
×
326
                vpc.Status.TCPSessionLoadBalancer = vpcLb.TCPSessLoadBalancer
×
327
                vpc.Status.UDPLoadBalancer = vpcLb.UDPLoadBalancer
×
328
                vpc.Status.UDPSessionLoadBalancer = vpcLb.UDPSessLoadBalancer
×
329
                vpc.Status.SctpLoadBalancer = vpcLb.SctpLoadBalancer
×
330
                vpc.Status.SctpSessionLoadBalancer = vpcLb.SctpSessLoadBalancer
×
331
                bytes, err := vpc.Status.Bytes()
×
332
                if err != nil {
×
333
                        klog.Error(err)
×
334
                        return err
×
335
                }
×
336
                if _, err = c.config.KubeOvnClient.KubeovnV1().Vpcs().Patch(context.Background(), vpc.Name, types.MergePatchType, bytes, metav1.PatchOptions{}, "status"); err != nil {
×
337
                        klog.Error(err)
×
338
                        return err
×
339
                }
×
340
        }
341
        return nil
×
342
}
343

344
func (c *Controller) InitIPAM() error {
×
345
        start := time.Now()
×
346
        subnets, err := c.subnetsLister.List(labels.Everything())
×
347
        if err != nil {
×
348
                klog.Errorf("failed to list subnet: %v", err)
×
349
                return err
×
350
        }
×
351
        subnetProviderMaps := make(map[string]string, len(subnets))
×
352
        for _, subnet := range subnets {
×
353
                klog.Infof("Init subnet %s", subnet.Name)
×
354
                subnetProviderMaps[subnet.Name] = subnet.Spec.Provider
×
355
                if err := c.ipam.AddOrUpdateSubnet(subnet.Name, subnet.Spec.CIDRBlock, subnet.Spec.Gateway, subnet.Spec.ExcludeIps); err != nil {
×
356
                        klog.Errorf("failed to init subnet %s: %v", subnet.Name, err)
×
357
                }
×
358

359
                u2oInterconnName := fmt.Sprintf(util.U2OInterconnName, subnet.Spec.Vpc, subnet.Name)
×
360
                u2oInterconnLrpName := fmt.Sprintf("%s-%s", subnet.Spec.Vpc, subnet.Name)
×
361
                if subnet.Status.U2OInterconnectionIP != "" {
×
362
                        var mac *string
×
363
                        klog.Infof("Init U2O for subnet %s", subnet.Name)
×
364
                        if subnet.Status.U2OInterconnectionMAC != "" {
×
365
                                mac = new(subnet.Status.U2OInterconnectionMAC)
×
366
                        } else {
×
367
                                lrp, err := c.OVNNbClient.GetLogicalRouterPort(u2oInterconnLrpName, true)
×
368
                                if err != nil {
×
369
                                        klog.Errorf("failed to get logical router port %s: %v", u2oInterconnLrpName, err)
×
370
                                        return err
×
371
                                }
×
372
                                if lrp != nil {
×
373
                                        mac = new(lrp.MAC)
×
374
                                }
×
375
                        }
376
                        if _, _, _, err = c.ipam.GetStaticAddress(u2oInterconnName, u2oInterconnLrpName, subnet.Status.U2OInterconnectionIP, mac, subnet.Name, true); err != nil {
×
377
                                klog.Errorf("failed to init subnet %q u2o interconnection ip to ipam %v", subnet.Name, err)
×
378
                        }
×
379
                }
380
        }
381

382
        ippools, err := c.ippoolLister.List(labels.Everything())
×
383
        if err != nil {
×
384
                klog.Errorf("failed to list ippool: %v", err)
×
385
                return err
×
386
        }
×
387
        for _, ippool := range ippools {
×
388
                if err = c.ipam.AddOrUpdateIPPool(ippool.Spec.Subnet, ippool.Name, ippool.Spec.IPs); err != nil {
×
389
                        klog.Errorf("failed to init ippool %s: %v", ippool.Name, err)
×
390
                }
×
391
        }
392

393
        klog.Infof("Init IPAM from StatefulSet or VM IP CR")
×
394
        ips, err := c.ipsLister.List(labels.Everything())
×
395
        if err != nil {
×
396
                klog.Errorf("failed to list IPs: %v", err)
×
397
                return err
×
398
        }
×
399

400
        for _, ip := range ips {
×
401
                if !ip.DeletionTimestamp.IsZero() {
×
402
                        klog.Infof("enqueue update for removing finalizer to delete ip %s", ip.Name)
×
403
                        c.updateIPQueue.Add(ip.Name)
×
404
                        continue
×
405
                }
406
                // recover sts and kubevirt vm ip, other ip recover in later pod loop
407
                if ip.Spec.PodType != util.KindStatefulSet &&
×
408
                        ip.Spec.PodType != util.KindVirtualMachine {
×
409
                        continue
×
410
                }
411

412
                var ipamKey string
×
413
                if ip.Spec.Namespace != "" {
×
414
                        ipamKey = fmt.Sprintf("%s/%s", ip.Spec.Namespace, ip.Spec.PodName)
×
415
                } else {
×
416
                        ipamKey = util.NodeLspName(ip.Spec.PodName)
×
417
                }
×
418
                if _, _, _, err = c.ipam.GetStaticAddress(ipamKey, ip.Name, ip.Spec.IPAddress, &ip.Spec.MacAddress, ip.Spec.Subnet, true); err != nil {
×
419
                        klog.Errorf("failed to init IPAM from IP CR %s: %v", ip.Name, err)
×
420
                }
×
421
        }
422

423
        klog.Infof("Init IPAM from pod")
×
424
        pods, err := c.podsLister.List(labels.Everything())
×
425
        if err != nil {
×
426
                klog.Errorf("failed to list pods: %v", err)
×
427
                return err
×
428
        }
×
429
        for _, pod := range pods {
×
430
                if pod.Spec.HostNetwork {
×
431
                        continue
×
432
                }
433

434
                isAlive := isPodAlive(pod)
×
435
                isStsPod, _, _ := isStatefulSetPod(pod)
×
436
                if !isAlive && !isStsPod {
×
437
                        continue
×
438
                }
439

440
                if !hasAllocatedAnnotation(pod) {
×
441
                        continue
×
442
                }
443

UNCOV
444
                podNets, err := c.getPodKubeovnNets(pod)
×
UNCOV
445
                if err != nil {
×
446
                        klog.Errorf("failed to get pod kubeovn nets %s.%s address %s: %v", pod.Name, pod.Namespace, pod.Annotations[util.IPAddressAnnotation], err)
×
447
                        continue
×
448
                }
449

450
                podType := getPodType(pod)
×
451
                podName := c.getNameByPod(pod)
×
452
                key := cache.NewObjectName(pod.Namespace, podName).String()
×
453
                for _, podNet := range podNets {
×
454
                        if pod.Annotations[fmt.Sprintf(util.AllocatedAnnotationTemplate, podNet.ProviderName)] == "true" {
×
455
                                portName := ovs.PodNameToPortName(podName, pod.Namespace, podNet.ProviderName)
×
456
                                ip := pod.Annotations[fmt.Sprintf(util.IPAddressAnnotationTemplate, podNet.ProviderName)]
×
UNCOV
457
                                mac := pod.Annotations[fmt.Sprintf(util.MacAddressAnnotationTemplate, podNet.ProviderName)]
×
458
                                if ip == "" {
×
459
                                        klog.Warningf("pod %s/%s has empty IP annotation for provider %s, skip IPAM init", pod.Namespace, podName, podNet.ProviderName)
×
460
                                        continue
×
461
                                }
462
                                _, _, _, err := c.ipam.GetStaticAddress(key, portName, ip, &mac, podNet.Subnet.Name, true)
×
463
                                if err != nil {
×
464
                                        klog.Errorf("failed to init pod %s.%s address %s: %v", podName, pod.Namespace, ip, err)
×
465
                                } else {
×
UNCOV
466
                                        err = c.createOrUpdateIPCR(portName, podName, ip, mac, podNet.Subnet.Name, pod.Namespace, pod.Spec.NodeName, podType)
×
UNCOV
467
                                        if err != nil {
×
UNCOV
468
                                                klog.Errorf("failed to create/update ips CR %s.%s with ip address %s: %v", podName, pod.Namespace, ip, err)
×
UNCOV
469
                                        }
×
470
                                }
471

472
                                // Append ExternalIds is added in v1.7, used for upgrading from v1.6.3. It should be deleted now since v1.7 is not used anymore.
473
                        }
474
                }
475
        }
476

477
        klog.Infof("Init IPAM from vip CR")
×
478
        vips, err := c.virtualIpsLister.List(labels.Everything())
×
479
        if err != nil {
×
480
                klog.Errorf("failed to list vips: %v", err)
×
481
                return err
×
482
        }
×
483
        for _, vip := range vips {
×
UNCOV
484
                provider, ok := subnetProviderMaps[vip.Spec.Subnet]
×
485
                if !ok {
×
486
                        klog.Errorf("failed to find subnet %s for vip %s", vip.Spec.Subnet, vip.Name)
×
487
                        continue
×
488
                }
UNCOV
489
                portName := ovs.PodNameToPortName(vip.Name, vip.Spec.Namespace, provider)
×
UNCOV
490
                if _, _, _, err = c.ipam.GetStaticAddress(vip.Name, portName, vip.Status.V4ip, &vip.Status.Mac, vip.Spec.Subnet, true); err != nil {
×
491
                        klog.Errorf("failed to init ipam from vip cr %s: %v", vip.Name, err)
×
492
                }
×
493
        }
494

495
        klog.Infof("Init IPAM from iptables EIP CR")
×
496
        eips, err := c.iptablesEipsLister.List(labels.Everything())
×
497
        if err != nil {
×
498
                klog.Errorf("failed to list EIPs: %v", err)
×
499
                return err
×
500
        }
×
501
        for _, eip := range eips {
×
UNCOV
502
                externalNetwork := util.GetExternalNetwork(eip.Spec.ExternalSubnet)
×
UNCOV
503
                if _, _, _, err = c.ipam.GetStaticAddress(eip.Name, eip.Name, eip.Status.IP, &eip.Spec.MacAddress, externalNetwork, true); err != nil {
×
504
                        klog.Errorf("failed to init ipam from iptables eip cr %s: %v", eip.Name, err)
×
505
                }
×
506
        }
507

508
        klog.Infof("Init IPAM from ovn EIP CR")
×
509
        oeips, err := c.ovnEipsLister.List(labels.Everything())
×
510
        if err != nil {
×
511
                klog.Errorf("failed to list ovn eips: %v", err)
×
512
                return err
×
513
        }
×
UNCOV
514
        for _, oeip := range oeips {
×
UNCOV
515
                if _, _, _, err = c.ipam.GetStaticAddress(oeip.Name, oeip.Name, oeip.Status.V4Ip, &oeip.Status.MacAddress, oeip.Spec.ExternalSubnet, true); err != nil {
×
516
                        klog.Errorf("failed to init ipam from ovn eip cr %s: %v", oeip.Name, err)
×
517
                }
×
518
        }
519

520
        klog.Infof("Init IPAM from node annotation")
×
521
        nodes, err := c.nodesLister.List(labels.Everything())
×
522
        if err != nil {
×
523
                klog.Errorf("failed to list nodes: %v", err)
×
524
                return err
×
525
        }
×
526
        for _, node := range nodes {
×
527
                if node.Annotations[util.AllocatedAnnotation] == "true" {
×
528
                        portName := util.NodeLspName(node.Name)
×
529
                        mac := node.Annotations[util.MacAddressAnnotation]
×
530
                        v4IP, v6IP, _, err := c.ipam.GetStaticAddress(portName, portName,
×
531
                                node.Annotations[util.IPAddressAnnotation], &mac,
×
532
                                node.Annotations[util.LogicalSwitchAnnotation], true)
×
533
                        if err != nil {
×
534
                                klog.Errorf("failed to init node %s.%s address %s: %v", node.Name, node.Namespace, node.Annotations[util.IPAddressAnnotation], err)
×
UNCOV
535
                        }
×
UNCOV
536
                        if v4IP != "" && v6IP != "" {
×
UNCOV
537
                                node.Annotations[util.IPAddressAnnotation] = util.GetStringIP(v4IP, v6IP)
×
538
                        }
×
539
                }
540
        }
541

542
        klog.Infof("take %.2f seconds to initialize IPAM", time.Since(start).Seconds())
×
543
        return nil
×
544
}
545

546
func (c *Controller) initDefaultProviderNetwork() error {
×
547
        _, err := c.providerNetworksLister.Get(c.config.DefaultProviderName)
×
548
        if err == nil {
×
549
                return nil
×
550
        }
×
UNCOV
551
        if !k8serrors.IsNotFound(err) {
×
552
                klog.Errorf("failed to get default provider network %s: %v", c.config.DefaultProviderName, err)
×
553
                return err
×
554
        }
×
555

556
        nodes, err := c.nodesLister.List(labels.Everything())
×
UNCOV
557
        if err != nil {
×
558
                klog.Errorf("failed to get nodes: %v", err)
×
559
                return err
×
560
        }
×
561

562
        pn := kubeovnv1.ProviderNetwork{
×
563
                ObjectMeta: metav1.ObjectMeta{
×
564
                        Name: c.config.DefaultProviderName,
×
565
                },
×
566
                Spec: kubeovnv1.ProviderNetworkSpec{
×
567
                        DefaultInterface: c.config.DefaultHostInterface,
×
568
                        ExchangeLinkName: c.config.DefaultExchangeLinkName,
×
569
                },
×
570
        }
×
571

×
572
        excludeAnno := fmt.Sprintf(util.ProviderNetworkExcludeTemplate, c.config.DefaultProviderName)
×
573
        interfaceAnno := fmt.Sprintf(util.ProviderNetworkInterfaceTemplate, c.config.DefaultProviderName)
×
UNCOV
574
        patchNodes := make([]string, 0, len(nodes))
×
UNCOV
575
        for _, node := range nodes {
×
576
                if len(node.Annotations) == 0 {
×
577
                        continue
×
578
                }
579

580
                if node.Annotations[excludeAnno] == "true" {
×
581
                        pn.Spec.ExcludeNodes = append(pn.Spec.ExcludeNodes, node.Name)
×
582
                        patchNodes = append(patchNodes, node.Name)
×
583
                } else if s := node.Annotations[interfaceAnno]; s != "" {
×
584
                        var index *int
×
UNCOV
585
                        for i := range pn.Spec.CustomInterfaces {
×
UNCOV
586
                                if pn.Spec.CustomInterfaces[i].Interface == s {
×
587
                                        index = &i
×
588
                                        break
×
589
                                }
590
                        }
591
                        if index != nil {
×
592
                                pn.Spec.CustomInterfaces[*index].Nodes = append(pn.Spec.CustomInterfaces[*index].Nodes, node.Name)
×
593
                        } else {
×
UNCOV
594
                                ci := kubeovnv1.CustomInterface{Interface: s, Nodes: []string{node.Name}}
×
UNCOV
595
                                pn.Spec.CustomInterfaces = append(pn.Spec.CustomInterfaces, ci)
×
UNCOV
596
                        }
×
597
                        patchNodes = append(patchNodes, node.Name)
×
598
                }
599
        }
600

UNCOV
601
        defer func() {
×
UNCOV
602
                if err != nil {
×
603
                        return
×
604
                }
×
605

606
                // update nodes only when provider network has been created successfully
607
                patch := util.KVPatch{excludeAnno: nil, interfaceAnno: nil}
×
UNCOV
608
                for _, node := range patchNodes {
×
UNCOV
609
                        if err := util.PatchAnnotations(c.config.KubeClient.CoreV1().Nodes(), node, patch); err != nil {
×
UNCOV
610
                                klog.Errorf("failed to patch node %s: %v", node, err)
×
611
                        }
×
612
                }
613
        }()
614

615
        _, err = c.config.KubeOvnClient.KubeovnV1().ProviderNetworks().Create(context.Background(), &pn, metav1.CreateOptions{})
×
616
        if err != nil {
×
UNCOV
617
                klog.Errorf("failed to create provider network %s: %v", c.config.DefaultProviderName, err)
×
UNCOV
618
                return err
×
619
        }
×
620
        return nil
×
621
}
622

UNCOV
623
func (c *Controller) initDefaultVlan() error {
×
624
        if c.config.NetworkType != util.NetworkTypeVlan {
×
625
                return nil
×
626
        }
×
627

UNCOV
628
        if err := c.initDefaultProviderNetwork(); err != nil {
×
629
                klog.Error(err)
×
630
                return err
×
631
        }
×
632

UNCOV
633
        _, err := c.vlansLister.Get(c.config.DefaultVlanName)
×
634
        if err == nil {
×
635
                return nil
×
636
        }
×
637

UNCOV
638
        if !k8serrors.IsNotFound(err) {
×
639
                klog.Errorf("get default vlan %s failed: %v", c.config.DefaultVlanName, err)
×
640
                return err
×
641
        }
×
642

643
        if c.config.DefaultVlanID < 0 || c.config.DefaultVlanID > 4095 {
×
644
                return errors.New("the default vlan id is not between 1-4095")
×
645
        }
×
646

647
        defaultVlan := kubeovnv1.Vlan{
×
648
                ObjectMeta: metav1.ObjectMeta{Name: c.config.DefaultVlanName},
×
649
                Spec: kubeovnv1.VlanSpec{
×
650
                        ID:       c.config.DefaultVlanID,
×
651
                        Provider: c.config.DefaultProviderName,
×
652
                },
×
653
        }
×
654

×
655
        _, err = c.config.KubeOvnClient.KubeovnV1().Vlans().Create(context.Background(), &defaultVlan, metav1.CreateOptions{})
×
656
        if err != nil {
×
UNCOV
657
                klog.Errorf("failed to create vlan %s: %v", defaultVlan.Name, err)
×
UNCOV
658
                return err
×
659
        }
×
660
        return nil
×
661
}
662

663
func (c *Controller) syncIPCR() error {
×
664
        klog.Info("start to sync ips")
×
665
        ips, err := c.ipsLister.List(labels.Everything())
×
666
        if err != nil {
×
667
                if k8serrors.IsNotFound(err) {
×
UNCOV
668
                        return nil
×
UNCOV
669
                }
×
670
                klog.Error(err)
×
671
                return err
×
672
        }
673

674
        ipMap := strset.New(c.getVMLsps()...)
×
675
        for _, ip := range ips {
×
UNCOV
676
                if !ip.DeletionTimestamp.IsZero() {
×
677
                        klog.Infof("enqueue update for removing finalizer to delete ip %s", ip.Name)
×
678
                        c.updateIPQueue.Add(ip.Name)
×
679
                        continue
×
680
                }
681
                changed := false
×
682
                ip = ip.DeepCopy()
×
UNCOV
683
                if ipMap.Has(ip.Name) && ip.Spec.PodType == "" {
×
684
                        ip.Spec.PodType = util.KindVirtualMachine
×
685
                        changed = true
×
686
                }
×
687

UNCOV
688
                v4IP, v6IP := util.SplitStringIP(ip.Spec.IPAddress)
×
689
                if ip.Spec.V4IPAddress == v4IP && ip.Spec.V6IPAddress == v6IP && !changed {
×
690
                        continue
×
691
                }
692

693
                ip.Spec.V4IPAddress = v4IP
×
694
                ip.Spec.V6IPAddress = v6IP
×
695
                _, err := c.config.KubeOvnClient.KubeovnV1().IPs().Update(context.Background(), ip, metav1.UpdateOptions{})
×
UNCOV
696
                if err != nil {
×
697
                        klog.Errorf("failed to sync crd ip %s: %v", ip.Spec.IPAddress, err)
×
UNCOV
698
                        return err
×
UNCOV
699
                }
×
700
        }
701
        return nil
×
702
}
703

704
func (c *Controller) syncSubnetCR() error {
×
705
        klog.Info("start to sync subnets")
×
706
        subnets, err := c.subnetsLister.List(labels.Everything())
×
707
        if err != nil {
×
708
                if k8serrors.IsNotFound(err) {
×
UNCOV
709
                        return nil
×
710
                }
×
711
                klog.Error(err)
×
712
                return err
×
713
        }
714
        for _, cachedSubnet := range subnets {
×
UNCOV
715
                subnet := cachedSubnet.DeepCopy()
×
716
                if !subnet.Status.IsReady() {
×
717
                        klog.Warningf("subnet %s is not ready", subnet.Name)
×
718
                        continue
×
719
                }
720
                subnet, err = c.calcSubnetStatusIP(subnet)
×
UNCOV
721
                if err != nil {
×
UNCOV
722
                        klog.Errorf("failed to calculate subnet %s used ip: %v", cachedSubnet.Name, err)
×
723
                        return err
×
724
                }
×
725

726
                // only sync subnet spec enableEcmp when subnet.Spec.EnableEcmp is false and c.config.EnableEcmp is true
727
                if subnet.Spec.GatewayType == kubeovnv1.GWCentralizedType && !subnet.Spec.EnableEcmp && subnet.Spec.EnableEcmp != c.config.EnableEcmp {
×
728
                        subnet, err = c.subnetsLister.Get(subnet.Name)
×
UNCOV
729
                        if err != nil {
×
730
                                klog.Errorf("failed to get subnet %s: %v", subnet.Name, err)
×
731
                                return err
×
732
                        }
×
733

734
                        subnet.Spec.EnableEcmp = c.config.EnableEcmp
×
UNCOV
735
                        if _, err := c.config.KubeOvnClient.KubeovnV1().Subnets().Update(context.Background(), subnet, metav1.UpdateOptions{}); err != nil {
×
UNCOV
736
                                klog.Errorf("failed to sync subnet spec enableEcmp with kube-ovn-controller config enableEcmp %s: %v", subnet.Name, err)
×
737
                                return err
×
UNCOV
738
                        }
×
739
                }
740
        }
741
        return nil
×
742
}
743

744
func (c *Controller) syncVpcNatGatewayCR() error {
×
745
        klog.Info("start to sync crd vpc nat gw")
×
746
        gws, err := c.vpcNatGatewayLister.List(labels.Everything())
×
747
        if err != nil {
×
748
                klog.Errorf("failed to list vpc nat gateway, %v", err)
×
749
                return err
×
UNCOV
750
        }
×
751
        if len(gws) == 0 {
×
752
                return nil
×
753
        }
×
754
        // get vpc nat gateway enable state
755
        cm, err := c.configMapsLister.ConfigMaps(c.config.PodNamespace).Get(util.VpcNatGatewayConfig)
×
756
        if err != nil && !k8serrors.IsNotFound(err) {
×
757
                klog.Errorf("failed to get config map %s, %v", util.VpcNatGatewayConfig, err)
×
758
                return err
×
UNCOV
759
        }
×
760
        if k8serrors.IsNotFound(err) || cm.Data["enable-vpc-nat-gw"] == "false" {
×
761
                return nil
×
762
        }
×
763
        // get vpc nat gateway image
764
        cm, err = c.configMapsLister.ConfigMaps(c.config.PodNamespace).Get(util.VpcNatConfig)
×
765
        if err != nil {
×
766
                if k8serrors.IsNotFound(err) {
×
767
                        klog.Errorf("should set config map for vpc-nat-gateway %s, %v", util.VpcNatConfig, err)
×
UNCOV
768
                        return err
×
UNCOV
769
                }
×
770
                klog.Errorf("failed to get config map %s, %v", util.VpcNatConfig, err)
×
771
                return err
×
772
        }
773

774
        if cm.Data["image"] == "" {
×
UNCOV
775
                err = errors.New("should set image for vpc-nat-gateway pod")
×
776
                klog.Error(err)
×
777
                return err
×
778
        }
×
779

780
        for _, gw := range gws {
×
UNCOV
781
                if err := c.updateCrdNatGwLabels(gw.Name, ""); err != nil {
×
782
                        klog.Errorf("failed to update nat gw %s: %v", gw.Name, err)
×
UNCOV
783
                        return err
×
UNCOV
784
                }
×
785
        }
786
        return nil
×
787
}
788

789
func (c *Controller) syncVlanCR() error {
×
790
        klog.Info("start to sync vlans")
×
791
        vlans, err := c.vlansLister.List(labels.Everything())
×
792
        if err != nil {
×
793
                if k8serrors.IsNotFound(err) {
×
UNCOV
794
                        return nil
×
UNCOV
795
                }
×
796
                klog.Error(err)
×
797
                return err
×
798
        }
799

800
        for _, vlan := range vlans {
×
801
                var needUpdate bool
×
802
                newVlan := vlan.DeepCopy()
×
803
                if newVlan.Spec.VlanID != 0 && newVlan.Spec.ID == 0 {
×
804
                        newVlan.Spec.ID = newVlan.Spec.VlanID
×
805
                        newVlan.Spec.VlanID = 0
×
806
                        needUpdate = true
×
807
                }
×
808
                if newVlan.Spec.ProviderInterfaceName != "" && newVlan.Spec.Provider == "" {
×
809
                        newVlan.Spec.Provider = newVlan.Spec.ProviderInterfaceName
×
810
                        newVlan.Spec.ProviderInterfaceName = ""
×
811
                        needUpdate = true
×
812
                }
×
813
                if needUpdate {
×
UNCOV
814
                        if _, err = c.config.KubeOvnClient.KubeovnV1().Vlans().Update(context.Background(), newVlan, metav1.UpdateOptions{}); err != nil {
×
UNCOV
815
                                klog.Errorf("failed to update spec of vlan %s: %v", newVlan.Name, err)
×
UNCOV
816
                                return err
×
817
                        }
×
818
                }
819
        }
820

821
        return nil
×
822
}
823

824
func (c *Controller) batchMigrateNodeRoute(nodes []*v1.Node) error {
×
825
        start := time.Now()
×
826
        addPolicies := make([]*kubeovnv1.PolicyRoute, 0)
×
827
        delPolicies := make([]*kubeovnv1.PolicyRoute, 0)
×
828
        staticRoutes := make([]*kubeovnv1.StaticRoute, 0)
×
829
        externalIDsMap := make(map[string]map[string]string)
×
UNCOV
830
        delAsNames := make([]string, 0)
×
831
        for _, node := range nodes {
×
832
                if node.Annotations[util.AllocatedAnnotation] != "true" {
×
833
                        continue
×
834
                }
835
                nodeName := node.Name
×
836
                nodeIPv4, nodeIPv6 := util.GetNodeInternalIP(*node)
×
837
                joinAddrV4, joinAddrV6 := util.SplitStringIP(node.Annotations[util.IPAddressAnnotation])
×
838
                if nodeIPv4 != "" && joinAddrV4 != "" {
×
839
                        buildNodeRoute(4, nodeName, joinAddrV4, nodeIPv4, &addPolicies, &delPolicies, &staticRoutes, externalIDsMap, &delAsNames)
×
UNCOV
840
                }
×
UNCOV
841
                if nodeIPv6 != "" && joinAddrV6 != "" {
×
842
                        buildNodeRoute(6, nodeName, joinAddrV6, nodeIPv6, &addPolicies, &delPolicies, &staticRoutes, externalIDsMap, &delAsNames)
×
843
                }
×
844
        }
845

846
        if err := c.batchAddPolicyRouteToVpc(c.config.ClusterRouter, addPolicies, externalIDsMap); err != nil {
×
847
                klog.Errorf("failed to batch add logical router policy for lr %s nodes %d: %v", c.config.ClusterRouter, len(nodes), err)
×
848
                return err
×
849
        }
×
850
        if err := c.batchDeleteStaticRouteFromVpc(c.config.ClusterRouter, staticRoutes); err != nil {
×
851
                klog.Errorf("failed to batch delete  obsolete logical router static route for lr %s nodes %d: %v", c.config.ClusterRouter, len(nodes), err)
×
852
                return err
×
853
        }
×
854
        if err := c.batchDeletePolicyRouteFromVpc(c.config.ClusterRouter, delPolicies); err != nil {
×
855
                klog.Errorf("failed to batch delete obsolete logical router policy for lr %s nodes %d: %v", c.config.ClusterRouter, len(nodes), err)
×
856
                return err
×
857
        }
×
858
        if err := c.OVNNbClient.BatchDeleteAddressSetByNames(delAsNames); err != nil {
×
859
                klog.Errorf("failed to batch delete obsolete address set for asNames %v nodes %d: %v", delAsNames, len(nodes), err)
×
860
                return err
×
861
        }
×
UNCOV
862
        klog.V(3).Infof("take to %v batch migrate node route for router: %s priority: %d add policy len: %d externalID len: %d del policy len: %d del address set len: %d",
×
UNCOV
863
                time.Since(start), c.config.ClusterRouter, util.NodeRouterPolicyPriority, len(addPolicies), len(externalIDsMap), len(delPolicies), len(delAsNames))
×
864

×
865
        return nil
×
866
}
867

868
func buildNodeRoute(af int, nodeName, nexthop, ip string, addPolicies, delPolicies *[]*kubeovnv1.PolicyRoute, staticRoutes *[]*kubeovnv1.StaticRoute, externalIDsMap map[string]map[string]string, delAsNames *[]string) {
×
869
        var (
×
870
                match       = fmt.Sprintf("ip%d.dst == %s", af, ip)
×
871
                action      = kubeovnv1.PolicyRouteActionReroute
×
872
                externalIDs = map[string]string{
×
873
                        "vendor": util.CniTypeName,
×
874
                        "node":   nodeName,
×
875
                }
×
876
        )
×
877
        *addPolicies = append(*addPolicies, &kubeovnv1.PolicyRoute{
×
878
                Priority:  util.NodeRouterPolicyPriority,
×
879
                Match:     match,
×
880
                Action:    action,
×
881
                NextHopIP: nexthop,
×
882
        })
×
883
        externalIDsMap[buildExternalIDsMapKey(match, string(action), util.NodeRouterPolicyPriority)] = externalIDs
×
884
        *staticRoutes = append(*staticRoutes, &kubeovnv1.StaticRoute{
×
885
                Policy:     kubeovnv1.PolicyDst,
×
886
                RouteTable: util.MainRouteTable,
×
887
                NextHopIP:  "",
×
888
                CIDR:       ip,
×
889
        })
×
890
        asName := nodeUnderlayAddressSetName(nodeName, af)
×
891
        obsoleteMatch := fmt.Sprintf("ip%d.dst == %s && ip%d.src != $%s", af, ip, af, asName)
×
892
        *delPolicies = append(*delPolicies, &kubeovnv1.PolicyRoute{
×
893
                Match:    obsoleteMatch,
×
UNCOV
894
                Priority: util.NodeRouterPolicyPriority,
×
895
        })
×
896
        *delAsNames = append(*delAsNames, asName)
×
897
}
×
898

899
func (c *Controller) syncNodeRoutes() error {
×
900
        nodes, err := c.nodesLister.List(labels.Everything())
×
UNCOV
901
        if err != nil {
×
902
                klog.Errorf("failed to list nodes: %v", err)
×
903
                return err
×
904
        }
×
905

UNCOV
906
        if err := c.batchMigrateNodeRoute(nodes); err != nil {
×
907
                klog.Errorf("failed to batch migrate node routes: %v", err)
×
908
                return err
×
909
        }
×
910

911
        return nil
×
912
}
913

914
func (c *Controller) initNodeChassis() error {
×
915
        nodes, err := c.nodesLister.List(labels.Everything())
×
916
        if err != nil {
×
917
                klog.Errorf("failed to list nodes: %v", err)
×
918
                return err
×
919
        }
×
920
        chassises, err := c.OVNSbClient.GetKubeOvnChassises()
×
921
        if err != nil {
×
922
                klog.Errorf("failed to get chassis nodes: %v", err)
×
923
                return err
×
924
        }
×
925
        chassisNodes := make(map[string]string, len(*chassises))
×
926
        for _, chassis := range *chassises {
×
927
                chassisNodes[chassis.Name] = chassis.Hostname
×
928
        }
×
929
        for _, node := range nodes {
×
930
                if err := c.UpdateChassisTag(node); err != nil {
×
UNCOV
931
                        klog.Error(err)
×
UNCOV
932
                        if _, ok := err.(*ErrChassisNotFound); !ok {
×
933
                                return err
×
UNCOV
934
                        }
×
935
                }
936
        }
937
        return nil
×
938
}
939

940
func migrateFinalizers(c client.Client, list client.ObjectList, getObjectItem func(int) (client.Object, client.Object)) error {
×
UNCOV
941
        if err := c.List(context.Background(), list); err != nil {
×
942
                klog.Errorf("failed to list objects: %v", err)
×
943
                return err
×
944
        }
×
945

946
        var i int
×
UNCOV
947
        var cachedObj, patchedObj client.Object
×
948
        for {
×
949
                if cachedObj, patchedObj = getObjectItem(i); cachedObj == nil {
×
950
                        break
×
951
                }
952
                if !controllerutil.ContainsFinalizer(cachedObj, util.DeprecatedFinalizerName) {
×
953
                        i++
×
954
                        continue
×
955
                }
956
                controllerutil.RemoveFinalizer(patchedObj, util.DeprecatedFinalizerName)
×
957
                if cachedObj.GetDeletionTimestamp() == nil {
×
958
                        // if the object is not being deleted, add the new finalizer
×
959
                        controllerutil.AddFinalizer(patchedObj, util.KubeOVNControllerFinalizer)
×
960
                }
×
961
                if err := c.Patch(context.Background(), patchedObj, client.MergeFrom(cachedObj)); client.IgnoreNotFound(err) != nil {
×
962
                        klog.Errorf("failed to sync finalizers for %s %s: %v",
×
963
                                patchedObj.GetObjectKind().GroupVersionKind().Kind,
×
UNCOV
964
                                cache.MetaObjectToName(patchedObj), err)
×
UNCOV
965
                        return err
×
966
                }
×
UNCOV
967
                i++
×
968
        }
969

970
        return nil
×
971
}
972

973
func (c *Controller) syncFinalizers() error {
×
974
        cl, err := client.New(config.GetConfigOrDie(), client.Options{})
×
UNCOV
975
        if err != nil {
×
UNCOV
976
                klog.Errorf("failed to create client: %v", err)
×
977
                return err
×
978
        }
×
979

980
        // migrate deprecated finalizer to new finalizer
981
        klog.Info("start to sync finalizers")
×
982
        if err := c.syncIPFinalizer(cl); err != nil {
×
983
                klog.Errorf("failed to sync ip finalizer: %v", err)
×
984
                return err
×
985
        }
×
986
        if err := c.syncIPPoolFinalizer(cl); err != nil {
×
987
                klog.Errorf("failed to sync ippool finalizer: %v", err)
×
988
                return err
×
989
        }
×
990
        if err := c.syncOvnDnatFinalizer(cl); err != nil {
×
991
                klog.Errorf("failed to sync ovn dnat finalizer: %v", err)
×
992
                return err
×
993
        }
×
994
        if err := c.syncOvnEipFinalizer(cl); err != nil {
×
995
                klog.Errorf("failed to sync ovn eip finalizer: %v", err)
×
996
                return err
×
997
        }
×
998
        if err := c.syncOvnFipFinalizer(cl); err != nil {
×
999
                klog.Errorf("failed to sync ovn fip finalizer: %v", err)
×
1000
                return err
×
1001
        }
×
1002
        if err := c.syncOvnSnatFinalizer(cl); err != nil {
×
1003
                klog.Errorf("failed to sync ovn snat finalizer: %v", err)
×
1004
                return err
×
1005
        }
×
1006
        if err := c.syncQoSPolicyFinalizer(cl); err != nil {
×
1007
                klog.Errorf("failed to sync qos policy finalizer: %v", err)
×
1008
                return err
×
1009
        }
×
1010
        if err := c.syncSubnetFinalizer(cl); err != nil {
×
1011
                klog.Errorf("failed to sync subnet finalizer: %v", err)
×
1012
                return err
×
1013
        }
×
1014
        if err := c.syncVipFinalizer(cl); err != nil {
×
1015
                klog.Errorf("failed to sync vip finalizer: %v", err)
×
1016
                return err
×
1017
        }
×
1018
        if err := c.syncIptablesEipFinalizer(cl); err != nil {
×
1019
                klog.Errorf("failed to sync iptables eip finalizer: %v", err)
×
1020
                return err
×
1021
        }
×
1022
        if err := c.syncIptablesFipFinalizer(cl); err != nil {
×
1023
                klog.Errorf("failed to sync iptables fip finalizer: %v", err)
×
1024
                return err
×
1025
        }
×
1026
        if err := c.syncIptablesDnatFinalizer(cl); err != nil {
×
1027
                klog.Errorf("failed to sync iptables dnat finalizer: %v", err)
×
1028
                return err
×
1029
        }
×
1030
        if err := c.syncIptablesSnatFinalizer(cl); err != nil {
×
1031
                klog.Errorf("failed to sync iptables snat finalizer: %v", err)
×
UNCOV
1032
                return err
×
UNCOV
1033
        }
×
UNCOV
1034
        klog.Info("sync finalizers done")
×
UNCOV
1035
        return nil
×
1036
}
1037

1038
func hasAllocatedAnnotation(pod *v1.Pod) bool {
1✔
1039
        for key, value := range pod.Annotations {
2✔
1040
                if value == "true" && strings.HasSuffix(key, util.AllocatedAnnotationSuffix) {
2✔
1041
                        return true
1✔
1042
                }
1✔
1043
        }
1044
        return false
1✔
1045
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc