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

kubeovn / kube-ovn / 14547474456

19 Apr 2025 08:37AM UTC coverage: 21.73% (-0.007%) from 21.737%
14547474456

push

github

web-flow
modernize: simplify code by using modern constructs (#5163)

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

87 of 376 new or added lines in 94 files covered. (23.14%)

1 existing line in 1 file now uncovered.

10251 of 47175 relevant lines covered (21.73%)

0.25 hits per line

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

9.88
/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

NEW
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

NEW
52
func (c *Controller) enqueueDeleteAnp(obj any) {
×
53
        anp := obj.(*v1alpha1.AdminNetworkPolicy)
×
54
        klog.V(3).Infof("enqueue delete anp %s", cache.MetaObjectToName(anp).String())
×
55
        c.deleteAnpQueue.Add(anp)
×
56
}
×
57

NEW
58
func (c *Controller) enqueueUpdateAnp(oldObj, newObj any) {
×
59
        oldAnpObj := oldObj.(*v1alpha1.AdminNetworkPolicy)
×
60
        newAnpObj := newObj.(*v1alpha1.AdminNetworkPolicy)
×
61

×
62
        // All the acls should be recreated with the following situations
×
63
        if oldAnpObj.Spec.Priority != newAnpObj.Spec.Priority || len(oldAnpObj.Spec.Ingress) != len(newAnpObj.Spec.Ingress) || len(oldAnpObj.Spec.Egress) != len(newAnpObj.Spec.Egress) {
×
64
                c.addAnpQueue.Add(newAnpObj.Name)
×
65
                return
×
66
        }
×
67

68
        // Acls should be updated when action or ports of ingress/egress rule has been changed
69
        for index, rule := range newAnpObj.Spec.Ingress {
×
70
                oldRule := oldAnpObj.Spec.Ingress[index]
×
71
                if oldRule.Action != rule.Action || !reflect.DeepEqual(oldRule.Ports, rule.Ports) {
×
72
                        // 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.
×
73
                        // 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
×
74
                        c.addAnpQueue.Add(newAnpObj.Name)
×
75
                        return
×
76
                }
×
77
        }
78

79
        for index, rule := range newAnpObj.Spec.Egress {
×
80
                oldRule := oldAnpObj.Spec.Egress[index]
×
81
                if oldRule.Action != rule.Action || !reflect.DeepEqual(oldRule.Ports, rule.Ports) {
×
82
                        c.addAnpQueue.Add(newAnpObj.Name)
×
83
                        return
×
84
                }
×
85
        }
86

87
        if oldAnpObj.Annotations[util.ACLActionsLogAnnotation] != newAnpObj.Annotations[util.ACLActionsLogAnnotation] {
×
88
                c.addAnpQueue.Add(newAnpObj.Name)
×
89
                return
×
90
        }
×
91
        klog.V(3).Infof("enqueue update anp %s", newAnpObj.Name)
×
92

×
93
        // The remaining changes do not affect the acls. The port-group or address-set should be updated.
×
94
        // The port-group for anp should be updated
×
95
        if !reflect.DeepEqual(oldAnpObj.Spec.Subject, newAnpObj.Spec.Subject) {
×
96
                c.updateAnpQueue.Add(&AdminNetworkPolicyChangedDelta{key: newAnpObj.Name, field: ChangedSubject})
×
97
        }
×
98

99
        // Rule name or peer selector in ingress/egress rule has changed, the corresponding address-set need be updated
100
        ruleChanged := false
×
101
        var changedIngressRuleNames, changedEgressRuleNames [util.AnpMaxRules]ChangedName
×
102
        for index, rule := range newAnpObj.Spec.Ingress {
×
103
                oldRule := oldAnpObj.Spec.Ingress[index]
×
104
                if oldRule.Name != rule.Name {
×
105
                        changedIngressRuleNames[index] = ChangedName{oldRuleName: oldRule.Name, curRuleName: rule.Name}
×
106
                        ruleChanged = true
×
107
                }
×
108
                if !reflect.DeepEqual(oldRule.From, rule.From) {
×
109
                        changedIngressRuleNames[index] = ChangedName{curRuleName: rule.Name}
×
110
                        ruleChanged = true
×
111
                }
×
112
        }
113
        if ruleChanged {
×
114
                c.updateAnpQueue.Add(&AdminNetworkPolicyChangedDelta{key: newAnpObj.Name, ruleNames: changedIngressRuleNames, field: ChangedIngressRule})
×
115
        }
×
116

117
        ruleChanged = false
×
118
        for index, rule := range newAnpObj.Spec.Egress {
×
119
                oldRule := oldAnpObj.Spec.Egress[index]
×
120
                if oldRule.Name != rule.Name {
×
121
                        changedEgressRuleNames[index] = ChangedName{oldRuleName: oldRule.Name, curRuleName: rule.Name}
×
122
                        ruleChanged = true
×
123
                }
×
124
                if !reflect.DeepEqual(oldRule.To, rule.To) {
×
125
                        changedEgressRuleNames[index] = ChangedName{curRuleName: rule.Name}
×
126
                        ruleChanged = true
×
127
                }
×
128
        }
129
        if ruleChanged {
×
130
                c.updateAnpQueue.Add(&AdminNetworkPolicyChangedDelta{key: newAnpObj.Name, ruleNames: changedEgressRuleNames, field: ChangedEgressRule})
×
131
        }
×
132
}
133

134
func (c *Controller) handleAddAnp(key string) (err error) {
×
135
        c.anpKeyMutex.LockKey(key)
×
136
        defer func() { _ = c.anpKeyMutex.UnlockKey(key) }()
×
137

138
        cachedAnp, err := c.anpsLister.Get(key)
×
139
        if err != nil {
×
140
                if k8serrors.IsNotFound(err) {
×
141
                        return nil
×
142
                }
×
143
                klog.Error(err)
×
144
                return err
×
145
        }
146
        klog.Infof("handle add anp %s", cachedAnp.Name)
×
147
        anp := cachedAnp.DeepCopy()
×
148

×
149
        if err := c.validateAnpConfig(anp); err != nil {
×
150
                klog.Errorf("failed to validate anp %s: %v", anp.Name, err)
×
151
                return err
×
152
        }
×
153
        if priority, exist := c.anpNamePrioMap[anp.Name]; exist && priority != anp.Spec.Priority {
×
154
                // anp spec's priority has been changed
×
155
                delete(c.anpPrioNameMap, priority)
×
156
        }
×
157
        // record new created anp after validation
158
        c.anpPrioNameMap[anp.Spec.Priority] = anp.Name
×
159
        c.anpNamePrioMap[anp.Name] = anp.Spec.Priority
×
160

×
161
        anpName := getAnpName(anp.Name)
×
162
        var logActions []string
×
163
        if anp.Annotations[util.ACLActionsLogAnnotation] != "" {
×
164
                logActions = strings.Split(anp.Annotations[util.ACLActionsLogAnnotation], ",")
×
165
        }
×
166

167
        // ovn portGroup/addressSet doesn't support name with '-', so we replace '-' by '.'.
168
        // 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.
169
        // Make sure all create operations are reentrant.
170
        pgName := strings.ReplaceAll(anpName, "-", ".")
×
171
        if err = c.OVNNbClient.CreatePortGroup(pgName, map[string]string{adminNetworkPolicyKey: anpName}); err != nil {
×
172
                klog.Errorf("failed to create port group for anp %s: %v", key, err)
×
173
                return err
×
174
        }
×
175

176
        ports, err := c.fetchSelectedPods(&anp.Spec.Subject)
×
177
        if err != nil {
×
178
                klog.Errorf("failed to fetch ports belongs to anp %s: %v", key, err)
×
179
                return err
×
180
        }
×
181

182
        if err = c.OVNNbClient.PortGroupSetPorts(pgName, ports); err != nil {
×
183
                klog.Errorf("failed to set ports %v to port group %s: %v", ports, pgName, err)
×
184
                return err
×
185
        }
×
186

187
        ingressACLOps, err := c.OVNNbClient.DeleteAclsOps(pgName, portGroupKey, "to-lport", nil)
×
188
        if err != nil {
×
189
                klog.Errorf("failed to generate clear operations for anp %s ingress acls: %v", key, err)
×
190
                return err
×
191
        }
×
192

193
        curIngressAddrSet, curEgressAddrSet, err := c.getCurrentAddrSetByName(anpName, false)
×
194
        if err != nil {
×
195
                klog.Errorf("failed to list address sets for anp %s: %v", key, err)
×
196
                return err
×
197
        }
×
198
        desiredIngressAddrSet := strset.NewWithSize(len(anp.Spec.Ingress) * 2)
×
199
        desiredEgressAddrSet := strset.NewWithSize(len(anp.Spec.Egress) * 2)
×
200

×
201
        // create ingress acl
×
202
        for index, anpr := range anp.Spec.Ingress {
×
203
                // 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
×
204
                ingressAsV4Name, ingressAsV6Name := getAnpAddressSetName(pgName, anpr.Name, index, true)
×
205
                desiredIngressAddrSet.Add(ingressAsV4Name, ingressAsV6Name)
×
206

×
207
                var v4Addrs, v4Addr, v6Addrs, v6Addr []string
×
208
                // This field must be defined and contain at least one item.
×
209
                for _, anprpeer := range anpr.From {
×
210
                        if v4Addr, v6Addr, err = c.fetchIngressSelectedAddresses(&anprpeer); err != nil {
×
211
                                klog.Errorf("failed to fetch admin network policy selected addresses, %v", err)
×
212
                                return err
×
213
                        }
×
214
                        v4Addrs = append(v4Addrs, v4Addr...)
×
215
                        v6Addrs = append(v6Addrs, v6Addr...)
×
216
                }
217
                klog.Infof("anp %s, ingress rule %s, selected v4 address %v, v6 address %v", anpName, anpr.Name, v4Addrs, v6Addrs)
×
218

×
219
                if err = c.createAsForAnpRule(anpName, anpr.Name, "ingress", ingressAsV4Name, v4Addrs, false); err != nil {
×
220
                        klog.Error(err)
×
221
                        return err
×
222
                }
×
223
                if err = c.createAsForAnpRule(anpName, anpr.Name, "ingress", ingressAsV6Name, v6Addrs, false); err != nil {
×
224
                        klog.Error(err)
×
225
                        return err
×
226
                }
×
227

228
                aclPriority := util.AnpACLMaxPriority - int(anp.Spec.Priority*100) - index
×
229
                aclAction := anpACLAction(anpr.Action)
×
230
                rulePorts := []v1alpha1.AdminNetworkPolicyPort{}
×
231
                if anpr.Ports != nil {
×
232
                        rulePorts = *anpr.Ports
×
233
                }
×
234

235
                if len(v4Addrs) != 0 {
×
236
                        aclName := fmt.Sprintf("anp/%s/ingress/%s/%d", anpName, kubeovnv1.ProtocolIPv4, index)
×
237
                        ops, err := c.OVNNbClient.UpdateAnpRuleACLOps(pgName, ingressAsV4Name, kubeovnv1.ProtocolIPv4, aclName, aclPriority, aclAction, logActions, rulePorts, true, false)
×
238
                        if err != nil {
×
239
                                klog.Errorf("failed to add v4 ingress acls for anp %s: %v", key, err)
×
240
                                return err
×
241
                        }
×
242
                        ingressACLOps = append(ingressACLOps, ops...)
×
243
                }
244

245
                if len(v6Addrs) != 0 {
×
246
                        aclName := fmt.Sprintf("anp/%s/ingress/%s/%d", anpName, kubeovnv1.ProtocolIPv6, index)
×
247
                        ops, err := c.OVNNbClient.UpdateAnpRuleACLOps(pgName, ingressAsV6Name, kubeovnv1.ProtocolIPv6, aclName, aclPriority, aclAction, logActions, rulePorts, true, false)
×
248
                        if err != nil {
×
249
                                klog.Errorf("failed to add v6 ingress acls for anp %s: %v", key, err)
×
250
                                return err
×
251
                        }
×
252
                        ingressACLOps = append(ingressACLOps, ops...)
×
253
                }
254
        }
255

256
        if err := c.OVNNbClient.Transact("add-ingress-acls", ingressACLOps); err != nil {
×
257
                return fmt.Errorf("failed to add ingress acls for anp %s: %w", key, err)
×
258
        }
×
259
        if err := c.deleteUnusedAddrSetForAnp(curIngressAddrSet, desiredIngressAddrSet); err != nil {
×
260
                return fmt.Errorf("failed to delete unused ingress address set for anp %s: %w", key, err)
×
261
        }
×
262

263
        egressACLOps, err := c.OVNNbClient.DeleteAclsOps(pgName, portGroupKey, "from-lport", nil)
×
264
        if err != nil {
×
265
                klog.Errorf("failed to generate clear operations for anp %s egress acls: %v", key, err)
×
266
                return err
×
267
        }
×
268
        // create egress acl
269
        for index, anpr := range anp.Spec.Egress {
×
270
                // 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
×
271
                egressAsV4Name, egressAsV6Name := getAnpAddressSetName(pgName, anpr.Name, index, false)
×
272
                desiredEgressAddrSet.Add(egressAsV4Name, egressAsV6Name)
×
273

×
274
                var v4Addrs, v4Addr, v6Addrs, v6Addr []string
×
275
                // This field must be defined and contain at least one item.
×
276
                for _, anprpeer := range anpr.To {
×
277
                        if v4Addr, v6Addr, err = c.fetchEgressSelectedAddresses(&anprpeer); err != nil {
×
278
                                klog.Errorf("failed to fetch admin network policy selected addresses, %v", err)
×
279
                                return err
×
280
                        }
×
281
                        v4Addrs = append(v4Addrs, v4Addr...)
×
282
                        v6Addrs = append(v6Addrs, v6Addr...)
×
283
                }
284
                klog.Infof("anp %s, egress rule %s, selected v4 address %v, v6 address %v", anpName, anpr.Name, v4Addrs, v6Addrs)
×
285

×
286
                if err = c.createAsForAnpRule(anpName, anpr.Name, "egress", egressAsV4Name, v4Addrs, false); err != nil {
×
287
                        klog.Error(err)
×
288
                        return err
×
289
                }
×
290
                if err = c.createAsForAnpRule(anpName, anpr.Name, "egress", egressAsV6Name, v6Addrs, false); err != nil {
×
291
                        klog.Error(err)
×
292
                        return err
×
293
                }
×
294

295
                aclPriority := util.AnpACLMaxPriority - int(anp.Spec.Priority*100) - index
×
296
                aclAction := anpACLAction(anpr.Action)
×
297
                rulePorts := []v1alpha1.AdminNetworkPolicyPort{}
×
298
                if anpr.Ports != nil {
×
299
                        rulePorts = *anpr.Ports
×
300
                }
×
301

302
                if len(v4Addrs) != 0 {
×
303
                        aclName := fmt.Sprintf("anp/%s/egress/%s/%d", anpName, kubeovnv1.ProtocolIPv4, index)
×
304
                        ops, err := c.OVNNbClient.UpdateAnpRuleACLOps(pgName, egressAsV4Name, kubeovnv1.ProtocolIPv4, aclName, aclPriority, aclAction, logActions, rulePorts, false, false)
×
305
                        if err != nil {
×
306
                                klog.Errorf("failed to add v4 egress acls for anp %s: %v", key, err)
×
307
                                return err
×
308
                        }
×
309
                        egressACLOps = append(egressACLOps, ops...)
×
310
                }
311

312
                if len(v6Addrs) != 0 {
×
313
                        aclName := fmt.Sprintf("anp/%s/egress/%s/%d", anpName, kubeovnv1.ProtocolIPv6, index)
×
314
                        ops, err := c.OVNNbClient.UpdateAnpRuleACLOps(pgName, egressAsV6Name, kubeovnv1.ProtocolIPv6, aclName, aclPriority, aclAction, logActions, rulePorts, false, false)
×
315
                        if err != nil {
×
316
                                klog.Errorf("failed to add v6 egress acls for anp %s: %v", key, err)
×
317
                                return err
×
318
                        }
×
319
                        egressACLOps = append(egressACLOps, ops...)
×
320
                }
321
        }
322

323
        if err := c.OVNNbClient.Transact("add-egress-acls", egressACLOps); err != nil {
×
324
                return fmt.Errorf("failed to add egress acls for anp %s: %w", key, err)
×
325
        }
×
326
        if err := c.deleteUnusedAddrSetForAnp(curEgressAddrSet, desiredEgressAddrSet); err != nil {
×
327
                return fmt.Errorf("failed to delete unused egress address set for anp %s: %w", key, err)
×
328
        }
×
329

330
        return nil
×
331
}
332

333
func (c *Controller) handleDeleteAnp(anp *v1alpha1.AdminNetworkPolicy) error {
×
334
        c.anpKeyMutex.LockKey(anp.Name)
×
335
        defer func() { _ = c.anpKeyMutex.UnlockKey(anp.Name) }()
×
336

337
        klog.Infof("handle delete admin network policy %s", anp.Name)
×
338
        delete(c.anpPrioNameMap, anp.Spec.Priority)
×
339
        delete(c.anpNamePrioMap, anp.Name)
×
340

×
341
        anpName := getAnpName(anp.Name)
×
342

×
343
        // ACLs releated to port_group will be deleted automatically when port_group is deleted
×
344
        pgName := strings.ReplaceAll(anpName, "-", ".")
×
345
        if err := c.OVNNbClient.DeletePortGroup(pgName); err != nil {
×
346
                klog.Errorf("failed to delete port group for anp %s: %v", anpName, err)
×
347
        }
×
348

349
        if err := c.OVNNbClient.DeleteAddressSets(map[string]string{
×
350
                adminNetworkPolicyKey: fmt.Sprintf("%s/%s", anpName, "ingress"),
×
351
        }); err != nil {
×
352
                klog.Errorf("failed to delete ingress address set for anp %s: %v", anpName, err)
×
353
                return err
×
354
        }
×
355

356
        if err := c.OVNNbClient.DeleteAddressSets(map[string]string{
×
357
                adminNetworkPolicyKey: fmt.Sprintf("%s/%s", anpName, "egress"),
×
358
        }); err != nil {
×
359
                klog.Errorf("failed to delete egress address set for anp %s: %v", anpName, err)
×
360
                return err
×
361
        }
×
362

363
        return nil
×
364
}
365

366
func (c *Controller) handleUpdateAnp(changed *AdminNetworkPolicyChangedDelta) error {
×
367
        // Only handle updates that do not affect acls.
×
368
        c.anpKeyMutex.LockKey(changed.key)
×
369
        defer func() { _ = c.anpKeyMutex.UnlockKey(changed.key) }()
×
370

371
        cachedAnp, err := c.anpsLister.Get(changed.key)
×
372
        if err != nil {
×
373
                if k8serrors.IsNotFound(err) {
×
374
                        return nil
×
375
                }
×
376
                klog.Error(err)
×
377
                return err
×
378
        }
379
        desiredAnp := cachedAnp.DeepCopy()
×
380
        klog.Infof("handle update admin network policy %s", desiredAnp.Name)
×
381

×
382
        anpName := getAnpName(desiredAnp.Name)
×
383
        pgName := strings.ReplaceAll(anpName, "-", ".")
×
384

×
385
        // The port-group for anp should be updated
×
386
        if changed.field == ChangedSubject {
×
387
                // The port-group must exist when update anp, this check should never be matched.
×
388
                if ok, err := c.OVNNbClient.PortGroupExists(pgName); !ok || err != nil {
×
389
                        klog.Errorf("port-group for anp %s does not exist when update anp", desiredAnp.Name)
×
390
                        return err
×
391
                }
×
392

393
                ports, err := c.fetchSelectedPods(&desiredAnp.Spec.Subject)
×
394
                if err != nil {
×
395
                        klog.Errorf("failed to fetch ports belongs to anp %s: %v", desiredAnp.Name, err)
×
396
                        return err
×
397
                }
×
398

399
                if err = c.OVNNbClient.PortGroupSetPorts(pgName, ports); err != nil {
×
400
                        klog.Errorf("failed to set ports %v to port group %s: %v", ports, pgName, err)
×
401
                        return err
×
402
                }
×
403
        }
404

405
        // Peer selector in ingress/egress rule has changed, so the corresponding address-set need be updated
406
        if changed.field == ChangedIngressRule {
×
407
                for index, rule := range desiredAnp.Spec.Ingress {
×
408
                        // Make sure the rule is changed and go on update
×
409
                        if rule.Name == changed.ruleNames[index].curRuleName || changed.ruleNames[index].isMatch {
×
410
                                if err := c.setAddrSetForAnpRule(anpName, pgName, rule.Name, index, rule.From, []v1alpha1.AdminNetworkPolicyEgressPeer{}, true, false); err != nil {
×
411
                                        klog.Errorf("failed to set ingress address-set for anp rule %s/%s, %v", anpName, rule.Name, err)
×
412
                                        return err
×
413
                                }
×
414

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

×
421
                                        if err := c.OVNNbClient.DeleteAddressSet(oldAsV4Name); err != nil {
×
422
                                                klog.Errorf("failed to delete address set %s, %v", oldAsV4Name, err)
×
423
                                                // just record error log
×
424
                                        }
×
425
                                        if err := c.OVNNbClient.DeleteAddressSet(oldAsV6Name); err != nil {
×
426
                                                klog.Errorf("failed to delete address set %s, %v", oldAsV6Name, err)
×
427
                                        }
×
428
                                }
429
                        }
430
                }
431
        }
432

433
        if changed.field == ChangedEgressRule {
×
434
                for index, rule := range desiredAnp.Spec.Egress {
×
435
                        // Make sure the rule is changed and go on update
×
436
                        if rule.Name == changed.ruleNames[index].curRuleName || changed.ruleNames[index].isMatch {
×
437
                                if err := c.setAddrSetForAnpRule(anpName, pgName, rule.Name, index, []v1alpha1.AdminNetworkPolicyIngressPeer{}, rule.To, false, false); err != nil {
×
438
                                        klog.Errorf("failed to set egress address-set for anp rule %s/%s, %v", anpName, rule.Name, err)
×
439
                                        return err
×
440
                                }
×
441

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

×
448
                                        if err := c.OVNNbClient.DeleteAddressSet(oldAsV4Name); err != nil {
×
449
                                                klog.Errorf("failed to delete address set %s, %v", oldAsV4Name, err)
×
450
                                                // just record error log
×
451
                                        }
×
452
                                        if err := c.OVNNbClient.DeleteAddressSet(oldAsV6Name); err != nil {
×
453
                                                klog.Errorf("failed to delete address set %s, %v", oldAsV6Name, err)
×
454
                                        }
×
455
                                }
456
                        }
457
                }
458
        }
