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

kubeovn / kube-ovn / 12308058851

13 Dec 2024 01:46AM UTC coverage: 22.084% (+0.2%) from 21.903%
12308058851

push

github

web-flow
add anp/banp unittests (#4774)

Signed-off-by: 马洪贞 <hzma@alauda.io>
Signed-off-by: zhangzujian <zhangzujian.7@gmail.com>
Co-authored-by: zhangzujian <zhangzujian.7@gmail.com>

16 of 20 new or added lines in 2 files covered. (80.0%)

2 existing lines in 1 file now uncovered.

10267 of 46491 relevant lines covered (22.08%)

0.26 hits per line

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

9.83
/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
        utilruntime "k8s.io/apimachinery/pkg/util/runtime"
16
        "k8s.io/client-go/tools/cache"
17
        "k8s.io/klog/v2"
18
        v1alpha1 "sigs.k8s.io/network-policy-api/apis/v1alpha1"
19

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

26
type ChangedField string
27

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

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

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

47
func (c *Controller) enqueueAddAnp(obj interface{}) {
×
48
        var key string
×
49
        var err error
×
50
        if key, err = cache.MetaNamespaceKeyFunc(obj); err != nil {
×
51
                utilruntime.HandleError(err)
×
52
                return
×
53
        }
×
54
        klog.V(3).Infof("enqueue add anp %s", key)
×
55
        c.addAnpQueue.Add(key)
×
56
}
57

58
func (c *Controller) enqueueDeleteAnp(obj interface{}) {
×
59
        anp := obj.(*v1alpha1.AdminNetworkPolicy)
×
60
        klog.V(3).Infof("enqueue delete anp %s", anp.Name)
×
61
        c.deleteAnpQueue.Add(anp)
×
62
}
×
63

64
func (c *Controller) enqueueUpdateAnp(oldObj, newObj interface{}) {
×
65
        oldAnpObj := oldObj.(*v1alpha1.AdminNetworkPolicy)
×
66
        newAnpObj := newObj.(*v1alpha1.AdminNetworkPolicy)
×
67

×
68
        // All the acls should be recreated with the following situations
×
69
        if oldAnpObj.Spec.Priority != newAnpObj.Spec.Priority || len(oldAnpObj.Spec.Ingress) != len(newAnpObj.Spec.Ingress) || len(oldAnpObj.Spec.Egress) != len(newAnpObj.Spec.Egress) {
×
70
                c.addAnpQueue.Add(newAnpObj.Name)
×
71
                return
×
72
        }
×
73

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

85
        for index, rule := range newAnpObj.Spec.Egress {
×
86
                oldRule := oldAnpObj.Spec.Egress[index]
×
87
                if oldRule.Action != rule.Action || !reflect.DeepEqual(oldRule.Ports, rule.Ports) {
×
88
                        c.addAnpQueue.Add(newAnpObj.Name)
×
89
                        return
×
90
                }
×
91
        }
92

93
        if oldAnpObj.Annotations[util.ACLActionsLogAnnotation] != newAnpObj.Annotations[util.ACLActionsLogAnnotation] {
×
94
                c.addAnpQueue.Add(newAnpObj.Name)
×
95
                return
×
96
        }
×
97
        klog.V(3).Infof("enqueue update anp %s", newAnpObj.Name)
×
98

×
99
        // The remaining changes do not affect the acls. The port-group or address-set should be updated.
×
100
        // The port-group for anp should be updated
×
101
        if !reflect.DeepEqual(oldAnpObj.Spec.Subject, newAnpObj.Spec.Subject) {
×
102
                c.updateAnpQueue.Add(&AdminNetworkPolicyChangedDelta{key: newAnpObj.Name, field: ChangedSubject})
×
103
        }
×
104

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

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

140
func (c *Controller) handleAddAnp(key string) (err error) {
×
141
        c.anpKeyMutex.LockKey(key)
×
142
        defer func() { _ = c.anpKeyMutex.UnlockKey(key) }()
×
143

144
        cachedAnp, err := c.anpsLister.Get(key)
×
145
        if err != nil {
×
146
                if k8serrors.IsNotFound(err) {
×
147
                        return nil
×
148
                }
×
149
                klog.Error(err)
×
150
                return err
×
151
        }
152
        klog.Infof("handle add anp %s", cachedAnp.Name)
×
153
        anp := cachedAnp.DeepCopy()
×
154

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

×
167
        anpName := getAnpName(anp.Name)
×
168
        var logActions []string
×
169
        if anp.Annotations[util.ACLActionsLogAnnotation] != "" {
×
170
                logActions = strings.Split(anp.Annotations[util.ACLActionsLogAnnotation], ",")
×
171
        }
×
172

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

182
        ports, err := c.fetchSelectedPods(&anp.Spec.Subject)
×
183
        if err != nil {
×
184
                klog.Errorf("failed to fetch ports belongs to anp %s: %v", key, err)
×
185
                return err
×
186
        }
×
187

188
        if err = c.OVNNbClient.PortGroupSetPorts(pgName, ports); err != nil {
×
189
                klog.Errorf("failed to set ports %v to port group %s: %v", ports, pgName, err)
×
190
                return err
×
191
        }
×
192

193
        ingressACLOps, err := c.OVNNbClient.DeleteAclsOps(pgName, portGroupKey, "to-lport", nil)
×
194
        if err != nil {
×
195
                klog.Errorf("failed to generate clear operations for anp %s ingress acls: %v", key, err)
×
196
                return err
×
197
        }
×
198

199
        curIngressAddrSet, curEgressAddrSet, err := c.getCurrentAddrSetByName(anpName, false)
×
200
        if err != nil {
×
201
                klog.Errorf("failed to list address sets for anp %s: %v", key, err)
×
202
                return err
×
203
        }
×
204
        desiredIngressAddrSet := strset.NewWithSize(len(anp.Spec.Ingress) * 2)
×
205
        desiredEgressAddrSet := strset.NewWithSize(len(anp.Spec.Egress) * 2)
×
206

×
207
        // create ingress acl
×
208
        for index, anpr := range anp.Spec.Ingress {
×
209
                // 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
×
210
                ingressAsV4Name, ingressAsV6Name := getAnpAddressSetName(pgName, anpr.Name, index, true)
×
211
                desiredIngressAddrSet.Add(ingressAsV4Name, ingressAsV6Name)
×
212

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

×
225
                if err = c.createAsForAnpRule(anpName, anpr.Name, "ingress", ingressAsV4Name, v4Addrs, false); err != nil {
×
226
                        klog.Error(err)
×
227
                        return err
×
228
                }
×
229
                if err = c.createAsForAnpRule(anpName, anpr.Name, "ingress", ingressAsV6Name, v6Addrs, false); err != nil {
×
230
                        klog.Error(err)
×
231
                        return err
×
232
                }
×
233

234
                aclPriority := util.AnpACLMaxPriority - int(anp.Spec.Priority*100) - index
×
NEW
235
                aclAction := anpACLAction(anpr.Action)
×
236
                rulePorts := []v1alpha1.AdminNetworkPolicyPort{}
×
237
                if anpr.Ports != nil {
×
238
                        rulePorts = *anpr.Ports
×
239
                }
×
240

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

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

262
        if err := c.OVNNbClient.Transact("add-ingress-acls", ingressACLOps); err != nil {
×
263
                return fmt.Errorf("failed to add ingress acls for anp %s: %w", key, err)
×
264
        }
×
265
        if err := c.deleteUnusedAddrSetForAnp(curIngressAddrSet, desiredIngressAddrSet); err != nil {
×
266
                return fmt.Errorf("failed to delete unused ingress address set for anp %s: %w", key, err)
×
267
        }
×
268

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

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

×
292
                if err = c.createAsForAnpRule(anpName, anpr.Name, "egress", egressAsV4Name, v4Addrs, false); err != nil {
×
293
                        klog.Error(err)
×
294
                        return err
×
295
                }
×
296
                if err = c.createAsForAnpRule(anpName, anpr.Name, "egress", egressAsV6Name, v6Addrs, false); err != nil {
×
297
                        klog.Error(err)
×
298
                        return err
×
299
                }
×
300

301
                aclPriority := util.AnpACLMaxPriority - int(anp.Spec.Priority*100) - index
×
NEW
302
                aclAction := anpACLAction(anpr.Action)
×
303
                rulePorts := []v1alpha1.AdminNetworkPolicyPort{}
×
304
                if anpr.Ports != nil {
×
305
                        rulePorts = *anpr.Ports
×
306
                }
×
307

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

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

329
        if err := c.OVNNbClient.Transact("add-egress-acls", egressACLOps); err != nil {
×
330
                return fmt.Errorf("failed to add egress acls for anp %s: %w", key, err)
×
331
        }
×
332
        if err := c.deleteUnusedAddrSetForAnp(curEgressAddrSet, desiredEgressAddrSet); err != nil {
×
333
                return fmt.Errorf("failed to delete unused egress address set for anp %s: %w", key, err)
×
334
        }
×
335

336
        return nil
×
337
}
338

339
func (c *Controller) handleDeleteAnp(anp *v1alpha1.AdminNetworkPolicy) error {
×
340
        c.anpKeyMutex.LockKey(anp.Name)
×
341
        defer func() { _ = c.anpKeyMutex.UnlockKey(anp.Name) }()
×
342

343
        klog.Infof("handle delete admin network policy %s", anp.Name)
×
344
        delete(c.anpPrioNameMap, anp.Spec.Priority)
×
345
        delete(c.anpNamePrioMap, anp.Name)
×
346

×
347
        anpName := getAnpName(anp.Name)
×
348

×
349
        // ACLs releated to port_group will be deleted automatically when port_group is deleted
×
350
        pgName := strings.ReplaceAll(anpName, "-", ".")
×
351
        if err := c.OVNNbClient.DeletePortGroup(pgName); err != nil {
×
352
                klog.Errorf("failed to delete port group for anp %s: %v", anpName, err)
×
353
        }
×
354

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

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

369
        return nil
×
370
}
371

372
func (c *Controller) handleUpdateAnp(changed *AdminNetworkPolicyChangedDelta) error {
×
373
        // Only handle updates that do not affect acls.
×
374
        c.anpKeyMutex.LockKey(changed.key)
×
375
        defer func() { _ = c.anpKeyMutex.UnlockKey(changed.key) }()
×
376

377
        cachedAnp, err := c.anpsLister.Get(changed.key)
×
378
        if err != nil {
×
379
                if k8serrors.IsNotFound(err) {
×
380
                        return nil
×
381
                }
×
382
                klog.Error(err)
×
383
                return err
×
384
        }
385
        desiredAnp := cachedAnp.DeepCopy()
×
386
        klog.Infof("handle update admin network policy %s", desiredAnp.Name)
×
387

×
388
        anpName := getAnpName(desiredAnp.Name)
×
389
        pgName := strings.ReplaceAll(anpName, "-", ".")
×
390

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

399
                ports, err := c.fetchSelectedPods(&desiredAnp.Spec.Subject)
×
400
                if err != nil {
×
401
                        klog.Errorf("failed to fetch ports belongs to anp %s: %v", desiredAnp.Name, err)
×
402
                        return err
×
403
                }
×
404

405
                if err = c.OVNNbClient.PortGroupSetPorts(pgName, ports); err != nil {
×
406
                        klog.Errorf("failed to set ports %v to port group %s: %v", ports, pgName, err)
×
407
                        return err
×
408
                }
×
409
        }
410

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

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

×
427
                                        if err := c.OVNNbClient.DeleteAddressSet(oldAsV4Name); err != nil {
×
428
                                                klog.Errorf("failed to delete address set %s, %v", oldAsV4Name, err)
×
429
                                                // just record error log
×
430
                                        }
×
431
                                        if err := c.OVNNbClient.DeleteAddressSet(oldAsV6Name); err != nil {
×
432
                                                klog.Errorf("failed to delete address set %s, %v", oldAsV6Name, err)
×
433
                                        }
×
434
                                }
435
                        }
436
                }
437
        }
438

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

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

×
454
                                        if err := c.OVNNbClient.DeleteAddressSet(oldAsV4Name); err != nil {
×
455
                                                klog.Errorf("failed to delete address set %s, %v", oldAsV4Name, err)
×
456
                                                // just record error log
×
457
                                        }
×
458
                                        if err := c.OVNNbClient.DeleteAddressSet(oldAsV6Name); err != nil {
×
459
                                                klog.Errorf("failed to delete address set %s, %v", oldAsV6Name, err)
×
460
                                        }
×
461
                                }
462
                        }
463
                }
464
        }
465

466
        return nil
×
467
}
468

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

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

485
        if len(anp.Spec.Ingress) > util.AnpMaxRules || len(anp.Spec.Egress) > util.AnpMaxRules {
1✔
486
                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)
×
487
                klog.Error(err)
×
488
                return err
×
489
        }
×
490

491
        return nil
1✔
492
}
493

494
func (c *Controller) fetchSelectedPods(anpSubject *v1alpha1.AdminNetworkPolicySubject) ([]string, error) {
×
495
        var ports []string
×
496

×
497
        // Exactly one field must be set.
×
498
        if anpSubject.Namespaces != nil {
×
499
                nsSelector, err := metav1.LabelSelectorAsSelector(anpSubject.Namespaces)
×
500
                if err != nil {
×
501
                        return nil, fmt.Errorf("error creating ns label selector, %w", err)
×
502
                }
×
503

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

518
                ports, _, _, err = c.fetchPods(nsSelector, podSelector)
×
519
                if err != nil {
×
520
                        return nil, fmt.Errorf("failed to fetch pods, %w", err)
×
521
                }
×
522
        }
523
        klog.Infof("get selected ports for subject, %v", ports)
×
524
        return ports, nil
×
525
}
526

