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

kubeovn / kube-ovn / 13425935899

20 Feb 2025 01:32AM UTC coverage: 22.263% (+0.2%) from 22.068%
13425935899

Pull #4991

github

zhangzujian
wip

Signed-off-by: zhangzujian <zhangzujian.7@gmail.com>
Pull Request #4991: add support for internalTrafficPolicy=Local

175 of 617 new or added lines in 13 files covered. (28.36%)

8 existing lines in 5 files now uncovered.

10436 of 46876 relevant lines covered (22.26%)

0.26 hits per line

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

0.69
/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
        gcFunctions := []func() error{
×
32
                c.gcNode,
×
33
                c.gcChassis,
×
34
                c.gcLogicalSwitch,
×
35
                c.gcCustomLogicalRouter,
×
36
                // The lsp gc is processed periodically by markAndCleanLSP, will not gc lsp when init
×
37
                c.gcLoadBalancer,
×
38
                c.gcNetworkPolicy,
×
39
                c.gcSecurityGroup,
×
40
                c.gcAddressSet,
×
41
                c.gcRoutePolicy,
×
42
                c.gcStaticRoute,
×
43
                c.gcVpcNatGateway,
×
44
                c.gcLogicalRouterPort,
×
45
                c.gcVip,
×
46
                c.gcLbSvcPods,
×
47
                c.gcVPCDNS,
×
48
        }
×
49
        for _, gcFunc := range gcFunctions {
×
50
                if err := gcFunc(); err != nil {
×
51
                        klog.Error(err)
×
52
                        return err
×
53
                }
×
54
        }
55
        return nil
×
56
}
57

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

66
        exceptPeerPorts := strset.New()
×
67
        for _, vpc := range vpcs {
×
68
                for _, peer := range vpc.Status.VpcPeerings {
×
69
                        exceptPeerPorts.Add(fmt.Sprintf("%s-%s", vpc.Name, peer))
×
70
                }
×
71
        }
72

73
        if err = c.OVNNbClient.DeleteLogicalRouterPorts(nil, logicalRouterPortFilter(exceptPeerPorts)); err != nil {
×
74
                klog.Errorf("delete non-existent peer logical router port: %v", err)
×
75
                return err
×
76
        }
×
77
        return nil
×
78
}
79

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

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

104
        sel, _ := metav1.LabelSelectorAsSelector(&metav1.LabelSelector{MatchLabels: map[string]string{util.VpcNatGatewayLabel: "true"}})
×
105
        stss, err := c.config.KubeClient.AppsV1().StatefulSets(c.config.PodNamespace).List(context.Background(), metav1.ListOptions{
×
106
                LabelSelector: sel.String(),
×
107
        })
×
108
        if err != nil {
×
109
                klog.Errorf("failed to list vpc nat gateway statefulset, %v", err)
×
110
                return err
×
111
        }
×
112
        for _, sts := range stss.Items {
×
113
                if !slices.Contains(gwStsNames, sts.Name) {
×
114
                        err = c.config.KubeClient.AppsV1().StatefulSets(c.config.PodNamespace).Delete(context.Background(), sts.Name, metav1.DeleteOptions{})
×
115
                        if err != nil {
×
116
                                klog.Errorf("failed to delete vpc nat gateway statefulset, %v", err)
×
117
                                return err
×
118
                        }
×
119
                }
120
        }
121
        return nil
×
122
}
123

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

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

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

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

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

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

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

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

200
        vpcNames := set.New[string]()
×
201
        for _, v := range vpcs {
×
202
                vpcNames.Insert(v.Name)
×
203
        }
×
204

205
        klog.Infof("lr in ovn: %v", lrs)
×
206
        klog.Infof("vpc in kubernetes: %v", vpcNames)
×
207

×
208
        for _, lr := range lrs {
×
209
                if lr == c.config.ClusterRouter || vpcNames.Has(lr) {
×
210
                        continue
×
211
                }
212

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

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

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

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

277
        return nil
×
278
}
279

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

