Skip to content

Commit a3c3b47

Browse files
project: UDP NodeBalancers (#751)
* Add support for NodeBalancers UDP (#630) * WIP * Finish up * Add integration tests * Add NB unit test * Add config unit test * Replace TODO * Render fixtures * Re-render unrelated fixture * Merge main into proj/nb-udp * Updated GetCreateOptions to handle 0 udpCheckPort * Added LA notices * Fix lint * Reran fixtures --------- Co-authored-by: Lena Garber <[email protected]> Co-authored-by: Lena Garber <[email protected]>
1 parent a13a99b commit a3c3b47

37 files changed

+6430
-4811
lines changed

nodebalancer.go

Lines changed: 34 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,11 @@ type NodeBalancer struct {
2424
IPv6 *string `json:"ipv6"`
2525
// Throttle connections per second (0-20). Set to 0 (zero) to disable throttling.
2626
ClientConnThrottle int `json:"client_conn_throttle"`
27+
28+
// ClientUDPSessThrottle throttles UDP sessions per second. Set to 0 (zero) to disable throttling.
29+
// NOTE: ClientUDPSessThrottle may not currently be available to all users.
30+
ClientUDPSessThrottle int `json:"client_udp_sess_throttle"`
31+
2732
// Information about the amount of transfer this NodeBalancer has had so far this month.
2833
Transfer NodeBalancerTransfer `json:"transfer"`
2934
// This NodeBalancer's plan Type
@@ -55,21 +60,29 @@ type NodeBalancerVPCOptions struct {
5560

5661
// NodeBalancerCreateOptions are the options permitted for CreateNodeBalancer
5762
type NodeBalancerCreateOptions struct {
58-
Label *string `json:"label,omitempty"`
59-
Region string `json:"region,omitempty"`
60-
ClientConnThrottle *int `json:"client_conn_throttle,omitempty"`
61-
Configs []*NodeBalancerConfigCreateOptions `json:"configs,omitempty"`
62-
Tags []string `json:"tags"`
63-
FirewallID int `json:"firewall_id,omitempty"`
64-
Type NodeBalancerPlanType `json:"type,omitempty"`
65-
VPCs []NodeBalancerVPCOptions `json:"vpcs,omitempty"`
63+
Label *string `json:"label,omitempty"`
64+
Region string `json:"region,omitempty"`
65+
ClientConnThrottle *int `json:"client_conn_throttle,omitempty"`
66+
67+
// NOTE: ClientUDPSessThrottle may not currently be available to all users.
68+
ClientUDPSessThrottle *int `json:"client_udp_sess_throttle,omitempty"`
69+
70+
Configs []*NodeBalancerConfigCreateOptions `json:"configs,omitempty"`
71+
Tags []string `json:"tags"`
72+
FirewallID int `json:"firewall_id,omitempty"`
73+
Type NodeBalancerPlanType `json:"type,omitempty"`
74+
VPCs []NodeBalancerVPCOptions `json:"vpcs,omitempty"`
6675
}
6776

6877
// NodeBalancerUpdateOptions are the options permitted for UpdateNodeBalancer
6978
type NodeBalancerUpdateOptions struct {
70-
Label *string `json:"label,omitempty"`
71-
ClientConnThrottle *int `json:"client_conn_throttle,omitempty"`
72-
Tags *[]string `json:"tags,omitempty"`
79+
Label *string `json:"label,omitempty"`
80+
ClientConnThrottle *int `json:"client_conn_throttle,omitempty"`
81+
82+
// NOTE: ClientUDPSessThrottle may not currently be available to all users.
83+
ClientUDPSessThrottle *int `json:"client_udp_sess_throttle,omitempty"`
84+
85+
Tags *[]string `json:"tags,omitempty"`
7386
}
7487

7588
// NodeBalancerPlanType constants start with NBType and include Linode API NodeBalancer's plan types
@@ -106,20 +119,22 @@ func (i *NodeBalancer) UnmarshalJSON(b []byte) error {
106119
// GetCreateOptions converts a NodeBalancer to NodeBalancerCreateOptions for use in CreateNodeBalancer
107120
func (i NodeBalancer) GetCreateOptions() NodeBalancerCreateOptions {
108121
return NodeBalancerCreateOptions{
109-
Label: i.Label,
110-
Region: i.Region,
111-
ClientConnThrottle: &i.ClientConnThrottle,
112-
Type: i.Type,
113-
Tags: i.Tags,
122+
Label: i.Label,
123+
Region: i.Region,
124+
ClientConnThrottle: &i.ClientConnThrottle,
125+
ClientUDPSessThrottle: &i.ClientUDPSessThrottle,
126+
Type: i.Type,
127+
Tags: i.Tags,
114128
}
115129
}
116130

117131
// GetUpdateOptions converts a NodeBalancer to NodeBalancerUpdateOptions for use in UpdateNodeBalancer
118132
func (i NodeBalancer) GetUpdateOptions() NodeBalancerUpdateOptions {
119133
return NodeBalancerUpdateOptions{
120-
Label: i.Label,
121-
ClientConnThrottle: &i.ClientConnThrottle,
122-
Tags: &i.Tags,
134+
Label: i.Label,
135+
ClientConnThrottle: &i.ClientConnThrottle,
136+
ClientUDPSessThrottle: &i.ClientUDPSessThrottle,
137+
Tags: &i.Tags,
123138
}
124139
}
125140

nodebalancer_configs.go

Lines changed: 83 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,26 @@ import (
66

77
// NodeBalancerConfig objects allow a NodeBalancer to accept traffic on a new port
88
type NodeBalancerConfig struct {
9-
ID int `json:"id"`
10-
Port int `json:"port"`
11-
Protocol ConfigProtocol `json:"protocol"`
12-
ProxyProtocol ConfigProxyProtocol `json:"proxy_protocol"`
13-
Algorithm ConfigAlgorithm `json:"algorithm"`
14-
Stickiness ConfigStickiness `json:"stickiness"`
15-
Check ConfigCheck `json:"check"`
16-
CheckInterval int `json:"check_interval"`
17-
CheckAttempts int `json:"check_attempts"`
18-
CheckPath string `json:"check_path"`
19-
CheckBody string `json:"check_body"`
20-
CheckPassive bool `json:"check_passive"`
21-
CheckTimeout int `json:"check_timeout"`
9+
ID int `json:"id"`
10+
Port int `json:"port"`
11+
Protocol ConfigProtocol `json:"protocol"`
12+
ProxyProtocol ConfigProxyProtocol `json:"proxy_protocol"`
13+
Algorithm ConfigAlgorithm `json:"algorithm"`
14+
Stickiness ConfigStickiness `json:"stickiness"`
15+
Check ConfigCheck `json:"check"`
16+
CheckInterval int `json:"check_interval"`
17+
CheckAttempts int `json:"check_attempts"`
18+
CheckPath string `json:"check_path"`
19+
CheckBody string `json:"check_body"`
20+
CheckPassive bool `json:"check_passive"`
21+
CheckTimeout int `json:"check_timeout"`
22+
23+
// NOTE: UDPCheckPort may not currently be available to all users.
24+
UDPCheckPort int `json:"udp_check_port"`
25+
26+
// NOTE: UDPSessionTimeout may not currently be available to all users.
27+
UDPSessionTimeout int `json:"udp_session_timeout"`
28+
2229
CipherSuite ConfigCipher `json:"cipher_suite"`
2330
NodeBalancerID int `json:"nodebalancer_id"`
2431
SSLCommonName string `json:"ssl_commonname"`
@@ -36,6 +43,7 @@ const (
3643
AlgorithmRoundRobin ConfigAlgorithm = "roundrobin"
3744
AlgorithmLeastConn ConfigAlgorithm = "leastconn"
3845
AlgorithmSource ConfigAlgorithm = "source"
46+
AlgorithmRingHash ConfigAlgorithm = "ring_hash"
3947
)
4048

4149
// ConfigStickiness constants start with Stickiness and include Linode API NodeBalancer Config Stickiness
@@ -44,8 +52,10 @@ type ConfigStickiness string
4452
// ConfigStickiness constants reflect the node stickiness method for a NodeBalancer Config
4553
const (
4654
StickinessNone ConfigStickiness = "none"
55+
StickinessSession ConfigStickiness = "session"
4756
StickinessTable ConfigStickiness = "table"
4857
StickinessHTTPCookie ConfigStickiness = "http_cookie"
58+
StickinessSourceIP ConfigStickiness = "source_ip"
4959
)
5060

5161
// ConfigCheck constants start with Check and include Linode API NodeBalancer Config Check methods
@@ -67,12 +77,13 @@ const (
6777
ProtocolHTTP ConfigProtocol = "http"
6878
ProtocolHTTPS ConfigProtocol = "https"
6979
ProtocolTCP ConfigProtocol = "tcp"
80+
ProtocolUDP ConfigProtocol = "udp"
7081
)
7182

7283
// ConfigProxyProtocol constants start with ProxyProtocol and include Linode API NodeBalancer Config proxy protocol versions
7384
type ConfigProxyProtocol string
7485

75-
// ConfigProxyProtocol constatns reflect the proxy protocol version used by a NodeBalancer Config
86+
// ConfigProxyProtocol constants reflect the proxy protocol version used by a NodeBalancer Config
7687
const (
7788
ProxyProtocolNone ConfigProxyProtocol = "none"
7889
ProxyProtocolV1 ConfigProxyProtocol = "v1"
@@ -96,42 +107,50 @@ type NodeBalancerNodeStatus struct {
96107

97108
// NodeBalancerConfigCreateOptions are permitted by CreateNodeBalancerConfig
98109
type NodeBalancerConfigCreateOptions struct {
99-
Port int `json:"port"`
100-
Protocol ConfigProtocol `json:"protocol,omitempty"`
101-
ProxyProtocol ConfigProxyProtocol `json:"proxy_protocol,omitempty"`
102-
Algorithm ConfigAlgorithm `json:"algorithm,omitempty"`
103-
Stickiness ConfigStickiness `json:"stickiness,omitempty"`
104-
Check ConfigCheck `json:"check,omitempty"`
105-
CheckInterval int `json:"check_interval,omitempty"`
106-
CheckAttempts int `json:"check_attempts,omitempty"`
107-
CheckPath string `json:"check_path,omitempty"`
108-
CheckBody string `json:"check_body,omitempty"`
109-
CheckPassive *bool `json:"check_passive,omitempty"`
110-
CheckTimeout int `json:"check_timeout,omitempty"`
111-
CipherSuite ConfigCipher `json:"cipher_suite,omitempty"`
112-
SSLCert string `json:"ssl_cert,omitempty"`
113-
SSLKey string `json:"ssl_key,omitempty"`
114-
Nodes []NodeBalancerNodeCreateOptions `json:"nodes,omitempty"`
110+
Port int `json:"port"`
111+
Protocol ConfigProtocol `json:"protocol,omitempty"`
112+
ProxyProtocol ConfigProxyProtocol `json:"proxy_protocol,omitempty"`
113+
Algorithm ConfigAlgorithm `json:"algorithm,omitempty"`
114+
Stickiness ConfigStickiness `json:"stickiness,omitempty"`
115+
Check ConfigCheck `json:"check,omitempty"`
116+
CheckInterval int `json:"check_interval,omitempty"`
117+
CheckAttempts int `json:"check_attempts,omitempty"`
118+
CheckPath string `json:"check_path,omitempty"`
119+
CheckBody string `json:"check_body,omitempty"`
120+
CheckPassive *bool `json:"check_passive,omitempty"`
121+
CheckTimeout int `json:"check_timeout,omitempty"`
122+
123+
// NOTE: UDPCheckPort may not currently be available to all users.
124+
UDPCheckPort *int `json:"udp_check_port,omitempty"`
125+
126+
CipherSuite ConfigCipher `json:"cipher_suite,omitempty"`
127+
SSLCert string `json:"ssl_cert,omitempty"`
128+
SSLKey string `json:"ssl_key,omitempty"`
129+
Nodes []NodeBalancerNodeCreateOptions `json:"nodes,omitempty"`
115130
}
116131

117132
// NodeBalancerConfigRebuildOptions used by RebuildNodeBalancerConfig
118133
type NodeBalancerConfigRebuildOptions struct {
119-
Port int `json:"port"`
120-
Protocol ConfigProtocol `json:"protocol,omitempty"`
121-
ProxyProtocol ConfigProxyProtocol `json:"proxy_protocol,omitempty"`
122-
Algorithm ConfigAlgorithm `json:"algorithm,omitempty"`
123-
Stickiness ConfigStickiness `json:"stickiness,omitempty"`
124-
Check ConfigCheck `json:"check,omitempty"`
125-
CheckInterval int `json:"check_interval,omitempty"`
126-
CheckAttempts int `json:"check_attempts,omitempty"`
127-
CheckPath string `json:"check_path,omitempty"`
128-
CheckBody string `json:"check_body,omitempty"`
129-
CheckPassive *bool `json:"check_passive,omitempty"`
130-
CheckTimeout int `json:"check_timeout,omitempty"`
131-
CipherSuite ConfigCipher `json:"cipher_suite,omitempty"`
132-
SSLCert string `json:"ssl_cert,omitempty"`
133-
SSLKey string `json:"ssl_key,omitempty"`
134-
Nodes []NodeBalancerConfigRebuildNodeOptions `json:"nodes"`
134+
Port int `json:"port"`
135+
Protocol ConfigProtocol `json:"protocol,omitempty"`
136+
ProxyProtocol ConfigProxyProtocol `json:"proxy_protocol,omitempty"`
137+
Algorithm ConfigAlgorithm `json:"algorithm,omitempty"`
138+
Stickiness ConfigStickiness `json:"stickiness,omitempty"`
139+
Check ConfigCheck `json:"check,omitempty"`
140+
CheckInterval int `json:"check_interval,omitempty"`
141+
CheckAttempts int `json:"check_attempts,omitempty"`
142+
CheckPath string `json:"check_path,omitempty"`
143+
CheckBody string `json:"check_body,omitempty"`
144+
CheckPassive *bool `json:"check_passive,omitempty"`
145+
CheckTimeout int `json:"check_timeout,omitempty"`
146+
147+
// NOTE: UDPCheckPort may not currently be available to all users.
148+
UDPCheckPort *int `json:"udp_check_port,omitempty"`
149+
150+
CipherSuite ConfigCipher `json:"cipher_suite,omitempty"`
151+
SSLCert string `json:"ssl_cert,omitempty"`
152+
SSLKey string `json:"ssl_key,omitempty"`
153+
Nodes []NodeBalancerConfigRebuildNodeOptions `json:"nodes"`
135154
}
136155

137156
// NodeBalancerConfigRebuildNodeOptions represents a node defined when rebuilding a
@@ -147,6 +166,11 @@ type NodeBalancerConfigUpdateOptions NodeBalancerConfigCreateOptions
147166

148167
// GetCreateOptions converts a NodeBalancerConfig to NodeBalancerConfigCreateOptions for use in CreateNodeBalancerConfig
149168
func (i NodeBalancerConfig) GetCreateOptions() NodeBalancerConfigCreateOptions {
169+
var udpCheckPort *int
170+
if i.UDPCheckPort != 0 {
171+
udpCheckPort = &i.UDPCheckPort
172+
}
173+
150174
return NodeBalancerConfigCreateOptions{
151175
Port: i.Port,
152176
Protocol: i.Protocol,
@@ -160,6 +184,7 @@ func (i NodeBalancerConfig) GetCreateOptions() NodeBalancerConfigCreateOptions {
160184
CheckPath: i.CheckPath,
161185
CheckBody: i.CheckBody,
162186
CheckPassive: copyBool(&i.CheckPassive),
187+
UDPCheckPort: udpCheckPort,
163188
CipherSuite: i.CipherSuite,
164189
SSLCert: i.SSLCert,
165190
SSLKey: i.SSLKey,
@@ -168,6 +193,11 @@ func (i NodeBalancerConfig) GetCreateOptions() NodeBalancerConfigCreateOptions {
168193

169194
// GetUpdateOptions converts a NodeBalancerConfig to NodeBalancerConfigUpdateOptions for use in UpdateNodeBalancerConfig
170195
func (i NodeBalancerConfig) GetUpdateOptions() NodeBalancerConfigUpdateOptions {
196+
var udpCheckPort *int
197+
if i.UDPCheckPort != 0 {
198+
udpCheckPort = &i.UDPCheckPort
199+
}
200+
171201
return NodeBalancerConfigUpdateOptions{
172202
Port: i.Port,
173203
Protocol: i.Protocol,
@@ -181,6 +211,7 @@ func (i NodeBalancerConfig) GetUpdateOptions() NodeBalancerConfigUpdateOptions {
181211
CheckBody: i.CheckBody,
182212
CheckPassive: copyBool(&i.CheckPassive),
183213
CheckTimeout: i.CheckTimeout,
214+
UDPCheckPort: udpCheckPort,
184215
CipherSuite: i.CipherSuite,
185216
SSLCert: i.SSLCert,
186217
SSLKey: i.SSLKey,
@@ -189,6 +220,11 @@ func (i NodeBalancerConfig) GetUpdateOptions() NodeBalancerConfigUpdateOptions {
189220

190221
// GetRebuildOptions converts a NodeBalancerConfig to NodeBalancerConfigRebuildOptions for use in RebuildNodeBalancerConfig
191222
func (i NodeBalancerConfig) GetRebuildOptions() NodeBalancerConfigRebuildOptions {
223+
var udpCheckPort *int
224+
if i.UDPCheckPort != 0 {
225+
udpCheckPort = &i.UDPCheckPort
226+
}
227+
192228
return NodeBalancerConfigRebuildOptions{
193229
Port: i.Port,
194230
Protocol: i.Protocol,
@@ -202,6 +238,7 @@ func (i NodeBalancerConfig) GetRebuildOptions() NodeBalancerConfigRebuildOptions
202238
CheckPath: i.CheckPath,
203239
CheckBody: i.CheckBody,
204240
CheckPassive: copyBool(&i.CheckPassive),
241+
UDPCheckPort: udpCheckPort,
205242
CipherSuite: i.CipherSuite,
206243
SSLCert: i.SSLCert,
207244
SSLKey: i.SSLKey,

0 commit comments

Comments
 (0)