527
func (c *Controller) fetchPods(nsSelector, podSelector labels.Selector) ([]string, []string, []string, error) {
×
528
        ports := make([]string, 0, util.AnpMaxRules)
×
529
        v4Addresses := make([]string, 0, util.AnpMaxRules)
×
530
        v6Addresses := make([]string, 0, util.AnpMaxRules)
×
531

×
532
        namespaces, err := c.namespacesLister.List(nsSelector)
×
533
        if err != nil {
×
534
                klog.Errorf("failed to list namespaces: %v", err)
×
535
                return nil, nil, nil, err
×
536
        }
×
537

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

545
                for _, pod := range pods {
×
546
                        if pod.Spec.HostNetwork {
×
547
                                continue
×
548
                        }
549
                        podName := c.getNameByPod(pod)
×
550

×
551
                        podNets, err := c.getPodKubeovnNets(pod)
×
552
                        if err != nil {
×
553
                                return nil, nil, nil, fmt.Errorf("failed to get pod networks, %w", err)
×
554
                        }
×
555

556
                        for _, podNet := range podNets {
×
557
                                if !isOvnSubnet(podNet.Subnet) {
×
558
                                        continue
×
559
                                }
560

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

×
564
                                        podIPAnnotation := pod.Annotations[fmt.Sprintf(util.IPAddressAnnotationTemplate, podNet.ProviderName)]
×
565
                                        podIPs := strings.Split(podIPAnnotation, ",")
×
566
                                        for _, podIP := range podIPs {
×
567
                                                switch util.CheckProtocol(podIP) {
×
568
                                                case kubeovnv1.ProtocolIPv4:
×
569
                                                        v4Addresses = append(v4Addresses, podIP)
×
570
                                                case kubeovnv1.ProtocolIPv6:
×
571
                                                        v6Addresses = append(v6Addresses, podIP)
×
572
                                                }
573
                                        }
574
                                }
575
                        }
576
                }