315
func (c *Controller) markAndCleanLSP() error {
×
316
        klog.V(4).Infof("start to gc logical switch ports")
×
317
        pods, err := c.podsLister.List(labels.Everything())
×
318
        if err != nil {
×
319
                klog.Errorf("failed to list ip, %v", err)
×
320
                return err
×
321
        }
×
322
        nodes, err := c.nodesLister.List(labels.Everything())
×
323
        if err != nil {
×
324
                klog.Errorf("failed to list node, %v", err)
×
325
                return err
×
326
        }
×
327
        ipMap := strset.NewWithSize(len(pods) + len(nodes))
×
328
        for _, pod := range pods {
×
329
                if isStsPod, stsName, stsUID := isStatefulSetPod(pod); isStsPod {
×
330
                        if isStatefulSetPodToDel(c.config.KubeClient, pod, stsName, stsUID) {
×
331
                                continue
×
332
                        }
333
                } else if !isPodAlive(pod) {
×
334
                        continue
×
335
                }
336
                podName := c.getNameByPod(pod)
×
337

×
338
                for k, v := range pod.Annotations {
×
339
                        if !strings.Contains(k, util.AllocatedAnnotationSuffix) || v != "true" {
×
340
                                continue
×
341
                        }
342
                        providerName := strings.ReplaceAll(k, util.AllocatedAnnotationSuffix, "")
×
343
                        isProviderOvn, err := c.isOVNProvided(providerName, pod)
×
344
                        if err != nil {
×
345
                                klog.Errorf("determine if provider is ovn failed %v", err)
×
346
                        }
×
347
                        if !isProviderOvn {
×
348
                                continue
×
349
                        }
350
                        ipMap.Add(ovs.PodNameToPortName(podName, pod.Namespace, providerName))
×
351
                }
352
        }
353
        for _, node := range nodes {
×
354
                if node.Annotations[util.AllocatedAnnotation] == "true" {
×
355
                        ipMap.Add(util.NodeLspName(node.Name))
×
356
                }
×
357

358
                if _, err := c.ovnEipsLister.Get(node.Name); err == nil {
×
359
                        // node external gw lsp is managed by ovn eip cr, skip gc its lsp
×
360
                        ipMap.Add(node.Name)
×
361
                }
×
362
        }
363

364
        // The lsp for vm pod should not be deleted if vm still exists
365
        ipMap.Add(c.getVMLsps()...)
×
366

×
367
        lsps, err := c.OVNNbClient.ListNormalLogicalSwitchPorts(c.config.EnableExternalVpc, nil)
×
368
        if err != nil {
×
369
                klog.Errorf("failed to list logical switch port, %v", err)
×
370
                return err
×
371
        }
×
372

373
        noPodLSP := strset.New()
×
374
        lspMap := strset.NewWithSize(len(lsps))
×
375
        for _, lsp := range lsps {
×
376
                lspMap.Add(lsp.Name)
×
377
                if ipMap.Has(lsp.Name) {
×
378
                        continue
×
379
                }
380

381
                if lsp.Options != nil && lsp.Options["arp_proxy"] == "true" {
×
382
                        // arp_proxy lsp is a type of vip crd which should not gc
×
383
                        continue
×
384
                }
385
                if !lastNoPodLSP.Has(lsp.Name) {
×
386
                        noPodLSP.Add(lsp.Name)
×
387
                        continue
×
388
                }
389

390
                klog.Infof("gc logical switch port %s", lsp.Name)
×
391
                if err := c.OVNNbClient.DeleteLogicalSwitchPort(lsp.Name); err != nil {
×
392
                        klog.Errorf("failed to delete lsp %s: %v", lsp.Name, err)
×
393
                        return err
×
394
                }
×
395
                ipCR, err := c.config.KubeOvnClient.KubeovnV1().IPs().Get(context.Background(), lsp.Name, metav1.GetOptions{})
×
396
                if err != nil {
×
397
                        if k8serrors.IsNotFound(err) {
×
398
                                // ip cr not found, skip lsp gc
×
399
                                continue
×
400
                        }
401
                        klog.Errorf("failed to get ip %s, %v", lsp.Name, err)
×
402
                        return err
×
403
                }
404
                if ipCR.Labels[util.IPReservedLabel] != "true" {
×
405
                        klog.Infof("gc ip %s", ipCR.Name)
×
406
                        if err := c.config.KubeOvnClient.KubeovnV1().IPs().Delete(context.Background(), ipCR.Name, metav1.DeleteOptions{}); err != nil {
×
407
                                if k8serrors.IsNotFound(err) {
×
408
                                        // ip cr not found, skip lsp gc
×
409
                                        continue
×
410
                                }
411
                                klog.Errorf("failed to delete ip %s, %v", ipCR.Name, err)
×
412
                                return err
×
413
                        }
414
                        if ipCR.Spec.Subnet == "" {
×
415
                                klog.Errorf("ip %s has no subnet", ipCR.Name)
×
416
                                // ip cr no subnet, skip lsp gc
×
417
                                continue
×
418
                        }
419
                        if key := lsp.ExternalIDs["pod"]; key != "" {
×
420
                                c.ipam.ReleaseAddressByPod(key, ipCR.Spec.Subnet)
×
421
                        }
×
422
                } else {
×
423
                        klog.Infof("gc skip reserved ip %s", ipCR.Name)
×
424
                }
×
425
        }
426
        lastNoPodLSP = noPodLSP
×
427

×
428
        ipMap.Each(func(ipName string) bool {
×
429
                if !lspMap.Has(ipName) {
×
430
                        klog.Errorf("lsp lost for pod %s, please delete the pod and retry", ipName)
×
431
                }
×
432
                return true
×
433
        })
434

435
        return nil
×
436
}
437

