Skip to content

Commit b406ec9

Browse files
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
1 parent 857b24b commit b406ec9

30 files changed

+5741
-4783
lines changed

go.work.sum

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7
4545
golang.org/x/crypto v0.29.0/go.mod h1:+F4F4N5hv6v38hfeYwTdx20oUvLLc+QfrE9Ax9HtgRg=
4646
golang.org/x/crypto v0.30.0 h1:RwoQn3GkWiMkzlX562cLB7OxWvjH1L8xutO2WoJcRoY=
4747
golang.org/x/crypto v0.30.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=
48+
golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U=
4849
golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=
4950
golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA=
5051
golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=

nodebalancer.go

Lines changed: 30 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,28 @@ import (
1212
type NodeBalancer struct {
1313
// This NodeBalancer's unique ID.
1414
ID int `json:"id"`
15+
1516
// This NodeBalancer's label. These must be unique on your Account.
1617
Label *string `json:"label"`
18+
1719
// The Region where this NodeBalancer is located. NodeBalancers only support backends in the same Region.
1820
Region string `json:"region"`
21+
1922
// This NodeBalancer's hostname, ending with .nodebalancer.linode.com
2023
Hostname *string `json:"hostname"`
24+
2125
// This NodeBalancer's public IPv4 address.
2226
IPv4 *string `json:"ipv4"`
27+
2328
// This NodeBalancer's public IPv6 address.
2429
IPv6 *string `json:"ipv6"`
30+
2531
// Throttle connections per second (0-20). Set to 0 (zero) to disable throttling.
2632
ClientConnThrottle int `json:"client_conn_throttle"`
33+
34+
// ClientUDPSessThrottle throttles UDP sessions per second. Set to 0 (zero) to disable throttling.
35+
ClientUDPSessThrottle int `json:"client_udp_sess_throttle"`
36+
2737
// Information about the amount of transfer this NodeBalancer has had so far this month.
2838
Transfer NodeBalancerTransfer `json:"transfer"`
2939

@@ -46,19 +56,21 @@ type NodeBalancerTransfer struct {
4656

4757
// NodeBalancerCreateOptions are the options permitted for CreateNodeBalancer
4858
type NodeBalancerCreateOptions struct {
49-
Label *string `json:"label,omitempty"`
50-
Region string `json:"region,omitempty"`
51-
ClientConnThrottle *int `json:"client_conn_throttle,omitempty"`
52-
Configs []*NodeBalancerConfigCreateOptions `json:"configs,omitempty"`
53-
Tags []string `json:"tags"`
54-
FirewallID int `json:"firewall_id,omitempty"`
59+
Label *string `json:"label,omitempty"`
60+
Region string `json:"region,omitempty"`
61+
ClientConnThrottle *int `json:"client_conn_throttle,omitempty"`
62+
ClientUDPSessThrottle *int `json:"client_udp_sess_throttle,omitempty"`
63+
Configs []*NodeBalancerConfigCreateOptions `json:"configs,omitempty"`
64+
Tags []string `json:"tags"`
65+
FirewallID int `json:"firewall_id,omitempty"`
5566
}
5667

5768
// NodeBalancerUpdateOptions are the options permitted for UpdateNodeBalancer
5869
type NodeBalancerUpdateOptions struct {
59-
Label *string `json:"label,omitempty"`
60-
ClientConnThrottle *int `json:"client_conn_throttle,omitempty"`
61-
Tags *[]string `json:"tags,omitempty"`
70+
Label *string `json:"label,omitempty"`
71+
ClientConnThrottle *int `json:"client_conn_throttle,omitempty"`
72+
ClientUDPSessThrottle *int `json:"client_udp_sess_throttle,omitempty"`
73+
Tags *[]string `json:"tags,omitempty"`
6274
}
6375

6476
// UnmarshalJSON implements the json.Unmarshaler interface
@@ -86,19 +98,21 @@ func (i *NodeBalancer) UnmarshalJSON(b []byte) error {
8698
// GetCreateOptions converts a NodeBalancer to NodeBalancerCreateOptions for use in CreateNodeBalancer
8799
func (i NodeBalancer) GetCreateOptions() NodeBalancerCreateOptions {
88100
return NodeBalancerCreateOptions{
89-
Label: i.Label,
90-
Region: i.Region,
91-
ClientConnThrottle: &i.ClientConnThrottle,
92-
Tags: i.Tags,
101+
Label: i.Label,
102+
Region: i.Region,
103+
ClientConnThrottle: &i.ClientConnThrottle,
104+
ClientUDPSessThrottle: &i.ClientUDPSessThrottle,
105+
Tags: i.Tags,
93106
}
94107
}
95108

96109
// GetUpdateOptions converts a NodeBalancer to NodeBalancerUpdateOptions for use in UpdateNodeBalancer
97110
func (i NodeBalancer) GetUpdateOptions() NodeBalancerUpdateOptions {
98111
return NodeBalancerUpdateOptions{
99-
Label: i.Label,
100-
ClientConnThrottle: &i.ClientConnThrottle,
101-
Tags: &i.Tags,
112+
Label: i.Label,
113+
ClientConnThrottle: &i.ClientConnThrottle,
114+
ClientUDPSessThrottle: &i.ClientUDPSessThrottle,
115+
Tags: &i.Tags,
102116
}
103117
}
104118

nodebalancer_configs.go

Lines changed: 32 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -6,26 +6,28 @@ 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"`
22-
CipherSuite ConfigCipher `json:"cipher_suite"`
23-
NodeBalancerID int `json:"nodebalancer_id"`
24-
SSLCommonName string `json:"ssl_commonname"`
25-
SSLFingerprint string `json:"ssl_fingerprint"`
26-
SSLCert string `json:"ssl_cert"`
27-
SSLKey string `json:"ssl_key"`
28-
NodesStatus *NodeBalancerNodeStatus `json:"nodes_status"`
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+
UDPCheckPort int `json:"udp_check_port"`
23+
UDPSessionTimeout int `json:"udp_session_timeout"`
24+
CipherSuite ConfigCipher `json:"cipher_suite"`
25+
NodeBalancerID int `json:"nodebalancer_id"`
26+
SSLCommonName string `json:"ssl_commonname"`
27+
SSLFingerprint string `json:"ssl_fingerprint"`
28+
SSLCert string `json:"ssl_cert"`
29+
SSLKey string `json:"ssl_key"`
30+
NodesStatus *NodeBalancerNodeStatus `json:"nodes_status"`
2931
}
3032

3133
// ConfigAlgorithm constants start with Algorithm and include Linode API NodeBalancer Config Algorithms
@@ -36,6 +38,7 @@ const (
3638
AlgorithmRoundRobin ConfigAlgorithm = "roundrobin"
3739
AlgorithmLeastConn ConfigAlgorithm = "leastconn"
3840
AlgorithmSource ConfigAlgorithm = "source"
41+
AlgorithmRingHash ConfigAlgorithm = "ring_hash"
3942
)
4043

4144
// ConfigStickiness constants start with Stickiness and include Linode API NodeBalancer Config Stickiness
@@ -44,8 +47,10 @@ type ConfigStickiness string
4447
// ConfigStickiness constants reflect the node stickiness method for a NodeBalancer Config
4548
const (
4649
StickinessNone ConfigStickiness = "none"
50+
StickinessSession ConfigStickiness = "session"
4751
StickinessTable ConfigStickiness = "table"
4852
StickinessHTTPCookie ConfigStickiness = "http_cookie"
53+
StickinessSourceIP ConfigStickiness = "source_ip"
4954
)
5055

5156
// ConfigCheck constants start with Check and include Linode API NodeBalancer Config Check methods
@@ -67,12 +72,13 @@ const (
6772
ProtocolHTTP ConfigProtocol = "http"
6873
ProtocolHTTPS ConfigProtocol = "https"
6974
ProtocolTCP ConfigProtocol = "tcp"
75+
ProtocolUDP ConfigProtocol = "udp"
7076
)
7177

7278
// ConfigProxyProtocol constants start with ProxyProtocol and include Linode API NodeBalancer Config proxy protocol versions
7379
type ConfigProxyProtocol string
7480

75-
// ConfigProxyProtocol constatns reflect the proxy protocol version used by a NodeBalancer Config
81+
// ConfigProxyProtocol constants reflect the proxy protocol version used by a NodeBalancer Config
7682
const (
7783
ProxyProtocolNone ConfigProxyProtocol = "none"
7884
ProxyProtocolV1 ConfigProxyProtocol = "v1"
@@ -108,6 +114,7 @@ type NodeBalancerConfigCreateOptions struct {
108114
CheckBody string `json:"check_body,omitempty"`
109115
CheckPassive *bool `json:"check_passive,omitempty"`
110116
CheckTimeout int `json:"check_timeout,omitempty"`
117+
UDPCheckPort *int `json:"udp_check_port,omitempty"`
111118
CipherSuite ConfigCipher `json:"cipher_suite,omitempty"`
112119
SSLCert string `json:"ssl_cert,omitempty"`
113120
SSLKey string `json:"ssl_key,omitempty"`
@@ -128,6 +135,7 @@ type NodeBalancerConfigRebuildOptions struct {
128135
CheckBody string `json:"check_body,omitempty"`
129136
CheckPassive *bool `json:"check_passive,omitempty"`
130137
CheckTimeout int `json:"check_timeout,omitempty"`
138+
UDPCheckPort *int `json:"udp_check_port,omitempty"`
131139
CipherSuite ConfigCipher `json:"cipher_suite,omitempty"`
132140
SSLCert string `json:"ssl_cert,omitempty"`
133141
SSLKey string `json:"ssl_key,omitempty"`
@@ -160,6 +168,7 @@ func (i NodeBalancerConfig) GetCreateOptions() NodeBalancerConfigCreateOptions {
160168
CheckPath: i.CheckPath,
161169
CheckBody: i.CheckBody,
162170
CheckPassive: copyBool(&i.CheckPassive),
171+
UDPCheckPort: &i.UDPCheckPort,
163172
CipherSuite: i.CipherSuite,
164173
SSLCert: i.SSLCert,
165174
SSLKey: i.SSLKey,
@@ -181,6 +190,7 @@ func (i NodeBalancerConfig) GetUpdateOptions() NodeBalancerConfigUpdateOptions {
181190
CheckBody: i.CheckBody,
182191
CheckPassive: copyBool(&i.CheckPassive),
183192
CheckTimeout: i.CheckTimeout,
193+
UDPCheckPort: copyInt(&i.UDPCheckPort),
184194
CipherSuite: i.CipherSuite,
185195
SSLCert: i.SSLCert,
186196
SSLKey: i.SSLKey,
@@ -202,6 +212,7 @@ func (i NodeBalancerConfig) GetRebuildOptions() NodeBalancerConfigRebuildOptions
202212
CheckPath: i.CheckPath,
203213
CheckBody: i.CheckBody,
204214
CheckPassive: copyBool(&i.CheckPassive),
215+
UDPCheckPort: copyInt(&i.UDPCheckPort),
205216
CipherSuite: i.CipherSuite,
206217
SSLCert: i.SSLCert,
207218
SSLKey: i.SSLKey,

0 commit comments

Comments
 (0)