459

460
        return nil
×
461
}
462

463
func (c *Controller) validateAnpConfig(anp *v1alpha1.AdminNetworkPolicy) error {
1✔
464
        // The behavior is undefined if two ANP objects have same priority.
1✔
465
        if anpName, exist := c.anpPrioNameMap[anp.Spec.Priority]; exist && anpName != anp.Name {
2✔
466
                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✔
467
                klog.Error(err)
1✔
468
                return err
1✔
469
        }
1✔
470

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

479
        if len(anp.Spec.Ingress) > util.AnpMaxRules || len(anp.Spec.Egress) > util.AnpMaxRules {
1✔
480
                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)
×
481
                klog.Error(err)
×
482
                return err
×
483
        }
×
484

485
        return nil
1✔
486
}
487

488
func (c *Controller) fetchSelectedPods(anpSubject *v1alpha1.AdminNetworkPolicySubject) ([]string, error) {
×
489
        var ports []string
×
490

×
491
        // Exactly one field must be set.
×
492
        if anpSubject.Namespaces != nil {
×
493
                nsSelector, err := metav1.LabelSelectorAsSelector(anpSubject.Namespaces)
×
494
                if err != nil {
×
495
                        return nil, fmt.Errorf("error creating ns label selector, %w", err)
×
496
                }
×
497

498
                ports, _, _, err = c.fetchPods(nsSelector, labels.Everything())
×
499
                if err != nil {
×
500
                        return nil, fmt.Errorf("failed to fetch pods, %w", err)
×
501
                }
×
502
        } else if anpSubject.Pods != nil {
×
503
                nsSelector, err := metav1.LabelSelectorAsSelector(&anpSubject.Pods.NamespaceSelector)
×
504
                if err != nil {
×
505
                        return nil, fmt.Errorf("error creating ns label selector, %w", err)
×
506
                }
×
507
                podSelector, err := metav1.LabelSelectorAsSelector(&anpSubject.Pods.PodSelector)
×
508
                if err != nil {
×
509
                        return nil, fmt.Errorf("error creating pod label selector, %w", err)
×
510
                }
×
511

512
                ports, _, _, err = c.fetchPods(nsSelector, podSelector)
×
513
                if err != nil {
×
514
                        return nil, fmt.Errorf("failed to fetch pods, %w", err)
×
515
                }
×
516
        }
517
        klog.Infof("get selected ports for subject, %v", ports)
×
518
        return ports, nil
×
519
}
520

