init.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. package datasources
  2. import (
  3. "io"
  4. "io/ioutil"
  5. "path/filepath"
  6. "github.com/grafana/grafana/pkg/bus"
  7. "github.com/grafana/grafana/pkg/log"
  8. "github.com/grafana/grafana/pkg/models"
  9. yaml "gopkg.in/yaml.v2"
  10. )
  11. var (
  12. logger log.Logger
  13. )
  14. // TODO: secure jsonData
  15. // TODO: auto reload on file changes
  16. func Init(configPath string) (error, io.Closer) {
  17. logger = log.New("setting.datasource")
  18. datasources, err := readDatasources(configPath)
  19. if err != nil {
  20. return err, ioutil.NopCloser(nil)
  21. }
  22. for _, ds := range datasources {
  23. query := &models.GetDataSourceByNameQuery{Name: ds.Name}
  24. err := bus.Dispatch(query)
  25. if err != nil && err != models.ErrDataSourceNotFound {
  26. return err, ioutil.NopCloser(nil)
  27. }
  28. if ds.OrgId == 0 {
  29. ds.OrgId = 1
  30. }
  31. if query.Result == nil {
  32. logger.Info("inserting ", "name", ds.Name)
  33. insertCmd := insertCommand(ds)
  34. if err := bus.Dispatch(insertCmd); err != nil {
  35. return err, ioutil.NopCloser(nil)
  36. }
  37. } else {
  38. logger.Info("updating", "name", ds.Name)
  39. updateCmd := updateCommand(ds, query.Result.Id)
  40. if err := bus.Dispatch(updateCmd); err != nil {
  41. return err, ioutil.NopCloser(nil)
  42. }
  43. }
  44. }
  45. return nil, ioutil.NopCloser(nil)
  46. }
  47. func readDatasources(path string) ([]models.DataSource, error) {
  48. filename, _ := filepath.Abs(path)
  49. yamlFile, err := ioutil.ReadFile(filename)
  50. if err != nil {
  51. return nil, err
  52. }
  53. var datasources []models.DataSource
  54. err = yaml.Unmarshal(yamlFile, &datasources)
  55. if err != nil {
  56. return nil, err
  57. }
  58. return datasources, nil
  59. }
  60. func insertCommand(ds models.DataSource) *models.AddDataSourceCommand {
  61. return &models.AddDataSourceCommand{
  62. OrgId: ds.OrgId,
  63. Name: ds.Name,
  64. Type: ds.Type,
  65. Access: ds.Access,
  66. Url: ds.Url,
  67. Password: ds.Password,
  68. User: ds.User,
  69. Database: ds.Database,
  70. BasicAuth: ds.BasicAuth,
  71. BasicAuthUser: ds.BasicAuthUser,
  72. BasicAuthPassword: ds.BasicAuthPassword,
  73. WithCredentials: ds.WithCredentials,
  74. IsDefault: ds.IsDefault,
  75. JsonData: ds.JsonData,
  76. }
  77. }
  78. func updateCommand(ds models.DataSource, id int64) *models.UpdateDataSourceCommand {
  79. return &models.UpdateDataSourceCommand{
  80. Id: id,
  81. OrgId: ds.OrgId,
  82. Name: ds.Name,
  83. Type: ds.Type,
  84. Access: ds.Access,
  85. Url: ds.Url,
  86. Password: ds.Password,
  87. User: ds.User,
  88. Database: ds.Database,
  89. BasicAuth: ds.BasicAuth,
  90. BasicAuthUser: ds.BasicAuthUser,
  91. BasicAuthPassword: ds.BasicAuthPassword,
  92. WithCredentials: ds.WithCredentials,
  93. IsDefault: ds.IsDefault,
  94. JsonData: ds.JsonData,
  95. }
  96. }