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

kubeovn / kube-ovn / 17227113524

26 Aug 2025 03:33AM UTC coverage: 21.226% (-0.2%) from 21.39%
17227113524

push

github

web-flow
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.

10589 of 49886 relevant lines covered (21.23%)

0.25 hits per line

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

9.73
/pkg/controller/admin_network_policy.go
1
package controller
2

3
import (
4
        "errors"
5
        "fmt"
6
        "net"
7
        "reflect"
8
        "strings"
9
        "unicode"
10

11
        "github.com/scylladb/go-set/strset"
12
        k8serrors "k8s.io/apimachinery/pkg/api/errors"
13
        metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
14
        "k8s.io/apimachinery/pkg/labels"
15
        "k8s.io/client-go/tools/cache"
16
        "k8s.io/klog/v2"
17
        v1alpha1 "sigs.k8s.io/network-policy-api/apis/v1alpha1"
18

19
        kubeovnv1 "github.com/kubeovn/kube-ovn/pkg/apis/kubeovn/v1"
20
        "github.com/kubeovn/kube-ovn/pkg/ovs"
21
        "github.com/kubeovn/kube-ovn/pkg/ovsdb/ovnnb"
22
        "github.com/kubeovn/kube-ovn/pkg/util"
23
)
24

25
type ChangedField string
26

27
const (
28
        ChangedSubject     ChangedField = "Subject"
29
        ChangedIngressRule ChangedField = "IngressRule"
30
        ChangedEgressRule  ChangedField = "EgressRule"
31
)
32

33
type ChangedName struct {
34
        // the rule name can be omitted default, add isMatch to append check for rule update
35
        isMatch     bool
36
        oldRuleName string
37
        curRuleName string
38
}
39

40
type AdminNetworkPolicyChangedDelta struct {
41
        key       string
42
        ruleNames [util.AnpMaxRules]ChangedName
43
        field     ChangedField
44
}
45

46
func (c *Controller) enqueueAddAnp(obj any) {
×
47
        key := cache.MetaObjectToName(obj.(*v1alpha1.AdminNetworkPolicy)).String()
×
48
        klog.V(3).Infof("enqueue add anp %s", key)
×
49
        c.addAnpQueue.Add(key)
×
50
}
×
51

52
func (c *Controller) enqueueDeleteAnp(obj any) {
×
NEW
53
        var anp *v1alpha1.AdminNetworkPolicy
×
NEW
54
        switch t := obj.(type) {
×
NEW
55
        case *v1alpha1.AdminNetworkPolicy:
×
NEW
56
                anp = t
×
NEW
57
        case cache.DeletedFinalStateUnknown:
×
NEW
58
                a, ok := t.Obj.(*v1alpha1.AdminNetworkPolicy)
×
NEW
59
                if !ok {
×
NEW
60
                        klog.Warningf("unexpected object type: %T", t.Obj)
×
NEW
61
                        return
×
NEW
62
                }
×
NEW
63
                anp = a
×
NEW
64
        default:
×
NEW
65
                klog.Warningf("unexpected type: %T", obj)
×
NEW
66
                return
×
67
        }
68

69
        klog.V(3).Infof("enqueue delete anp %s", cache.MetaObjectToName(anp).String())
×
70
        c.deleteAnpQueue.Add(anp)
×
71
}
72

73
func (c *Controller) enqueueUpdateAnp(oldObj, newObj any) {
×
74
        oldAnpObj := oldObj.(*v1alpha1.AdminNetworkPolicy)
×
75
        newAnpObj := newObj.(*v1alpha1.AdminNetworkPolicy)
×
76

×
77
        // All the acls should be recreated with the following situations
×
78
        if oldAnpObj.Spec.Priority != newAnpObj.Spec.Priority || len(oldAnpObj.Spec.Ingress) != len(newAnpObj.Spec.Ingress) || len(oldAnpObj.Spec.Egress) != len(newAnpObj.Spec.Egress) {
×
79
                c.addAnpQueue.Add(newAnpObj.Name)
×
80
                return
×
81
        }
×
82

83
        // Acls should be updated when action or ports of ingress/egress rule has been changed
84
        for index, rule := range newAnpObj.Spec.Ingress {
×
85
                oldRule := oldAnpObj.Spec.Ingress[index]
×
86
                if oldRule.Action != rule.Action || !reflect.DeepEqual(oldRule.Ports, rule.Ports) {
×
87
                        // It's difficult to distinguish which rule has changed and update acls for that rule, so go through the anp add process to recreate acls.
×
88
                        // If we want to get fine-grained changes over rule, maybe it's a better way to add a new queue to process the change
×
89
                        c.addAnpQueue.Add(newAnpObj.Name)
×
90
                        return
×
91
                }
×
92
        }
93

94
        for index, rule := range newAnpObj.Spec.Egress {
×
95
                oldRule := oldAnpObj.Spec.Egress[index]
×
96
                if oldRule.Action != rule.Action || !reflect.DeepEqual(oldRule.Ports, rule.Ports) {
×
97
                        c.addAnpQueue.Add(newAnpObj.Name)
×
98
                        return
×
99
                }
×
100
        }
101

102
        if oldAnpObj.Annotations[util.ACLActionsLogAnnotation] != newAnpObj.Annotations[util.ACLActionsLogAnnotation] {
×
103
                c.addAnpQueue.Add(newAnpObj.Name)
×
104
                return
×
105
        }
×
106
        klog.V(3).Infof("enqueue update anp %s", newAnpObj.Name)
×
107

×
108
        // The remaining changes do not affect the acls. The port-group or address-set should be updated.
×
109
        // The port-group for anp should be updated
×
110
        if !reflect.DeepEqual(oldAnpObj.Spec.Subject, newAnpObj.Spec.Subject) {
×
111
                c.updateAnpQueue.Add(&AdminNetworkPolicyChangedDelta{key: newAnpObj.Name, field: ChangedSubject})
×
112
        }
×
113

114
        // Rule name or peer selector in ingress/egress rule has changed, the corresponding address-set need be updated
115
        ruleChanged := false
×
116
        var changedIngressRuleNames, changedEgressRuleNames [util.AnpMaxRules]ChangedName
×
117
        for index, rule := range newAnpObj.Spec.Ingress {
×
118
                oldRule := oldAnpObj.Spec.Ingress[index]
×
119
                if oldRule.Name != rule.Name {
×
120
                        changedIngressRuleNames[index] = ChangedName{oldRuleName: oldRule.Name, curRuleName: rule.Name}
×
121
                        ruleChanged = true
×
122
                }
×
123
                if !reflect.DeepEqual(oldRule.From, rule.From) {
×
124
                        changedIngressRuleNames[index] = ChangedName{curRuleName: rule.Name}
×
125
                        ruleChanged = true
×
126
                }
×
127
        }
128
        if ruleChanged {
×
129
                c.updateAnpQueue.Add(&AdminNetworkPolicyChangedDelta{key: newAnpObj.Name, ruleNames: changedIngressRuleNames, field: ChangedIngressRule})
×
130
        }
×
131

132
        ruleChanged = false
×
133
        for index, rule := range newAnpObj.Spec.Egress {
×
134
                oldRule := oldAnpObj.Spec.Egress[index]
×
135
                if oldRule.Name != rule.Name {
×
136
                        changedEgressRuleNames[index] = ChangedName{oldRuleName: oldRule.Name, curRuleName: rule.Name}
×
137
                        ruleChanged = true
×
138
                }
×
139
                if !reflect.DeepEqual(oldRule.To, rule.To) {
×
140
                        changedEgressRuleNames[index] = ChangedName{curRuleName: rule.Name}
×
141
                        ruleChanged = true
×
142
                }
×
143
        }
144
        if ruleChanged {
×
145
                c.updateAnpQueue.Add(&AdminNetworkPolicyChangedDelta{key: newAnpObj.Name, ruleNames: changedEgressRuleNames, field: ChangedEgressRule})
×
146
        }
×
147
}
148

149
func (c *Controller) handleAddAnp(key string) (err error) {
×
150
        c.anpKeyMutex.LockKey(key)
×
151
        defer func() { _ = c.anpKeyMutex.UnlockKey(key) }()
×
152

153
        cachedAnp, err := c.anpsLister.Get(key)
×
154
        if err != nil {
×
155
                if k8serrors.IsNotFound(err) {
×
156
                        return nil
×
157
                }
×
158
                klog.Error(err)
×
159
                return err
×
160
        }
161
        klog.Infof("handle add anp %s", cachedAnp.Name)
×
162
        anp := cachedAnp.DeepCopy()
×
163

×
164
        if err := c.validateAnpConfig(anp); err != nil {
×
165
                klog.Errorf("failed to validate anp %s: %v", anp.Name, err)
×
166
                return err
×
167
        }
×
168
        if priority, exist := c.anpNamePrioMap[anp.Name]; exist && priority != anp.Spec.Priority {
×
169
                // anp spec's priority has been changed
×
170
                delete(c.anpPrioNameMap, priority)
×
171
        }
×
172
        // record new created anp after validation
173
        c.anpPrioNameMap[anp.Spec.Priority] = anp.Name
×
174
        c.anpNamePrioMap[anp.Name] = anp.Spec.Priority
×
175

×
176
        anpName := getAnpName(anp.Name)
×
177
        var logActions []string
×
178
        if anp.Annotations[util.ACLActionsLogAnnotation] != "" {
×
179
                logActions = strings.Split(anp.Annotations[util.ACLActionsLogAnnotation], ",")
×
180
        }
×
181

182
        // ovn portGroup/addressSet doesn't support name with '-', so we replace '-' by '.'.
183
        // This may cause conflict if two anp with name test-anp and test.anp, maybe hash is a better solution, but we do not want to lost the readability now.
184
        // Make sure all create operations are reentrant.
185
        pgName := strings.ReplaceAll(anpName, "-", ".")
×
186
        if err = c.OVNNbClient.CreatePortGroup(pgName, map[string]string{adminNetworkPolicyKey: anpName}); err != nil {
×
187
                klog.Errorf("failed to create port group for anp %s: %v", key, err)
×
188
                return err
×
189
        }
×
190

191
        ports, err := c.fetchSelectedPods(&anp.Spec.Subject)
×
192
        if err != nil {
×
193
                klog.Errorf("failed to fetch ports belongs to anp %s: %v", key, err)
×
194
                return err
×
195
        }
×
196

197
        if err = c.OVNNbClient.PortGroupSetPorts(pgName, ports); err != nil {
×
198
                klog.Errorf("failed to set ports %v to port group %s: %v", ports, pgName, err)
×
199
                return err
×
200
        }
×
201

202
        ingressACLOps, err := c.OVNNbClient.DeleteAclsOps(pgName, portGroupKey, "to-lport", nil)
×
203
        if err != nil {
×
204
                klog.Errorf("failed to generate clear operations for anp %s ingress acls: %v", key, err)
×
205
                return err
×
206
        }
×
207

208
        curIngressAddrSet, curEgressAddrSet, err := c.getCurrentAddrSetByName(anpName, false)
×
209
        if err != nil {
×
210
                klog.Errorf("failed to list address sets for anp %s: %v", key, err)
×
211
                return err
×
212
        }
×
213
        desiredIngressAddrSet := strset.NewWithSize(len(anp.Spec.Ingress) * 2)
×
214
        desiredEgressAddrSet := strset.NewWithSize(len(anp.Spec.Egress) * 2)
×
215

×
216
        // create ingress acl
×
217
        for index, anpr := range anp.Spec.Ingress {
×
218
                // A single address set must contain addresses of the same type and the name must be unique within table, so IPv4 and IPv6 address set should be different
×
219
                ingressAsV4Name, ingressAsV6Name := getAnpAddressSetName(pgName, anpr.Name, index, true)
×
220
                desiredIngressAddrSet.Add(ingressAsV4Name, ingressAsV6Name)
×
221

×
222
                var v4Addrs, v4Addr, v6Addrs, v6Addr []string
×
223
                // This field must be defined and contain at least one item.
×
224
                for _, anprpeer := range anpr.From {
×
225
                        if v4Addr, v6Addr, err = c.fetchIngressSelectedAddresses(&anprpeer); err != nil {
×
226
                                klog.Errorf("failed to fetch admin network policy selected addresses, %v", err)
×
227
                                return err
×
228
                        }
×
229
                        v4Addrs = append(v4Addrs, v4Addr...)
×
230
                        v6Addrs = append(v6Addrs, v6Addr...)
×
231
                }
232
                klog.Infof("anp %s, ingress rule %s, selected v4 address %v, v6 address %v", anpName, anpr.Name, v4Addrs, v6Addrs)
×
233

×
234
                if err = c.createAsForAnpRule(anpName, anpr.Name, "ingress", ingressAsV4Name, v4Addrs, false); err != nil {
×
235
                        klog.Error(err)
×
236
                        return err
×
237
                }
×
238
                if err = c.createAsForAnpRule(anpName, anpr.Name, "ingress", ingressAsV6Name, v6Addrs, false); err != nil {
×
239
                        klog.Error(err)
×
240
                        return err
×
241
                }
×
242

243
                aclPriority := util.AnpACLMaxPriority - int(anp.Spec.Priority*100) - index
×
244
                aclAction := anpACLAction(anpr.Action)
×
245
                rulePorts := []v1alpha1.AdminNetworkPolicyPort{}
×
246
                if anpr.Ports != nil {
×
247
                        rulePorts = *anpr.Ports
×
248
                }
×
249

250
                if len(v4Addrs) != 0 {
×
251
                        aclName := fmt.Sprintf("anp/%s/ingress/%s/%d", anpName, kubeovnv1.ProtocolIPv4, index)
×
252
                        ops, err := c.OVNNbClient.UpdateAnpRuleACLOps(pgName, ingressAsV4Name, kubeovnv1.ProtocolIPv4, aclName, aclPriority, aclAction, logActions, rulePorts, true, false)
×
253
                        if err != nil {
×
254
                                klog.Errorf("failed to add v4 ingress acls for anp %s: %v", key, err)
×
255
                                return err
×
256
                        }
×
257
                        ingressACLOps = append(ingressACLOps, ops...)
×
258
                }
259

260
                if len(v6Addrs) != 0 {
×
261
                        aclName := fmt.Sprintf("anp/%s/ingress/%s/%d", anpName, kubeovnv1.ProtocolIPv6, index)
×
262
                        ops, err := c.OVNNbClient.UpdateAnpRuleACLOps(pgName, ingressAsV6Name, kubeovnv1.ProtocolIPv6, aclName, aclPriority, aclAction, logActions, rulePorts, true, false)
×
263
                        if err != nil {
×
264
                                klog.Errorf("failed to add v6 ingress acls for anp %s: %v", key, err)
×
265
                                return err
×
266
                        }
×
267
                        ingressACLOps = append(ingressACLOps, ops...)
×
268
                }
269
        }
270

271
        if err := c.OVNNbClient.Transact("add-ingress-acls", ingressACLOps); err != nil {
×
272
                return fmt.Errorf("failed to add ingress acls for anp %s: %w", key, err)
×
273
        }
×
274
        if err := c.deleteUnusedAddrSetForAnp(curIngressAddrSet, desiredIngressAddrSet); err != nil {
×
275
                return fmt.Errorf("failed to delete unused ingress address set for anp %s: %w", key, err)
×
276
        }
×
277

278
        egressACLOps, err := c.OVNNbClient.DeleteAclsOps(pgName, portGroupKey, "from-lport", nil)
×
279
        if err != nil {
×
280
                klog.Errorf("failed to generate clear operations for anp %s egress acls: %v", key, err)
×
281
                return err
×
282
        }
×
283
        // create egress acl
284
        for index, anpr := range anp.Spec.Egress {
×
285
                // A single address set must contain addresses of the same type and the name must be unique within table, so IPv4 and IPv6 address set should be different
×
286
                egressAsV4Name, egressAsV6Name := getAnpAddressSetName(pgName, anpr.Name, index, false)
×
287
                desiredEgressAddrSet.Add(egressAsV4Name, egressAsV6Name)
×
288

×
289
                var v4Addrs, v4Addr, v6Addrs, v6Addr []string
×
290
                // This field must be defined and contain at least one item.
×
291
                for _, anprpeer := range anpr.To {
×
292
                        if v4Addr, v6Addr, err = c.fetchEgressSelectedAddresses(&anprpeer); err != nil {
×
293
                                klog.Errorf("failed to fetch admin network policy selected addresses, %v", err)
×
294
                                return err
×
295
                        }
×
296
                        v4Addrs = append(v4Addrs, v4Addr...)
×
297
                        v6Addrs = append(v6Addrs, v6Addr...)
×
298
                }
299
                klog.Infof("anp %s, egress rule %s, selected v4 address %v, v6 address %v", anpName, anpr.Name, v4Addrs, v6Addrs)
×
300

×
301
                if err = c.createAsForAnpRule(anpName, anpr.Name, "egress", egressAsV4Name, v4Addrs, false); err != nil {
×
302
                        klog.Error(err)
×
303
                        return err
×
304
                }
×
305
                if err = c.createAsForAnpRule(anpName, anpr.Name, "egress", egressAsV6Name, v6Addrs, false); err != nil {
×
306
                        klog.Error(err)
×
307
                        return err
×
308
                }
×
309

310
                aclPriority := util.AnpACLMaxPriority - int(anp.Spec.Priority*100) - index
×
311
                aclAction := anpACLAction(anpr.Action)
×
312
                rulePorts := []v1alpha1.AdminNetworkPolicyPort{}
×
313
                if anpr.Ports != nil {
×
314
                        rulePorts = *anpr.Ports
×
315
                }
×
316

317
                if len(v4Addrs) != 0 {
×
318
                        aclName := fmt.Sprintf("anp/%s/egress/%s/%d", anpName, kubeovnv1.ProtocolIPv4, index)
×
319
                        ops, err := c.OVNNbClient.UpdateAnpRuleACLOps(pgName, egressAsV4Name, kubeovnv1.ProtocolIPv4, aclName, aclPriority, aclAction, logActions, rulePorts, false, false)
×
320
                        if err != nil {
×
321
                                klog.Errorf("failed to add v4 egress acls for anp %s: %v", key, err)
×
322
                                return err
×
323
                        }
×
324
                        egressACLOps = append(egressACLOps, ops...)
×
325
                }
326

327
                if len(v6Addrs) != 0 {
×
328
                        aclName := fmt.Sprintf("anp/%s/egress/%s/%d", anpName, kubeovnv1.ProtocolIPv6, index)
×
329
                        ops, err := c.OVNNbClient.UpdateAnpRuleACLOps(pgName, egressAsV6Name, kubeovnv1.ProtocolIPv6, aclName, aclPriority, aclAction, logActions, rulePorts, false, false)
×
330
                        if err != nil {
×
331
                                klog.Errorf("failed to add v6 egress acls for anp %s: %v", key, err)
×
332
                                return err
×
333
                        }
×
334
                        egressACLOps = append(egressACLOps, ops...)
×
335
                }
336
        }
337

338
        if err := c.OVNNbClient.Transact("add-egress-acls", egressACLOps); err != nil {
×
339
                return fmt.Errorf("failed to add egress acls for anp %s: %w", key, err)
×
340
        }
×
341
        if err := c.deleteUnusedAddrSetForAnp(curEgressAddrSet, desiredEgressAddrSet); err != nil {
×
342
                return fmt.Errorf("failed to delete unused egress address set for anp %s: %w", key, err)
×
343
        }
×
344

345
        return nil
×
346
}
347

348
func (c *Controller) handleDeleteAnp(anp *v1alpha1.AdminNetworkPolicy) error {
×
349
        c.anpKeyMutex.LockKey(anp.Name)
×
350
        defer func() { _ = c.anpKeyMutex.UnlockKey(anp.Name) }()
×
351

352
        klog.Infof("handle delete admin network policy %s", anp.Name)
×
353
        delete(c.anpPrioNameMap, anp.Spec.Priority)
×
354
        delete(c.anpNamePrioMap, anp.Name)
×
355

×
356
        anpName := getAnpName(anp.Name)
×
357

×
358
        // ACLs releated to port_group will be deleted automatically when port_group is deleted
×
359
        pgName := strings.ReplaceAll(anpName, "-", ".")
×
360
        if err := c.OVNNbClient.DeletePortGroup(pgName); err != nil {
×
361
                klog.Errorf("failed to delete port group for anp %s: %v", anpName, err)
×
362
        }
×
363

364
        if err := c.OVNNbClient.DeleteAddressSets(map[string]string{
×
365
                adminNetworkPolicyKey: fmt.Sprintf("%s/%s", anpName, "ingress"),
×
366
        }); err != nil {
×
367
                klog.Errorf("failed to delete ingress address set for anp %s: %v", anpName, err)
×
368
                return err
×
369
        }
×
370

371
        if err := c.OVNNbClient.DeleteAddressSets(map[string]string{
×
372
                adminNetworkPolicyKey: fmt.Sprintf("%s/%s", anpName, "egress"),
×
373
        }); err != nil {
×
374
                klog.Errorf("failed to delete egress address set for anp %s: %v", anpName, err)
×
375
                return err
×
376
        }
×
377

378
        return nil
×
379
}
380