521
func (c *Controller) fetchPods(nsSelector, podSelector labels.Selector) ([]string, []string, []string, error) {
×
522
        ports := make([]string, 0, util.AnpMaxRules)
×
523
        v4Addresses := make([]string, 0, util.AnpMaxRules)
×
524
        v6Addresses := make([]string, 0, util.AnpMaxRules)
×
525

×
526
        namespaces, err := c.namespacesLister.List(nsSelector)
×
527
        if err != nil {
×
528
                klog.Errorf("failed to list namespaces: %v", err)
×
529
                return nil, nil, nil, err
×
530
        }
×
531

532
        klog.V(3).Infof("fetch pod ports/addresses, namespace selector is %s, pod selector is %s", nsSelector.String(), podSelector.String())
×
533
        for _, namespace := range namespaces {
×
534
                pods, err := c.podsLister.Pods(namespace.Name).List(podSelector)
×
535
                if err != nil {
×
536
                        return nil, nil, nil, fmt.Errorf("failed to list pods, %w", err)
×
537
                }
×
538

539
                for _, pod := range pods {
×
540
                        if pod.Spec.HostNetwork {
×
541
                                continue
×
542
                        }
543
                        podName := c.getNameByPod(pod)
×
544

×
545
                        podNets, err := c.getPodKubeovnNets(pod)
×
546
                        if err != nil {
×
547
                                return nil, nil, nil, fmt.Errorf("failed to get pod networks, %w", err)
×
548
                        }
×
549

550
                        for _, podNet := range podNets {
×
551
                                if !isOvnSubnet(podNet.Subnet) {
×
552
                                        continue
×
553
                                }
554

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

×
558
                                        podIPAnnotation := pod.Annotations[fmt.Sprintf(util.IPAddressAnnotationTemplate, podNet.ProviderName)]
×
NEW
559
                                        podIPs := strings.SplitSeq(podIPAnnotation, ",")
×
NEW
560
                                        for podIP := range podIPs {
×
561
                                                switch util.CheckProtocol(podIP) {
×
562
                                                case kubeovnv1.ProtocolIPv4:
×
563
                                                        v4Addresses = append(v4Addresses, podIP)
×
564
                                                case kubeovnv1.ProtocolIPv6:
×
565
                                                        v6Addresses = append(v6Addresses, podIP)
×
566
                                                }
567
                                        }
568
                                }
569
                        }
570
                }
571
        }