577
        }
578

579
        return ports, v4Addresses, v6Addresses, nil
×
580
}
581

582
func (c *Controller) fetchIngressSelectedAddresses(ingressPeer *v1alpha1.AdminNetworkPolicyIngressPeer) ([]string, []string, error) {
×
583
        var v4Addresses, v6Addresses []string
×
584

×
585
        // Exactly one of the selector pointers must be set for a given peer.
×
586
        if ingressPeer.Namespaces != nil {
×
587
                nsSelector, err := metav1.LabelSelectorAsSelector(ingressPeer.Namespaces)
×
588
                if err != nil {
×
589
                        return nil, nil, fmt.Errorf("error creating ns label selector, %w", err)
×
590
                }
×
591

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

606
                _, v4Addresses, v6Addresses, err = c.fetchPods(nsSelector, podSelector)
×
607
                if err != nil {
×
608
                        return nil, nil, fmt.Errorf("failed to fetch ingress peer addresses, %w", err)
×
609
                }
×
610
        }
611

612
        return v4Addresses, v6Addresses, nil
×
613
}
614

615
func (c *Controller) fetchEgressSelectedAddresses(egressPeer *v1alpha1.AdminNetworkPolicyEgressPeer) ([]string, []string, error) {
×
616
        var v4Addresses, v6Addresses []string
×
617

×
618
        // Exactly one of the selector pointers must be set for a given peer.
×
619
        switch {
×
620
        case egressPeer.Namespaces != nil:
×
621
                nsSelector, err := metav1.LabelSelectorAsSelector(egressPeer.Namespaces)
×
622
                if err != nil {
×
623
                        return nil, nil, fmt.Errorf("error creating ns label selector, %w", err)
×
624
                }
×
625

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

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

659
        return v4Addresses, v6Addresses, nil
×
660
}
661

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

678
        if err := c.OVNNbClient.AddressSetUpdateAddress(asName, addresses...); err != nil {
×
679
                klog.Errorf("failed to set addresses %q to address set %s: %v", strings.Join(addresses, ","), asName, err)
×
680
                return err
×
681
        }
×
682

683
        return nil
×
684
}
685

686
func (c *Controller) getCurrentAddrSetByName(anpName string, isBanp bool) (*strset.Set, *strset.Set, error) {
×
687
        curIngressAddrSet := strset.New()
×
688
        curEgressAddrSet := strset.New()
×
689
        var ass []ovnnb.AddressSet
×
690
        var err error
×
691

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

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

727
        return curIngressAddrSet, curEgressAddrSet, nil
×
728
}
729

730
func (c *Controller) deleteUnusedAddrSetForAnp(curAddrSet, desiredAddrSet *strset.Set) error {
×
731
        toDel := strset.Difference(curAddrSet, desiredAddrSet).List()
×
732

×
733
        for _, asName := range toDel {
×
734
                if err := c.OVNNbClient.DeleteAddressSet(asName); err != nil {
×
735
                        klog.Errorf("failed to delete address set %s, %v", asName, err)
×
736
                        return err
×
737
                }
×
738
        }
739

740
        return nil
×
741
}
742

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

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

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

×
779
                gressAsV4Name, gressAsV6Name := getAnpAddressSetName(pgName, ruleName, index, false)
×
780
                if err = c.createAsForAnpRule(anpName, ruleName, "egress", gressAsV4Name, v4Addrs, isBanp); err != nil {
×
781
                        klog.Error(err)
×
782
                        return err
×
783
                }
×
784
                if err = c.createAsForAnpRule(anpName, ruleName, "egress", gressAsV6Name, v6Addrs, isBanp); err != nil {
×
785
                        klog.Error(err)
×
786
                        return err
×
787
                }
×
788
        }
789

790
        return nil
×
791
}
792