381
func (c *Controller) handleUpdateAnp(changed *AdminNetworkPolicyChangedDelta) error {
×
382
        // Only handle updates that do not affect acls.
×
383
        c.anpKeyMutex.LockKey(changed.key)
×
384
        defer func() { _ = c.anpKeyMutex.UnlockKey(changed.key) }()
×
385

386
        cachedAnp, err := c.anpsLister.Get(changed.key)
×
387
        if err != nil {
×
388
                if k8serrors.IsNotFound(err) {
×
389
                        return nil
×
390
                }
×
391
                klog.Error(err)
×
392
                return err
×
393
        }
394
        desiredAnp := cachedAnp.DeepCopy()
×
395
        klog.Infof("handle update admin network policy %s", desiredAnp.Name)
×
396

×
397
        anpName := getAnpName(desiredAnp.Name)
×
398
        pgName := strings.ReplaceAll(anpName, "-", ".")
×
399

×
400
        // The port-group for anp should be updated
×
401
        if changed.field == ChangedSubject {
×
402
                // The port-group must exist when update anp, this check should never be matched.
×
403
                if ok, err := c.OVNNbClient.PortGroupExists(pgName); !ok || err != nil {
×
404
                        klog.Errorf("port-group for anp %s does not exist when update anp", desiredAnp.Name)
×
405
                        return err
×
406
                }
×
407

408
                ports, err := c.fetchSelectedPods(&desiredAnp.Spec.Subject)
×
409
                if err != nil {
×
410
                        klog.Errorf("failed to fetch ports belongs to anp %s: %v", desiredAnp.Name, err)
×
411
                        return err
×
412
                }
×
413

414
                if err = c.OVNNbClient.PortGroupSetPorts(pgName, ports); err != nil {
×
415
                        klog.Errorf("failed to set ports %v to port group %s: %v", ports, pgName, err)
×
416
                        return err
×
417
                }
×
418
        }
419

420
        // Peer selector in ingress/egress rule has changed, so the corresponding address-set need be updated
421
        if changed.field == ChangedIngressRule {
×
422
                for index, rule := range desiredAnp.Spec.Ingress {
×
423
                        // Make sure the rule is changed and go on update
×
424
                        if rule.Name == changed.ruleNames[index].curRuleName || changed.ruleNames[index].isMatch {
×
425
                                if err := c.setAddrSetForAnpRule(anpName, pgName, rule.Name, index, rule.From, []v1alpha1.AdminNetworkPolicyEgressPeer{}, true, false); err != nil {
×
426
                                        klog.Errorf("failed to set ingress address-set for anp rule %s/%s, %v", anpName, rule.Name, err)
×
427
                                        return err
×
428
                                }
×
429

430
                                if changed.ruleNames[index].oldRuleName != "" {
×
431
                                        oldRuleName := changed.ruleNames[index].oldRuleName
×
432
                                        // Normally the name can not be changed, but when the name really changes, the old address set should be deleted
×
433
                                        // There is no description in the Name comments that it cannot be changed
×
434
                                        oldAsV4Name, oldAsV6Name := getAnpAddressSetName(pgName, oldRuleName, index, true)
×
435

×
436
                                        if err := c.OVNNbClient.DeleteAddressSet(oldAsV4Name); err != nil {
×
437
                                                klog.Errorf("failed to delete address set %s, %v", oldAsV4Name, err)
×
438
                                                // just record error log
×
439
                                        }
×
440
                                        if err := c.OVNNbClient.DeleteAddressSet(oldAsV6Name); err != nil {
×
441
                                                klog.Errorf("failed to delete address set %s, %v", oldAsV6Name, err)
×
442
                                        }
×
443
                                }
444
                        }
445
                }
446
        }
447

448
        if changed.field == ChangedEgressRule {
×
449
                for index, rule := range desiredAnp.Spec.Egress {
×
450
                        // Make sure the rule is changed and go on update
×
451
                        if rule.Name == changed.ruleNames[index].curRuleName || changed.ruleNames[index].isMatch {
×
452
                                if err := c.setAddrSetForAnpRule(anpName, pgName, rule.Name, index, []v1alpha1.AdminNetworkPolicyIngressPeer{}, rule.To, false, false); err != nil {
×
453
                                        klog.Errorf("failed to set egress address-set for anp rule %s/%s, %v", anpName, rule.Name, err)
×
454
                                        return err
×
455
                                }
×
456

457
                                if changed.ruleNames[index].oldRuleName != "" {
×
458
                                        oldRuleName := changed.ruleNames[index].oldRuleName
×
459
                                        // Normally the name can not be changed, but when the name really changes, the old address set should be deleted
×
460
                                        // There is no description in the Name comments that it cannot be changed
×
461
                                        oldAsV4Name, oldAsV6Name := getAnpAddressSetName(pgName, oldRuleName, index, false)
×
462

×
463
                                        if err := c.OVNNbClient.DeleteAddressSet(oldAsV4Name); err != nil {
×
464
                                                klog.Errorf("failed to delete address set %s, %v", oldAsV4Name, err)
×
465
                                                // just record error log
×
466
                                        }
×
467
                                        if err := c.OVNNbClient.DeleteAddressSet(oldAsV6Name); err != nil {
×
468
                                                klog.Errorf("failed to delete address set %s, %v", oldAsV6Name, err)
×
469
                                        }
×
470
                                }
471
                        }
472
                }
473
        }
474

475
        return nil
×
476
}
477

478
func (c *Controller) validateAnpConfig(anp *v1alpha1.AdminNetworkPolicy) error {
1✔
479
        // The behavior is undefined if two ANP objects have same priority.
1✔
480
        if anpName, exist := c.anpPrioNameMap[anp.Spec.Priority]; exist && anpName != anp.Name {
2✔
481
                err := fmt.Errorf("can not create anp with same priority %d, exist one is %s, new created is %s", anp.Spec.Priority, anpName, anp.Name)
1✔
482
                klog.Error(err)
1✔
483
                return err
1✔
484
        }
1✔
485

486
        // We have noticed redhat's discussion about ACL priority in https://bugzilla.redhat.com/show_bug.cgi?id=2175752
487
        // After discussion, we decided to use the same range of priorities(20000-30000). Pay tribute to the developers of redhat.
488
        if anp.Spec.Priority > util.AnpMaxPriority {
2✔
489
                err := fmt.Errorf("the priority of anp %s is greater than max value %d", anp.Name, util.AnpMaxPriority)
1✔
490
                klog.Error(err)
1✔
491
                return err
1✔
492
        }
1✔
493

494
        if len(anp.Spec.Ingress) > util.AnpMaxRules || len(anp.Spec.Egress) > util.AnpMaxRules {
1✔
495
                err := fmt.Errorf("at most %d rules can be create in anp ingress/egress, ingress rules num %d and egress rules num %d in anp %s", util.AnpMaxRules, len(anp.Spec.Ingress), len(anp.Spec.Egress), anp.Name)
×
496
                klog.Error(err)
×
497
                return err
×
498
        }
×
499

500
        return nil
1✔
501
}
502

