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

kubeovn / kube-ovn / 23134800411

16 Mar 2026 08:35AM UTC coverage: 23.397%. Remained the same
23134800411

push

github

web-flow
fix: avoid error log for missing VPC annotation on underlay pods (#6454)

In underlay networks (subnet with Vlan, without LogicalGateway or
U2OInterconnection), the logical_router annotation is intentionally
not set on pods. The endpoint_slice controller treated this as an
error, causing frequent "couldn't find vpc linked to provider ovn"
log messages. Change getVpcByProvider to return an empty string
instead of an error, allowing the existing fallback logic in
getDefaultVpcAndSubnet to correctly resolve to the default VPC.

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

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

77 existing lines in 2 files now uncovered.

12827 of 54823 relevant lines covered (23.4%)

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 = []string{
×
266
                        ovnnb.LoadBalancerSelectionFieldsIPSrc,
×
267
                        ovnnb.LoadBalancerSelectionFieldsIpv6Src,
×
268
                }
×
269
        }
×
270

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

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

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

289
        return nil
×
290
}
291

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

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

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

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

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

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

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

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

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

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

437
                isAlive := isPodAlive(pod)
×
438
                isStsPod, _, _ := isStatefulSetPod(pod)
×
439
                if !isAlive && !isStsPod {
×
440
                        continue
×
441
                }
442

443
                if !hasAllocatedAnnotation(pod) {
×
444
                        continue
×
445
                }
446

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

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

475
                                // 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.
476
                        }
477
                }
478
        }
479

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

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

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

523
        klog.Infof("Init IPAM from node annotation")
×
524
        nodes, err := c.nodesLister.List(labels.Everything())
×
525
        if err != nil {
×
526
                klog.Errorf("failed to list nodes: %v", err)
×
527
                return err
×
528
        }
×
529
        for _, node := range nodes {
×
530
                if node.Annotations[util.AllocatedAnnotation] == "true" {
×
531
                        portName := util.NodeLspName(node.Name)
×
532
                        mac := node.Annotations[util.MacAddressAnnotation]
×
533
                        v4IP, v6IP, _, err := c.ipam.GetStaticAddress(portName, portName,
×
534
                                node.Annotations[util.IPAddressAnnotation], &mac,
×
535
                                node.Annotations[util.LogicalSwitchAnnotation], true)
×
536
                        if err != nil {
×
537
                                klog.Errorf("failed to init node %s.%s address %s: %v", node.Name, node.Namespace, node.Annotations[util.IPAddressAnnotation], err)
×
538
                        }
×
539
                        if v4IP != "" && v6IP != "" {
×
540
                                ipStr := util.GetStringIP(v4IP, v6IP)
×
541
                                if ipStr != node.Annotations[util.IPAddressAnnotation] {
×
UNCOV
542
                                        patch := util.KVPatch{util.IPAddressAnnotation: ipStr}
×
UNCOV
543
                                        if err = util.PatchAnnotations(c.config.KubeClient.CoreV1().Nodes(), node.Name, patch); err != nil {
×
UNCOV
544
                                                klog.Errorf("failed to patch node %s IP annotation: %v", node.Name, err)
×
545
                                        }
×
546
                                }
547
                        }
548
                }
549
        }
550

551
        klog.Infof("take %.2f seconds to initialize IPAM", time.Since(start).Seconds())
×
552
        return nil
×
553
}
554