572

573
        return ports, v4Addresses, v6Addresses, nil
×
574
}
575

576
func (c *Controller) fetchIngressSelectedAddresses(ingressPeer *v1alpha1.AdminNetworkPolicyIngressPeer) ([]string, []string, error) {
×
577
        var v4Addresses, v6Addresses []string
×
578

×
579
        // Exactly one of the selector pointers must be set for a given peer.
×
580
        if ingressPeer.Namespaces != nil {
×
581
                nsSelector, err := metav1.LabelSelectorAsSelector(ingressPeer.Namespaces)
×
582
                if err != nil {
×
583
                        return nil, nil, fmt.Errorf("error creating ns label selector, %w", err)
×
584
                }
×
585

586
                _, v4Addresses, v6Addresses, err = c.fetchPods(nsSelector, labels.Everything())
×
587
                if err != nil {
×
588
                        return nil, nil, fmt.Errorf("failed to fetch ingress peer addresses, %w", err)
×
589
                }
×
590
        } else if ingressPeer.Pods != nil {
×
591
                nsSelector, err := metav1.LabelSelectorAsSelector(&ingressPeer.Pods.NamespaceSelector)
×
592
                if err != nil {
×
593
                        return nil, nil, fmt.Errorf("error creating ns label selector, %w", err)
×
594
                }
×
595
                podSelector, err := metav1.LabelSelectorAsSelector(&ingressPeer.Pods.PodSelector)
×
596
                if err != nil {
×
597
                        return nil, nil, fmt.Errorf("error creating pod label selector, %w", err)
×
598
                }
×
599

600
                _, v4Addresses, v6Addresses, err = c.fetchPods(nsSelector, podSelector)
×
601
                if err != nil {
×
602
                        return nil, nil, fmt.Errorf("failed to fetch ingress peer addresses, %w", err)
×
603
                }
×
604
        }
605

606
        return v4Addresses, v6Addresses, nil
×
607
}
608