503
func (c *Controller) fetchSelectedPods(anpSubject *v1alpha1.AdminNetworkPolicySubject) ([]string, error) {
×
504
        var ports []string
×
505

×
506
        // Exactly one field must be set.
×
507
        if anpSubject.Namespaces != nil {
×
508
                nsSelector, err := metav1.LabelSelectorAsSelector(anpSubject.Namespaces)
×
509
                if err != nil {
×
510
                        return nil, fmt.Errorf("error creating ns label selector, %w", err)
×
511
                }
×
512

513
                ports, _, _, err = c.fetchPods(nsSelector, labels.Everything())
×
514
                if err != nil {
×
515
                        return nil, fmt.Errorf("failed to fetch pods, %w", err)
×
516
                }
×
517
        } else if anpSubject.Pods != nil {
×
518
                nsSelector, err := metav1.LabelSelectorAsSelector(&anpSubject.Pods.NamespaceSelector)
×
519
                if err != nil {
×
520
                        return nil, fmt.Errorf("error creating ns label selector, %w", err)
×
521
                }
×
522
                podSelector, err := metav1.LabelSelectorAsSelector(&anpSubject.Pods.PodSelector)
×
523
                if err != nil {
×
524
                        return nil, fmt.Errorf("error creating pod label selector, %w", err)
×
525
                }
×
526

527
                ports, _, _, err = c.fetchPods(nsSelector, podSelector)
×
528
                if err != nil {
×
529
                        return nil, fmt.Errorf("failed to fetch pods, %w", err)
×
530
                }
×
531
        }
532
        klog.Infof("get selected ports for subject, %v", ports)
×
533
        return ports, nil
×
534
}
535

536
func (c *Controller) fetchPods(nsSelector, podSelector labels.Selector) ([]string, []string, []string, error) {
×
537
        ports := make([]string, 0, util.AnpMaxRules)
×
538
        v4Addresses := make([]string, 0, util.AnpMaxRules)
×
539
        v6Addresses := make([]string, 0, util.AnpMaxRules)
×
540

×
541
        namespaces, err := c.namespacesLister.List(nsSelector)
×
542
        if err != nil {
×
543
                klog.Errorf("failed to list namespaces: %v", err)
×
544
                return nil, nil, nil, err
×
545
        }
×
546

547
        klog.V(3).Infof("fetch pod ports/addresses, namespace selector is %s, pod selector is %s", nsSelector.String(), podSelector.String())
×
548
        for _, namespace := range namespaces {
×
549
                pods, err := c.podsLister.Pods(namespace.Name).List(podSelector)
×
550
                if err != nil {
×
551
                        return nil, nil, nil, fmt.Errorf("failed to list pods, %w", err)
×
552
                }
×
553

554
                for _, pod := range pods {
×
555
                        if pod.Spec.HostNetwork {
×
556
                                continue
×
557
                        }
558
                        podName := c.getNameByPod(pod)
×
559

×
560
                        podNets, err := c.getPodKubeovnNets(pod)
×
561
                        if err != nil {
×
562
                                return nil, nil, nil, fmt.Errorf("failed to get pod networks, %w", err)
×
563
                        }
×
564

565
                        for _, podNet := range podNets {
×
566
                                if !isOvnSubnet(podNet.Subnet) {
×
567
                                        continue
×
568
                                }
569

570
                                if pod.Annotations[fmt.Sprintf(util.AllocatedAnnotationTemplate, podNet.ProviderName)] == "true" {
×
571
                                        ports = append(ports, ovs.PodNameToPortName(podName, pod.Namespace, podNet.ProviderName))
×
572

×
573
                                        podIPAnnotation := pod.Annotations[fmt.Sprintf(util.IPAddressAnnotationTemplate, podNet.ProviderName)]
×
574
                                        podIPs := strings.SplitSeq(podIPAnnotation, ",")
×
575
                                        for podIP := range podIPs {
×
576
                                                switch util.CheckProtocol(podIP) {
×
577
                                                case kubeovnv1.ProtocolIPv4:
×
578
                                                        v4Addresses = append(v4Addresses, podIP)
×
579
                                                case kubeovnv1.ProtocolIPv6:
×
580
                                                        v6Addresses = append(v6Addresses, podIP)
×
581
                                                }
582
                                        }
583
                                }
584
                        }
585
                }
586
        }
587

588
        return ports, v4Addresses, v6Addresses, nil
×
589
}
590

591
func (c *Controller) fetchIngressSelectedAddresses(ingressPeer *v1alpha1.AdminNetworkPolicyIngressPeer) ([]string, []string, error) {
×
592
        var v4Addresses, v6Addresses []string
×
593

×
594
        // Exactly one of the selector pointers must be set for a given peer.
×
595
        if ingressPeer.Namespaces != nil {
×
596
                nsSelector, err := metav1.LabelSelectorAsSelector(ingressPeer.Namespaces)
×
597
                if err != nil {
×
598
                        return nil, nil, fmt.Errorf("error creating ns label selector, %w", err)
×
599
                }
×
600

601
                _, v4Addresses, v6Addresses, err = c.fetchPods(nsSelector, labels.Everything())
×
602
                if err != nil {
×
603
                        return nil, nil, fmt.Errorf("failed to fetch ingress peer addresses, %w", err)
×
604
                }
×
605
        } else if ingressPeer.Pods != nil {
×
606
                nsSelector, err := metav1.LabelSelectorAsSelector(&ingressPeer.Pods.NamespaceSelector)
×
607
                if err != nil {
×
608
                        return nil, nil, fmt.Errorf("error creating ns label selector, %w", err)
×
609
                }
×
610
                podSelector, err := metav1.LabelSelectorAsSelector(&ingressPeer.Pods.PodSelector)
×
611
                if err != nil {
×
612
                        return nil, nil, fmt.Errorf("error creating pod label selector, %w", err)
×
613
                }
×
614

615
                _, v4Addresses, v6Addresses, err = c.fetchPods(nsSelector, podSelector)
×
616
                if err != nil {
×
617
                        return nil, nil, fmt.Errorf("failed to fetch ingress peer addresses, %w", err)
×
618
                }
×
619
        }
620

621
        return v4Addresses, v6Addresses, nil
×
622
}
623

624
func (c *Controller) fetchEgressSelectedAddresses(egressPeer *v1alpha1.AdminNetworkPolicyEgressPeer) ([]string, []string, error) {
×
625
        var v4Addresses, v6Addresses []string
×
626

×
627
        // Exactly one of the selector pointers must be set for a given peer.
×
628
        switch {
×
629
        case egressPeer.Namespaces != nil:
×
630
                nsSelector, err := metav1.LabelSelectorAsSelector(egressPeer.Namespaces)
×
631
                if err != nil {
×
632
                        return nil, nil, fmt.Errorf("error creating ns label selector, %w", err)
×
633
                }
×
634

635
                _, v4Addresses, v6Addresses, err = c.fetchPods(nsSelector, labels.Everything())
×
636
                if err != nil {
×
637
                        return nil, nil, fmt.Errorf("failed to fetch egress peer addresses, %w", err)
×
638
                }
×
639
        case egressPeer.Pods != nil:
×
640
                nsSelector, err := metav1.LabelSelectorAsSelector(&egressPeer.Pods.NamespaceSelector)
×
641
                if err != nil {
×
642
                        return nil, nil, fmt.Errorf("error creating ns label selector, %w", err)
×
643
                }
×
644
                podSelector, err := metav1.LabelSelectorAsSelector(&egressPeer.Pods.PodSelector)
×
645
                if err != nil {
×
646
                        return nil, nil, fmt.Errorf("error creating pod label selector, %w", err)
×
647
                }
×
648

649
                _, v4Addresses, v6Addresses, err = c.fetchPods(nsSelector, podSelector)
×
650
                if err != nil {
×
651
                        return nil, nil, fmt.Errorf("failed to fetch egress peer addresses, %w", err)
×
652
                }
×
653
        case egressPeer.Nodes != nil:
×
654
                nodesSelector, err := metav1.LabelSelectorAsSelector(egressPeer.Nodes)
×
655
                if err != nil {
×
656
                        return nil, nil, fmt.Errorf("error creating nodes label selector, %w", err)
×
657
                }
×
658
                v4Addresses, v6Addresses, err = c.fetchNodesAddrs(nodesSelector)
×
659
                if err != nil {
×
660
                        return nil, nil, fmt.Errorf("failed to fetch egress peer addresses, %w", err)
×
661
                }
×
662
        case len(egressPeer.Networks) != 0:
×
663
                v4Addresses, v6Addresses = fetchCIDRAddrs(egressPeer.Networks)
×
664
        default:
×
665
                return nil, nil, errors.New("at least one egressPeer must be specified")
×
666
        }
667

668
        return v4Addresses, v6Addresses, nil
×
669
}
670

671
func (c *Controller) createAsForAnpRule(anpName, ruleName, direction, asName string, addresses []string, isBanp bool) error {
×
672
        var err error
×
673
        if isBanp {
×
674
                err = c.OVNNbClient.CreateAddressSet(asName, map[string]string{
×
675
                        baselineAdminNetworkPolicyKey: fmt.Sprintf("%s/%s", anpName, direction),
×
676
                })
×
677
        } else {
×
678
                err = c.OVNNbClient.CreateAddressSet(asName, map[string]string{
×
679
                        adminNetworkPolicyKey: fmt.Sprintf("%s/%s", anpName, direction),
×
680
                })
×
681
        }
×
682
        if err != nil {
×
683
                klog.Errorf("failed to create ovn address set %s for anp/banp rule %s/%s: %v", asName, anpName, ruleName, err)
×
684
                return err
×
685
        }
×
686

687
        if err := c.OVNNbClient.AddressSetUpdateAddress(asName, addresses...); err != nil {
×
688
                klog.Errorf("failed to set addresses %q to address set %s: %v", strings.Join(addresses, ","), asName, err)
×
689
                return err
×
690
        }
×
691

692
        return nil
×
693
}
694

695
func (c *Controller) getCurrentAddrSetByName(anpName string, isBanp bool) (*strset.Set, *strset.Set, error) {
×
696
        curIngressAddrSet := strset.New()
×
697
        curEgressAddrSet := strset.New()
×
698
        var ass []ovnnb.AddressSet
×
699
        var err error
×
700

×
701
        // anp and banp can use same name, so depends on the external_ids key field to distinguish
×
702
        if isBanp {
×
703
                ass, err = c.OVNNbClient.ListAddressSets(map[string]string{
×
704
                        baselineAdminNetworkPolicyKey: fmt.Sprintf("%s/%s", anpName, "ingress"),
×
705
                })
×
706
        } else {
×
707
                ass, err = c.OVNNbClient.ListAddressSets(map[string]string{
×
708
                        adminNetworkPolicyKey: fmt.Sprintf("%s/%s", anpName, "ingress"),
×
709
                })
×
710
        }
×
711
        if err != nil {
×
712
                klog.Errorf("failed to list ingress address sets for anp/banp %s: %v", anpName, err)
×
713
                return curIngressAddrSet, curEgressAddrSet, err
×
714
        }
×
715
        for _, as := range ass {
×
716
                curIngressAddrSet.Add(as.Name)
×
717
        }
×
718

719
        if isBanp {
×
720
                ass, err = c.OVNNbClient.ListAddressSets(map[string]string{
×
721
                        baselineAdminNetworkPolicyKey: fmt.Sprintf("%s/%s", anpName, "egress"),
×
722
                })
×
723
        } else {
×
724
                ass, err = c.OVNNbClient.ListAddressSets(map[string]string{
×
725
                        adminNetworkPolicyKey: fmt.Sprintf("%s/%s", anpName, "egress"),
×
726
                })
×
727
        }
×
728
        if err != nil {
×
729
                klog.Errorf("failed to list egress address sets for anp/banp %s: %v", anpName, err)
×
730
                return curIngressAddrSet, curEgressAddrSet, err
×
731
        }
×
732
        for _, as := range ass {
×
733
                curEgressAddrSet.Add(as.Name)
×
734
        }
×
735

736
        return curIngressAddrSet, curEgressAddrSet, nil
×
737
}
738

739
func (c *Controller) deleteUnusedAddrSetForAnp(curAddrSet, desiredAddrSet *strset.Set) error {
×
740
        toDel := strset.Difference(curAddrSet, desiredAddrSet).List()
×
741

×
742
        for _, asName := range toDel {
×
743
                if err := c.OVNNbClient.DeleteAddressSet(asName); err != nil {
×
744
                        klog.Errorf("failed to delete address set %s, %v", asName, err)
×
745
                        return err
×
746
                }
×
747
        }
748

749
        return nil
×
750
}
751

752
func (c *Controller) setAddrSetForAnpRule(anpName, pgName, ruleName string, index int, from []v1alpha1.AdminNetworkPolicyIngressPeer, to []v1alpha1.AdminNetworkPolicyEgressPeer, isIngress, isBanp bool) error {
×
753
        // A single address set must contain addresses of the same type and the name must be unique within table, so IPv4 and IPv6 address set should be different
×
754

×
755
        var v4Addrs, v4Addr, v6Addrs, v6Addr []string
×
756
        var err error
×
757
        if isIngress {
×
758
                for _, anprpeer := range from {
×
759
                        if v4Addr, v6Addr, err = c.fetchIngressSelectedAddresses(&anprpeer); err != nil {
×
760
                                klog.Errorf("failed to fetch anp/banp ingress selected addresses, %v", err)
×
761
                                return err
×
762
                        }
×
763
                        v4Addrs = append(v4Addrs, v4Addr...)
×
764
                        v6Addrs = append(v6Addrs, v6Addr...)
×
765
                }
766
                klog.Infof("update anp/banp ingress rule %s, selected v4 address %v, v6 address %v", ruleName, v4Addrs, v6Addrs)
×
767

×
768
                gressAsV4Name, gressAsV6Name := getAnpAddressSetName(pgName, ruleName, index, true)
×
769
                if err = c.createAsForAnpRule(anpName, ruleName, "ingress", gressAsV4Name, v4Addrs, isBanp); err != nil {
×
770
                        klog.Error(err)
×
771
                        return err
×
772
                }
×
773
                if err = c.createAsForAnpRule(anpName, ruleName, "ingress", gressAsV6Name, v6Addrs, isBanp); err != nil {
×
774
                        klog.Error(err)
×
775
                        return err
×
776
                }
×
777
        } else {
×
778
                for _, anprpeer := range to {
×
779
                        if v4Addr, v6Addr, err = c.fetchEgressSelectedAddresses(&anprpeer); err != nil {
×
780
                                klog.Errorf("failed to fetch anp/banp egress selected addresses, %v", err)
×
781
                                return err
×
782
                        }
×
783
                        v4Addrs = append(v4Addrs, v4Addr...)
×
784
                        v6Addrs = append(v6Addrs, v6Addr...)
×
785
                }
786
                klog.Infof("update anp/banp egress rule %s, selected v4 address %v, v6 address %v", ruleName, v4Addrs, v6Addrs)
×
787

×
788
                gressAsV4Name, gressAsV6Name := getAnpAddressSetName(pgName, ruleName, index, false)
×
789
                if err = c.createAsForAnpRule(anpName, ruleName, "egress", gressAsV4Name, v4Addrs, isBanp); err != nil {
×
790
                        klog.Error(err)
×
791
                        return err
×
792
                }
×
793
                if err = c.createAsForAnpRule(anpName, ruleName, "egress", gressAsV6Name, v6Addrs, isBanp); err != nil {
×
794
                        klog.Error(err)
×
795
                        return err
×
796
                }
×
797
        }
798

799
        return nil
×
800
}
801