438
func (c *Controller) gcLoadBalancer() error {
×
439
        klog.Infof("start to gc load balancers")
×
440

×
441
        dnats, err := c.ovnDnatRulesLister.List(labels.Everything())
×
442
        if err != nil {
×
443
                klog.Errorf("failed to list dnats, %v", err)
×
444
                return err
×
445
        }
×
446

447
        vpcLbs := strset.NewWithSize(len(dnats))
×
448
        for _, dnat := range dnats {
×
449
                vpcLbs.Add(dnat.Name)
×
450
        }
×
451

452
        if !c.config.EnableLb {
×
453
                // remove lb from logical switch
×
454
                vpcs, err := c.vpcsLister.List(labels.Everything())
×
455
                if err != nil {
×
456
                        klog.Error(err)
×
457
                        return err
×
458
                }
×
459
                for _, cachedVpc := range vpcs {
×
460
                        vpc := cachedVpc.DeepCopy()
×
461
                        for _, subnetName := range vpc.Status.Subnets {
×
462
                                subnet, err := c.subnetsLister.Get(subnetName)
×
463
                                if err != nil {
×
464
                                        if k8serrors.IsNotFound(err) {
×
465
                                                continue
×
466
                                        }
467
                                        klog.Error(err)
×
468
                                        return err
×
469
                                }
470
                                if !isOvnSubnet(subnet) {
×
471
                                        continue
×
472
                                }
NEW
473
                                lbs := []string{
×
NEW
474
                                        vpc.Status.TCPLoadBalancer,
×
NEW
475
                                        vpc.Status.TCPSessionLoadBalancer,
×
NEW
476
                                        vpc.Status.UDPLoadBalancer,
×
NEW
477
                                        vpc.Status.UDPSessionLoadBalancer,
×
NEW
478
                                        vpc.Status.SCTPLoadBalancer,
×
NEW
479
                                        vpc.Status.SCTPSessionLoadBalancer,
×
NEW
480
                                        vpc.Status.LocalTCPLoadBalancer,
×
NEW
481
                                        vpc.Status.LocalTCPSessionLoadBalancer,
×
NEW
482
                                        vpc.Status.LocalUDPLoadBalancer,
×
NEW
483
                                        vpc.Status.LocalUDPSessionLoadBalancer,
×
NEW
484
                                        vpc.Status.LocalSCTPLoadBalancer,
×
NEW
485
                                        vpc.Status.LocalSCTPSessionLoadBalancer,
×
NEW
486
                                }
×
487
                                if err := c.OVNNbClient.LogicalSwitchUpdateLoadBalancers(subnetName, ovsdb.MutateOperationDelete, lbs...); err != nil {
×
488
                                        klog.Error(err)
×
489
                                        return err
×
490
                                }
×
491
                        }
492

493
                        vpc.Status.TCPLoadBalancer = ""
×
494
                        vpc.Status.TCPSessionLoadBalancer = ""
×
495
                        vpc.Status.UDPLoadBalancer = ""
×
496
                        vpc.Status.UDPSessionLoadBalancer = ""
×
NEW
497
                        vpc.Status.SCTPLoadBalancer = ""
×
NEW
498
                        vpc.Status.SCTPSessionLoadBalancer = ""
×
NEW
499
                        vpc.Status.LocalTCPLoadBalancer = ""
×
NEW
500
                        vpc.Status.LocalTCPSessionLoadBalancer = ""
×
NEW
501
                        vpc.Status.LocalUDPLoadBalancer = ""
×
NEW
502
                        vpc.Status.LocalUDPSessionLoadBalancer = ""
×
NEW
503
                        vpc.Status.LocalSCTPLoadBalancer = ""
×
NEW
504
                        vpc.Status.LocalSCTPSessionLoadBalancer = ""
×
505
                        bytes, err := vpc.Status.Bytes()
×
506
                        if err != nil {
×
507
                                klog.Error(err)
×
508
                                return err
×
509
                        }
×
510
                        _, err = c.config.KubeOvnClient.KubeovnV1().Vpcs().Patch(context.Background(), vpc.Name, types.MergePatchType, bytes, metav1.PatchOptions{}, "status")
×
511
                        if err != nil {
×
512
                                klog.Error(err)
×
513
                                return err
×
514
                        }
×
515
                }
516
                // lbs will remove from logical switch automatically when delete lbs
517
                if err = c.OVNNbClient.DeleteLoadBalancers(func(lb *ovnnb.LoadBalancer) bool {
×
518
                        return !vpcLbs.Has(lb.Name)
×
519
                }); err != nil {
×
520
                        klog.Errorf("delete all load balancers: %v", err)
×
521
                        return err
×
522
                }
×
523
                return nil
×
524
        }
525

526
        svcs, err := c.servicesLister.List(labels.Everything())
×
527
        if err != nil {
×
528
                klog.Errorf("failed to list svc, %v", err)
×
529
                return err
×
530
        }
×
531

532
        var (
×
533
                tcpVips         = strset.NewWithSize(len(svcs) * 2)
×
534
                udpVips         = strset.NewWithSize(len(svcs) * 2)
×
535
                sctpVips        = strset.NewWithSize(len(svcs) * 2)
×
536
                tcpSessionVips  = strset.NewWithSize(len(svcs) * 2)
×
537
                udpSessionVips  = strset.NewWithSize(len(svcs) * 2)
×
538
                sctpSessionVips = strset.NewWithSize(len(svcs) * 2)
×
NEW
539

×
NEW
540
                localTCPVips         = strset.New()
×
NEW
541
                localUDPVips         = strset.New()
×
NEW
542
                localSCTPVips        = strset.New()
×
NEW
543
                localTCPSessionVips  = strset.New()
×
NEW
544
                localUDPSessionVips  = strset.New()
×
NEW
545
                localSCTPSessionVips = strset.New()
×
546
        )
×
547

×
548
        for _, svc := range svcs {
×
NEW
549
                tcpVipSet, tcpSessVipSet, udpVipSet, udpSessVipSet, sctpVipSet, sctpSessVipSet := tcpVips, tcpSessionVips, udpVips, udpSessionVips, sctpVips, sctpSessionVips
×
NEW
550
                if svc.Spec.InternalTrafficPolicy != nil && *svc.Spec.InternalTrafficPolicy == corev1.ServiceInternalTrafficPolicyLocal {
×
NEW
551
                        tcpVipSet, tcpSessVipSet, udpVipSet, udpSessVipSet, sctpVipSet, sctpSessVipSet = localTCPVips, localTCPSessionVips, localUDPVips, localUDPSessionVips, localSCTPVips, localSCTPSessionVips
×
NEW
552
                }
×
553

554
                for _, ip := range getVipIps(svc) {
×
555
                        for _, port := range svc.Spec.Ports {
×
556
                                vip := util.JoinHostPort(ip, port.Port)
×
557
                                switch port.Protocol {
×
558
                                case corev1.ProtocolTCP:
×
559
                                        if svc.Spec.SessionAffinity == corev1.ServiceAffinityClientIP {
×
NEW
560
                                                tcpSessVipSet.Add(vip)
×
561
                                        } else {
×
NEW
562
                                                tcpVipSet.Add(vip)
×
563
                                        }
×
564
                                case corev1.ProtocolUDP:
×
565
                                        if svc.Spec.SessionAffinity == corev1.ServiceAffinityClientIP {
×
NEW
566
                                                udpSessVipSet.Add(vip)
×
567
                                        } else {
×
NEW
568
                                                udpVipSet.Add(vip)
×
569
                                        }
×
570
                                case corev1.ProtocolSCTP:
×
571
                                        if svc.Spec.SessionAffinity == corev1.ServiceAffinityClientIP {
×
NEW
572
                                                sctpSessVipSet.Add(vip)
×
573
                                        } else {
×
NEW
574
                                                sctpVipSet.Add(vip)
×
575
                                        }
×
576
                                }
577
                        }
578
                }
579
        }
580

581
        vpcs, err := c.vpcsLister.List(labels.Everything())
×
582
        if err != nil {
×
583
                klog.Errorf("failed to list vpc, %v", err)
×
584
                return err
×
585
        }
×
586

NEW
587
        removeVip := func(lbName string, svcVips *strset.Set) error {
×
588
                if lbName == "" {
×
589
                        return nil
×
590
                }
×
591

NEW
592
                lb, err := c.OVNNbClient.GetLoadBalancer(lbName, true)
×
NEW
593
                if err != nil {
×
594
                        klog.Errorf("get LB %s: %v", lbName, err)
×
595
                        return err
×
596
                }
×
UNCOV
597
                if lb == nil {
×
598
                        klog.Infof("load balancer %q already deleted", lbName)
×
599
                        return nil
×
600
                }
×
601

602
                for vip := range lb.Vips {
×
603
                        if !svcVips.Has(vip) {
×
NEW
604
                                if err = c.OVNNbClient.LoadBalancerDeleteVip(lbName, vip, true); err != nil {
×
605
                                        klog.Errorf("failed to delete vip %s from LB %s: %v", vip, lbName, err)
×
606
                                        return err
×
607
                                }
×
608
                        }
609
                }
610
                return nil
×
611
        }
612

613
        for _, vpc := range vpcs {
×
NEW
614
                lbVipsMap := map[string]*strset.Set{
×
NEW
615
                        vpc.Status.TCPLoadBalancer:              tcpVips,
×
NEW
616
                        vpc.Status.UDPLoadBalancer:              udpVips,
×
NEW
617
                        vpc.Status.SCTPLoadBalancer:             sctpVips,
×
NEW
618
                        vpc.Status.TCPSessionLoadBalancer:       tcpSessionVips,
×
NEW
619
                        vpc.Status.UDPSessionLoadBalancer:       udpSessionVips,
×
NEW
620
                        vpc.Status.SCTPSessionLoadBalancer:      sctpSessionVips,
×
NEW
621
                        vpc.Status.LocalTCPLoadBalancer:         localTCPVips,
×
NEW
622
                        vpc.Status.LocalUDPLoadBalancer:         localUDPVips,
×
NEW
623
                        vpc.Status.LocalSCTPLoadBalancer:        localSCTPVips,
×
NEW
624
                        vpc.Status.LocalTCPSessionLoadBalancer:  localTCPSessionVips,
×
NEW
625
                        vpc.Status.LocalUDPSessionLoadBalancer:  localUDPSessionVips,
×
NEW
626
                        vpc.Status.LocalSCTPSessionLoadBalancer: localSCTPSessionVips,
×
NEW
627
                }
×
NEW
628
                for lb, vips := range lbVipsMap {
×
NEW
629
                        vpcLbs.Add(lb)
×
NEW
630
                        if err = removeVip(lb, vips); err != nil {
×
NEW
631
                                klog.Error(err)
×
NEW
632
                                return err
×
NEW
633
                        }
×
634
                }
635
        }
636

637
        // delete lbs
638
        if err = c.OVNNbClient.DeleteLoadBalancers(
×
639
                func(lb *ovnnb.LoadBalancer) bool {
×
640
                        return !vpcLbs.Has(lb.Name)
×
641
                },
×
642
        ); err != nil {
×
643
                klog.Errorf("delete load balancers: %v", err)
×
644
                return err
×
645
        }
×
646
        return nil
×
647
}
648