555
func (c *Controller) initDefaultProviderNetwork() error {
×
556
        _, err := c.providerNetworksLister.Get(c.config.DefaultProviderName)
×
557
        if err == nil {
×
UNCOV
558
                return nil
×
559
        }
×
560
        if !k8serrors.IsNotFound(err) {
×
561
                klog.Errorf("failed to get default provider network %s: %v", c.config.DefaultProviderName, err)
×
562
                return err
×
563
        }
×
564

565
        nodes, err := c.nodesLister.List(labels.Everything())
×
566
        if err != nil {
×
567
                klog.Errorf("failed to get nodes: %v", err)
×
568
                return err
×
569
        }
×
570

571
        pn := kubeovnv1.ProviderNetwork{
×
572
                ObjectMeta: metav1.ObjectMeta{
×
573
                        Name: c.config.DefaultProviderName,
×
574
                },
×
575
                Spec: kubeovnv1.ProviderNetworkSpec{
×
576
                        DefaultInterface: c.config.DefaultHostInterface,
×
577
                        ExchangeLinkName: c.config.DefaultExchangeLinkName,
×
578
                },
×
579
        }
×
580

×
UNCOV
581
        excludeAnno := fmt.Sprintf(util.ProviderNetworkExcludeTemplate, c.config.DefaultProviderName)
×
UNCOV
582
        interfaceAnno := fmt.Sprintf(util.ProviderNetworkInterfaceTemplate, c.config.DefaultProviderName)
×
583
        patchNodes := make([]string, 0, len(nodes))
×
584
        for _, node := range nodes {
×
585
                if len(node.Annotations) == 0 {
×
586
                        continue
×
587
                }
588

589
                if node.Annotations[excludeAnno] == "true" {
×
590
                        pn.Spec.ExcludeNodes = append(pn.Spec.ExcludeNodes, node.Name)
×
591
                        patchNodes = append(patchNodes, node.Name)
×
UNCOV
592
                } else if s := node.Annotations[interfaceAnno]; s != "" {
×
UNCOV
593
                        var index *int
×
594
                        for i := range pn.Spec.CustomInterfaces {
×
595
                                if pn.Spec.CustomInterfaces[i].Interface == s {
×
596
                                        index = &i
×
597
                                        break
×
598
                                }
599
                        }
600
                        if index != nil {
×
UNCOV
601
                                pn.Spec.CustomInterfaces[*index].Nodes = append(pn.Spec.CustomInterfaces[*index].Nodes, node.Name)
×
UNCOV
602
                        } else {
×
UNCOV
603
                                ci := kubeovnv1.CustomInterface{Interface: s, Nodes: []string{node.Name}}
×
604
                                pn.Spec.CustomInterfaces = append(pn.Spec.CustomInterfaces, ci)
×
605
                        }
×
606
                        patchNodes = append(patchNodes, node.Name)
×
607
                }
608
        }
609

610
        defer func() {
×
611
                if err != nil {
×
612
                        return
×
613
                }
×
614

615
                // update nodes only when provider network has been created successfully
UNCOV
616
                patch := util.KVPatch{excludeAnno: nil, interfaceAnno: nil}
×
UNCOV
617
                for _, node := range patchNodes {
×
618
                        if err := util.PatchAnnotations(c.config.KubeClient.CoreV1().Nodes(), node, patch); err != nil {
×
619
                                klog.Errorf("failed to patch node %s: %v", node, err)
×
620
                        }
×
621
                }
622
        }()
623

UNCOV
624
        _, err = c.config.KubeOvnClient.KubeovnV1().ProviderNetworks().Create(context.Background(), &pn, metav1.CreateOptions{})
×
UNCOV
625
        if err != nil {
×
626
                klog.Errorf("failed to create provider network %s: %v", c.config.DefaultProviderName, err)
×
627
                return err
×
628
        }
×
629
        return nil
×
630
}
631

632
func (c *Controller) initDefaultVlan() error {
×
633
        if c.config.NetworkType != util.NetworkTypeVlan {
×
634
                return nil
×
UNCOV
635
        }
×
636

637
        if err := c.initDefaultProviderNetwork(); err != nil {
×
638
                klog.Error(err)
×
639
                return err
×
UNCOV
640
        }
×
641

642
        _, err := c.vlansLister.Get(c.config.DefaultVlanName)
×
643
        if err == nil {
×
644
                return nil
×
UNCOV
645
        }
×
646

647
        if !k8serrors.IsNotFound(err) {
×
648
                klog.Errorf("get default vlan %s failed: %v", c.config.DefaultVlanName, err)
×
UNCOV
649
                return err
×
650
        }
×
651

652
        if c.config.DefaultVlanID < 0 || c.config.DefaultVlanID > 4095 {
×
653
                return errors.New("the default vlan id is not between 1-4095")
×
654
        }
×
655

656
        defaultVlan := kubeovnv1.Vlan{
×
657
                ObjectMeta: metav1.ObjectMeta{Name: c.config.DefaultVlanName},
×
658
                Spec: kubeovnv1.VlanSpec{
×
659
                        ID:       c.config.DefaultVlanID,
×
660
                        Provider: c.config.DefaultProviderName,
×
661
                },
×
662
        }
×
663

×
UNCOV
664
        _, err = c.config.KubeOvnClient.KubeovnV1().Vlans().Create(context.Background(), &defaultVlan, metav1.CreateOptions{})
×
UNCOV
665
        if err != nil {
×
666
                klog.Errorf("failed to create vlan %s: %v", defaultVlan.Name, err)
×
667
                return err
×
668
        }
×
669
        return nil
×
670
}
671