802
func (c *Controller) updateAnpsByLabelsMatch(nsLabels, podLabels map[string]string) {
×
803
        anps, _ := c.anpsLister.List(labels.Everything())
×
804
        for _, anp := range anps {
×
805
                changed := &AdminNetworkPolicyChangedDelta{
×
806
                        key: anp.Name,
×
807
                }
×
808

×
809
                if isLabelsMatch(anp.Spec.Subject.Namespaces, anp.Spec.Subject.Pods, nsLabels, podLabels) {
×
810
                        klog.Infof("anp %s, labels matched for anp's subject, nsLabels %s, podLabels %s", anp.Name, labels.Set(nsLabels).String(), labels.Set(podLabels).String())
×
811
                        changed.field = ChangedSubject
×
812
                        c.updateAnpQueue.Add(changed)
×
813
                }
×
814

815
                ingressRuleNames, egressRuleNames := isLabelsMatchAnpRulePeers(anp.Spec.Ingress, anp.Spec.Egress, nsLabels, podLabels)
×
816
                if !isRulesArrayEmpty(ingressRuleNames) {
×
817
                        klog.Infof("anp %s, labels matched for anp's ingress peer, nsLabels %s, podLabels %s", anp.Name, labels.Set(nsLabels).String(), labels.Set(podLabels).String())
×
818
                        changed.ruleNames = ingressRuleNames
×
819
                        changed.field = ChangedIngressRule
×
820
                        c.updateAnpQueue.Add(changed)
×
821
                }
×
822

823
                if !isRulesArrayEmpty(egressRuleNames) {
×
824
                        klog.Infof("anp %s, labels matched for anp's egress peer, nsLabels %s, podLabels %s", anp.Name, labels.Set(nsLabels).String(), labels.Set(podLabels).String())
×
825
                        changed.ruleNames = egressRuleNames
×
826
                        changed.field = ChangedEgressRule
×
827
                        c.updateAnpQueue.Add(changed)
×
828
                }
×
829
        }
830

831
        banps, _ := c.banpsLister.List(labels.Everything())
×
832
        for _, banp := range banps {
×
833
                changed := &AdminNetworkPolicyChangedDelta{
×
834
                        key: banp.Name,
×
835
                }
×
836

×
837
                if isLabelsMatch(banp.Spec.Subject.Namespaces, banp.Spec.Subject.Pods, nsLabels, podLabels) {
×
838
                        klog.Infof("banp %s, labels matched for banp's subject, nsLabels %s, podLabels %s", banp.Name, labels.Set(nsLabels).String(), labels.Set(podLabels).String())
×
839
                        changed.field = ChangedSubject
×
840
                        c.updateBanpQueue.Add(changed)
×
841
                }
×
842

843
                ingressRuleNames, egressRuleNames := isLabelsMatchBanpRulePeers(banp.Spec.Ingress, banp.Spec.Egress, nsLabels, podLabels)
×
844
                if !isRulesArrayEmpty(ingressRuleNames) {
×
845
                        klog.Infof("banp %s, labels matched for banp's ingress peer, nsLabels %s, podLabels %s", banp.Name, labels.Set(nsLabels).String(), labels.Set(podLabels).String())
×
846
                        changed.ruleNames = ingressRuleNames
×
847
                        changed.field = ChangedIngressRule
×
848
                        c.updateBanpQueue.Add(changed)
×
849
                }
×
850

851
                if !isRulesArrayEmpty(egressRuleNames) {
×
852
                        klog.Infof("banp %s, labels matched for banp's egress peer, nsLabels %s, podLabels %s", banp.Name, labels.Set(nsLabels).String(), labels.Set(podLabels).String())
×
853
                        changed.ruleNames = egressRuleNames
×
854
                        changed.field = ChangedEgressRule
×
855
                        c.updateBanpQueue.Add(changed)
×
856
                }
×
857
        }
858
}
859

860
func isLabelsMatch(namespaces *metav1.LabelSelector, pods *v1alpha1.NamespacedPod, nsLabels, podLabels map[string]string) bool {
1✔
861
        // Exactly one field of namespaces/pods must be set.
1✔
862
        if namespaces != nil {
2✔
863
                nsSelector, _ := metav1.LabelSelectorAsSelector(namespaces)
1✔
864
                klog.V(3).Infof("namespaces is not nil, nsSelector %s", nsSelector.String())
1✔
865
                if nsSelector.Matches(labels.Set(nsLabels)) {
2✔
866
                        return true
1✔
867
                }
1✔
868
        } else if pods != nil {
2✔
869
                nsSelector, _ := metav1.LabelSelectorAsSelector(&pods.NamespaceSelector)
1✔
870
                podSelector, _ := metav1.LabelSelectorAsSelector(&pods.PodSelector)
1✔
871
                klog.V(3).Infof("pods is not nil, nsSelector %s, podSelector %s", nsSelector.String(), podSelector.String())
1✔
872
                if nsSelector.Matches(labels.Set(nsLabels)) && podSelector.Matches(labels.Set(podLabels)) {
2✔
873
                        return true
1✔
874
                }
1✔
875
        }
876

877
        return false
1✔
878
}
879

880
func isLabelsMatchRulePeers(from []v1alpha1.AdminNetworkPolicyIngressPeer, to []v1alpha1.AdminNetworkPolicyEgressPeer, nsLabels, podLabels map[string]string) bool {
×
881
        for _, ingressPeer := range from {
×
882
                if isLabelsMatch(ingressPeer.Namespaces, ingressPeer.Pods, nsLabels, podLabels) {
×
883
                        return true
×
884
                }
×
885
        }
886

887
        for _, egressPeer := range to {
×
888
                if isLabelsMatch(egressPeer.Namespaces, egressPeer.Pods, nsLabels, podLabels) {
×
889
                        return true
×
890
                }
×
891
        }
892

893
        return false
×
894
}
895