649
func (c *Controller) gcAddressSet() error {
×
650
        klog.Infof("start to gc address set")
×
651
        // get all address
×
652
        addressSets, err := c.OVNNbClient.ListAddressSets(nil)
×
653
        if err != nil {
×
654
                klog.Errorf("failed to list address set,%v", err)
×
655
                return err
×
656
        }
×
657

658
        asList := make([]string, 0)
×
659
        for _, as := range addressSets {
×
660
                sg := as.ExternalIDs[sgKey]
×
661
                if sg == "" {
×
662
                        continue
×
663
                }
664
                // if address set not found associated port group, delete it
665
                if pg, err := c.OVNNbClient.GetPortGroup(ovs.GetSgPortGroupName(sg), true); err == nil && pg == nil {
×
666
                        klog.Infof("ready to gc address set %s", as.Name)
×
667
                        asList = append(asList, as.Name)
×
668
                }
×
669
        }
670
        if len(asList) == 0 {
×
671
                return nil
×
672
        }
×
673

674
        if err = c.OVNNbClient.DeleteAddressSet(asList...); err != nil {
×
675
                klog.Errorf("failed to delete address set %v: %v", asList, err)
×
676
                return err
×
677
        }
×
678

679
        return nil
×
680
}
681

682
func (c *Controller) gcSecurityGroup() error {
×
683
        klog.Infof("start to gc security group residual port groups")
×
684
        // get security group
×
685
        sgs, err := c.config.KubeOvnClient.KubeovnV1().SecurityGroups().List(context.Background(), metav1.ListOptions{})
×
686
        if err != nil {
×
687
                klog.Errorf("failed to list security group,%v", err)
×
688
                return err
×
689
        }
×
690
        sgSet := strset.NewWithSize(len(sgs.Items))
×
691
        for _, sg := range sgs.Items {
×
692
                sgSet.Add(sg.Name)
×
693
        }
×
694

695
        pgs, err := c.OVNNbClient.ListPortGroups(nil)
×
696
        if err != nil {
×
697
                klog.Errorf("failed to list port group,%v", err)
×
698
                return err
×
699
        }
×
700

701
        needToDelPgs := make([]string, 0)
×
702
        denyAllPg := ovs.GetSgPortGroupName(util.DenyAllSecurityGroup)
×
703
        defaultPg := ovs.GetSgPortGroupName(util.DefaultSecurityGroupName)
×
704
        for _, pg := range pgs {
×
705
                if pg.Name == denyAllPg || pg.Name == defaultPg || pg.ExternalIDs[networkPolicyKey] != "" {
×
706
                        continue
×
707
                }
708
                // if port group not exist in security group, delete it
709
                if !sgSet.Has(pg.ExternalIDs["sg"]) {
×
710
                        klog.Infof("ready to gc port group %s", pg.Name)
×
711
                        needToDelPgs = append(needToDelPgs, pg.Name)
×
712
                }
×
713
        }
714
        if len(needToDelPgs) == 0 {
×
715
                return nil
×
716
        }
×
717
        if err = c.OVNNbClient.DeletePortGroup(needToDelPgs...); err != nil {
×
718
                klog.Errorf("failed to gc port group list,%v", err)
×
719
                return err
×
720
        }
×
721
        return nil
×
722
}
723

