datasources_test.go 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. package datasources
  2. import (
  3. "testing"
  4. "github.com/grafana/grafana/pkg/bus"
  5. "github.com/grafana/grafana/pkg/log"
  6. "github.com/grafana/grafana/pkg/models"
  7. . "github.com/smartystreets/goconvey/convey"
  8. )
  9. var (
  10. logger log.Logger = log.New("fake.logger")
  11. oneDatasourcesConfig string = ""
  12. twoDatasourcesConfig string = "./test-configs/two-datasources"
  13. twoDatasourcesConfigPurgeOthers string = "./test-configs/insert-two-delete-two"
  14. doubleDatasourcesConfig string = "./test-configs/double-default"
  15. allProperties string = "./test-configs/all-properties"
  16. brokenYaml string = "./test-configs/broken-yaml"
  17. fakeRepo *fakeRepository
  18. )
  19. func TestDatasourceAsConfig(t *testing.T) {
  20. Convey("Testing datasource as configuration", t, func() {
  21. fakeRepo = &fakeRepository{}
  22. bus.ClearBusHandlers()
  23. bus.AddHandler("test", mockDelete)
  24. bus.AddHandler("test", mockInsert)
  25. bus.AddHandler("test", mockUpdate)
  26. bus.AddHandler("test", mockGet)
  27. bus.AddHandler("test", mockGetAll)
  28. Convey("One configured datasource", func() {
  29. Convey("no datasource in database", func() {
  30. dc := newDatasourceProvisioner(logger)
  31. err := dc.applyChanges(twoDatasourcesConfig)
  32. if err != nil {
  33. t.Fatalf("applyChanges return an error %v", err)
  34. }
  35. So(len(fakeRepo.deleted), ShouldEqual, 0)
  36. So(len(fakeRepo.inserted), ShouldEqual, 2)
  37. So(len(fakeRepo.updated), ShouldEqual, 0)
  38. })
  39. Convey("One datasource in database with same name", func() {
  40. fakeRepo.loadAll = []*models.DataSource{
  41. {Name: "Graphite", OrgId: 1, Id: 1},
  42. }
  43. Convey("should update one datasource", func() {
  44. dc := newDatasourceProvisioner(logger)
  45. err := dc.applyChanges(twoDatasourcesConfig)
  46. if err != nil {
  47. t.Fatalf("applyChanges return an error %v", err)
  48. }
  49. So(len(fakeRepo.deleted), ShouldEqual, 0)
  50. So(len(fakeRepo.inserted), ShouldEqual, 1)
  51. So(len(fakeRepo.updated), ShouldEqual, 1)
  52. })
  53. })
  54. Convey("Two datasources with is_default", func() {
  55. dc := newDatasourceProvisioner(logger)
  56. err := dc.applyChanges(doubleDatasourcesConfig)
  57. Convey("should raise error", func() {
  58. So(err, ShouldEqual, ErrInvalidConfigToManyDefault)
  59. })
  60. })
  61. })
  62. Convey("Two configured datasource and purge others ", func() {
  63. Convey("two other datasources in database", func() {
  64. fakeRepo.loadAll = []*models.DataSource{
  65. {Name: "old-graphite", OrgId: 1, Id: 1},
  66. {Name: "old-graphite2", OrgId: 1, Id: 2},
  67. }
  68. Convey("should have two new datasources", func() {
  69. dc := newDatasourceProvisioner(logger)
  70. err := dc.applyChanges(twoDatasourcesConfigPurgeOthers)
  71. if err != nil {
  72. t.Fatalf("applyChanges return an error %v", err)
  73. }
  74. So(len(fakeRepo.deleted), ShouldEqual, 2)
  75. So(len(fakeRepo.inserted), ShouldEqual, 2)
  76. So(len(fakeRepo.updated), ShouldEqual, 0)
  77. })
  78. })
  79. })
  80. Convey("Two configured datasource and purge others = false", func() {
  81. Convey("two other datasources in database", func() {
  82. fakeRepo.loadAll = []*models.DataSource{
  83. {Name: "Graphite", OrgId: 1, Id: 1},
  84. {Name: "old-graphite2", OrgId: 1, Id: 2},
  85. }
  86. Convey("should have two new datasources", func() {
  87. dc := newDatasourceProvisioner(logger)
  88. err := dc.applyChanges(twoDatasourcesConfig)
  89. if err != nil {
  90. t.Fatalf("applyChanges return an error %v", err)
  91. }
  92. So(len(fakeRepo.deleted), ShouldEqual, 0)
  93. So(len(fakeRepo.inserted), ShouldEqual, 1)
  94. So(len(fakeRepo.updated), ShouldEqual, 1)
  95. })
  96. })
  97. })
  98. Convey("broken yaml should return error", func() {
  99. _, err := configReader{}.readConfig(brokenYaml)
  100. So(err, ShouldNotBeNil)
  101. })
  102. Convey("can read all properties", func() {
  103. cfgProvifer := configReader{}
  104. cfg, err := cfgProvifer.readConfig(allProperties)
  105. if err != nil {
  106. t.Fatalf("readConfig return an error %v", err)
  107. }
  108. So(len(cfg), ShouldEqual, 2)
  109. dsCfg := cfg[0]
  110. ds := dsCfg.Datasources[0]
  111. So(ds.Name, ShouldEqual, "name")
  112. So(ds.Type, ShouldEqual, "type")
  113. So(ds.Access, ShouldEqual, models.DS_ACCESS_PROXY)
  114. So(ds.OrgId, ShouldEqual, 2)
  115. So(ds.Url, ShouldEqual, "url")
  116. So(ds.User, ShouldEqual, "user")
  117. So(ds.Password, ShouldEqual, "password")
  118. So(ds.Database, ShouldEqual, "database")
  119. So(ds.BasicAuth, ShouldBeTrue)
  120. So(ds.BasicAuthUser, ShouldEqual, "basic_auth_user")
  121. So(ds.BasicAuthPassword, ShouldEqual, "basic_auth_password")
  122. So(ds.WithCredentials, ShouldBeTrue)
  123. So(ds.IsDefault, ShouldBeTrue)
  124. So(ds.Editable, ShouldBeTrue)
  125. So(len(ds.JsonData), ShouldBeGreaterThan, 2)
  126. So(ds.JsonData["graphiteVersion"], ShouldEqual, "1.1")
  127. So(ds.JsonData["tlsAuth"], ShouldEqual, true)
  128. So(ds.JsonData["tlsAuthWithCACert"], ShouldEqual, true)
  129. So(len(ds.SecureJsonData), ShouldBeGreaterThan, 2)
  130. So(ds.SecureJsonData["tlsCACert"], ShouldEqual, "MjNOcW9RdkbUDHZmpco2HCYzVq9dE+i6Yi+gmUJotq5CDA==")
  131. So(ds.SecureJsonData["tlsClientCert"], ShouldEqual, "ckN0dGlyMXN503YNfjTcf9CV+GGQneN+xmAclQ==")
  132. So(ds.SecureJsonData["tlsClientKey"], ShouldEqual, "ZkN4aG1aNkja/gKAB1wlnKFIsy2SRDq4slrM0A==")
  133. dstwo := cfg[1].Datasources[0]
  134. So(dstwo.Name, ShouldEqual, "name2")
  135. })
  136. })
  137. }
  138. type fakeRepository struct {
  139. inserted []*models.AddDataSourceCommand
  140. deleted []*models.DeleteDataSourceByNameCommand
  141. updated []*models.UpdateDataSourceCommand
  142. loadAll []*models.DataSource
  143. }
  144. func mockDelete(cmd *models.DeleteDataSourceByNameCommand) error {
  145. fakeRepo.deleted = append(fakeRepo.deleted, cmd)
  146. return nil
  147. }
  148. func mockUpdate(cmd *models.UpdateDataSourceCommand) error {
  149. fakeRepo.updated = append(fakeRepo.updated, cmd)
  150. return nil
  151. }
  152. func mockInsert(cmd *models.AddDataSourceCommand) error {
  153. fakeRepo.inserted = append(fakeRepo.inserted, cmd)
  154. return nil
  155. }
  156. func mockGetAll(cmd *models.GetAllDataSourcesQuery) error {
  157. cmd.Result = fakeRepo.loadAll
  158. return nil
  159. }
  160. func mockGet(cmd *models.GetDataSourceByNameQuery) error {
  161. for _, v := range fakeRepo.loadAll {
  162. if cmd.Name == v.Name && cmd.OrgId == v.OrgId {
  163. cmd.Result = v
  164. return nil
  165. }
  166. }
  167. return models.ErrDataSourceNotFound
  168. }