896
func isLabelsMatchAnpRulePeers(ingress []v1alpha1.AdminNetworkPolicyIngressRule, egress []v1alpha1.AdminNetworkPolicyEgressRule, nsLabels, podLabels map[string]string) ([util.AnpMaxRules]ChangedName, [util.AnpMaxRules]ChangedName) {
×
897
        var changedIngressRuleNames, changedEgressRuleNames [util.AnpMaxRules]ChangedName
×
898

×
899
        for index, anpr := range ingress {
×
900
                if isLabelsMatchRulePeers(anpr.From, []v1alpha1.AdminNetworkPolicyEgressPeer{}, nsLabels, podLabels) {
×
901
                        changedIngressRuleNames[index].isMatch = true
×
902
                        changedIngressRuleNames[index].curRuleName = anpr.Name
×
903
                }
×
904
        }
905

906
        for index, anpr := range egress {
×
907
                if isLabelsMatchRulePeers([]v1alpha1.AdminNetworkPolicyIngressPeer{}, anpr.To, nsLabels, podLabels) {
×
908
                        changedEgressRuleNames[index].isMatch = true
×
909
                        changedEgressRuleNames[index].curRuleName = anpr.Name
×
910
                }
×
911
        }
912

913
        return changedIngressRuleNames, changedEgressRuleNames
×
914
}
915

916
func isLabelsMatchBanpRulePeers(ingress []v1alpha1.BaselineAdminNetworkPolicyIngressRule, egress []v1alpha1.BaselineAdminNetworkPolicyEgressRule, nsLabels, podLabels map[string]string) ([util.AnpMaxRules]ChangedName, [util.AnpMaxRules]ChangedName) {
×
917
        var changedIngressRuleNames, changedEgressRuleNames [util.AnpMaxRules]ChangedName
×
918

×
919
        for index, banpr := range ingress {
×
920
                if isLabelsMatchRulePeers(banpr.From, []v1alpha1.AdminNetworkPolicyEgressPeer{}, nsLabels, podLabels) {
×
921
                        changedIngressRuleNames[index].isMatch = true
×
922
                        changedIngressRuleNames[index].curRuleName = banpr.Name
×
923
                }
×
924
        }
925

926
        for index, banpr := range egress {
×
927
                if isLabelsMatchRulePeers([]v1alpha1.AdminNetworkPolicyIngressPeer{}, banpr.To, nsLabels, podLabels) {
×
928
                        changedEgressRuleNames[index].isMatch = true
×
929
                        changedEgressRuleNames[index].curRuleName = banpr.Name
×
930
                }
×
931
        }
932

933
        return changedIngressRuleNames, changedEgressRuleNames
×
934
}
935

936
func getAnpName(name string) string {
1✔
937
        anpName := name
1✔
938
        nameArray := []rune(name)
1✔
939
        if !unicode.IsLetter(nameArray[0]) {
2✔
940
                anpName = "anp" + name
1✔
941
        }
1✔
942
        return anpName
1✔
943
}
944

945
func getAnpAddressSetName(pgName, ruleName string, index int, isIngress bool) (string, string) {
1✔
946
        var asV4Name, asV6Name string
1✔
947
        if isIngress {
2✔
948
                // In case ruleName is omitted, add direction and index to distinguish address-set
1✔
949
                asV4Name = strings.ReplaceAll(fmt.Sprintf("%s.ingress.%d.%s.%s", pgName, index, ruleName, kubeovnv1.ProtocolIPv4), "-", ".")
1✔
950
                asV6Name = strings.ReplaceAll(fmt.Sprintf("%s.ingress.%d.%s.%s", pgName, index, ruleName, kubeovnv1.ProtocolIPv6), "-", ".")
1✔
951
        } else {
2✔
952
                asV4Name = strings.ReplaceAll(fmt.Sprintf("%s.egress.%d.%s.%s", pgName, index, ruleName, kubeovnv1.ProtocolIPv4), "-", ".")
1✔
953
                asV6Name = strings.ReplaceAll(fmt.Sprintf("%s.egress.%d.%s.%s", pgName, index, ruleName, kubeovnv1.ProtocolIPv6), "-", ".")
1✔
954
        }
1✔
955

956
        return asV4Name, asV6Name
1✔
957
}
958

959
func anpACLAction(action v1alpha1.AdminNetworkPolicyRuleAction) ovnnb.ACLAction {
1✔
960
        switch action {
1✔
961
        case v1alpha1.AdminNetworkPolicyRuleActionAllow:
1✔
962
                return ovnnb.ACLActionAllowRelated
1✔
963
        case v1alpha1.AdminNetworkPolicyRuleActionDeny:
1✔
964
                return ovnnb.ACLActionDrop
1✔
965
        case v1alpha1.AdminNetworkPolicyRuleActionPass:
1✔
966
                return ovnnb.ACLActionPass
1✔
967
        }
968
        return ovnnb.ACLActionDrop
1✔
969
}
970

971
func isRulesArrayEmpty(ruleNames [util.AnpMaxRules]ChangedName) bool {
1✔
972
        for _, ruleName := range ruleNames {
2✔
973
                // The ruleName can be omitted default
1✔
974
                if ruleName.curRuleName != "" || ruleName.isMatch {
2✔
975
                        return false
1✔
976
                }
1✔
977
        }
978
        return true
1✔
979
}
980

981
func (c *Controller) fetchNodesAddrs(nodeSelector labels.Selector) ([]string, []string, error) {
×
982
        nodes, err := c.nodesLister.List(nodeSelector)
×
983
        if err != nil {
×
984
                klog.Errorf("failed to list nodes: %v", err)
×
985
                return nil, nil, err
×
986
        }
×
987
        v4Addresses := make([]string, 0, len(nodes))
×
988
        v6Addresses := make([]string, 0, len(nodes))
×
989

×
990
        klog.V(3).Infof("fetch nodes addresses, selector is %s", nodeSelector.String())
×
991
        for _, node := range nodes {
×
992
                nodeIPv4, nodeIPv6 := util.GetNodeInternalIP(*node)
×
993
                if nodeIPv4 != "" {
×
994
                        v4Addresses = append(v4Addresses, nodeIPv4)
×
995
                }
×
996
                if nodeIPv6 != "" {
×
997
                        v6Addresses = append(v6Addresses, nodeIPv6)
×
998
                }
×
999
        }
1000

1001
        return v4Addresses, v6Addresses, nil
×
1002
}
1003

1004
func fetchCIDRAddrs(networks []v1alpha1.CIDR) ([]string, []string) {
1✔
1005
        var v4Addresses, v6Addresses []string
1✔
1006

1✔
1007
        for _, network := range networks {
2✔
1008
                if _, _, err := net.ParseCIDR(string(network)); err != nil {
2✔
1009
                        klog.Errorf("invalid cidr %s", string(network))
1✔
1010
                        continue
1✔
1011
                }
1012
                switch util.CheckProtocol(string(network)) {
1✔
1013
                case kubeovnv1.ProtocolIPv4:
1✔
1014
                        v4Addresses = append(v4Addresses, string(network))
1✔
1015
                case kubeovnv1.ProtocolIPv6:
1✔
1016
                        v6Addresses = append(v6Addresses, string(network))
1✔
1017
                }
1018
        }
1019

1020
        return v4Addresses, v6Addresses
1✔
1021
}
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