724
func (c *Controller) gcNetworkPolicy() error {
×
725
        klog.Infof("start to gc network policy")
×
726

×
727
        npNames := strset.New()
×
728
        delPgNames := strset.New()
×
729

×
730
        if c.config.EnableNP {
×
731
                nps, err := c.npsLister.List(labels.Everything())
×
732
                if err != nil {
×
733
                        klog.Errorf("failed to list network policy, %v", err)
×
734
                        return err
×
735
                }
×
736

737
                for _, np := range nps {
×
738
                        npName := np.Name
×
739
                        nameArray := []rune(np.Name)
×
740
                        if !unicode.IsLetter(nameArray[0]) {
×
741
                                npName = "np" + np.Name
×
742
                        }
×
743

744
                        npNames.Add(fmt.Sprintf("%s/%s", np.Namespace, npName))
×
745
                }
746
        }
747

748
        // append node port group to npNames to avoid gc node port group
749
        nodes, err := c.nodesLister.List(labels.Everything())
×
750
        if err != nil {
×
751
                klog.Errorf("failed to list nodes, %v", err)
×
752
                return err
×
753
        }
×
754

755
        for _, node := range nodes {
×
756
                npNames.Add(fmt.Sprintf("%s/%s", "node", node.Name))
×
757
        }
×
758

759
        // append overlay subnets port group to npNames to avoid gc distributed subnets port group
760
        subnets, err := c.subnetsLister.List(labels.Everything())
×
761
        if err != nil {
×
762
                klog.Errorf("failed to list subnets %v", err)
×
763
                return err
×
764
        }
×
765
        for _, subnet := range subnets {
×
766
                if subnet.Spec.Vpc != c.config.ClusterRouter || (subnet.Spec.Vlan != "" && !subnet.Spec.LogicalGateway) || subnet.Name == c.config.NodeSwitch || subnet.Spec.GatewayType != kubeovnv1.GWDistributedType {
×
767
                        continue
×
768
                }
769

770
                for _, node := range nodes {
×
771
                        npNames.Add(fmt.Sprintf("%s/%s", subnet.Name, node.Name))
×
772
                }
×
773
        }
774

775
        // list all np port groups which externalIDs[np]!=""
776
        pgs, err := c.OVNNbClient.ListPortGroups(map[string]string{networkPolicyKey: ""})
×
777
        if err != nil {
×
778
                klog.Errorf("list np port group: %v", err)
×
779
                return err
×
780
        }
×
781

782
        for _, pg := range pgs {
×
783
                np := strings.Split(pg.ExternalIDs[networkPolicyKey], "/")
×
784
                if len(np) != 2 {
×
785
                        // not np port group
×
786
                        continue
×
787
                }
788
                if !npNames.Has(pg.ExternalIDs[networkPolicyKey]) {
×
789
                        klog.Infof("gc port group '%s' network policy '%s'", pg.Name, pg.ExternalIDs[networkPolicyKey])
×
790
                        delPgNames.Add(pg.Name)
×
791
                        if c.config.EnableNP {
×
792
                                c.deleteNpQueue.Add(pg.ExternalIDs[networkPolicyKey])
×
793
                        }
×
794
                }
795
        }
796
        // gc port group
797
        // the pgName in the network policy is generated differently from the node/subnet pgName
798
        // so processes port group gc separately
799
        // ensure that the port group can be correctly gc
800
        if err := c.OVNNbClient.DeletePortGroup(delPgNames.List()...); err != nil {
×
801
                klog.Errorf("failed to gc port group %v: %v", delPgNames.List(), err)
×
802
                return err
×
803
        }
×
804

805
        return nil
×
806
}
807