609
func (c *Controller) fetchEgressSelectedAddresses(egressPeer *v1alpha1.AdminNetworkPolicyEgressPeer) ([]string, []string, error) {
×
610
        var v4Addresses, v6Addresses []string
×
611

×
612
        // Exactly one of the selector pointers must be set for a given peer.
×
613
        switch {
×
614
        case egressPeer.Namespaces != nil:
×
615
                nsSelector, err := metav1.LabelSelectorAsSelector(egressPeer.Namespaces)
×
616
                if err != nil {
×
617
                        return nil, nil, fmt.Errorf("error creating ns label selector, %w", err)
×
618
                }
×
619

620
                _, v4Addresses, v6Addresses, err = c.fetchPods(nsSelector, labels.Everything())
×
621
                if err != nil {
×
622
                        return nil, nil, fmt.Errorf("failed to fetch egress peer addresses, %w", err)
×
623
                }
×
624
        case egressPeer.Pods != nil:
×
625
                nsSelector, err := metav1.LabelSelectorAsSelector(&egressPeer.Pods.NamespaceSelector)
×
626
                if err != nil {
×
627
                        return nil, nil, fmt.Errorf("error creating ns label selector, %w", err)
×
628
                }
×
629
                podSelector, err := metav1.LabelSelectorAsSelector(&egressPeer.Pods.PodSelector)
×
630
                if err != nil {
×
631
                        return nil, nil, fmt.Errorf("error creating pod label selector, %w", err)
×
632
                }
×
633

634
                _, v4Addresses, v6Addresses, err = c.fetchPods(nsSelector, podSelector)
×
635
                if err != nil {
×
636
                        return nil, nil, fmt.Errorf("failed to fetch egress peer addresses, %w", err)
×
637
                }
×
638
        case egressPeer.Nodes != nil:
×
639
                nodesSelector, err := metav1.LabelSelectorAsSelector(egressPeer.Nodes)
×
640
                if err != nil {
×
641
                        return nil, nil, fmt.Errorf("error creating nodes label selector, %w", err)
×
642
                }
×
643
                v4Addresses, v6Addresses, err = c.fetchNodesAddrs(nodesSelector)
×
644
                if err != nil {
×
645
                        return nil, nil, fmt.Errorf("failed to fetch egress peer addresses, %w", err)
×
646
                }
×
647
        case len(egressPeer.Networks) != 0:
×
648
                v4Addresses, v6Addresses = fetchCIDRAddrs(egressPeer.Networks)
×
649
        default:
×
650
                return nil, nil, errors.New("at least one egressPeer must be specified")
×
651
        }
652

653
        return v4Addresses, v6Addresses, nil
×
654
}
655

