token_client.go 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. package mqe
  2. import (
  3. "context"
  4. "encoding/json"
  5. "fmt"
  6. "io/ioutil"
  7. "net/http"
  8. "net/url"
  9. "path"
  10. "golang.org/x/net/context/ctxhttp"
  11. "github.com/grafana/grafana/pkg/log"
  12. "github.com/grafana/grafana/pkg/tsdb"
  13. )
  14. type TokenClient struct {
  15. tlog log.Logger
  16. }
  17. func NewTokenClient() *TokenClient {
  18. return &TokenClient{
  19. tlog: log.New("tsdb.mqe.tokenclient"),
  20. }
  21. }
  22. var cache map[int64]*TokenBody = map[int64]*TokenBody{}
  23. //Replace this stupid cache with internal cache from grafana master before merging
  24. func (client *TokenClient) GetTokenData(ctx context.Context, datasource *tsdb.DataSourceInfo) (*TokenBody, error) {
  25. _, excist := cache[datasource.Id]
  26. if !excist {
  27. b, err := client.RequestTokenData(ctx, datasource)
  28. if err != nil {
  29. return nil, err
  30. }
  31. cache[datasource.Id] = b
  32. }
  33. return cache[datasource.Id], nil
  34. }
  35. func (client *TokenClient) RequestTokenData(ctx context.Context, datasource *tsdb.DataSourceInfo) (*TokenBody, error) {
  36. u, _ := url.Parse(datasource.Url)
  37. u.Path = path.Join(u.Path, "token")
  38. req, err := http.NewRequest(http.MethodGet, u.String(), nil)
  39. if err != nil {
  40. client.tlog.Info("Failed to create request", "error", err)
  41. }
  42. res, err := ctxhttp.Do(ctx, HttpClient, req)
  43. if err != nil {
  44. return nil, err
  45. }
  46. body, err := ioutil.ReadAll(res.Body)
  47. defer res.Body.Close()
  48. if err != nil {
  49. return nil, err
  50. }
  51. if res.StatusCode/100 != 2 {
  52. client.tlog.Info("Request failed", "status", res.Status, "body", string(body))
  53. return nil, fmt.Errorf("Request failed status: %v", res.Status)
  54. }
  55. var result *TokenResponse
  56. err = json.Unmarshal(body, &result)
  57. if err != nil {
  58. client.tlog.Info("Failed to unmarshal graphite response", "error", err, "status", res.Status, "body", string(body))
  59. return nil, err
  60. }
  61. if !result.Success {
  62. return nil, fmt.Errorf("Request failed for unknown reason.")
  63. }
  64. return &result.Body, nil
  65. }