808
func (c *Controller) gcRoutePolicy() error {
×
809
        klog.Infof("start to gc route policy")
×
810

×
811
        policies, err := c.OVNNbClient.ListLogicalRouterPolicies(c.config.ClusterRouter, util.NorthGatewayRoutePolicyPriority, nil, true)
×
812
        if err != nil {
×
813
                klog.Errorf("failed to list route policy, %v", err)
×
814
                return err
×
815
        }
×
816

817
        podIPs := []string{}
×
818
        pods, err := c.podsLister.List(labels.Everything())
×
819
        if err != nil {
×
820
                klog.Errorf("failed to list pods, %v", err)
×
821
                return err
×
822
        }
×
823
        for _, pod := range pods {
×
824
                if pod.Annotations != nil && pod.Annotations[util.NorthGatewayAnnotation] != "" {
×
825
                        podIPs = append(podIPs, strings.Split(pod.Annotations[util.IPAddressAnnotation], ",")...)
×
826
                }
×
827
        }
828

829
        for _, policy := range policies {
×
830
                parts := strings.Split(policy.Match, "==")
×
831
                if len(parts) != 2 {
×
832
                        continue
×
833
                }
834
                srcIP := strings.TrimSpace(parts[1])
×
835
                if !slices.Contains(podIPs, srcIP) {
×
836
                        klog.Infof("gc route policy %s", policy.Match)
×
837
                        if err := c.OVNNbClient.DeleteLogicalRouterPolicy(c.config.ClusterRouter, policy.Priority, policy.Match); err != nil {
×
838
                                klog.Errorf("failed to delete route policy %s: %v", policy.Match, err)
×
839
                                return err
×
840
                        }
×
841
                }
842
        }
843

844
        return nil
×
845
}
846

847
func (c *Controller) gcStaticRoute() error {
×
848
        klog.Infof("start to gc static routes")
×
849
        routes, err := c.OVNNbClient.ListLogicalRouterStaticRoutes(c.config.ClusterRouter, nil, nil, "", nil)
×
850
        if err != nil {
×
851
                klog.Errorf("failed to list static route %v", err)
×
852
                return err
×
853
        }
×
854
        defaultVpc, err := c.vpcsLister.Get(c.config.ClusterRouter)
×
855
        if err != nil {
×
856
                klog.Errorf("failed to get default vpc, %v", err)
×
857
                return err
×
858
        }
×
859
        var keepStaticRoute bool
×
860
        for _, route := range routes {
×
861
                keepStaticRoute = false
×
862
                for _, item := range defaultVpc.Spec.StaticRoutes {
×
863
                        if route.IPPrefix == item.CIDR && route.Nexthop == item.NextHopIP && route.RouteTable == item.RouteTable {
×
864
                                keepStaticRoute = true
×
865
                                break
×
866
                        }
867
                }
868
                if keepStaticRoute {
×
869
                        continue
×
870
                }
871
                if route.IPPrefix != "0.0.0.0/0" && route.IPPrefix != "::/0" && c.ipam.ContainAddress(route.IPPrefix) {
×
872
                        exist, err := c.OVNNbClient.NatExists(c.config.ClusterRouter, "", "", route.IPPrefix)
×
873
                        if err != nil {
×
874
                                klog.Errorf("failed to get NatRule by LogicalIP %s, %v", route.IPPrefix, err)
×
875
                                continue
×
876
                        }
877
                        if exist {
×
878
                                continue
×
879
                        }
880
                        klog.Infof("gc static route %s %v %s %s", route.RouteTable, route.Policy, route.IPPrefix, route.Nexthop)
×
881
                        if err = c.deleteStaticRouteFromVpc(
×
882
                                c.config.ClusterRouter,
×
883
                                route.RouteTable,
×
884
                                route.IPPrefix,
×
885
                                route.Nexthop,
×
886
                                reversePolicy(*route.Policy),
×
887
                        ); err != nil {
×
888
                                klog.Errorf("failed to delete stale route %s %v %s %s: %v", route.RouteTable, route.Policy, route.IPPrefix, route.Nexthop, err)
×
889
                        }
×
890
                }
891
        }
892
        return nil
×
893
}
894