656
func (c *Controller) createAsForAnpRule(anpName, ruleName, direction, asName string, addresses []string, isBanp bool) error {
×
657
        var err error
×
658
        if isBanp {
×
659
                err = c.OVNNbClient.CreateAddressSet(asName, map[string]string{
×
660
                        baselineAdminNetworkPolicyKey: fmt.Sprintf("%s/%s", anpName, direction),
×
661
                })
×
662
        } else {
×
663
                err = c.OVNNbClient.CreateAddressSet(asName, map[string]string{
×
664
                        adminNetworkPolicyKey: fmt.Sprintf("%s/%s", anpName, direction),
×
665
                })
×
666
        }
×
667
        if err != nil {
×
668
                klog.Errorf("failed to create ovn address set %s for anp/banp rule %s/%s: %v", asName, anpName, ruleName, err)
×
669
                return err
×
670
        }
×
671

672
        if err := c.OVNNbClient.AddressSetUpdateAddress(asName, addresses...); err != nil {
×
673
                klog.Errorf("failed to set addresses %q to address set %s: %v", strings.Join(addresses, ","), asName, err)
×
674
                return err
×
675
        }
×
676

677
        return nil
×
678
}
679

680
func (c *Controller) getCurrentAddrSetByName(anpName string, isBanp bool) (*strset.Set, *strset.Set, error) {
×
681
        curIngressAddrSet := strset.New()
×
682
        curEgressAddrSet := strset.New()
×
683
        var ass []ovnnb.AddressSet
×
684
        var err error
×
685

×
686
        // anp and banp can use same name, so depends on the external_ids key field to distinguish
×
687
        if isBanp {
×
688
                ass, err = c.OVNNbClient.ListAddressSets(map[string]string{
×
689
                        baselineAdminNetworkPolicyKey: fmt.Sprintf("%s/%s", anpName, "ingress"),
×
690
                })
×
691
        } else {
×
692
                ass, err = c.OVNNbClient.ListAddressSets(map[string]string{
×
693
                        adminNetworkPolicyKey: fmt.Sprintf("%s/%s", anpName, "ingress"),
×
694
                })
×
695
        }
×
696
        if err != nil {
×
697
                klog.Errorf("failed to list ingress address sets for anp/banp %s: %v", anpName, err)
×
698
                return curIngressAddrSet, curEgressAddrSet, err
×
699
        }
×
700
        for _, as := range ass {
×
701
                curIngressAddrSet.Add(as.Name)
×
702
        }
×
703

704
        if isBanp {
×
705
                ass, err = c.OVNNbClient.ListAddressSets(map[string]string{
×
706
                        baselineAdminNetworkPolicyKey: fmt.Sprintf("%s/%s", anpName, "egress"),
×
707
                })
×
708
        } else {
×
709
                ass, err = c.OVNNbClient.ListAddressSets(map[string]string{
×
710
                        adminNetworkPolicyKey: fmt.Sprintf("%s/%s", anpName, "egress"),
×
711
                })
×
712
        }
×
713
        if err != nil {
×
714
                klog.Errorf("failed to list egress address sets for anp/banp %s: %v", anpName, err)
×
715
                return curIngressAddrSet, curEgressAddrSet, err
×
716
        }
×
717
        for _, as := range ass {
×
718
                curEgressAddrSet.Add(as.Name)
×
719
        }
×
720

721
        return curIngressAddrSet, curEgressAddrSet, nil
×
722
}
723

724
func (c *Controller) deleteUnusedAddrSetForAnp(curAddrSet, desiredAddrSet *strset.Set) error {
×
725
        toDel := strset.Difference(curAddrSet, desiredAddrSet).List()
×
726

×
727
        for _, asName := range toDel {
×
728
                if err := c.OVNNbClient.DeleteAddressSet(asName); err != nil {
×
729
                        klog.Errorf("failed to delete address set %s, %v", asName, err)
×
730
                        return err
×
731
                }
×
732
        }
733

734
        return nil
×
735
}
736

737
func (c *Controller) setAddrSetForAnpRule(anpName, pgName, ruleName string, index int, from []v1alpha1.AdminNetworkPolicyIngressPeer, to []v1alpha1.AdminNetworkPolicyEgressPeer, isIngress, isBanp bool) error {
×
738
        // 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
×
739

×
740
        var v4Addrs, v4Addr, v6Addrs, v6Addr []string
×
741
        var err error
×
742
        if isIngress {
×
743
                for _, anprpeer := range from {
×
744
                        if v4Addr, v6Addr, err = c.fetchIngressSelectedAddresses(&anprpeer); err != nil {
×
745
                                klog.Errorf("failed to fetch anp/banp ingress selected addresses, %v", err)
×
746
                                return err
×
747
                        }
×
748
                        v4Addrs = append(v4Addrs, v4Addr...)
×
749
                        v6Addrs = append(v6Addrs, v6Addr...)
×
750
                }
751
                klog.Infof("update anp/banp ingress rule %s, selected v4 address %v, v6 address %v", ruleName, v4Addrs, v6Addrs)
×
752

×
753
                gressAsV4Name, gressAsV6Name := getAnpAddressSetName(pgName, ruleName, index, true)
×
754
                if err = c.createAsForAnpRule(anpName, ruleName, "ingress", gressAsV4Name, v4Addrs, isBanp); err != nil {
×
755
                        klog.Error(err)
×
756
                        return err
×
757
                }
×
758
                if err = c.createAsForAnpRule(anpName, ruleName, "ingress", gressAsV6Name, v6Addrs, isBanp); err != nil {
×
759
                        klog.Error(err)
×
760
                        return err
×
761
                }
×
762
        } else {
×
763
                for _, anprpeer := range to {
×
764
                        if v4Addr, v6Addr, err = c.fetchEgressSelectedAddresses(&anprpeer); err != nil {
×
765
                                klog.Errorf("failed to fetch anp/banp egress selected addresses, %v", err)
×
766
                                return err
×
767
                        }
×
768
                        v4Addrs = append(v4Addrs, v4Addr...)
×
769
                        v6Addrs = append(v6Addrs, v6Addr...)
×
770
                }
771
                klog.Infof("update anp/banp egress rule %s, selected v4 address %v, v6 address %v", ruleName, v4Addrs, v6Addrs)
×
772

×
773
                gressAsV4Name, gressAsV6Name := getAnpAddressSetName(pgName, ruleName, index, false)
×
774
                if err = c.createAsForAnpRule(anpName, ruleName, "egress", gressAsV4Name, v4Addrs, isBanp); err != nil {
×
775
                        klog.Error(err)
×
776
                        return err
×
777
                }
×
778
                if err = c.createAsForAnpRule(anpName, ruleName, "egress", gressAsV6Name, v6Addrs, isBanp); err != nil {
×
779
                        klog.Error(err)
×
780
                        return err
×
781
                }
×
782
        }
783

784
        return nil
×
785
}
786

