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

kubeovn / kube-ovn / 16744851721

05 Aug 2025 08:30AM UTC coverage: 21.461% (-0.005%) from 21.466%
16744851721

Pull #5557

github

Andrew Lee
Do not garbage collect IPs of stopped VMs using non-default multus networks

If a kubevirt VM:
- is not using the default multus network
- is stopped
- does not have any annotation under `vm.Spec.Template.ObjectMeta.Annotations[nadv1.NetworkAttachmentAnnot]`

Then GC would delete the IP of this VM.

To fix, we ensure that we find the LSPs of VMs on the spec before it tries (and maybe fails) to get the LSPs defined as annotations

Signed-off-by: Andrew Lee <alee@evroc.com>
Pull Request #5557: Do not garbage collect IPs of stopped VMs using non-default multus networks

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

2 existing lines in 1 file now uncovered.

10569 of 49247 relevant lines covered (21.46%)

0.25 hits per line

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

0.66
/pkg/controller/gc.go
1
package controller
2

3
import (
4
        "context"
5
        "fmt"
6
        "slices"
7
        "strings"
8
        "unicode"
9

10
        nadv1 "github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/apis/k8s.cni.cncf.io/v1"
11
        nadutils "github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/utils"
12
        "github.com/ovn-org/libovsdb/ovsdb"
13
        "github.com/scylladb/go-set/strset"
14
        corev1 "k8s.io/api/core/v1"
15
        k8serrors "k8s.io/apimachinery/pkg/api/errors"
16
        metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
17
        "k8s.io/apimachinery/pkg/labels"
18
        "k8s.io/apimachinery/pkg/types"
19
        "k8s.io/klog/v2"
20
        "k8s.io/utils/set"
21

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

28
var lastNoPodLSP = strset.New()
29

30
func (c *Controller) gc() error {
×
31
        if c.config.GCInterval == 0 {
×
32
                klog.Infof("gc is disabled")
×
33
                return nil
×
34
        }
×
35
        gcFunctions := []func() error{
×
36
                c.gcNode,
×
37
                c.gcChassis,
×
38
                c.gcLogicalSwitch,
×
39
                c.gcCustomLogicalRouter,
×
40
                // The lsp gc is processed periodically by markAndCleanLSP, will not gc lsp when init
×
41
                c.gcLoadBalancer,
×
42
                c.gcNetworkPolicy,
×
43
                c.gcSecurityGroup,
×
44
                c.gcAddressSet,
×
45
                c.gcRoutePolicy,
×
46
                c.gcStaticRoute,
×
47
                c.gcVpcNatGateway,
×
48
                c.gcLogicalRouterPort,
×
49
                c.gcIP,
×
50
                c.gcVip,
×
51
                c.gcLbSvcPods,
×
52
                c.gcVPCDNS,
×
53
        }
×
54
        for _, gcFunc := range gcFunctions {
×
55
                if err := gcFunc(); err != nil {
×
56
                        klog.Error(err)
×
57
                        return err
×
58
                }
×
59
        }
60
        return nil
×
61
}
62

63
func (c *Controller) gcLogicalRouterPort() error {
×
64
        klog.Infof("start to gc logical router port")
×
65
        vpcs, err := c.vpcsLister.List(labels.Everything())
×
66
        if err != nil {
×
67
                klog.Errorf("failed to list vpc, %v", err)
×
68
                return err
×
69
        }
×
70

71
        exceptPeerPorts := strset.New()
×
72
        for _, vpc := range vpcs {
×
73
                for _, peer := range vpc.Status.VpcPeerings {
×
74
                        exceptPeerPorts.Add(fmt.Sprintf("%s-%s", vpc.Name, peer))
×
75
                }
×
76
        }
77

78
        if err = c.OVNNbClient.DeleteLogicalRouterPorts(nil, logicalRouterPortFilter(exceptPeerPorts)); err != nil {
×
79
                klog.Errorf("delete non-existent peer logical router port: %v", err)
×
80
                return err
×
81
        }
×
82
        return nil
×
83
}
84

85
func (c *Controller) gcVpcNatGateway() error {
×
86
        klog.Infof("start to gc vpc nat gateway")
×
87
        gws, err := c.vpcNatGatewayLister.List(labels.Everything())
×
88
        if err != nil {
×
89
                klog.Errorf("failed to list vpc nat gateway, %v", err)
×
90
                return err
×
91
        }
×
92

93
        var gwStsNames []string
×
94
        for _, gw := range gws {
×
95
                _, err = c.vpcsLister.Get(gw.Spec.Vpc)
×
96
                if err != nil {
×
97
                        if !k8serrors.IsNotFound(err) {
×
98
                                klog.Errorf("failed to get vpc, %v", err)
×
99
                                return err
×
100
                        }
×
101
                        if err = c.config.KubeOvnClient.KubeovnV1().VpcNatGateways().Delete(context.Background(), gw.Name, metav1.DeleteOptions{}); err != nil {
×
102
                                klog.Errorf("failed to delete vpc nat gateway, %v", err)
×
103
                                return err
×
104
                        }
×
105
                }
106
                gwStsNames = append(gwStsNames, util.GenNatGwName(gw.Name))
×
107
        }
108

109
        stss, err := c.config.KubeClient.AppsV1().StatefulSets(c.config.PodNamespace).List(context.Background(), metav1.ListOptions{
×
110
                LabelSelector: labels.Set{util.VpcNatGatewayLabel: "true"}.AsSelector().String(),
×
111
        })
×
112
        if err != nil {
×
113
                klog.Errorf("failed to list vpc nat gateway statefulset, %v", err)
×
114
                return err
×
115
        }
×
116
        for _, sts := range stss.Items {
×
117
                if !slices.Contains(gwStsNames, sts.Name) {
×
118
                        err = c.config.KubeClient.AppsV1().StatefulSets(c.config.PodNamespace).Delete(context.Background(), sts.Name, metav1.DeleteOptions{})
×
119
                        if err != nil {
×
120
                                klog.Errorf("failed to delete vpc nat gateway statefulset, %v", err)
×
121
                                return err
×
122
                        }
×
123
                }
124
        }
125
        return nil
×
126
}
127

128
func (c *Controller) gcLogicalSwitch() error {
×
129
        klog.Infof("start to gc logical switch")
×
130
        subnets, err := c.subnetsLister.List(labels.Everything())
×
131
        if err != nil {
×
132
                klog.Errorf("failed to list subnet, %v", err)
×
133
                return err
×
134
        }
×
135

136
        lss, err := c.OVNNbClient.ListLogicalSwitchNames(c.config.EnableExternalVpc, nil)
×
137
        if err != nil {
×
138
                klog.Errorf("failed to list logical switch: %v", err)
×
139
                return err
×
140
        }
×
141

142
        subnetNames := set.New[string]()
×
143
        subnetMap := make(map[string]*kubeovnv1.Subnet, len(subnets))
×
144
        for _, s := range subnets {
×
145
                subnetMap[s.Name] = s
×
146
                subnetNames.Insert(s.Name)
×
147
        }
×
148

149
        klog.Infof("logical switch in ovn: %v", lss)
×
150
        klog.Infof("subnet in kubernetes: %v", subnetNames)
×
151
        for _, ls := range lss {
×
152
                if ls == util.InterconnectionSwitch ||
×
153
                        ls == util.ExternalGatewaySwitch ||
×
154
                        ls == c.config.ExternalGatewaySwitch {
×
155
                        continue
×
156
                }
157
                if s := subnetMap[ls]; s != nil && isOvnSubnet(s) {
×
158
                        continue
×
159
                }
160

161
                klog.Infof("gc logical switch %s", ls)
×
162
                if err = c.handleDeleteLogicalSwitch(ls); err != nil {
×
163
                        klog.Errorf("failed to gc logical switch %q: %v", ls, err)
×
164
                        return err
×
165
                }
×
166
        }
167

168
        klog.Infof("start to gc dhcp options")
×
169
        dhcpOptions, err := c.OVNNbClient.ListDHCPOptions(c.config.EnableExternalVpc, nil)
×
170
        if err != nil {
×
171
                klog.Errorf("failed to list dhcp options, %v", err)
×
172
                return err
×
173
        }
×
174
        uuidToDeleteList := []string{}
×
175
        for _, item := range dhcpOptions {
×
176
                if len(item.ExternalIDs) == 0 || !subnetNames.Has(item.ExternalIDs["ls"]) {
×
177
                        uuidToDeleteList = append(uuidToDeleteList, item.UUID)
×
178
                }
×
179
        }
180
        klog.Infof("gc dhcp options %v", uuidToDeleteList)
×
181
        if len(uuidToDeleteList) > 0 {
×
182
                if err = c.OVNNbClient.DeleteDHCPOptionsByUUIDs(uuidToDeleteList...); err != nil {
×
183
                        klog.Errorf("failed to delete dhcp options by uuids, %v", err)
×
184
                        return err
×
185
                }
×
186
        }
187
        return nil
×
188
}
189

190
func (c *Controller) gcCustomLogicalRouter() error {
×
191
        klog.Infof("start to gc logical router")
×
192
        vpcs, err := c.vpcsLister.List(labels.Everything())
×
193
        if err != nil {
×
194
                klog.Errorf("failed to list vpc, %v", err)
×
195
                return err
×
196
        }
×
197

198
        lrs, err := c.OVNNbClient.ListLogicalRouterNames(c.config.EnableExternalVpc, nil)
×
199
        if err != nil {
×
200
                klog.Errorf("failed to list logical router, %v", err)
×
201
                return err
×
202
        }
×
203

204
        vpcNames := set.New[string]()
×
205
        for _, v := range vpcs {
×
206
                vpcNames.Insert(v.Name)
×
207
        }
×
208

209
        klog.Infof("lr in ovn: %v", lrs)
×
210
        klog.Infof("vpc in kubernetes: %v", vpcNames)
×
211

×
212
        for _, lr := range lrs {
×
213
                if lr == c.config.ClusterRouter || vpcNames.Has(lr) {
×
214
                        continue
×
215
                }
216

217
                klog.Infof("gc logical router %s", lr)
×
218
                if err = c.deleteVpcRouter(lr); err != nil {
×
219
                        klog.Errorf("failed to gc logical router %q: %v", lr, err)
×
220
                        return err
×
221
                }
×
222
        }
223
        return nil
×
224
}
225

226
func (c *Controller) gcNode() error {
×
227
        klog.Infof("start to gc nodes")
×
228
        nodes, err := c.nodesLister.List(labels.Everything())
×
229
        if err != nil {
×
230
                klog.Errorf("failed to list node, %v", err)
×
231
                return err
×
232
        }
×
233
        nodeNames := strset.NewWithSize(len(nodes))
×
234
        for _, node := range nodes {
×
235
                nodeNames.Add(node.Name)
×
236
        }
×
237
        ips, err := c.ipsLister.List(labels.Everything())
×
238
        if err != nil {
×
239
                klog.Errorf("failed to list ip, %v", err)
×
240
                return err
×
241
        }
×
242

243
        for _, ip := range ips {
×
244
                if strings.HasPrefix(ip.Name, util.NodeLspPrefix) && !strings.Contains(ip.Name, ".") {
×
245
                        if node := ip.Name[len(util.NodeLspPrefix):]; !nodeNames.Has(node) {
×
246
                                klog.Infof("gc node %s", node)
×
247
                                if err := c.deleteNode(node); err != nil {
×
248
                                        klog.Errorf("failed to gc node %s: %v", node, err)
×
249
                                        return err
×
250
                                }
×
251
                        }
252
                }
253
        }
254

255
        policies, err := c.OVNNbClient.ListLogicalRouterPolicies(c.config.ClusterRouter, util.NodeRouterPolicyPriority, map[string]string{"vendor": util.CniTypeName}, false)
×
256
        if err != nil {
×
257
                klog.Errorf("failed to list logical router policies on lr %s: %v", c.config.ClusterRouter, err)
×
258
                return err
×
259
        }
×
260
        gatewayRouterPolicies, err := c.OVNNbClient.ListLogicalRouterPolicies(c.config.ClusterRouter, util.GatewayRouterPolicyPriority, map[string]string{"vendor": util.CniTypeName}, false)
×
261
        if err != nil {
×
262
                klog.Errorf("failed to list logical router policies priority %d on lr %s: %v", util.GatewayRouterPolicyPriority, c.config.ClusterRouter, err)
×
263
                return err
×
264
        }
×
265
        policies = append(policies, gatewayRouterPolicies...)
×
266
        for _, policy := range policies {
×
267
                // skip the policy for centralized subnet
×
268
                if _, ok := policy.ExternalIDs["node"]; !ok {
×
269
                        continue
×
270
                }
271
                if nodeNames.Has(policy.ExternalIDs["node"]) {
×
272
                        continue
×
273
                }
274
                klog.Infof("gc logical router policy %q priority %d on lr %s", policy.Match, policy.Priority, c.config.ClusterRouter)
×
275
                if err = c.OVNNbClient.DeleteLogicalRouterPolicy(c.config.ClusterRouter, policy.Priority, policy.Match); err != nil {
×
276
                        klog.Errorf("failed to delete logical router policy %q on lr %s", policy.Match, c.config.ClusterRouter)
×
277
                        return err
×
278
                }
×
279
        }
280

281
        return nil
×
282
}
283

284
func (c *Controller) gcVip() error {
×
285
        klog.Infof("start to gc vips")
×
286
        selector, err := util.LabelSelectorNotEmpty(util.IPReservedLabel)
×
287
        if err != nil {
×
288
                klog.Errorf("failed to generate selector for label %s: %v", util.IPReservedLabel, err)
×
289
                return err
×
290
        }
×
291
        vips, err := c.virtualIpsLister.List(selector)
×
292
        if err != nil {
×
293
                klog.Errorf("failed to list vips: %v", err)
×
294
                return err
×
295
        }
×
296
        for _, vip := range vips {
×
297
                portName := vip.Labels[util.IPReservedLabel]
×
298
                portNameSplits := strings.Split(portName, ".")
×
299
                if len(portNameSplits) >= 2 {
×
300
                        podName := portNameSplits[0]
×
301
                        namespace := portNameSplits[1]
×
302
                        _, err := c.podsLister.Pods(namespace).Get(podName)
×
303
                        if err != nil {
×
304
                                if k8serrors.IsNotFound(err) {
×
305
                                        if err = c.releaseVip(vip.Name); err != nil {
×
306
                                                klog.Errorf("failed to clean label from vip %s, %v", vip.Name, err)
×
307
                                                return err
×
308
                                        }
×
309
                                        return nil
×
310
                                }
311
                                klog.Error(err)
×
312
                                return err
×
313
                        }
314
                }
315
        }
316
        return nil
×
317
}
318

319
func (c *Controller) gcIP() error {
×
320
        klog.Infof("start to gc ips")
×
321
        ips, err := c.ipsLister.List(labels.Everything())
×
322
        if err != nil {
×
323
                klog.Errorf("failed to list ip, %v", err)
×
324
                return err
×
325
        }
×
326
        for _, ip := range ips {
×
327
                if _, ok := c.ipam.Subnets[ip.Spec.Subnet]; !ok {
×
328
                        klog.Infof("subnet %s already not exist, gc ip %s", ip.Spec.Subnet, ip.Name)
×
329
                        if err := c.config.KubeOvnClient.KubeovnV1().IPs().Delete(context.Background(), ip.Name, metav1.DeleteOptions{}); err != nil {
×
330
                                klog.Errorf("failed to gc ip %s, %v", ip.Name, err)
×
331
                        }
×
332
                }
333
        }
334
        return nil
×
335
}
336

337
func (c *Controller) markAndCleanLSP() error {
×
338
        klog.V(4).Infof("start to gc logical switch ports")
×
339
        pods, err := c.podsLister.List(labels.Everything())
×
340
        if err != nil {
×
341
                klog.Errorf("failed to list ip, %v", err)
×
342
                return err
×
343
        }
×
344
        nodes, err := c.nodesLister.List(labels.Everything())
×
345
        if err != nil {
×
346
                klog.Errorf("failed to list node, %v", err)
×
347
                return err
×
348
        }
×
349
        ipMap := strset.NewWithSize(len(pods) + len(nodes))
×
350
        for _, pod := range pods {
×
351
                if isStsPod, stsName, stsUID := isStatefulSetPod(pod); isStsPod {
×
352
                        if isStatefulSetPodToGC(c.config.KubeClient, pod, stsName, stsUID) {
×
353
                                continue
×
354
                        }
355
                } else if !isPodAlive(pod) {
×
356
                        continue
×
357
                }
358
                podName := c.getNameByPod(pod)
×
359

×
360
                for k, v := range pod.Annotations {
×
361
                        if !strings.Contains(k, util.AllocatedAnnotationSuffix) || v != "true" {
×
362
                                continue
×
363
                        }
364
                        providerName := strings.ReplaceAll(k, util.AllocatedAnnotationSuffix, "")
×
365
                        isProviderOvn, err := c.isOVNProvided(providerName, pod)
×
366
                        if err != nil {
×
367
                                klog.Errorf("determine if provider is ovn failed %v", err)
×
368
                        }
×
369
                        if !isProviderOvn {
×
370
                                continue
×
371
                        }
372
                        ipMap.Add(ovs.PodNameToPortName(podName, pod.Namespace, providerName))
×
373
                }
374
        }
375
        for _, node := range nodes {
×
376
                if node.Annotations[util.AllocatedAnnotation] == "true" {
×
377
                        ipMap.Add(util.NodeLspName(node.Name))
×
378
                }
×
379

380
                if _, err := c.ovnEipsLister.Get(node.Name); err == nil {
×
381
                        // node external gw lsp is managed by ovn eip cr, skip gc its lsp
×
382
                        ipMap.Add(node.Name)
×
383
                }
×
384
        }
385

386
        // The lsp for vm pod should not be deleted if vm still exists
387
        ipMap.Add(c.getVMLsps()...)
×
388

×
389
        vips, err := c.virtualIpsLister.List(labels.Everything())
×
390
        if err != nil {
×
391
                klog.Errorf("failed to list virtual ip, %v", err)
×
392
                return err
×
393
        }
×
394
        vipsMap := strset.NewWithSize(len(vips))
×
395
        for _, vip := range vips {
×
396
                if vip.Spec.Type != "" {
×
397
                        subnetName := vip.Spec.Subnet
×
398
                        if subnetName == "" {
×
399
                                klog.Errorf("failed to gc vip '%s', subnet should be set", vip.Name)
×
400
                                continue
×
401
                        }
402

403
                        subnet, err := c.subnetsLister.Get(subnetName)
×
404
                        if err != nil {
×
405
                                klog.Errorf("failed to get subnet %s: %v", subnetName, err)
×
406
                                continue
×
407
                        }
408

409
                        portName := ovs.PodNameToPortName(vip.Name, vip.Spec.Namespace, subnet.Spec.Provider)
×
410
                        vipsMap.Add(portName)
×
411
                }
412
        }
413
        lsps, err := c.OVNNbClient.ListNormalLogicalSwitchPorts(c.config.EnableExternalVpc, nil)
×
414
        if err != nil {
×
415
                klog.Errorf("failed to list logical switch port, %v", err)
×
416
                return err
×
417
        }
×
418

419
        noPodLSP := strset.New()
×
420
        lspMap := strset.NewWithSize(len(lsps))
×
421
        for _, lsp := range lsps {
×
422
                lspMap.Add(lsp.Name)
×
423
                if ipMap.Has(lsp.Name) {
×
424
                        continue
×
425
                }
426
                if vipsMap.Has(lsp.Name) {
×
427
                        // skip gc lsp for k8s host network vm pod or switch lb rule
×
428
                        continue
×
429
                }
430
                if !lastNoPodLSP.Has(lsp.Name) {
×
431
                        noPodLSP.Add(lsp.Name)
×
432
                        continue
×
433
                }
434

435
                klog.Infof("gc logical switch port %s", lsp.Name)
×
436
                if err := c.OVNNbClient.DeleteLogicalSwitchPort(lsp.Name); err != nil {
×
437
                        klog.Errorf("failed to delete lsp %s: %v", lsp.Name, err)
×
438
                        return err
×
439
                }
×
440
                ipCR, err := c.config.KubeOvnClient.KubeovnV1().IPs().Get(context.Background(), lsp.Name, metav1.GetOptions{})
×
441
                if err != nil {
×
442
                        if k8serrors.IsNotFound(err) {
×
443
                                // ip cr not found, skip lsp gc
×
444
                                continue
×
445
                        }
446
                        klog.Errorf("failed to get ip %s, %v", lsp.Name, err)
×
447
                        return err
×
448
                }
449
                if ipCR.Labels[util.IPReservedLabel] != "true" {
×
450
                        klog.Infof("gc ip %s", ipCR.Name)
×
451
                        if err := c.config.KubeOvnClient.KubeovnV1().IPs().Delete(context.Background(), ipCR.Name, metav1.DeleteOptions{}); err != nil {
×
452
                                if k8serrors.IsNotFound(err) {
×
453
                                        // ip cr not found, skip lsp gc
×
454
                                        continue
×
455
                                }
456
                                klog.Errorf("failed to delete ip %s, %v", ipCR.Name, err)
×
457
                                return err
×
458
                        }
459
                        if ipCR.Spec.Subnet == "" {
×
460
                                klog.Errorf("ip %s has no subnet", ipCR.Name)
×
461
                                // ip cr no subnet, skip lsp gc
×
462
                                continue
×
463
                        }
464
                        if key := lsp.ExternalIDs["pod"]; key != "" {
×
465
                                c.ipam.ReleaseAddressByPod(key, ipCR.Spec.Subnet)
×
466
                        }
×
467
                } else {
×
468
                        klog.Infof("gc skip reserved ip %s", ipCR.Name)
×
469
                }
×
470
        }
471
        lastNoPodLSP = noPodLSP
×
472

×
473
        ipMap.Each(func(ipName string) bool {
×
474
                if !lspMap.Has(ipName) {
×
475
                        klog.Errorf("lsp lost for pod %s, please delete the pod and retry", ipName)
×
476
                }
×
477
                return true
×
478
        })
479

480
        return nil
×
481
}
482

483
func (c *Controller) gcLoadBalancer() error {
×
484
        klog.Infof("start to gc load balancers")
×
485

×
486
        dnats, err := c.ovnDnatRulesLister.List(labels.Everything())
×
487
        if err != nil {
×
488
                klog.Errorf("failed to list dnats, %v", err)
×
489
                return err
×
490
        }
×
491

492
        vpcLbs := strset.NewWithSize(len(dnats))
×
493
        for _, dnat := range dnats {
×
494
                vpcLbs.Add(dnat.Name)
×
495
        }
×
496

497
        if !c.config.EnableLb {
×
498
                // remove lb from logical switch
×
499
                vpcs, err := c.vpcsLister.List(labels.Everything())
×
500
                if err != nil {
×
501
                        klog.Error(err)
×
502
                        return err
×
503
                }
×
504
                for _, cachedVpc := range vpcs {
×
505
                        vpc := cachedVpc.DeepCopy()
×
506
                        for _, subnetName := range vpc.Status.Subnets {
×
507
                                subnet, err := c.subnetsLister.Get(subnetName)
×
508
                                if err != nil {
×
509
                                        if k8serrors.IsNotFound(err) {
×
510
                                                continue
×
511
                                        }
512
                                        klog.Error(err)
×
513
                                        return err
×
514
                                }
515
                                if !isOvnSubnet(subnet) {
×
516
                                        continue
×
517
                                }
518
                                lbs := []string{vpc.Status.TCPLoadBalancer, vpc.Status.TCPSessionLoadBalancer, vpc.Status.UDPLoadBalancer, vpc.Status.UDPSessionLoadBalancer, vpc.Status.SctpLoadBalancer, vpc.Status.SctpSessionLoadBalancer}
×
519
                                if err := c.OVNNbClient.LogicalSwitchUpdateLoadBalancers(subnetName, ovsdb.MutateOperationDelete, lbs...); err != nil {
×
520
                                        klog.Error(err)
×
521
                                        return err
×
522
                                }
×
523
                        }
524

525
                        vpc.Status.TCPLoadBalancer = ""
×
526
                        vpc.Status.TCPSessionLoadBalancer = ""
×
527
                        vpc.Status.UDPLoadBalancer = ""
×
528
                        vpc.Status.UDPSessionLoadBalancer = ""
×
529
                        vpc.Status.SctpLoadBalancer = ""
×
530
                        vpc.Status.SctpSessionLoadBalancer = ""
×
531
                        bytes, err := vpc.Status.Bytes()
×
532
                        if err != nil {
×
533
                                klog.Error(err)
×
534
                                return err
×
535
                        }
×
536
                        _, err = c.config.KubeOvnClient.KubeovnV1().Vpcs().Patch(context.Background(), vpc.Name, types.MergePatchType, bytes, metav1.PatchOptions{}, "status")
×
537
                        if err != nil {
×
538
                                klog.Error(err)
×
539
                                return err
×
540
                        }
×
541
                }
542
                // lbs will remove from logical switch automatically when delete lbs
543
                if err = c.OVNNbClient.DeleteLoadBalancers(func(lb *ovnnb.LoadBalancer) bool {
×
544
                        return !vpcLbs.Has(lb.Name)
×
545
                }); err != nil {
×
546
                        klog.Errorf("delete all load balancers: %v", err)
×
547
                        return err
×
548
                }
×
549
                return nil
×
550
        }
551

552
        svcs, err := c.servicesLister.List(labels.Everything())
×
553
        if err != nil {
×
554
                klog.Errorf("failed to list svc, %v", err)
×
555
                return err
×
556
        }
×
557

558
        var (
×
559
                tcpVips         = strset.NewWithSize(len(svcs) * 2)
×
560
                udpVips         = strset.NewWithSize(len(svcs) * 2)
×
561
                sctpVips        = strset.NewWithSize(len(svcs) * 2)
×
562
                tcpSessionVips  = strset.NewWithSize(len(svcs) * 2)
×
563
                udpSessionVips  = strset.NewWithSize(len(svcs) * 2)
×
564
                sctpSessionVips = strset.NewWithSize(len(svcs) * 2)
×
565
        )
×
566

×
567
        for _, svc := range svcs {
×
568
                for _, ip := range getVipIps(svc) {
×
569
                        for _, port := range svc.Spec.Ports {
×
570
                                vip := util.JoinHostPort(ip, port.Port)
×
571
                                switch port.Protocol {
×
572
                                case corev1.ProtocolTCP:
×
573
                                        if svc.Spec.SessionAffinity == corev1.ServiceAffinityClientIP {
×
574
                                                tcpSessionVips.Add(vip)
×
575
                                        } else {
×
576
                                                tcpVips.Add(vip)
×
577
                                        }
×
578
                                case corev1.ProtocolUDP:
×
579
                                        if svc.Spec.SessionAffinity == corev1.ServiceAffinityClientIP {
×
580
                                                udpSessionVips.Add(vip)
×
581
                                        } else {
×
582
                                                udpVips.Add(vip)
×
583
                                        }
×
584
                                case corev1.ProtocolSCTP:
×
585
                                        if svc.Spec.SessionAffinity == corev1.ServiceAffinityClientIP {
×
586
                                                sctpSessionVips.Add(vip)
×
587
                                        } else {
×
588
                                                sctpVips.Add(vip)
×
589
                                        }
×
590
                                }
591
                        }
592
                }
593
        }
594

595
        vpcs, err := c.vpcsLister.List(labels.Everything())
×
596
        if err != nil {
×
597
                klog.Errorf("failed to list vpc, %v", err)
×
598
                return err
×
599
        }
×
600

601
        var (
×
602
                removeVip         func(lbName string, svcVips *strset.Set) error
×
603
                ignoreHealthCheck = true
×
604
        )
×
605

×
606
        removeVip = func(lbName string, svcVips *strset.Set) error {
×
607
                if lbName == "" {
×
608
                        return nil
×
609
                }
×
610

611
                var (
×
612
                        lb  *ovnnb.LoadBalancer
×
613
                        err error
×
614
                )
×
615

×
616
                if lb, err = c.OVNNbClient.GetLoadBalancer(lbName, true); err != nil {
×
617
                        klog.Errorf("get LB %s: %v", lbName, err)
×
618
                        return err
×
619
                }
×
620

621
                if lb == nil {
×
622
                        klog.Infof("load balancer %q already deleted", lbName)
×
623
                        return nil
×
624
                }
×
625

626
                for vip := range lb.Vips {
×
627
                        if !svcVips.Has(vip) {
×
628
                                if err = c.OVNNbClient.LoadBalancerDeleteVip(lbName, vip, ignoreHealthCheck); err != nil {
×
629
                                        klog.Errorf("failed to delete vip %s from LB %s: %v", vip, lbName, err)
×
630
                                        return err
×
631
                                }
×
632
                        }
633
                }
634
                return nil
×
635
        }
636

637
        for _, vpc := range vpcs {
×
638
                var (
×
639
                        tcpLb, udpLb, sctpLb             = vpc.Status.TCPLoadBalancer, vpc.Status.UDPLoadBalancer, vpc.Status.SctpLoadBalancer
×
640
                        tcpSessLb, udpSessLb, sctpSessLb = vpc.Status.TCPSessionLoadBalancer, vpc.Status.UDPSessionLoadBalancer, vpc.Status.SctpSessionLoadBalancer
×
641
                )
×
642

×
643
                vpcLbs.Add(tcpLb, udpLb, sctpLb, tcpSessLb, udpSessLb, sctpSessLb)
×
644
                if err = removeVip(tcpLb, tcpVips); err != nil {
×
645
                        klog.Error(err)
×
646
                        return err
×
647
                }
×
648
                if err = removeVip(tcpSessLb, tcpSessionVips); err != nil {
×
649
                        klog.Error(err)
×
650
                        return err
×
651
                }
×
652
                if err = removeVip(udpLb, udpVips); err != nil {
×
653
                        klog.Error(err)
×
654
                        return err
×
655
                }
×
656
                if err = removeVip(udpSessLb, udpSessionVips); err != nil {
×
657
                        klog.Error(err)
×
658
                        return err
×
659
                }
×
660
                if err = removeVip(sctpLb, sctpVips); err != nil {
×
661
                        klog.Error(err)
×
662
                        return err
×
663
                }
×
664
                if err = removeVip(sctpSessLb, sctpSessionVips); err != nil {
×
665
                        klog.Error(err)
×
666
                        return err
×
667
                }
×
668
        }
669

670
        // delete lbs
671
        if err = c.OVNNbClient.DeleteLoadBalancers(
×
672
                func(lb *ovnnb.LoadBalancer) bool {
×
673
                        return !vpcLbs.Has(lb.Name)
×
674
                },
×
675
        ); err != nil {
×
676
                klog.Errorf("delete load balancers: %v", err)
×
677
                return err
×
678
        }
×
679
        return nil
×
680
}
681

682
func (c *Controller) gcAddressSet() error {
×
683
        klog.Infof("start to gc address set")
×
684
        // get all address
×
685
        addressSets, err := c.OVNNbClient.ListAddressSets(nil)
×
686
        if err != nil {
×
687
                klog.Errorf("failed to list address set,%v", err)
×
688
                return err
×
689
        }
×
690

691
        asList := make([]string, 0)
×
692
        for _, as := range addressSets {
×
693
                sg := as.ExternalIDs[sgKey]
×
694
                if sg == "" {
×
695
                        continue
×
696
                }
697
                // if address set not found associated port group, delete it
698
                if pg, err := c.OVNNbClient.GetPortGroup(ovs.GetSgPortGroupName(sg), true); err == nil && pg == nil {
×
699
                        klog.Infof("ready to gc address set %s", as.Name)
×
700
                        asList = append(asList, as.Name)
×
701
                }
×
702
        }
703
        if len(asList) == 0 {
×
704
                return nil
×
705
        }
×
706

707
        if err = c.OVNNbClient.DeleteAddressSet(asList...); err != nil {
×
708
                klog.Errorf("failed to delete address set %v: %v", asList, err)
×
709
                return err
×
710
        }
×
711

712
        return nil
×
713
}
714

715
func (c *Controller) gcSecurityGroup() error {
×
716
        klog.Infof("start to gc security group residual port groups")
×
717
        // get security group
×
718
        sgs, err := c.config.KubeOvnClient.KubeovnV1().SecurityGroups().List(context.Background(), metav1.ListOptions{})
×
719
        if err != nil {
×
720
                klog.Errorf("failed to list security group,%v", err)
×
721
                return err
×
722
        }
×
723
        sgSet := strset.NewWithSize(len(sgs.Items))
×
724
        for _, sg := range sgs.Items {
×
725
                sgSet.Add(sg.Name)
×
726
        }
×
727

728
        pgs, err := c.OVNNbClient.ListPortGroups(nil)
×
729
        if err != nil {
×
730
                klog.Errorf("failed to list port group,%v", err)
×
731
                return err
×
732
        }
×
733

734
        needToDelPgs := make([]string, 0)
×
735
        denyAllPg := ovs.GetSgPortGroupName(util.DenyAllSecurityGroup)
×
736
        defaultPg := ovs.GetSgPortGroupName(util.DefaultSecurityGroupName)
×
737
        for _, pg := range pgs {
×
738
                if pg.Name == denyAllPg || pg.Name == defaultPg || pg.ExternalIDs[networkPolicyKey] != "" {
×
739
                        continue
×
740
                }
741
                // if port group not exist in security group, delete it
742
                if !sgSet.Has(pg.ExternalIDs["sg"]) {
×
743
                        klog.Infof("ready to gc port group %s", pg.Name)
×
744
                        needToDelPgs = append(needToDelPgs, pg.Name)
×
745
                }
×
746
        }
747
        if len(needToDelPgs) == 0 {
×
748
                return nil
×
749
        }
×
750
        if err = c.OVNNbClient.DeletePortGroup(needToDelPgs...); err != nil {
×
751
                klog.Errorf("failed to gc port group list,%v", err)
×
752
                return err
×
753
        }
×
754
        return nil
×
755
}
756

757
func (c *Controller) gcNetworkPolicy() error {
×
758
        klog.Infof("start to gc network policy")
×
759

×
760
        npNames := strset.New()
×
761
        delPgNames := strset.New()
×
762

×
763
        if c.config.EnableNP {
×
764
                nps, err := c.npsLister.List(labels.Everything())
×
765
                if err != nil {
×
766
                        klog.Errorf("failed to list network policy, %v", err)
×
767
                        return err
×
768
                }
×
769

770
                for _, np := range nps {
×
771
                        npName := np.Name
×
772
                        nameArray := []rune(np.Name)
×
773
                        if !unicode.IsLetter(nameArray[0]) {
×
774
                                npName = "np" + np.Name
×
775
                        }
×
776

777
                        npNames.Add(fmt.Sprintf("%s/%s", np.Namespace, npName))
×
778
                }
779
        }
780

781
        // append node port group to npNames to avoid gc node port group
782
        nodes, err := c.nodesLister.List(labels.Everything())
×
783
        if err != nil {
×
784
                klog.Errorf("failed to list nodes, %v", err)
×
785
                return err
×
786
        }
×
787

788
        for _, node := range nodes {
×
789
                npNames.Add(fmt.Sprintf("%s/%s", "node", node.Name))
×
790
        }
×
791

792
        // append overlay subnets port group to npNames to avoid gc distributed subnets port group
793
        subnets, err := c.subnetsLister.List(labels.Everything())
×
794
        if err != nil {
×
795
                klog.Errorf("failed to list subnets %v", err)
×
796
                return err
×
797
        }
×
798
        for _, subnet := range subnets {
×
799
                if subnet.Spec.Vpc != c.config.ClusterRouter || (subnet.Spec.Vlan != "" && !subnet.Spec.LogicalGateway) || subnet.Name == c.config.NodeSwitch || subnet.Spec.GatewayType != kubeovnv1.GWDistributedType {
×
800
                        continue
×
801
                }
802

803
                for _, node := range nodes {
×
804
                        npNames.Add(fmt.Sprintf("%s/%s", subnet.Name, node.Name))
×
805
                }
×
806
        }
807

808
        // list all np port groups which externalIDs[np]!=""
809
        pgs, err := c.OVNNbClient.ListPortGroups(map[string]string{networkPolicyKey: ""})
×
810
        if err != nil {
×
811
                klog.Errorf("list np port group: %v", err)
×
812
                return err
×
813
        }
×
814

815
        for _, pg := range pgs {
×
816
                np := strings.Split(pg.ExternalIDs[networkPolicyKey], "/")
×
817
                if len(np) != 2 {
×
818
                        // not np port group
×
819
                        continue
×
820
                }
821
                if !npNames.Has(pg.ExternalIDs[networkPolicyKey]) {
×
822
                        klog.Infof("gc port group '%s' network policy '%s'", pg.Name, pg.ExternalIDs[networkPolicyKey])
×
823
                        delPgNames.Add(pg.Name)
×
824
                        if c.config.EnableNP {
×
825
                                c.deleteNpQueue.Add(pg.ExternalIDs[networkPolicyKey])
×
826
                        }
×
827
                }
828
        }
829
        // gc port group
830
        // the pgName in the network policy is generated differently from the node/subnet pgName
831
        // so processes port group gc separately
832
        // ensure that the port group can be correctly gc
833
        if err := c.OVNNbClient.DeletePortGroup(delPgNames.List()...); err != nil {
×
834
                klog.Errorf("failed to gc port group %v: %v", delPgNames.List(), err)
×
835
                return err
×
836
        }
×
837

838
        return nil
×
839
}
840

841
func (c *Controller) gcRoutePolicy() error {
×
842
        klog.Infof("start to gc route policy")
×
843

×
844
        policies, err := c.OVNNbClient.ListLogicalRouterPolicies(c.config.ClusterRouter, util.NorthGatewayRoutePolicyPriority, nil, true)
×
845
        if err != nil {
×
846
                klog.Errorf("failed to list route policy, %v", err)
×
847
                return err
×
848
        }
×
849

850
        podIPs := []string{}
×
851
        pods, err := c.podsLister.List(labels.Everything())
×
852
        if err != nil {
×
853
                klog.Errorf("failed to list pods, %v", err)
×
854
                return err
×
855
        }
×
856
        for _, pod := range pods {
×
857
                if pod.Annotations != nil && pod.Annotations[util.NorthGatewayAnnotation] != "" {
×
858
                        podIPs = append(podIPs, strings.Split(pod.Annotations[util.IPAddressAnnotation], ",")...)
×
859
                }
×
860
        }
861

862
        for _, policy := range policies {
×
863
                parts := strings.Split(policy.Match, "==")
×
864
                if len(parts) != 2 {
×
865
                        continue
×
866
                }
867
                srcIP := strings.TrimSpace(parts[1])
×
868
                if !slices.Contains(podIPs, srcIP) {
×
869
                        klog.Infof("gc route policy %s", policy.Match)
×
870
                        if err := c.OVNNbClient.DeleteLogicalRouterPolicy(c.config.ClusterRouter, policy.Priority, policy.Match); err != nil {
×
871
                                klog.Errorf("failed to delete route policy %s: %v", policy.Match, err)
×
872
                                return err
×
873
                        }
×
874
                }
875
        }
876

877
        return nil
×
878
}
879

880
func (c *Controller) gcStaticRoute() error {
×
881
        klog.Infof("start to gc static routes")
×
882
        routes, err := c.OVNNbClient.ListLogicalRouterStaticRoutes(c.config.ClusterRouter, nil, nil, "", nil)
×
883
        if err != nil {
×
884
                klog.Errorf("failed to list static route %v", err)
×
885
                return err
×
886
        }
×
887
        defaultVpc, err := c.vpcsLister.Get(c.config.ClusterRouter)
×
888
        if err != nil {
×
889
                klog.Errorf("failed to get default vpc, %v", err)
×
890
                return err
×
891
        }
×
892
        var keepStaticRoute bool
×
893
        for _, route := range routes {
×
894
                keepStaticRoute = false
×
895
                for _, item := range defaultVpc.Spec.StaticRoutes {
×
896
                        if route.IPPrefix == item.CIDR && route.Nexthop == item.NextHopIP && route.RouteTable == item.RouteTable {
×
897
                                keepStaticRoute = true
×
898
                                break
×
899
                        }
900
                }
901
                if keepStaticRoute {
×
902
                        continue
×
903
                }
904
                if route.IPPrefix != "0.0.0.0/0" && route.IPPrefix != "::/0" && c.ipam.ContainAddress(route.IPPrefix) {
×
905
                        exist, err := c.OVNNbClient.NatExists(c.config.ClusterRouter, "", "", route.IPPrefix)
×
906
                        if err != nil {
×
907
                                klog.Errorf("failed to get NatRule by LogicalIP %s, %v", route.IPPrefix, err)
×
908
                                continue
×
909
                        }
910
                        if exist {
×
911
                                continue
×
912
                        }
913
                        klog.Infof("gc static route %s %v %s %s", route.RouteTable, route.Policy, route.IPPrefix, route.Nexthop)
×
914
                        if err = c.deleteStaticRouteFromVpc(
×
915
                                c.config.ClusterRouter,
×
916
                                route.RouteTable,
×
917
                                route.IPPrefix,
×
918
                                route.Nexthop,
×
919
                                reversePolicy(*route.Policy),
×
920
                        ); err != nil {
×
921
                                klog.Errorf("failed to delete stale route %s %v %s %s: %v", route.RouteTable, route.Policy, route.IPPrefix, route.Nexthop, err)
×
922
                        }
×
923
                }
924
        }
925
        return nil
×
926
}
927

928
func (c *Controller) gcChassis() error {
×
929
        klog.Infof("start to gc chassis")
×
930
        chassises, err := c.OVNSbClient.ListChassis()
×
931
        if err != nil {
×
932
                klog.Errorf("failed to get all chassis, %v", err)
×
933
        }
×
934
        chassisNodes := make(map[string]string, len(*chassises))
×
935
        for _, chassis := range *chassises {
×
936
                chassisNodes[chassis.Name] = chassis.Hostname
×
937
        }
×
938
        nodes, err := c.nodesLister.List(labels.Everything())
×
939
        if err != nil {
×
940
                klog.Errorf("failed to list nodes, %v", err)
×
941
                return err
×
942
        }
×
943
        for _, node := range nodes {
×
944
                chassisName := node.Annotations[util.ChassisAnnotation]
×
945
                if chassisName == "" {
×
946
                        // kube-ovn-cni not ready to set chassis annotation
×
947
                        continue
×
948
                }
949
                if hostname, exist := chassisNodes[chassisName]; exist {
×
950
                        if hostname == node.Name {
×
951
                                // node is alive, matched chassis should be alive
×
952
                                delete(chassisNodes, chassisName)
×
953
                                continue
×
954
                        }
955
                        // maybe node name changed, delete chassis
956
                        klog.Infof("gc node %s chassis %s", node.Name, chassisName)
×
957
                        if err := c.OVNSbClient.DeleteChassis(chassisName); err != nil {
×
958
                                klog.Errorf("failed to delete node %s chassis %s %v", node.Name, chassisName, err)
×
959
                                return err
×
960
                        }
×
961
                }
962
        }
963

964
        for chassisName, hostname := range chassisNodes {
×
965
                klog.Infof("gc node %s chassis %s", hostname, chassisName)
×
966
                if err := c.OVNSbClient.DeleteChassis(chassisName); err != nil {
×
967
                        klog.Errorf("failed to delete node %s chassis %s %v", hostname, chassisName, err)
×
968
                        return err
×
969
                }
×
970
        }
971

972
        return nil
×
973
}
974

975
func (c *Controller) isOVNProvided(providerName string, pod *corev1.Pod) (bool, error) {
×
976
        if ls, ok := pod.Annotations[fmt.Sprintf(util.LogicalSwitchAnnotationTemplate, providerName)]; ok {
×
977
                subnet, err := c.subnetsLister.Get(ls)
×
978
                if err != nil {
×
979
                        klog.Errorf("parse annotation logical switch %s error %v", ls, err)
×
980
                        return false, err
×
981
                }
×
982
                if !isOvnSubnet(subnet) {
×
983
                        return false, nil
×
984
                }
×
985
                return true, nil
×
986
        }
987
        return false, nil
×
988
}
989

990
func (c *Controller) getVMLsps() []string {
×
991
        var vmLsps []string
×
992

×
993
        if !c.config.EnableKeepVMIP {
×
994
                return vmLsps
×
995
        }
×
996

997
        nss, err := c.namespacesLister.List(labels.Everything())
×
998
        if err != nil {
×
999
                klog.Errorf("failed to list namespaces, %v", err)
×
1000
                return vmLsps
×
1001
        }
×
1002

1003
        for _, ns := range nss {
×
1004
                vms, err := c.config.KubevirtClient.VirtualMachine(ns.Name).List(context.Background(), metav1.ListOptions{})
×
1005
                if err != nil {
×
1006
                        if !k8serrors.IsNotFound(err) {
×
1007
                                klog.Errorf("failed to list vm in namespace %s, %v", ns, err)
×
1008
                        }
×
1009
                        continue
×
1010
                }
1011
                for _, vm := range vms.Items {
×
1012
                        defaultMultus := false
×
1013
                        for _, network := range vm.Spec.Template.Spec.Networks {
×
1014
                                if network.Multus != nil && network.Multus.Default {
×
1015
                                        defaultMultus = true
×
1016
                                        break
×
1017
                                }
1018
                        }
1019
                        if !defaultMultus {
×
1020
                                vmLsp := ovs.PodNameToPortName(vm.Name, ns.Name, util.OvnProvider)
×
1021
                                vmLsps = append(vmLsps, vmLsp)
×
1022
                        }
×
1023

NEW
1024
                        nadAnnotation := vm.Spec.Template.ObjectMeta.Annotations[nadv1.NetworkAttachmentAnnot]
×
NEW
1025
                        if nadAnnotation != "" {
×
NEW
1026
                                attachNets, err := nadutils.ParseNetworkAnnotation(nadAnnotation, vm.Namespace)
×
NEW
1027
                                if err != nil {
×
NEW
1028
                                        klog.Errorf("failed to get attachment subnet of vm %s, %v", vm.Name, err)
×
NEW
1029
                                        continue
×
1030
                                }
NEW
1031
                                for _, multiNet := range attachNets {
×
NEW
1032
                                        provider := fmt.Sprintf("%s.%s.%s", multiNet.Name, multiNet.Namespace, util.OvnProvider)
×
NEW
1033
                                        vmLsp := ovs.PodNameToPortName(vm.Name, ns.Name, provider)
×
NEW
1034
                                        vmLsps = append(vmLsps, vmLsp)
×
NEW
1035
                                }
×
1036
                        }
1037

1038
                        for _, network := range vm.Spec.Template.Spec.Networks {
×
1039
                                if network.Multus != nil && network.Multus.NetworkName != "" {
×
1040
                                        items := strings.Split(network.Multus.NetworkName, "/")
×
1041
                                        if len(items) != 2 {
×
1042
                                                items = []string{vm.GetNamespace(), items[0]}
×
1043
                                        }
×
1044
                                        provider := fmt.Sprintf("%s.%s.%s", items[1], items[0], util.OvnProvider)
×
1045
                                        vmLsp := ovs.PodNameToPortName(vm.Name, ns.Name, provider)
×
1046
                                        vmLsps = append(vmLsps, vmLsp)
×
1047
                                }
1048
                        }
1049
                }
1050
        }
1051

1052
        return vmLsps
×
1053
}
1054

1055
func (c *Controller) gcLbSvcPods() error {
×
1056
        klog.Infof("start to gc lb svc pods")
×
1057
        nss, err := c.namespacesLister.List(labels.Everything())
×
1058
        if err != nil {
×
1059
                klog.Errorf("failed to list namespaces, %v", err)
×
1060
                return err
×
1061
        }
×
1062

1063
        for _, ns := range nss {
×
1064
                dps, err := c.config.KubeClient.AppsV1().Deployments(ns.Name).List(context.Background(), metav1.ListOptions{})
×
1065
                if err != nil {
×
1066
                        if !k8serrors.IsNotFound(err) {
×
1067
                                klog.Errorf("failed to list lb svc deployment in namespace %s, %v", ns.Name, err)
×
1068
                        }
×
1069
                        continue
×
1070
                }
1071

1072
                for _, dp := range dps.Items {
×
1073
                        if !strings.HasPrefix(dp.Name, "lb-svc-") {
×
1074
                                continue
×
1075
                        }
1076
                        if _, ok := dp.Spec.Template.Labels["service"]; !ok {
×
1077
                                continue
×
1078
                        }
1079

1080
                        svcName := strings.TrimPrefix(dp.Name, "lb-svc-")
×
1081
                        _, err := c.servicesLister.Services(ns.Name).Get(svcName)
×
1082
                        if err != nil && k8serrors.IsNotFound(err) {
×
1083
                                klog.Infof("gc lb svc deployment %s in ns %s", dp.Name, ns.Name)
×
1084
                                if err := c.config.KubeClient.AppsV1().Deployments(ns.Name).Delete(context.Background(), dp.Name, metav1.DeleteOptions{}); err != nil {
×
1085
                                        if !k8serrors.IsNotFound(err) {
×
1086
                                                klog.Errorf("failed to delete lb svc deployment in namespace %s, %v", ns.Name, err)
×
1087
                                        }
×
1088
                                }
1089
                        }
1090
                }
1091
        }
1092
        return nil
×
1093
}
1094

1095
func (c *Controller) gcVPCDNS() error {
×
1096
        if !c.config.EnableLb {
×
1097
                return nil
×
1098
        }
×
1099

1100
        klog.Infof("start to gc vpc dns")
×
1101
        vds, err := c.vpcDNSLister.List(labels.Everything())
×
1102
        if err != nil {
×
1103
                klog.Errorf("failed to list vpc-dns, %v", err)
×
1104
                return err
×
1105
        }
×
1106

1107
        labelSelector := labels.Set{util.VpcDNSNameLabel: "true"}.AsSelector()
×
1108
        deps, err := c.config.KubeClient.AppsV1().Deployments(c.config.PodNamespace).List(context.Background(), metav1.ListOptions{
×
1109
                LabelSelector: labelSelector.String(),
×
1110
        })
×
1111
        if err != nil {
×
1112
                klog.Errorf("failed to list vpc-dns deployment, %s", err)
×
1113
                return err
×
1114
        }
×
1115

1116
        for _, dep := range deps.Items {
×
1117
                canFind := false
×
1118
                for _, vd := range vds {
×
1119
                        name := genVpcDNSDpName(vd.Name)
×
1120
                        if dep.Name == name {
×
1121
                                canFind = true
×
1122
                                break
×
1123
                        }
1124
                }
1125
                if !canFind {
×
1126
                        err := c.config.KubeClient.AppsV1().Deployments(c.config.PodNamespace).Delete(context.Background(),
×
1127
                                dep.Name, metav1.DeleteOptions{})
×
1128
                        if err != nil {
×
1129
                                klog.Errorf("failed to delete vpc-dns deployment, %s", err)
×
1130
                                return err
×
1131
                        }
×
1132
                }
1133
        }
1134

1135
        slrs, err := c.switchLBRuleLister.List(labelSelector)
×
1136
        if err != nil {
×
1137
                klog.Errorf("failed to list vpc-dns SwitchLBRules, %s", err)
×
1138
                return err
×
1139
        }
×
1140

1141
        for _, slr := range slrs {
×
1142
                canFind := false
×
1143
                for _, vd := range vds {
×
1144
                        name := genVpcDNSDpName(vd.Name)
×
1145
                        if slr.Name == name {
×
1146
                                canFind = true
×
1147
                                break
×
1148
                        }
1149
                }
1150
                if !canFind {
×
1151
                        err := c.config.KubeOvnClient.KubeovnV1().SwitchLBRules().Delete(context.Background(),
×
1152
                                slr.Name, metav1.DeleteOptions{})
×
1153
                        if err != nil {
×
1154
                                klog.Errorf("failed to delete vpc-dns SwitchLBRule, %s", err)
×
1155
                                return err
×
1156
                        }
×
1157
                }
1158
        }
1159
        return nil
×
1160
}
1161

1162
func logicalRouterPortFilter(exceptPeerPorts *strset.Set) func(lrp *ovnnb.LogicalRouterPort) bool {
1✔
1163
        return func(lrp *ovnnb.LogicalRouterPort) bool {
2✔
1164
                if exceptPeerPorts.Has(lrp.Name) {
2✔
1165
                        return false // ignore except lrp
1✔
1166
                }
1✔
1167

1168
                return lrp.Peer != nil && len(*lrp.Peer) != 0
1✔
1169
        }
1170
}
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

© 2025 Coveralls, Inc