793
func (c *Controller) updateAnpsByLabelsMatch(nsLabels, podLabels map[string]string) {
×
794
        anps, _ := c.anpsLister.List(labels.Everything())
×
795
        for _, anp := range anps {
×
796
                changed := &AdminNetworkPolicyChangedDelta{
×
797
                        key: anp.Name,
×
798
                }
×
799

×
800
                if isLabelsMatch(anp.Spec.Subject.Namespaces, anp.Spec.Subject.Pods, nsLabels, podLabels) {
×
801
                        klog.Infof("anp %s, labels matched for anp's subject, nsLabels %s, podLabels %s", anp.Name, labels.Set(nsLabels).String(), labels.Set(podLabels).String())
×
802
                        changed.field = ChangedSubject
×
803
                        c.updateAnpQueue.Add(changed)
×
804
                }
×
805

806
                ingressRuleNames, egressRuleNames := isLabelsMatchAnpRulePeers(anp.Spec.Ingress, anp.Spec.Egress, nsLabels, podLabels)
×
807
                if !isRulesArrayEmpty(ingressRuleNames) {
×
808
                        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())
×
809
                        changed.ruleNames = ingressRuleNames
×
810
                        changed.field = ChangedIngressRule
×
811
                        c.updateAnpQueue.Add(changed)
×
812
                }
×
813

814
                if !isRulesArrayEmpty(egressRuleNames) {
×
815
                        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())
×
816
                        changed.ruleNames = egressRuleNames
×
817
                        changed.field = ChangedEgressRule
×
818
                        c.updateAnpQueue.Add(changed)
×
819
                }
×
820
        }
821

822
        banps, _ := c.banpsLister.List(labels.Everything())
×
823
        for _, banp := range banps {
×
824
                changed := &AdminNetworkPolicyChangedDelta{
×
825
                        key: banp.Name,
×
826
                }
×
827

×
828
                if isLabelsMatch(banp.Spec.Subject.Namespaces, banp.Spec.Subject.Pods, nsLabels, podLabels) {
×
829
                        klog.Infof("banp %s, labels matched for banp's subject, nsLabels %s, podLabels %s", banp.Name, labels.Set(nsLabels).String(), labels.Set(podLabels).String())
×
830
                        changed.field = ChangedSubject
×
831
                        c.updateBanpQueue.Add(changed)
×
832
                }
×
833

834
                ingressRuleNames, egressRuleNames := isLabelsMatchBanpRulePeers(banp.Spec.Ingress, banp.Spec.Egress, nsLabels, podLabels)
×
835
                if !isRulesArrayEmpty(ingressRuleNames) {
×
836
                        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())
×
837
                        changed.ruleNames = ingressRuleNames
×
838
                        changed.field = ChangedIngressRule
×
839
                        c.updateBanpQueue.Add(changed)
×
840
                }
×
841

842
                if !isRulesArrayEmpty(egressRuleNames) {
×
843
                        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())
×
844
                        changed.ruleNames = egressRuleNames
×
845
                        changed.field = ChangedEgressRule
×
846
                        c.updateBanpQueue.Add(changed)
×
847
                }
×
848
        }
849
}
850

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

868
        return false
1✔
869
}
870

871
func isLabelsMatchRulePeers(from []v1alpha1.AdminNetworkPolicyIngressPeer, to []v1alpha1.AdminNetworkPolicyEgressPeer, nsLabels, podLabels map[string]string) bool {
×
872
        for _, ingressPeer := range from {
×
873
                if isLabelsMatch(ingressPeer.Namespaces, ingressPeer.Pods, nsLabels, podLabels) {
×
874
                        return true
×
875
                }
×
876
        }
877

878
        for _, egressPeer := range to {
×
879
                if isLabelsMatch(egressPeer.Namespaces, egressPeer.Pods, nsLabels, podLabels) {
×
880
                        return true
×
881
                }
×
882
        }
883

884
        return false
×
885
}
886

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

×
890
        for index, anpr := range ingress {
×
891
                if isLabelsMatchRulePeers(anpr.From, []v1alpha1.AdminNetworkPolicyEgressPeer{}, nsLabels, podLabels) {
×
892
                        changedIngressRuleNames[index].isMatch = true
×
893
                        changedIngressRuleNames[index].curRuleName = anpr.Name
×
894
                }
×
895
        }
896

