-
Notifications
You must be signed in to change notification settings - Fork 332
/
copp.go
99 lines (85 loc) · 2.99 KB
/
copp.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
package ovn
import (
"fmt"
libovsdbclient "github.com/ovn-org/libovsdb/client"
libovsdbops "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/libovsdb/ops"
"github.com/ovn-org/ovn-kubernetes/go-controller/pkg/nbdb"
"github.com/ovn-org/ovn-kubernetes/go-controller/pkg/types"
)
const (
// Default Meters created on GRs.
OVNARPRateLimiter = "arp"
OVNARPResolveRateLimiter = "arp-resolve"
OVNBFDRateLimiter = "bfd"
OVNControllerEventsRateLimiter = "event-elb"
OVNICMPV4ErrorsRateLimiter = "icmp4-error"
OVNICMPV6ErrorsRateLimiter = "icmp6-error"
OVNRejectRateLimiter = "reject"
OVNTCPRSTRateLimiter = "tcp-reset"
OVNServiceMonitorLimiter = "svc-monitor"
// Default COPP object name
defaultCOPPName = "ovnkube-default"
)
var defaultProtocolNames = [...]string{
OVNARPRateLimiter,
OVNARPResolveRateLimiter,
OVNBFDRateLimiter,
OVNControllerEventsRateLimiter,
OVNICMPV4ErrorsRateLimiter,
OVNICMPV6ErrorsRateLimiter,
OVNRejectRateLimiter,
OVNTCPRSTRateLimiter,
OVNServiceMonitorLimiter,
}
func getMeterNameForProtocol(protocol string) string {
// format: <OVNSupportedProtocolName>-rate-limiter
return protocol + "-" + types.OvnRateLimitingMeter
}
// EnsureDefaultCOPP creates the default COPP that needs to be added to each GR
// if not already present. Also cleans up old COPP entries if required.
func EnsureDefaultCOPP(nbClient libovsdbclient.Client) (string, error) {
p := func(item *nbdb.Copp) bool {
return item.Name == ""
}
ops, err := libovsdbops.DeleteCOPPsWithPredicateOps(nbClient, nil, p)
if err != nil {
return "", fmt.Errorf("failed to delete duplicate COPPs: %w", err)
}
band := &nbdb.MeterBand{
Action: types.MeterAction,
Rate: int(25), // hard-coding for now. TODO(tssurya): make this configurable if needed
}
ops, err = libovsdbops.CreateMeterBandOps(nbClient, ops, band)
if err != nil {
return "", fmt.Errorf("can't create meter band %v: %v", band, err)
}
meterNames := make(map[string]string, len(defaultProtocolNames))
meterFairness := true
for _, protocol := range defaultProtocolNames {
// format: <OVNSupportedProtocolName>-rate-limiter
meterName := getMeterNameForProtocol(protocol)
meterNames[protocol] = meterName
meter := &nbdb.Meter{
Name: meterName,
Fair: &meterFairness,
Unit: types.PacketsPerSecond,
}
ops, err = libovsdbops.CreateOrUpdateMeterOps(nbClient, ops, meter, []*nbdb.MeterBand{band},
&meter.Bands, &meter.Fair, &meter.Unit)
if err != nil {
return "", fmt.Errorf("can't create meter %v: %v", meter, err)
}
}
defaultCOPP := &nbdb.Copp{
Name: defaultCOPPName,
Meters: meterNames,
}
ops, err = libovsdbops.CreateOrUpdateCOPPsOps(nbClient, ops, defaultCOPP)
if err != nil {
return "", fmt.Errorf("failed to create/update default COPP: %w", err)
}
if _, err := libovsdbops.TransactAndCheckAndSetUUIDs(nbClient, defaultCOPP, ops); err != nil {
return "", fmt.Errorf("failed to transact default COPP: %w", err)
}
return defaultCOPP.UUID, nil
}