forked from civo/civogo
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathloadbalancer.go
146 lines (126 loc) · 4.96 KB
/
loadbalancer.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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
package civogo
import (
"bytes"
"encoding/json"
"fmt"
"strings"
)
// LoadBalancerBackend represents a backend instance being load-balanced
type LoadBalancerBackend struct {
InstanceID string `json:"instance_id"`
Protocol string `json:"protocol"`
Port int `json:"port"`
}
// LoadBalancerBackendConfig is the configuration for creating backends
type LoadBalancerBackendConfig struct {
InstanceID string `json:"instance_id"`
Protocol string `json:"protocol"`
Port int `json:"port"`
}
// LoadBalancer represents a load balancer configuration within Civo
type LoadBalancer struct {
ID string `json:"id"`
DefaultHostname bool `json:"default_hostname,omitempty"`
Hostname string `json:"hostname,omitempty"`
Protocol string `json:"protocol,omitempty"`
Port int `json:"port,omitempty"`
MaxRequestSize int `json:"max_request_size,omitempty"`
TLSCertificate string `json:"tls_certificate,omitempty"`
TLSKey string `json:"tls_key,omitempty"`
Policy string `json:"policy,omitempty"`
HealthCheckPath string `json:"health_check_path,omitempty"`
FailTimeout int `json:"fail_timeout,omitempty"`
MaxConns int `json:"max_conns,omitempty"`
IgnoreInvalidBackendTLS bool `json:"ignore_invalid_backend_tls,omitempty"`
Backends []LoadBalancerBackend
}
// LoadBalancerConfig represents a load balancer to be created
type LoadBalancerConfig struct {
Hostname string `json:"hostname"`
Region string `json:"region"`
Protocol string `json:"protocol"`
TLSCertificate string `json:"tls_certificate"`
TLSKey string `json:"tls_key"`
Policy string `json:"policy"`
Port int `json:"port"`
MaxRequestSize int `json:"max_request_size"`
HealthCheckPath string `json:"health_check_path"`
FailTimeout int `json:"fail_timeout"`
MaxConns int `json:"max_conns"`
IgnoreInvalidBackendTLS bool `json:"ignore_invalid_backend_tls"`
Backends []LoadBalancerBackendConfig `json:"backends"`
}
// ListLoadBalancers returns all load balancers owned by the calling API account
func (c *Client) ListLoadBalancers() ([]LoadBalancer, error) {
resp, err := c.SendGetRequest("/v2/loadbalancers")
if err != nil {
return nil, decodeERROR(err)
}
loadbalancer := make([]LoadBalancer, 0)
if err := json.NewDecoder(bytes.NewReader(resp)).Decode(&loadbalancer); err != nil {
return nil, decodeERROR(err)
}
return loadbalancer, nil
}
// FindLoadBalancer finds a load balancer by either part of the ID or part of the name
func (c *Client) FindLoadBalancer(search string) (*LoadBalancer, error) {
lbs, err := c.ListLoadBalancers()
if err != nil {
return nil, decodeERROR(err)
}
exactMatch := false
partialMatchesCount := 0
result := LoadBalancer{}
for _, value := range lbs {
if value.Hostname == search || value.ID == search {
exactMatch = true
result = value
} else if strings.Contains(value.Hostname, search) || strings.Contains(value.ID, search) {
if !exactMatch {
result = value
partialMatchesCount++
}
}
}
if exactMatch || partialMatchesCount == 1 {
return &result, nil
} else if partialMatchesCount > 1 {
err := fmt.Errorf("unable to find %s because there were multiple matches", search)
return nil, MultipleMatchesError.wrap(err)
} else {
err := fmt.Errorf("unable to find %s, zero matches", search)
return nil, ZeroMatchesError.wrap(err)
}
}
// CreateLoadBalancer creates a new load balancer
func (c *Client) CreateLoadBalancer(r *LoadBalancerConfig) (*LoadBalancer, error) {
body, err := c.SendPostRequest("/v2/loadbalancers", r)
if err != nil {
return nil, decodeERROR(err)
}
loadbalancer := &LoadBalancer{}
if err := json.NewDecoder(bytes.NewReader(body)).Decode(loadbalancer); err != nil {
return nil, err
}
return loadbalancer, nil
}
// UpdateLoadBalancer updates a load balancer
func (c *Client) UpdateLoadBalancer(id string, r *LoadBalancerConfig) (*LoadBalancer, error) {
body, err := c.SendPutRequest(fmt.Sprintf("/v2/loadbalancers/%s", id), r)
if err != nil {
return nil, decodeERROR(err)
}
loadbalancer := &LoadBalancer{}
if err := json.NewDecoder(bytes.NewReader(body)).Decode(loadbalancer); err != nil {
return nil, err
}
return loadbalancer, nil
}
// DeleteLoadBalancer deletes a load balancer
func (c *Client) DeleteLoadBalancer(id string) (*SimpleResponse, error) {
resp, err := c.SendDeleteRequest(fmt.Sprintf("/v2/loadbalancers/%s", id))
if err != nil {
return nil, decodeERROR(err)
}
return c.DecodeSimpleResponse(resp)
}