672
func (c *Controller) syncIPCR() error {
×
673
        klog.Info("start to sync ips")
×
674
        ips, err := c.ipsLister.List(labels.Everything())
×
UNCOV
675
        if err != nil {
×
UNCOV
676
                if k8serrors.IsNotFound(err) {
×
677
                        return nil
×
678
                }
×
679
                klog.Error(err)
×
680
                return err
×
681
        }
682

UNCOV
683
        ipMap := strset.New(c.getVMLsps()...)
×
684
        for _, ip := range ips {
×
685
                if !ip.DeletionTimestamp.IsZero() {
×
686
                        klog.Infof("enqueue update for removing finalizer to delete ip %s", ip.Name)
×
687
                        c.updateIPQueue.Add(ip.Name)
×
688
                        continue
×
689
                }
UNCOV
690
                changed := false
×
691
                ip = ip.DeepCopy()
×
692
                if ipMap.Has(ip.Name) && ip.Spec.PodType == "" {
×
693
                        ip.Spec.PodType = util.KindVirtualMachine
×
UNCOV
694
                        changed = true
×
UNCOV
695
                }
×
696

697
                v4IP, v6IP := util.SplitStringIP(ip.Spec.IPAddress)
×
698
                if ip.Spec.V4IPAddress == v4IP && ip.Spec.V6IPAddress == v6IP && !changed {
×
699
                        continue
×
700
                }
701

702
                ip.Spec.V4IPAddress = v4IP
×
UNCOV
703
                ip.Spec.V6IPAddress = v6IP
×
704
                _, err := c.config.KubeOvnClient.KubeovnV1().IPs().Update(context.Background(), ip, metav1.UpdateOptions{})
×
UNCOV
705
                if err != nil {
×
UNCOV
706
                        klog.Errorf("failed to sync crd ip %s: %v", ip.Spec.IPAddress, err)
×
707
                        return err
×
708
                }
×
709
        }
710
        return nil
×
711
}
712

713
func (c *Controller) syncSubnetCR() error {
×
714
        klog.Info("start to sync subnets")
×
715
        subnets, err := c.subnetsLister.List(labels.Everything())
×
UNCOV
716
        if err != nil {
×
717
                if k8serrors.IsNotFound(err) {
×
718
                        return nil
×
719
                }
×
720
                klog.Error(err)
×
721
                return err
×
722
        }
723
        for _, cachedSubnet := range subnets {
×
724
                subnet := cachedSubnet.DeepCopy()
×
725
                if !subnet.Status.IsReady() {
×
726
                        klog.Warningf("subnet %s is not ready", subnet.Name)
×
727
                        continue
×
728
                }
UNCOV
729
                subnet, err = c.calcSubnetStatusIP(subnet)
×
730
                if err != nil {
×
731
                        klog.Errorf("failed to calculate subnet %s used ip: %v", cachedSubnet.Name, err)
×
732
                        return err
×
733
                }
×
734

735
                // only sync subnet spec enableEcmp when subnet.Spec.EnableEcmp is false and c.config.EnableEcmp is true
UNCOV
736
                if subnet.Spec.GatewayType == kubeovnv1.GWCentralizedType && !subnet.Spec.EnableEcmp && subnet.Spec.EnableEcmp != c.config.EnableEcmp {
×
737
                        subnet, err = c.subnetsLister.Get(subnet.Name)
×
738
                        if err != nil {
×
739
                                klog.Errorf("failed to get subnet %s: %v", subnet.Name, err)
×
740
                                return err
×
741
                        }
×
742

UNCOV
743
                        subnet.Spec.EnableEcmp = c.config.EnableEcmp
×
744
                        if _, err := c.config.KubeOvnClient.KubeovnV1().Subnets().Update(context.Background(), subnet, metav1.UpdateOptions{}); err != nil {
×
UNCOV
745
                                klog.Errorf("failed to sync subnet spec enableEcmp with kube-ovn-controller config enableEcmp %s: %v", subnet.Name, err)
×
UNCOV
746
                                return err
×
747
                        }
×
748
                }
749
        }
750
        return nil
×
751
}
752

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

783
        if cm.Data["image"] == "" {
×
784
                err = errors.New("should set image for vpc-nat-gateway pod")
×
785
                klog.Error(err)
×
786
                return err
×
787
        }
×
788

789
        for _, gw := range gws {
×
UNCOV
790
                if err := c.updateCrdNatGwLabels(gw.Name, ""); err != nil {
×
UNCOV
791
                        klog.Errorf("failed to update nat gw %s: %v", gw.Name, err)
×
792
                        return err
×
793
                }
×
794
        }
795
        return nil
×
796
}
797

