blob: 42ccfae0ef1cc7715a190596eb81037cfab6ed1a [file] [log] [blame]
Jamie Hannafordfba65af2014-11-03 10:32:37 +01001package lbs
Jamie Hannaford186d4e22014-10-31 12:26:11 +01002
3import (
4 "github.com/mitchellh/mapstructure"
Jamie Hannaforde09b6822014-10-31 15:33:57 +01005
6 "github.com/rackspace/gophercloud"
Jamie Hannaford186d4e22014-10-31 12:26:11 +01007 "github.com/rackspace/gophercloud/pagination"
Jamie Hannaford21a3eb12014-11-03 10:34:29 +01008 "github.com/rackspace/gophercloud/rackspace/lb/v1/nodes"
Jamie Hannaford186d4e22014-10-31 12:26:11 +01009)
10
11type Protocol string
12
13// The constants below represent all the compatible load balancer protocols.
14const (
15 // DNSTCP is a protocol that works with IPv6 and allows your DNS server to
16 // receive traffic using TCP port 53.
17 DNSTCP = "DNS_TCP"
18
19 // DNSUDP is a protocol that works with IPv6 and allows your DNS server to
20 // receive traffic using UDP port 53.
21 DNSUDP = "DNS_UDP"
22
23 // TCP is one of the core protocols of the Internet Protocol Suite. It
24 // provides a reliable, ordered delivery of a stream of bytes from one
25 // program on a computer to another program on another computer. Applications
26 // that require an ordered and reliable delivery of packets use this protocol.
27 TCP = "TCP"
28
29 // TCPCLIENTFIRST is a protocol similar to TCP, but is more efficient when a
30 // client is expected to write the data first.
31 TCPCLIENTFIRST = "TCP_CLIENT_FIRST"
32
33 // UDP provides a datagram service that emphasizes speed over reliability. It
34 // works well with applications that provide security through other measures.
35 UDP = "UDP"
36
37 // UDPSTREAM is a protocol designed to stream media over networks and is
38 // built on top of UDP.
39 UDPSTREAM = "UDP_STREAM"
40)
41
42// Algorithm defines how traffic should be directed between back-end nodes.
43type Algorithm string
44
45const (
46 // LC directs traffic to the node with the lowest number of connections.
47 LC = "LEAST_CONNECTIONS"
48
49 // RAND directs traffic to nodes at random.
50 RAND = "RANDOM"
51
52 // RR directs traffic to each of the nodes in turn.
53 RR = "ROUND_ROBIN"
54
55 // WLC directs traffic to a node based on the number of concurrent
56 // connections and its weight.
57 WLC = "WEIGHTED_LEAST_CONNECTIONS"
58
59 // WRR directs traffic to a node according to the RR algorithm, but with
60 // different proportions of traffic being directed to the back-end nodes.
61 // Weights must be defined as part of the node configuration.
62 WRR = "WEIGHTED_ROUND_ROBIN"
63)
64
65type Status string
66
67const (
68 // ACTIVE indicates that the LB is configured properly and ready to serve
69 // traffic to incoming requests via the configured virtual IPs.
70 ACTIVE = "ACTIVE"
71
72 // BUILD indicates that the LB is being provisioned for the first time and
73 // configuration is being applied to bring the service online. The service
74 // cannot yet serve incoming requests.
75 BUILD = "BUILD"
76
77 // PENDINGUPDATE indicates that the LB is online but configuration changes
78 // are being applied to update the service based on a previous request.
79 PENDINGUPDATE = "PENDING_UPDATE"
80
81 // PENDINGDELETE indicates that the LB is online but configuration changes
82 // are being applied to begin deletion of the service based on a previous
83 // request.
84 PENDINGDELETE = "PENDING_DELETE"
85
86 // SUSPENDED indicates that the LB has been taken offline and disabled.
87 SUSPENDED = "SUSPENDED"
88
89 // ERROR indicates that the system encountered an error when attempting to
90 // configure the load balancer.
91 ERROR = "ERROR"
92
93 // DELETED indicates that the LB has been deleted.
94 DELETED = "DELETED"
95)
96
97type Datetime struct {
98 Time string
99}
100
101type VIP struct {
Jamie Hannaforde09b6822014-10-31 15:33:57 +0100102 Address string `json:"address,omitempty"`
103 ID int `json:"id,omitempty"`
104 Type string `json:"type,omitempty"`
105 Version string `json:"ipVersion,omitempty" mapstructure:"ipVersion"`
Jamie Hannaford186d4e22014-10-31 12:26:11 +0100106}
107
108type LoadBalancer struct {
109 // Human-readable name for the load balancer.
110 Name string
111
112 // The unique ID for the load balancer.
113 ID int
114
115 // Represents the service protocol being load balanced.
116 Protocol Protocol
117
118 // Defines how traffic should be directed between back-end nodes. The default
119 // algorithm is RANDOM.
120 Algorithm Algorithm
121
122 // The current status of the load balancer.
123 Status Status
124
125 // The number of load balancer nodes.
126 NodeCount int `mapstructure:"nodeCount"`
127
128 // Slice of virtual IPs associated with this load balancer.
129 VIPs []VIP `mapstructure:"virtualIps"`
130
131 // Datetime when the LB was created.
132 Created Datetime
133
134 // Datetime when the LB was created.
135 Updated Datetime
136
137 Port int
Jamie Hannaforde09b6822014-10-31 15:33:57 +0100138
139 HalfClosed bool
140
141 Timeout int
142
143 Cluster Cluster
144
Jamie Hannaford21a3eb12014-11-03 10:34:29 +0100145 Nodes []nodes.Node
Jamie Hannaforde09b6822014-10-31 15:33:57 +0100146
147 ConnectionLogging ConnectionLogging
Jamie Hannaford07c06962014-10-31 16:42:03 +0100148
149 SessionPersistence SessionPersistence
150
151 ConnectionThrottle ConnectionThrottle
152
153 SourceAddrs SourceAddrs `mapstructure:"sourceAddresses"`
154}
155
156type SourceAddrs struct {
157 IPv4Public string `json:"ipv4Public" mapstructure:"ipv4Public"`
158 IPv4Private string `json:"ipv4Servicenet" mapstructure:"ipv4Servicenet"`
159 IPv6Public string `json:"ipv6Public" mapstructure:"ipv6Public"`
160 IPv6Private string `json:"ipv6Servicenet" mapstructure:"ipv6Servicenet"`
161}
162
163type SessionPersistence struct {
164 Type string `json:"persistenceType" mapstructure:"persistenceType"`
165}
166
167type ConnectionThrottle struct {
168 MinConns int `json:"minConnections" mapstructure:"minConnections"`
169 MaxConns int `json:"maxConnections" mapstructure:"maxConnections"`
170 MaxConnRate int `json:"maxConnectionRate" mapstructure:"maxConnectionRate"`
171 RateInterval int `json:"rateInterval" mapstructure:"rateInterval"`
Jamie Hannaforde09b6822014-10-31 15:33:57 +0100172}
173
174type ConnectionLogging struct {
175 Enabled bool
176}
177
178type Cluster struct {
179 Name string
180}
181
Jamie Hannaford186d4e22014-10-31 12:26:11 +0100182// LBPage is the page returned by a pager when traversing over a collection of
183// LBs.
184type LBPage struct {
185 pagination.LinkedPageBase
186}
187
188// IsEmpty checks whether a NetworkPage struct is empty.
189func (p LBPage) IsEmpty() (bool, error) {
190 is, err := ExtractLBs(p)
191 if err != nil {
192 return true, nil
193 }
194 return len(is) == 0, nil
195}
196
197// ExtractLBs accepts a Page struct, specifically a LBPage struct, and extracts
198// the elements into a slice of LoadBalancer structs. In other words, a generic
199// collection is mapped into a relevant slice.
200func ExtractLBs(page pagination.Page) ([]LoadBalancer, error) {
201 var resp struct {
202 LBs []LoadBalancer `mapstructure:"loadBalancers" json:"loadBalancers"`
203 }
204
205 err := mapstructure.Decode(page.(LBPage).Body, &resp)
206
207 return resp.LBs, err
208}
Jamie Hannaforde09b6822014-10-31 15:33:57 +0100209
210type commonResult struct {
211 gophercloud.Result
212}
213
214// Extract interprets any commonResult as a LB, if possible.
215func (r commonResult) Extract() (*LoadBalancer, error) {
216 if r.Err != nil {
217 return nil, r.Err
218 }
219
220 var response struct {
221 LB LoadBalancer `mapstructure:"loadBalancer"`
222 }
223
224 err := mapstructure.Decode(r.Body, &response)
225
226 return &response.LB, err
227}
228
229type CreateResult struct {
230 commonResult
231}
Jamie Hannaford1c260332014-10-31 15:57:22 +0100232
233type DeleteResult struct {
234 gophercloud.ErrResult
235}
Jamie Hannaford07c06962014-10-31 16:42:03 +0100236
Jamie Hannaford76fcc832014-10-31 16:56:50 +0100237type UpdateResult struct {
238 gophercloud.ErrResult
239}
240
Jamie Hannaford07c06962014-10-31 16:42:03 +0100241type GetResult struct {
242 commonResult
243}