config_reader.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. package datasources
  2. import (
  3. "io/ioutil"
  4. "path/filepath"
  5. "strings"
  6. "github.com/grafana/grafana/pkg/log"
  7. "gopkg.in/yaml.v2"
  8. )
  9. type configReader struct {
  10. log log.Logger
  11. }
  12. func (cr *configReader) readConfig(path string) ([]*DatasourcesAsConfig, error) {
  13. var datasources []*DatasourcesAsConfig
  14. files, err := ioutil.ReadDir(path)
  15. if err != nil {
  16. cr.log.Error("cant read datasource provisioning files from directory", "path", path)
  17. return datasources, nil
  18. }
  19. for _, file := range files {
  20. if strings.HasSuffix(file.Name(), ".yaml") || strings.HasSuffix(file.Name(), ".yml") {
  21. filename, _ := filepath.Abs(filepath.Join(path, file.Name()))
  22. yamlFile, err := ioutil.ReadFile(filename)
  23. if err != nil {
  24. return nil, err
  25. }
  26. datasource, err := parseDatasourceConfig(yamlFile)
  27. if err != nil {
  28. return nil, err
  29. }
  30. if datasource != nil {
  31. datasources = append(datasources, datasource)
  32. }
  33. }
  34. }
  35. err = validateDefaultUniqueness(datasources)
  36. if err != nil {
  37. return nil, err
  38. }
  39. return datasources, nil
  40. }
  41. func parseDatasourceConfig(yamlFile []byte) (*DatasourcesAsConfig, error) {
  42. var apiVersion *ConfigVersion
  43. err := yaml.Unmarshal(yamlFile, &apiVersion)
  44. if err != nil {
  45. return nil, err
  46. }
  47. if apiVersion.ApiVersion > 0 {
  48. var v1 *DatasourcesAsConfigV1
  49. err = yaml.Unmarshal(yamlFile, &v1)
  50. if err != nil {
  51. return nil, err
  52. }
  53. return v1.mapToDatasourceFromConfig(apiVersion.ApiVersion), nil
  54. }
  55. var v0 *DatasourcesAsConfigV0
  56. err = yaml.Unmarshal(yamlFile, &v0)
  57. if err != nil {
  58. return nil, err
  59. }
  60. return v0.mapToDatasourceFromConfig(apiVersion.ApiVersion), nil
  61. }
  62. func validateDefaultUniqueness(datasources []*DatasourcesAsConfig) error {
  63. defaultCount := 0
  64. for i := range datasources {
  65. if datasources[i].Datasources == nil {
  66. continue
  67. }
  68. for _, ds := range datasources[i].Datasources {
  69. if ds.OrgId == 0 {
  70. ds.OrgId = 1
  71. }
  72. if ds.IsDefault {
  73. defaultCount++
  74. if defaultCount > 1 {
  75. return ErrInvalidConfigToManyDefault
  76. }
  77. }
  78. }
  79. for _, ds := range datasources[i].DeleteDatasources {
  80. if ds.OrgId == 0 {
  81. ds.OrgId = 1
  82. }
  83. }
  84. }
  85. return nil
  86. }