895
func (c *Controller) gcChassis() error {
×
896
        klog.Infof("start to gc chassis")
×
897
        chassises, err := c.OVNSbClient.ListChassis()
×
898
        if err != nil {
×
899
                klog.Errorf("failed to get all chassis, %v", err)
×
900
        }
×
901
        chassisNodes := make(map[string]string, len(*chassises))
×
902
        for _, chassis := range *chassises {
×
903
                chassisNodes[chassis.Name] = chassis.Hostname
×
904
        }
×
905
        nodes, err := c.nodesLister.List(labels.Everything())
×
906
        if err != nil {
×
907
                klog.Errorf("failed to list nodes, %v", err)
×
908
                return err
×
909
        }
×
910
        for _, node := range nodes {
×
911
                chassisName := node.Annotations[util.ChassisAnnotation]
×
912
                if chassisName == "" {
×
913
                        // kube-ovn-cni not ready to set chassis annotation
×
914
                        continue
×
915
                }
916
                if hostname, exist := chassisNodes[chassisName]; exist {
×
917
                        if hostname == node.Name {
×
918
                                // node is alive, matched chassis should be alive
×
919
                                delete(chassisNodes, chassisName)
×
920
                                continue
×
921
                        }
922
                        // maybe node name changed, delete chassis
923
                        klog.Infof("gc node %s chassis %s", node.Name, chassisName)
×
924
                        if err := c.OVNSbClient.DeleteChassis(chassisName); err != nil {
×
925
                                klog.Errorf("failed to delete node %s chassis %s %v", node.Name, chassisName, err)
×
926
                                return err
×
927
                        }
×
928
                }
929
        }
930

931
        for chassisName, hostname := range chassisNodes {
×
932
                klog.Infof("gc node %s chassis %s", hostname, chassisName)
×
933
                if err := c.OVNSbClient.DeleteChassis(chassisName); err != nil {
×
934
                        klog.Errorf("failed to delete node %s chassis %s %v", hostname, chassisName, err)
×
935
                        return err
×
936
                }
×
937
        }
938

939
        return nil
×
940
}
941

942
func (c *Controller) isOVNProvided(providerName string, pod *corev1.Pod) (bool, error) {
×
943
        if ls, ok := pod.Annotations[fmt.Sprintf(util.LogicalSwitchAnnotationTemplate, providerName)]; ok {
×
944
                subnet, err := c.subnetsLister.Get(ls)
×
945
                if err != nil {
×
946
                        klog.Errorf("parse annotation logical switch %s error %v", ls, err)
×
947
                        return false, err
×
948
                }
×
949
                if !isOvnSubnet(subnet) {
×
950
                        return false, nil
×
951
                }
×
952
                return true, nil
×
953
        }
954
        return false, nil
×
955
}
956

957
func (c *Controller) getVMLsps() []string {
×
958
        var vmLsps []string
×
959

×
960
        if !c.config.EnableKeepVMIP {
×
961
                return vmLsps
×
962
        }
×
963

964
        nss, err := c.namespacesLister.List(labels.Everything())
×
965
        if err != nil {
×
966
                klog.Errorf("failed to list namespaces, %v", err)
×
967
                return vmLsps
×
968
        }
×
969

970
        for _, ns := range nss {
×
971
                vms, err := c.config.KubevirtClient.VirtualMachine(ns.Name).List(context.Background(), metav1.ListOptions{})
×
972
                if err != nil {
×
973
                        if !k8serrors.IsNotFound(err) {
×
974
                                klog.Errorf("failed to list vm in namespace %s, %v", ns, err)
×
975
                        }
×
976
                        continue
×
977
                }
978
                for _, vm := range vms.Items {
×
979
                        vmLsp := ovs.PodNameToPortName(vm.Name, ns.Name, util.OvnProvider)
×
980
                        vmLsps = append(vmLsps, vmLsp)
×
981

×
982
                        attachNets, err := nadutils.ParseNetworkAnnotation(vm.Spec.Template.ObjectMeta.Annotations[nadv1.NetworkAttachmentAnnot], vm.Namespace)
×
983
                        if err != nil {
×
984
                                klog.Errorf("failed to get attachment subnet of vm %s, %v", vm.Name, err)
×
985
                                continue
×
986
                        }
987
                        for _, multiNet := range attachNets {
×
988
                                provider := fmt.Sprintf("%s.%s.%s", multiNet.Name, multiNet.Namespace, util.OvnProvider)
×
989
                                vmLsp := ovs.PodNameToPortName(vm.Name, ns.Name, provider)
×
990
                                vmLsps = append(vmLsps, vmLsp)
×
991
                        }
×
992

993
                        for _, network := range vm.Spec.Template.Spec.Networks {
×
994
                                if network.Multus != nil && network.Multus.NetworkName != "" {
×
995
                                        items := strings.Split(network.Multus.NetworkName, "/")
×
996
                                        if len(items) != 2 {
×
997
                                                items = []string{vm.GetNamespace(), items[0]}
×
998
                                        }
×
999
                                        provider := fmt.Sprintf("%s.%s.%s", items[1], items[0], util.OvnProvider)
×
1000
                                        vmLsp := ovs.PodNameToPortName(vm.Name, ns.Name, provider)
×
1001
                                        vmLsps = append(vmLsps, vmLsp)
×
1002
                                }
1003
                        }
1004
                }
1005
        }
1006

1007
        return vmLsps
×
1008
}
1009

1010
func (c *Controller) gcLbSvcPods() error {
×
1011
        klog.Infof("start to gc lb svc pods")
×
1012
        nss, err := c.namespacesLister.List(labels.Everything())
×
1013
        if err != nil {
×
1014
                klog.Errorf("failed to list namespaces, %v", err)
×
1015
                return err
×
1016
        }
×
1017

1018
        for _, ns := range nss {
×
1019
                dps, err := c.config.KubeClient.AppsV1().Deployments(ns.Name).List(context.Background(), metav1.ListOptions{})
×
1020
                if err != nil {
×
1021
                        if !k8serrors.IsNotFound(err) {
×
1022
                                klog.Errorf("failed to list lb svc deployment in namespace %s, %v", ns.Name, err)
×
1023
                        }
×
1024
                        continue
×
1025
                }
1026

1027
                for _, dp := range dps.Items {
×
1028
                        if !strings.HasPrefix(dp.Name, "lb-svc-") {
×
1029
                                continue
×
1030
                        }
1031
                        if _, ok := dp.Spec.Template.Labels["service"]; !ok {
×
1032
                                continue
×
1033
                        }
1034

1035
                        svcName := strings.TrimPrefix(dp.Name, "lb-svc-")
×
1036
                        _, err := c.servicesLister.Services(ns.Name).Get(svcName)
×
1037
                        if err != nil && k8serrors.IsNotFound(err) {
×
1038
                                klog.Infof("gc lb svc deployment %s in ns %s", dp.Name, ns.Name)
×
1039
                                if err := c.config.KubeClient.AppsV1().Deployments(ns.Name).Delete(context.Background(), dp.Name, metav1.DeleteOptions{}); err != nil {
×
1040
                                        if !k8serrors.IsNotFound(err) {
×
1041
                                                klog.Errorf("failed to delete lb svc deployment in namespace %s, %v", ns.Name, err)
×
1042
                                        }
×
1043
                                }
1044
                        }
1045
                }
1046
        }
1047
        return nil
×
1048
}
1049

1050
func (c *Controller) gcVPCDNS() error {
×
1051
        if !c.config.EnableLb {
×
1052
                return nil
×
1053
        }
×
1054

1055
        klog.Infof("start to gc vpc dns")
×
1056
        vds, err := c.vpcDNSLister.List(labels.Everything())
×
1057
        if err != nil {
×
1058
                klog.Errorf("failed to list vpc-dns, %v", err)
×
1059
                return err
×
1060
        }
×
1061

1062
        sel, _ := metav1.LabelSelectorAsSelector(&metav1.LabelSelector{MatchLabels: map[string]string{util.VpcDNSNameLabel: "true"}})
×
1063

×
1064
        deps, err := c.config.KubeClient.AppsV1().Deployments(c.config.PodNamespace).List(context.Background(), metav1.ListOptions{
×
1065
                LabelSelector: sel.String(),
×
1066
        })
×
1067
        if err != nil {
×
1068
                klog.Errorf("failed to list vpc-dns deployment, %s", err)
×
1069
                return err
×
1070
        }
×
1071

1072
        for _, dep := range deps.Items {
×
1073
                canFind := false
×
1074
                for _, vd := range vds {
×
1075
                        name := genVpcDNSDpName(vd.Name)
×
1076
                        if dep.Name == name {
×
1077
                                canFind = true
×
1078
                                break
×
1079
                        }
1080
                }
1081
                if !canFind {
×
1082
                        err := c.config.KubeClient.AppsV1().Deployments(c.config.PodNamespace).Delete(context.Background(),
×
1083
                                dep.Name, metav1.DeleteOptions{})
×
1084
                        if err != nil {
×
1085
                                klog.Errorf("failed to delete vpc-dns deployment, %s", err)
×
1086
                                return err
×
1087
                        }
×
1088
                }
1089
        }
1090

1091
        slrs, err := c.switchLBRuleLister.List(sel)
×
1092
        if err != nil {
×
1093
                klog.Errorf("failed to list vpc-dns SwitchLBRules, %s", err)
×
1094
                return err
×
1095
        }
×
1096

1097
        for _, slr := range slrs {
×
1098
                canFind := false
×
1099
                for _, vd := range vds {
×
1100
                        name := genVpcDNSDpName(vd.Name)
×
1101
                        if slr.Name == name {
×
1102
                                canFind = true
×
1103
                                break
×
1104
                        }
1105
                }
1106
                if !canFind {
×
1107
                        err := c.config.KubeOvnClient.KubeovnV1().SwitchLBRules().Delete(context.Background(),
×
1108
                                slr.Name, metav1.DeleteOptions{})
×
1109
                        if err != nil {
×
1110
                                klog.Errorf("failed to delete vpc-dns SwitchLBRule, %s", err)
×
1111
                                return err
×
1112
                        }
×
1113
                }
1114
        }
1115
        return nil
×
1116
}
1117

1118
func logicalRouterPortFilter(exceptPeerPorts *strset.Set) func(lrp *ovnnb.LogicalRouterPort) bool {
1✔
1119
        return func(lrp *ovnnb.LogicalRouterPort) bool {
2✔
1120
                if exceptPeerPorts.Has(lrp.Name) {
2✔
1121
                        return false // ignore except lrp
1✔
1122
                }
1✔
1123

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