Skip to content

Commit a1bbc0e

Browse files
committed
Support max_fails and fail_timeout
1 parent d158049 commit a1bbc0e

File tree

3 files changed

+172
-80
lines changed

3 files changed

+172
-80
lines changed

client/nginx_client.go

Lines changed: 33 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -18,19 +18,13 @@ type NginxClient struct {
1818
httpClient *http.Client
1919
}
2020

21-
type peers struct {
22-
Peers []peer
23-
}
24-
25-
type peer struct {
26-
ID int
27-
Server string
28-
}
29-
3021
type versions []int
3122

32-
type upstreamServer struct {
33-
Server string `json:"server"`
23+
type UpstreamServer struct {
24+
ID int64 `json:"id,omitempty"`
25+
Server string `json:"server"`
26+
MaxFails int64 `json:"max_fails"`
27+
FailTimeout string `json:"fail_timeout,omitempty"`
3428
}
3529

3630
type apiErrorResponse struct {
@@ -129,16 +123,17 @@ func readAPIErrorResponse(respBody io.ReadCloser) (*apiErrorResponse, error) {
129123

130124
// CheckIfUpstreamExists checks if the upstream exists in NGINX. If the upstream doesn't exist, it returns the error.
131125
func (client *NginxClient) CheckIfUpstreamExists(upstream string) error {
132-
_, err := client.getUpstreamPeers(upstream)
126+
_, err := client.GetHTTPServers(upstream)
133127
return err
134128
}
135129

136-
func (client *NginxClient) getUpstreamPeers(upstream string) (*peers, error) {
137-
url := fmt.Sprintf("%v/%v/http/upstreams/%v", client.apiEndpoint, APIVersion, upstream)
130+
// GetHTTPServers returns the servers of the upsteam from NGINX.
131+
func (client *NginxClient) GetHTTPServers(upstream string) ([]UpstreamServer, error) {
132+
url := fmt.Sprintf("%v/%v/http/upstreams/%v/servers", client.apiEndpoint, APIVersion, upstream)
138133

139134
resp, err := client.httpClient.Get(url)
140135
if err != nil {
141-
return nil, fmt.Errorf("failed to connect to the API to get upstream %v info: %v", upstream, err)
136+
return nil, fmt.Errorf("failed to connect to the API to get upstream servers of upstream %v: %v", upstream, err)
142137
}
143138
defer resp.Body.Close()
144139

@@ -149,50 +144,46 @@ func (client *NginxClient) getUpstreamPeers(upstream string) (*peers, error) {
149144

150145
body, err := ioutil.ReadAll(resp.Body)
151146
if err != nil {
152-
return nil, fmt.Errorf("failed to read the response body with upstream %v info: %v", upstream, err)
147+
return nil, fmt.Errorf("failed to read the response body with upstream servers of upstream %v: %v", upstream, err)
153148
}
154149

155-
var prs peers
156-
err = json.Unmarshal(body, &prs)
150+
var servers []UpstreamServer
151+
err = json.Unmarshal(body, &servers)
157152
if err != nil {
158-
return nil, fmt.Errorf("error unmarshalling upstream %v: got %q response: %v", upstream, string(body), err)
153+
return nil, fmt.Errorf("error unmarshalling upstream servers of upstream %v: got %q response: %v", upstream, string(body), err)
159154
}
160155

161-
return &prs, nil
156+
return servers, nil
162157
}
163158

164159
// AddHTTPServer adds the server to the upstream.
165-
func (client *NginxClient) AddHTTPServer(upstream string, server string) error {
166-
id, err := client.getIDOfHTTPServer(upstream, server)
160+
func (client *NginxClient) AddHTTPServer(upstream string, server UpstreamServer) error {
161+
id, err := client.getIDOfHTTPServer(upstream, server.Server)
167162

168163
if err != nil {
169-
return fmt.Errorf("failed to add %v server to %v upstream: %v", server, upstream, err)
164+
return fmt.Errorf("failed to add %v server to %v upstream: %v", server.Server, upstream, err)
170165
}
171166
if id != -1 {
172-
return fmt.Errorf("failed to add %v server to %v upstream: server already exists", server, upstream)
173-
}
174-
175-
upsServer := upstreamServer{
176-
Server: server,
167+
return fmt.Errorf("failed to add %v server to %v upstream: server already exists", server.Server, upstream)
177168
}
178169

179-
jsonServer, err := json.Marshal(upsServer)
170+
jsonServer, err := json.Marshal(server)
180171
if err != nil {
181-
return fmt.Errorf("error marshalling upstream server %v: %v", upsServer, err)
172+
return fmt.Errorf("error marshalling upstream server %v: %v", server, err)
182173
}
183174

184175
url := fmt.Sprintf("%v/%v/http/upstreams/%v/servers/", client.apiEndpoint, APIVersion, upstream)
185176

186177
resp, err := client.httpClient.Post(url, "application/json", bytes.NewBuffer(jsonServer))
187178

188179
if err != nil {
189-
return fmt.Errorf("failed to add %v server to %v upstream: %v", server, upstream, err)
180+
return fmt.Errorf("failed to add %v server to %v upstream: %v", server.Server, upstream, err)
190181
}
191182
defer resp.Body.Close()
192183

193184
if resp.StatusCode != http.StatusCreated {
194185
mainErr := fmt.Errorf("failed to add %v server to %v upstream: expected %v response, got %v",
195-
server, upstream, http.StatusCreated, resp.StatusCode)
186+
server.Server, upstream, http.StatusCreated, resp.StatusCode)
196187
return createResponseMismatchError(resp.Body, mainErr)
197188
}
198189

@@ -234,7 +225,7 @@ func (client *NginxClient) DeleteHTTPServer(upstream string, server string) erro
234225
// UpdateHTTPServers updates the servers of the upstream.
235226
// Servers that are in the slice, but don't exist in NGINX will be added to NGINX.
236227
// Servers that aren't in the slice, but exist in NGINX, will be removed from NGINX.
237-
func (client *NginxClient) UpdateHTTPServers(upstream string, servers []string) ([]string, []string, error) {
228+
func (client *NginxClient) UpdateHTTPServers(upstream string, servers []UpstreamServer) ([]UpstreamServer, []UpstreamServer, error) {
238229
serversInNginx, err := client.GetHTTPServers(upstream)
239230
if err != nil {
240231
return nil, nil, fmt.Errorf("failed to update servers of %v upstream: %v", upstream, err)
@@ -250,7 +241,7 @@ func (client *NginxClient) UpdateHTTPServers(upstream string, servers []string)
250241
}
251242

252243
for _, server := range toDelete {
253-
err := client.DeleteHTTPServer(upstream, server)
244+
err := client.DeleteHTTPServer(upstream, server.Server)
254245
if err != nil {
255246
return nil, nil, fmt.Errorf("failed to update servers of %v upstream: %v", upstream, err)
256247
}
@@ -259,11 +250,11 @@ func (client *NginxClient) UpdateHTTPServers(upstream string, servers []string)
259250
return toAdd, toDelete, nil
260251
}
261252

262-
func determineUpdates(updatedServers []string, nginxServers []string) (toAdd []string, toRemove []string) {
253+
func determineUpdates(updatedServers []UpstreamServer, nginxServers []UpstreamServer) (toAdd []UpstreamServer, toRemove []UpstreamServer) {
263254
for _, server := range updatedServers {
264255
found := false
265256
for _, serverNGX := range nginxServers {
266-
if server == serverNGX {
257+
if server.Server == serverNGX.Server {
267258
found = true
268259
break
269260
}
@@ -276,7 +267,7 @@ func determineUpdates(updatedServers []string, nginxServers []string) (toAdd []s
276267
for _, serverNGX := range nginxServers {
277268
found := false
278269
for _, server := range updatedServers {
279-
if serverNGX == server {
270+
if serverNGX.Server == server.Server {
280271
found = true
281272
break
282273
}
@@ -289,30 +280,15 @@ func determineUpdates(updatedServers []string, nginxServers []string) (toAdd []s
289280
return
290281
}
291282

292-
// GetHTTPServers returns the servers of the upsteam from NGINX.
293-
func (client *NginxClient) GetHTTPServers(upstream string) ([]string, error) {
294-
peers, err := client.getUpstreamPeers(upstream)
295-
if err != nil {
296-
return nil, fmt.Errorf("error getting servers of %v upstream: %v", upstream, err)
297-
}
298-
299-
var servers []string
300-
for _, peer := range peers.Peers {
301-
servers = append(servers, peer.Server)
302-
}
303-
304-
return servers, nil
305-
}
306-
307-
func (client *NginxClient) getIDOfHTTPServer(upstream string, name string) (int, error) {
308-
peers, err := client.getUpstreamPeers(upstream)
283+
func (client *NginxClient) getIDOfHTTPServer(upstream string, name string) (int64, error) {
284+
servers, err := client.GetHTTPServers(upstream)
309285
if err != nil {
310286
return -1, fmt.Errorf("error getting id of server %v of upstream %v: %v", name, upstream, err)
311287
}
312288

313-
for _, p := range peers.Peers {
314-
if p.Server == name {
315-
return p.ID, nil
289+
for _, s := range servers {
290+
if s.Server == name {
291+
return s.ID, nil
316292
}
317293
}
318294

client/nginx_client_test.go

Lines changed: 98 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -7,24 +7,106 @@ import (
77

88
func TestDetermineUpdates(t *testing.T) {
99
var tests = []struct {
10-
updated []string
11-
nginx []string
12-
expectedToAdd []string
13-
expectedToDelete []string
10+
updated []UpstreamServer
11+
nginx []UpstreamServer
12+
expectedToAdd []UpstreamServer
13+
expectedToDelete []UpstreamServer
1414
}{{
15-
updated: []string{"10.0.0.3:80", "10.0.0.4:80"},
16-
nginx: []string{"10.0.0.1:80", "10.0.0.2:80"},
17-
expectedToAdd: []string{"10.0.0.3:80", "10.0.0.4:80"},
18-
expectedToDelete: []string{"10.0.0.1:80", "10.0.0.2:80"},
19-
}, {
20-
updated: []string{"10.0.0.2:80", "10.0.0.3:80", "10.0.0.4:80"},
21-
nginx: []string{"10.0.0.1:80", "10.0.0.2:80", "10.0.0.3:80"},
22-
expectedToAdd: []string{"10.0.0.4:80"},
23-
expectedToDelete: []string{"10.0.0.1:80"},
24-
}, {
25-
updated: []string{"10.0.0.1:80", "10.0.0.2:80", "10.0.0.3:80"},
26-
nginx: []string{"10.0.0.1:80", "10.0.0.2:80", "10.0.0.3:80"},
15+
updated: []UpstreamServer{
16+
UpstreamServer{
17+
Server: "10.0.0.3:80",
18+
},
19+
UpstreamServer{
20+
Server: "10.0.0.4:80",
21+
},
22+
},
23+
nginx: []UpstreamServer{
24+
UpstreamServer{
25+
ID: 1,
26+
Server: "10.0.0.1:80",
27+
},
28+
UpstreamServer{
29+
ID: 2,
30+
Server: "10.0.0.2:80",
31+
},
32+
},
33+
expectedToAdd: []UpstreamServer{
34+
UpstreamServer{
35+
Server: "10.0.0.3:80",
36+
},
37+
UpstreamServer{
38+
Server: "10.0.0.4:80",
39+
},
40+
},
41+
expectedToDelete: []UpstreamServer{
42+
UpstreamServer{
43+
ID: 1,
44+
Server: "10.0.0.1:80",
45+
},
46+
UpstreamServer{
47+
ID: 2,
48+
Server: "10.0.0.2:80",
49+
},
50+
}}, {
51+
updated: []UpstreamServer{
52+
UpstreamServer{
53+
Server: "10.0.0.2:80",
54+
},
55+
UpstreamServer{
56+
Server: "10.0.0.3:80",
57+
},
58+
UpstreamServer{
59+
Server: "10.0.0.4:80",
60+
},
61+
},
62+
nginx: []UpstreamServer{
63+
UpstreamServer{
64+
ID: 1,
65+
Server: "10.0.0.1:80",
66+
},
67+
UpstreamServer{
68+
ID: 2,
69+
Server: "10.0.0.2:80",
70+
},
71+
UpstreamServer{
72+
ID: 3,
73+
Server: "10.0.0.3:80",
74+
},
75+
},
76+
expectedToAdd: []UpstreamServer{
77+
UpstreamServer{
78+
Server: "10.0.0.4:80",
79+
}},
80+
expectedToDelete: []UpstreamServer{
81+
UpstreamServer{
82+
ID: 1,
83+
Server: "10.0.0.1:80",
84+
}},
2785
}, {
86+
updated: []UpstreamServer{
87+
UpstreamServer{
88+
Server: "10.0.0.1:80",
89+
},
90+
UpstreamServer{
91+
Server: "10.0.0.2:80",
92+
},
93+
UpstreamServer{
94+
Server: "10.0.0.3:80",
95+
}},
96+
nginx: []UpstreamServer{
97+
UpstreamServer{
98+
ID: 1,
99+
Server: "10.0.0.1:80",
100+
},
101+
UpstreamServer{
102+
ID: 2,
103+
Server: "10.0.0.2:80",
104+
},
105+
UpstreamServer{
106+
ID: 3,
107+
Server: "10.0.0.3:80",
108+
},
109+
}}, {
28110
// empty values
29111
}}
30112

0 commit comments

Comments
 (0)