798
func (c *Controller) syncVlanCR() error {
×
799
        klog.Info("start to sync vlans")
×
800
        vlans, err := c.vlansLister.List(labels.Everything())
×
UNCOV
801
        if err != nil {
×
UNCOV
802
                if k8serrors.IsNotFound(err) {
×
803
                        return nil
×
804
                }
×
805
                klog.Error(err)
×
806
                return err
×
807
        }
808

809
        for _, vlan := range vlans {
×
810
                var needUpdate bool
×
811
                newVlan := vlan.DeepCopy()
×
812
                if newVlan.Spec.VlanID != 0 && newVlan.Spec.ID == 0 {
×
813
                        newVlan.Spec.ID = newVlan.Spec.VlanID
×
814
                        newVlan.Spec.VlanID = 0
×
815
                        needUpdate = true
×
816
                }
×
817
                if newVlan.Spec.ProviderInterfaceName != "" && newVlan.Spec.Provider == "" {
×
818
                        newVlan.Spec.Provider = newVlan.Spec.ProviderInterfaceName
×
819
                        newVlan.Spec.ProviderInterfaceName = ""
×
820
                        needUpdate = true
×
UNCOV
821
                }
×
UNCOV
822
                if needUpdate {
×
UNCOV
823
                        if _, err = c.config.KubeOvnClient.KubeovnV1().Vlans().Update(context.Background(), newVlan, metav1.UpdateOptions{}); err != nil {
×
824
                                klog.Errorf("failed to update spec of vlan %s: %v", newVlan.Name, err)
×
UNCOV
825
                                return err
×
UNCOV
826
                        }
×
827
                }
828
        }
829

830
        return nil
×
831
}
832

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

855
        if err := c.batchAddPolicyRouteToVpc(c.config.ClusterRouter, addPolicies, externalIDsMap); err != nil {
×
856
                klog.Errorf("failed to batch add logical router policy for lr %s nodes %d: %v", c.config.ClusterRouter, len(nodes), err)
×
857
                return err
×
858
        }
×
859
        if err := c.batchDeleteStaticRouteFromVpc(c.config.ClusterRouter, staticRoutes); err != nil {
×
860
                klog.Errorf("failed to batch delete  obsolete logical router static route for lr %s nodes %d: %v", c.config.ClusterRouter, len(nodes), err)
×
861
                return err
×
862
        }
×
863
        if err := c.batchDeletePolicyRouteFromVpc(c.config.ClusterRouter, delPolicies); err != nil {
×
864
                klog.Errorf("failed to batch delete obsolete logical router policy for lr %s nodes %d: %v", c.config.ClusterRouter, len(nodes), err)
×
865
                return err
×
866
        }
×
867
        if err := c.OVNNbClient.BatchDeleteAddressSetByNames(delAsNames); err != nil {
×
868
                klog.Errorf("failed to batch delete obsolete address set for asNames %v nodes %d: %v", delAsNames, len(nodes), err)
×
UNCOV
869
                return err
×
UNCOV
870
        }
×
871
        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",
×
872
                time.Since(start), c.config.ClusterRouter, util.NodeRouterPolicyPriority, len(addPolicies), len(externalIDsMap), len(delPolicies), len(delAsNames))
×
873

×
874
        return nil
×
875
}
876

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

UNCOV
908
func (c *Controller) syncNodeRoutes() error {
×
909
        nodes, err := c.nodesLister.List(labels.Everything())
×
910
        if err != nil {
×
911
                klog.Errorf("failed to list nodes: %v", err)
×
912
                return err
×
UNCOV
913
        }
×
914

UNCOV
915
        if err := c.batchMigrateNodeRoute(nodes); err != nil {
×
UNCOV
916
                klog.Errorf("failed to batch migrate node routes: %v", err)
×
917
                return err
×
918
        }
×
919

920
        return nil
×
921
}
922

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

949
func migrateFinalizers(c client.Client, list client.ObjectList, getObjectItem func(int) (client.Object, client.Object)) error {
×
950
        if err := c.List(context.Background(), list); err != nil {
×
951
                klog.Errorf("failed to list objects: %v", err)
×
952
                return err
×
953
        }
×
954

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

979
        return nil
×
980
}
981

UNCOV
982
func (c *Controller) syncFinalizers() error {
×
UNCOV
983
        cl, err := client.New(config.GetConfigOrDie(), client.Options{})
×
984
        if err != nil {
×
985
                klog.Errorf("failed to create client: %v", err)
×
986
                return err
×
987
        }
×
988

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

1047
func hasAllocatedAnnotation(pod *v1.Pod) bool {
1✔
1048
        for key, value := range pod.Annotations {
2✔
1049
                if value == "true" && strings.HasSuffix(key, util.AllocatedAnnotationSuffix) {
2✔
1050
                        return true
1✔
1051
                }
1✔
1052
        }
1053
        return false
1✔
1054
}
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