787
func (c *Controller) updateAnpsByLabelsMatch(nsLabels, podLabels map[string]string) {
×
788
        anps, _ := c.anpsLister.List(labels.Everything())
×
789
        for _, anp := range anps {
×
790
                changed := &AdminNetworkPolicyChangedDelta{
×
791
                        key: anp.Name,
×
792
                }
×
793

×
794
                if isLabelsMatch(anp.Spec.Subject.Namespaces, anp.Spec.Subject.Pods, nsLabels, podLabels) {
×
795
                        klog.Infof("anp %s, labels matched for anp's subject, nsLabels %s, podLabels %s", anp.Name, labels.Set(nsLabels).String(), labels.Set(podLabels).String())
×
796
                        changed.field = ChangedSubject
×
797
                        c.updateAnpQueue.Add(changed)
×
798
                }
×
799

800
                ingressRuleNames, egressRuleNames := isLabelsMatchAnpRulePeers(anp.Spec.Ingress, anp.Spec.Egress, nsLabels, podLabels)
×
801
                if !isRulesArrayEmpty(ingressRuleNames) {
×
802
                        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())
×
803
                        changed.ruleNames = ingressRuleNames
×
804
                        changed.field = ChangedIngressRule
×
805
                        c.updateAnpQueue.Add(changed)
×
806
                }
×
807

808
                if !isRulesArrayEmpty(egressRuleNames) {
×
809
                        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())
×
810
                        changed.ruleNames = egressRuleNames
×
811
                        changed.field = ChangedEgressRule
×
812
                        c.updateAnpQueue.Add(changed)
×
813
                }
×
814
        }
815

816
        banps, _ := c.banpsLister.List(labels.Everything())
×
817
        for _, banp := range banps {
×
818
                changed := &AdminNetworkPolicyChangedDelta{
×
819
                        key: banp.Name,
×
820
                }
×
821

×
822
                if isLabelsMatch(banp.Spec.Subject.Namespaces, banp.Spec.Subject.Pods, nsLabels, podLabels) {
×
823
                        klog.Infof("banp %s, labels matched for banp's subject, nsLabels %s, podLabels %s", banp.Name, labels.Set(nsLabels).String(), labels.Set(podLabels).String())
×
824
                        changed.field = ChangedSubject
×
825
                        c.updateBanpQueue.Add(changed)
×
826
                }
×
827

828
                ingressRuleNames, egressRuleNames := isLabelsMatchBanpRulePeers(banp.Spec.Ingress, banp.Spec.Egress, nsLabels, podLabels)
×
829
                if !isRulesArrayEmpty(ingressRuleNames) {
×
830
                        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())
×
831
                        changed.ruleNames = ingressRuleNames
×
832
                        changed.field = ChangedIngressRule
×
833
                        c.updateBanpQueue.Add(changed)
×
834
                }
×
835

836
                if !isRulesArrayEmpty(egressRuleNames) {
×
837
                        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())
×
838
                        changed.ruleNames = egressRuleNames
×
839
                        changed.field = ChangedEgressRule
×
840
                        c.updateBanpQueue.Add(changed)
×
841
                }
×
842
        }
843
}
844

845
func isLabelsMatch(namespaces *metav1.LabelSelector, pods *v1alpha1.NamespacedPod, nsLabels, podLabels map[string]string) bool {
1✔
846
        // Exactly one field of namespaces/pods must be set.
1✔
847
        if namespaces != nil {
2✔
848
                nsSelector, _ := metav1.LabelSelectorAsSelector(namespaces)
1✔
849
                klog.V(3).Infof("namespaces is not nil, nsSelector %s", nsSelector.String())
1✔
850
                if nsSelector.Matches(labels.Set(nsLabels)) {
2✔
851
                        return true
1✔
852
                }
1✔
853
        } else if pods != nil {
2✔
854
                nsSelector, _ := metav1.LabelSelectorAsSelector(&pods.NamespaceSelector)
1✔
855
                podSelector, _ := metav1.LabelSelectorAsSelector(&pods.PodSelector)
1✔
856
                klog.V(3).Infof("pods is not nil, nsSelector %s, podSelector %s", nsSelector.String(), podSelector.String())
1✔
857
                if nsSelector.Matches(labels.Set(nsLabels)) && podSelector.Matches(labels.Set(podLabels)) {
2✔
858
                        return true
1✔
859
                }
1✔
860
        }
861

862
        return false
1✔
863
}
864

865
func isLabelsMatchRulePeers(from []v1alpha1.AdminNetworkPolicyIngressPeer, to []v1alpha1.AdminNetworkPolicyEgressPeer, nsLabels, podLabels map[string]string) bool {
×
866
        for _, ingressPeer := range from {
×
867
                if isLabelsMatch(ingressPeer.Namespaces, ingressPeer.Pods, nsLabels, podLabels) {
×
868
                        return true
×
869
                }
×
870
        }
871

872
        for _, egressPeer := range to {
×
873
                if isLabelsMatch(egressPeer.Namespaces, egressPeer.Pods, nsLabels, podLabels) {
×
874
                        return true
×
875
                }
×
876
        }
877

878
        return false
×
879
}
880

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

