backend.go 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. package httpbackend
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "io/ioutil"
  6. "net/http"
  7. "time"
  8. )
  9. type Client struct {
  10. backendURL string
  11. httpClient *http.Client
  12. }
  13. func NewClient(backendURL string) *Client {
  14. httpClient := &http.Client{
  15. Timeout: time.Minute,
  16. }
  17. return &Client{backendURL, httpClient}
  18. }
  19. func (c *Client) GetCurrentState(name string) (*TFState, error) {
  20. resp := &TFState{}
  21. err := c.getRequest(fmt.Sprintf("%s/%s/tfstate", c.backendURL, name), resp)
  22. return resp, err
  23. }
  24. func (c *Client) GetDesiredState(name string) (*DesiredTFState, error) {
  25. resp := &DesiredTFState{}
  26. err := c.getRequest(fmt.Sprintf("%s/%s/state", c.backendURL, name), resp)
  27. return resp, err
  28. }
  29. func (c *Client) getRequest(path string, dst interface{}) error {
  30. req, err := http.NewRequest(
  31. "GET",
  32. path,
  33. nil,
  34. )
  35. if err != nil {
  36. return err
  37. }
  38. req.Header.Set("Content-Type", "application/json; charset=utf-8")
  39. req.Header.Set("Accept", "application/json; charset=utf-8")
  40. res, err := c.httpClient.Do(req)
  41. if err != nil {
  42. return err
  43. }
  44. defer res.Body.Close()
  45. if res.StatusCode < http.StatusOK || res.StatusCode >= http.StatusBadRequest {
  46. resBytes, err := ioutil.ReadAll(res.Body)
  47. if err != nil {
  48. return fmt.Errorf("request failed with status code %d, but could not read body (%s)\n", res.StatusCode, err.Error())
  49. }
  50. return fmt.Errorf("request failed with status code %d: %s\n", res.StatusCode, string(resBytes))
  51. }
  52. if dst != nil {
  53. return json.NewDecoder(res.Body).Decode(dst)
  54. }
  55. return nil
  56. }