@@ -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-
3021type 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
3630type 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.
131125func (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
0 commit comments