×
884
        for index, anpr := range ingress {
×
885
                if isLabelsMatchRulePeers(anpr.From, []v1alpha1.AdminNetworkPolicyEgressPeer{}, nsLabels, podLabels) {
×
886
                        changedIngressRuleNames[index].isMatch = true
×
887
                        changedIngressRuleNames[index].curRuleName = anpr.Name
×
888
                }
×
889
        }
890

891
        for index, anpr := range egress {
×
892
                if isLabelsMatchRulePeers([]v1alpha1.AdminNetworkPolicyIngressPeer{}, anpr.To, nsLabels, podLabels) {
×
893
                        changedEgressRuleNames[index].isMatch = true
×
894
                        changedEgressRuleNames[index].curRuleName = anpr.Name
×
895
                }
×
896
        }
897

898
        return changedIngressRuleNames, changedEgressRuleNames
×
899
}
900

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

×
904
        for index, banpr := range ingress {
×
905
                if isLabelsMatchRulePeers(banpr.From, []v1alpha1.AdminNetworkPolicyEgressPeer{}, nsLabels, podLabels) {
×
906
                        changedIngressRuleNames[index].isMatch = true
×
907
                        changedIngressRuleNames[index].curRuleName = banpr.Name
×
908
                }
×
909
        }
910

911
        for index, banpr := range egress {
×
912
                if isLabelsMatchRulePeers([]v1alpha1.AdminNetworkPolicyIngressPeer{}, banpr.To, nsLabels, podLabels) {
×
913
                        changedEgressRuleNames[index].isMatch = true
×
914
                        changedEgressRuleNames[index].curRuleName = banpr.Name
×
915
                }
×
916
        }
917

918
        return changedIngressRuleNames, changedEgressRuleNames
×
919
}
920

921
func getAnpName(name string) string {
1✔
922
        anpName := name
1✔
923
        nameArray := []rune(name)
1✔
924
        if !unicode.IsLetter(nameArray[0]) {
2✔
925
                anpName = "anp" + name
1✔
926
        }
1✔
927
        return anpName
1✔
928
}
929

930
func getAnpAddressSetName(pgName, ruleName string, index int, isIngress bool) (string, string) {
1✔
931
        var asV4Name, asV6Name string
1✔
932
        if isIngress {
2✔
933
                // In case ruleName is omitted, add direction and index to distinguish address-set
1✔
934
                asV4Name = strings.ReplaceAll(fmt.Sprintf("%s.ingress.%d.%s.%s", pgName, index, ruleName, kubeovnv1.ProtocolIPv4), "-", ".")
1✔
935
                asV6Name = strings.ReplaceAll(fmt.Sprintf("%s.ingress.%d.%s.%s", pgName, index, ruleName, kubeovnv1.ProtocolIPv6), "-", ".")
1✔
936
        } else {
2✔
937
                asV4Name = strings.ReplaceAll(fmt.Sprintf("%s.egress.%d.%s.%s", pgName, index, ruleName, kubeovnv1.ProtocolIPv4), "-", ".")
1✔
938
                asV6Name = strings.ReplaceAll(fmt.Sprintf("%s.egress.%d.%s.%s", pgName, index, ruleName, kubeovnv1.ProtocolIPv6), "-", ".")
1✔
939
        }
1✔
940

941
        return asV4Name, asV6Name
1✔
942
}
943

944
func anpACLAction(action v1alpha1.AdminNetworkPolicyRuleAction) ovnnb.ACLAction {
1✔
945
        switch action {
1✔
946
        case v1alpha1.AdminNetworkPolicyRuleActionAllow:
1✔
947
                return ovnnb.ACLActionAllowRelated
1✔
948
        case v1alpha1.AdminNetworkPolicyRuleActionDeny:
1✔
949
                return ovnnb.ACLActionDrop
1✔
950
        case v1alpha1.AdminNetworkPolicyRuleActionPass:
1✔
951
                return ovnnb.ACLActionPass
1✔
952
        }
953
        return ovnnb.ACLActionDrop
1✔
954
}
955

956
func isRulesArrayEmpty(ruleNames [util.AnpMaxRules]ChangedName) bool {
1✔
957
        for _, ruleName := range ruleNames {
2✔
958
                // The ruleName can be omitted default
1✔
959
                if ruleName.curRuleName != "" || ruleName.isMatch {
2✔
960
                        return false
1✔
961
                }
1✔
962
        }
963
        return true
1✔
964
}
965

966
func (c *Controller) fetchNodesAddrs(nodeSelector labels.Selector) ([]string, []string, error) {
×
967
        nodes, err := c.nodesLister.List(nodeSelector)
×
968
        if err != nil {
×
969
                klog.Errorf("failed to list nodes: %v", err)
×
970
                return nil, nil, err
×
971
        }
×
972
        v4Addresses := make([]string, 0, len(nodes))
×
973
        v6Addresses := make([]string, 0, len(nodes))
×
974

×
975
        klog.V(3).Infof("fetch nodes addresses, selector is %s", nodeSelector.String())
×
976
        for _, node := range nodes {
×
977
                nodeIPv4, nodeIPv6 := util.GetNodeInternalIP(*node)
×
978
                if nodeIPv4 != "" {
×
979
                        v4Addresses = append(v4Addresses, nodeIPv4)
×
980
                }
×
981
                if nodeIPv6 != "" {
×
982
                        v6Addresses = append(v6Addresses, nodeIPv6)
×
983
                }
×
984
        }
985

986
        return v4Addresses, v6Addresses, nil
×
987
}
988

989
func fetchCIDRAddrs(networks []v1alpha1.CIDR) ([]string, []string) {
1✔
990
        var v4Addresses, v6Addresses []string
1✔
991

1✔
992
        for _, network := range networks {
2✔
993
                if _, _, err := net.ParseCIDR(string(network)); err != nil {
2✔
994
                        klog.Errorf("invalid cidr %s", string(network))
1✔
995
                        continue
1✔
996
                }
997
                switch util.CheckProtocol(string(network)) {
1✔
998
                case kubeovnv1.ProtocolIPv4:
1✔
999
                        v4Addresses = append(v4Addresses, string(network))
1✔
1000
                case kubeovnv1.ProtocolIPv6:
1✔
1001
                        v6Addresses = append(v6Addresses, string(network))
1✔
1002
                }
1003
        }
1004

1005
        return v4Addresses, v6Addresses
1✔
1006
}
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