897
        for index, anpr := range egress {
×
898
                if isLabelsMatchRulePeers([]v1alpha1.AdminNetworkPolicyIngressPeer{}, anpr.To, nsLabels, podLabels) {
×
899
                        changedEgressRuleNames[index].isMatch = true
×
900
                        changedEgressRuleNames[index].curRuleName = anpr.Name
×
901
                }
×
902
        }
903

904
        return changedIngressRuleNames, changedEgressRuleNames
×
905
}
906

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

×
910
        for index, banpr := range ingress {
×
911
                if isLabelsMatchRulePeers(banpr.From, []v1alpha1.AdminNetworkPolicyEgressPeer{}, nsLabels, podLabels) {
×
912
                        changedIngressRuleNames[index].isMatch = true
×
913
                        changedIngressRuleNames[index].curRuleName = banpr.Name
×
914
                }
×
915
        }
916

917
        for index, banpr := range egress {
×
918
                if isLabelsMatchRulePeers([]v1alpha1.AdminNetworkPolicyIngressPeer{}, banpr.To, nsLabels, podLabels) {
×
919
                        changedEgressRuleNames[index].isMatch = true
×
920
                        changedEgressRuleNames[index].curRuleName = banpr.Name
×
921
                }
×
922
        }
923

924
        return changedIngressRuleNames, changedEgressRuleNames
×
925
}
926

927
func getAnpName(name string) string {
1✔
928
        anpName := name
1✔
929
        nameArray := []rune(name)
1✔
930
        if !unicode.IsLetter(nameArray[0]) {
2✔
931
                anpName = "anp" + name
1✔
932
        }
1✔
933
        return anpName
1✔
934
}
935

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

947
        return asV4Name, asV6Name
1✔
948
}
949

950
func anpACLAction(action v1alpha1.AdminNetworkPolicyRuleAction) ovnnb.ACLAction {
1✔
951
        switch action {
1✔
952
        case v1alpha1.AdminNetworkPolicyRuleActionAllow:
1✔
953
                return ovnnb.ACLActionAllowRelated
1✔
954
        case v1alpha1.AdminNetworkPolicyRuleActionDeny:
1✔
955
                return ovnnb.ACLActionDrop
1✔
956
        case v1alpha1.AdminNetworkPolicyRuleActionPass:
1✔
957
                return ovnnb.ACLActionPass
1✔
958
        }
959
        return ovnnb.ACLActionDrop
1✔
960
}
961

962
func isRulesArrayEmpty(ruleNames [util.AnpMaxRules]ChangedName) bool {
1✔
963
        for _, ruleName := range ruleNames {
2✔
964
                // The ruleName can be omitted default
1✔
965
                if ruleName.curRuleName != "" || ruleName.isMatch {
2✔
966
                        return false
1✔
967
                }
1✔
968
        }
969
        return true
1✔
970
}
971

972
func (c *Controller) fetchNodesAddrs(nodeSelector labels.Selector) ([]string, []string, error) {
×
973
        nodes, err := c.nodesLister.List(nodeSelector)
×
974
        if err != nil {
×
975
                klog.Errorf("failed to list nodes: %v", err)
×
976
                return nil, nil, err
×
977
        }
×
978
        v4Addresses := make([]string, 0, len(nodes))
×
979
        v6Addresses := make([]string, 0, len(nodes))
×
980

×
981
        klog.V(3).Infof("fetch nodes addresses, selector is %s", nodeSelector.String())
×
982
        for _, node := range nodes {
×
983
                nodeIPv4, nodeIPv6 := util.GetNodeInternalIP(*node)
×
984
                if nodeIPv4 != "" {
×
985
                        v4Addresses = append(v4Addresses, nodeIPv4)
×
986
                }
×
987
                if nodeIPv6 != "" {
×
988
                        v6Addresses = append(v6Addresses, nodeIPv6)
×
989
                }
×
990
        }
991

992
        return v4Addresses, v6Addresses, nil
×
993
}
994

995
func fetchCIDRAddrs(networks []v1alpha1.CIDR) ([]string, []string) {
1✔
996
        var v4Addresses, v6Addresses []string
1✔
997

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

1011
        return v4Addresses, v6Addresses
1✔
1012
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc