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

kubeovn / kube-ovn / 17228354799

26 Aug 2025 04:55AM UTC coverage: 21.341% (-0.2%) from 21.508%
17228354799

push

github

oilbeater
handle delete final state unknown object in enqueue handler (#5649)

Signed-off-by: Mengxin Liu <liumengxinfly@gmail.com>

0 of 443 new or added lines in 27 files covered. (0.0%)

1 existing line in 1 file now uncovered.

10514 of 49267 relevant lines covered (21.34%)

0.25 hits per line

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

0.0
/pkg/controller/vlan.go
1
package controller
2

3
import (
4
        "context"
5
        "fmt"
6
        "slices"
7

8
        k8serrors "k8s.io/apimachinery/pkg/api/errors"
9
        metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
10
        "k8s.io/apimachinery/pkg/labels"
11
        "k8s.io/client-go/tools/cache"
12
        "k8s.io/klog/v2"
13

14
        kubeovnv1 "github.com/kubeovn/kube-ovn/pkg/apis/kubeovn/v1"
15
        "github.com/kubeovn/kube-ovn/pkg/ovs"
16
        "github.com/kubeovn/kube-ovn/pkg/util"
17
)
18

19
func (c *Controller) enqueueAddVlan(obj any) {
×
20
        key := cache.MetaObjectToName(obj.(*kubeovnv1.Vlan)).String()
×
21
        klog.V(3).Infof("enqueue add vlan %s", key)
×
22
        c.addVlanQueue.Add(key)
×
23
}
×
24

25
func (c *Controller) enqueueUpdateVlan(_, newObj any) {
×
26
        key := cache.MetaObjectToName(newObj.(*kubeovnv1.Vlan)).String()
×
27
        klog.V(3).Infof("enqueue update vlan %s", key)
×
28
        c.updateVlanQueue.Add(key)
×
29
}
×
30

31
func (c *Controller) enqueueDelVlan(obj any) {
×
NEW
32
        var vlan *kubeovnv1.Vlan
×
NEW
33
        switch t := obj.(type) {
×
NEW
34
        case *kubeovnv1.Vlan:
×
NEW
35
                vlan = t
×
NEW
36
        case cache.DeletedFinalStateUnknown:
×
NEW
37
                v, ok := t.Obj.(*kubeovnv1.Vlan)
×
NEW
38
                if !ok {
×
NEW
39
                        klog.Warningf("unexpected object type: %T", t.Obj)
×
NEW
40
                        return
×
NEW
41
                }
×
NEW
42
                vlan = v
×
NEW
43
        default:
×
NEW
44
                klog.Warningf("unexpected type: %T", obj)
×
NEW
45
                return
×
46
        }
47

NEW
48
        key := cache.MetaObjectToName(vlan).String()
×
49
        klog.V(3).Infof("enqueue delete vlan %s", key)
×
50
        c.delVlanQueue.Add(key)
×
51
}
52

53
func (c *Controller) handleAddVlan(key string) error {
×
54
        c.vlanKeyMutex.LockKey(key)
×
55
        defer func() { _ = c.vlanKeyMutex.UnlockKey(key) }()
×
56
        klog.Infof("handle add vlan %s", key)
×
57

×
58
        cachedVlan, err := c.vlansLister.Get(key)
×
59
        if err != nil {
×
60
                if k8serrors.IsNotFound(err) {
×
61
                        return nil
×
62
                }
×
63
                klog.Error(err)
×
64
                return err
×
65
        }
66

67
        vlan := cachedVlan.DeepCopy()
×
68
        if vlan.Spec.Provider == "" {
×
69
                vlan.Spec.Provider = c.config.DefaultProviderName
×
70
                if vlan, err = c.config.KubeOvnClient.KubeovnV1().Vlans().Update(context.Background(), vlan, metav1.UpdateOptions{}); err != nil {
×
71
                        klog.Errorf("failed to update vlan %s, %v", vlan.Name, err)
×
72
                        return err
×
73
                }
×
74
        }
75

76
        subnets, err := c.subnetsLister.List(labels.Everything())
×
77
        if err != nil {
×
78
                klog.Errorf("failed to list subnets: %v", err)
×
79
                return err
×
80
        }
×
81

82
        var needUpdate bool
×
83
        for _, subnet := range subnets {
×
84
                if subnet.Spec.Vlan == vlan.Name && !slices.Contains(vlan.Status.Subnets, subnet.Name) {
×
85
                        vlan.Status.Subnets = append(vlan.Status.Subnets, subnet.Name)
×
86
                        needUpdate = true
×
87
                }
×
88
        }
89

90
        if needUpdate {
×
91
                vlan, err = c.config.KubeOvnClient.KubeovnV1().Vlans().UpdateStatus(context.Background(), vlan, metav1.UpdateOptions{})
×
92
                if err != nil {
×
93
                        klog.Errorf("failed to update status of vlan %s: %v", vlan.Name, err)
×
94
                        return err
×
95
                }
×
96
        }
97

98
        pn, err := c.providerNetworksLister.Get(vlan.Spec.Provider)
×
99
        if err != nil {
×
100
                klog.Errorf("failed to get provider network %s: %v", vlan.Spec.Provider, err)
×
101
                return err
×
102
        }
×
103

104
        if err = c.checkVlanConflict(vlan); err != nil {
×
105
                klog.Errorf("failed to check vlan %s: %v", vlan.Name, err)
×
106
                return err
×
107
        }
×
108

109
        if !slices.Contains(pn.Status.Vlans, vlan.Name) {
×
110
                newPn := pn.DeepCopy()
×
111
                newPn.Status.Vlans = append(newPn.Status.Vlans, vlan.Name)
×
112
                _, err = c.config.KubeOvnClient.KubeovnV1().ProviderNetworks().UpdateStatus(context.Background(), newPn, metav1.UpdateOptions{})
×
113
                if err != nil {
×
114
                        klog.Errorf("failed to update status of provider network %s: %v", pn.Name, err)
×
115
                        return err
×
116
                }
×
117
        }
118

119
        return nil
×
120
}
121

122
func (c *Controller) checkVlanConflict(vlan *kubeovnv1.Vlan) error {
×
123
        if vlan.Spec.ID == 0 {
×
124
                // no conflict if vlan id is 0
×
125
                return nil
×
126
        }
×
127
        // todo: check if vlan conflict in webhook
128
        vlans, err := c.vlansLister.List(labels.Everything())
×
129
        if err != nil {
×
130
                klog.Errorf("failed to list vlans: %v", err)
×
131
                return err
×
132
        }
×
133
        // check if new vlan conflict with old vlan
134
        var conflict bool
×
135
        var conflictErr error
×
136
        for _, v := range vlans {
×
137
                // different provider allow to have same vlan
×
138
                if vlan.Spec.Provider == v.Spec.Provider && vlan.Spec.ID == v.Spec.ID && vlan.Name != v.Name {
×
139
                        conflictErr = fmt.Errorf("provider %s new vlan %s conflict with old vlan %s", vlan.Spec.Provider, vlan.Name, v.Name)
×
140
                        klog.Error(conflictErr)
×
141
                        conflict = true
×
142
                }
×
143
        }
144
        if vlan.Status.Conflict != conflict {
×
145
                vlan.Status.Conflict = conflict
×
146
                vlan, err = c.config.KubeOvnClient.KubeovnV1().Vlans().UpdateStatus(context.Background(), vlan, metav1.UpdateOptions{})
×
147
                if err != nil {
×
148
                        klog.Errorf("failed to update conflict status of vlan %s: %v", vlan.Name, err)
×
149
                        return err
×
150
                }
×
151
        }
152
        return conflictErr
×
153
}
154

155
func (c *Controller) handleUpdateVlan(key string) error {
×
156
        c.vlanKeyMutex.LockKey(key)
×
157
        defer func() { _ = c.vlanKeyMutex.UnlockKey(key) }()
×
158
        klog.Infof("handle update vlan %s", key)
×
159

×
160
        vlan, err := c.vlansLister.Get(key)
×
161
        if err != nil {
×
162
                if k8serrors.IsNotFound(err) {
×
163
                        return nil
×
164
                }
×
165
                klog.Error(err)
×
166
                return err
×
167
        }
168

169
        if vlan.Spec.Provider == "" {
×
170
                newVlan := vlan.DeepCopy()
×
171
                newVlan.Spec.Provider = c.config.DefaultProviderName
×
172
                if vlan, err = c.config.KubeOvnClient.KubeovnV1().Vlans().Update(context.Background(), newVlan, metav1.UpdateOptions{}); err != nil {
×
173
                        klog.Errorf("failed to update vlan %s: %v", vlan.Name, err)
×
174
                        return err
×
175
                }
×
176
        }
177
        newVlan := vlan.DeepCopy()
×
178
        if err = c.checkVlanConflict(newVlan); err != nil {
×
179
                klog.Errorf("failed to check vlan %s: %v", vlan.Name, err)
×
180
                return err
×
181
        }
×
182
        subnets, err := c.subnetsLister.List(labels.Everything())
×
183
        if err != nil {
×
184
                klog.Errorf("failed to list subnets: %v", err)
×
185
                return err
×
186
        }
×
187
        for _, subnet := range subnets {
×
188
                if subnet.Spec.Vlan == vlan.Name {
×
189
                        if err = c.setLocalnetTag(subnet.Name, vlan.Spec.ID); err != nil {
×
190
                                klog.Error(err)
×
191
                                return err
×
192
                        }
×
193
                }
194
        }
195

196
        return nil
×
197
}
198

199
func (c *Controller) handleDelVlan(key string) error {
×
200
        c.vlanKeyMutex.LockKey(key)
×
201
        defer func() { _ = c.vlanKeyMutex.UnlockKey(key) }()
×
202
        klog.Infof("handle delete vlan %s", key)
×
203

×
204
        subnet, err := c.subnetsLister.List(labels.Everything())
×
205
        if err != nil {
×
206
                klog.Errorf("failed to list subnets: %v", err)
×
207
                return err
×
208
        }
×
209

210
        for _, s := range subnet {
×
211
                if s.Spec.Vlan == key {
×
212
                        c.addOrUpdateSubnetQueue.Add(s.Name)
×
213
                }
×
214
        }
215

216
        providerNetworks, err := c.providerNetworksLister.List(labels.Everything())
×
217
        if err != nil && !k8serrors.IsNotFound(err) {
×
218
                klog.Errorf("failed to list provider networks: %v", err)
×
219
                return err
×
220
        }
×
221

222
        for _, pn := range providerNetworks {
×
223
                if err = c.updateProviderNetworkStatusForVlanDeletion(pn, key); err != nil {
×
224
                        klog.Error(err)
×
225
                        return err
×
226
                }
×
227
        }
228

229
        return nil
×
230
}
231

232
func (c *Controller) updateProviderNetworkStatusForVlanDeletion(pn *kubeovnv1.ProviderNetwork, vlan string) error {
×
233
        if !slices.Contains(pn.Status.Vlans, vlan) {
×
234
                return nil
×
235
        }
×
236

237
        newPn := pn.DeepCopy()
×
238
        newPn.Status.Vlans = util.RemoveString(newPn.Status.Vlans, vlan)
×
239
        _, err := c.config.KubeOvnClient.KubeovnV1().ProviderNetworks().UpdateStatus(context.Background(), newPn, metav1.UpdateOptions{})
×
240
        if err != nil {
×
241
                klog.Errorf("failed to update status of provider network %s: %v", pn.Name, err)
×
242
                return err
×
243
        }
×
244
        return nil
×
245
}
246

247
func (c *Controller) setLocalnetTag(subnet string, vlanID int) error {
×
248
        localnetPort := ovs.GetLocalnetName(subnet)
×
249
        if err := c.OVNNbClient.SetLogicalSwitchPortVlanTag(localnetPort, vlanID); err != nil {
×
250
                klog.Errorf("set localnet port %s vlan tag %d: %v", localnetPort, vlanID, err)
×
251
                return err
×
252
        }
×
253

254
        return nil
×
255
}
256

257
func (c *Controller) delLocalnet(subnet string) error {
×
258
        localnetPort := ovs.GetLocalnetName(subnet)
×
259
        if err := c.OVNNbClient.DeleteLogicalSwitchPort(localnetPort); err != nil {
×
260
                klog.Errorf("delete localnet port %s: %v", localnetPort, err)
×
261
                return err
×
262
        }
×
263

264
        return nil
×
265
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc