From aed89b49c01d677bf5b41fbdc893da59f9f2868d Mon Sep 17 00:00:00 2001 From: Marcus Efraimsson Date: Tue, 14 Aug 2018 14:48:14 +0200 Subject: [PATCH 1/2] should allow one default datasource per organisation using provisioning --- .../provisioning/datasources/config_reader.go | 6 ++--- .../datasources/config_reader_test.go | 14 ++++++++++ .../provisioning/datasources/datasources.go | 2 +- .../testdata/multiple-org-default/config.yaml | 27 +++++++++++++++++++ 4 files changed, 45 insertions(+), 4 deletions(-) create mode 100644 pkg/services/provisioning/datasources/testdata/multiple-org-default/config.yaml diff --git a/pkg/services/provisioning/datasources/config_reader.go b/pkg/services/provisioning/datasources/config_reader.go index 4b8931f0ed3..b2930c2b679 100644 --- a/pkg/services/provisioning/datasources/config_reader.go +++ b/pkg/services/provisioning/datasources/config_reader.go @@ -83,7 +83,7 @@ func (cr *configReader) parseDatasourceConfig(path string, file os.FileInfo) (*D } func validateDefaultUniqueness(datasources []*DatasourcesAsConfig) error { - defaultCount := 0 + defaultCount := map[int64]int{} for i := range datasources { if datasources[i].Datasources == nil { continue @@ -95,8 +95,8 @@ func validateDefaultUniqueness(datasources []*DatasourcesAsConfig) error { } if ds.IsDefault { - defaultCount++ - if defaultCount > 1 { + defaultCount[ds.OrgId] = defaultCount[ds.OrgId] + 1 + if defaultCount[ds.OrgId] > 1 { return ErrInvalidConfigToManyDefault } } diff --git a/pkg/services/provisioning/datasources/config_reader_test.go b/pkg/services/provisioning/datasources/config_reader_test.go index 2e407dbe4de..df99456b21b 100644 --- a/pkg/services/provisioning/datasources/config_reader_test.go +++ b/pkg/services/provisioning/datasources/config_reader_test.go @@ -19,6 +19,7 @@ var ( allProperties = "testdata/all-properties" versionZero = "testdata/version-0" brokenYaml = "testdata/broken-yaml" + multipleOrgsWithDefault = "testdata/multiple-org-default" fakeRepo *fakeRepository ) @@ -73,6 +74,19 @@ func TestDatasourceAsConfig(t *testing.T) { }) }) + Convey("Multiple datasources in different organizations with is_default in each organization", func() { + dc := newDatasourceProvisioner(logger) + err := dc.applyChanges(multipleOrgsWithDefault) + Convey("should not raise error", func() { + So(err, ShouldBeNil) + So(len(fakeRepo.inserted), ShouldEqual, 4) + So(fakeRepo.inserted[0].IsDefault, ShouldBeTrue) + So(fakeRepo.inserted[0].OrgId, ShouldEqual, 1) + So(fakeRepo.inserted[2].IsDefault, ShouldBeTrue) + So(fakeRepo.inserted[2].OrgId, ShouldEqual, 2) + }) + }) + Convey("Two configured datasource and purge others ", func() { Convey("two other datasources in database", func() { fakeRepo.loadAll = []*models.DataSource{ diff --git a/pkg/services/provisioning/datasources/datasources.go b/pkg/services/provisioning/datasources/datasources.go index 1fa0a3b3173..de6c876baad 100644 --- a/pkg/services/provisioning/datasources/datasources.go +++ b/pkg/services/provisioning/datasources/datasources.go @@ -11,7 +11,7 @@ import ( ) var ( - ErrInvalidConfigToManyDefault = errors.New("datasource.yaml config is invalid. Only one datasource can be marked as default") + ErrInvalidConfigToManyDefault = errors.New("datasource.yaml config is invalid. Only one datasource per organization can be marked as default") ) func Provision(configDirectory string) error { diff --git a/pkg/services/provisioning/datasources/testdata/multiple-org-default/config.yaml b/pkg/services/provisioning/datasources/testdata/multiple-org-default/config.yaml new file mode 100644 index 00000000000..447317a8c77 --- /dev/null +++ b/pkg/services/provisioning/datasources/testdata/multiple-org-default/config.yaml @@ -0,0 +1,27 @@ +apiVersion: 1 + +datasources: + - orgId: 1 + name: prometheus + type: prometheus + isDefault: True + access: proxy + url: http://prometheus.example.com:9090 + - name: Graphite + type: graphite + access: proxy + url: http://localhost:8080 + is_default: true + - orgId: 2 + name: prometheus + type: prometheus + isDefault: True + access: proxy + url: http://prometheus.example.com:9090 + - orgId: 2 + name: Graphite + type: graphite + access: proxy + url: http://localhost:8080 + is_default: true + From 0a7be2618e23822c987468d3d506476597744db8 Mon Sep 17 00:00:00 2001 From: Marcus Efraimsson Date: Fri, 17 Aug 2018 15:00:37 +0200 Subject: [PATCH 2/2] cleaning up test data --- pkg/services/provisioning/datasources/config_reader_test.go | 2 +- .../datasources/testdata/multiple-org-default/config.yaml | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/pkg/services/provisioning/datasources/config_reader_test.go b/pkg/services/provisioning/datasources/config_reader_test.go index df99456b21b..07c8d68e75c 100644 --- a/pkg/services/provisioning/datasources/config_reader_test.go +++ b/pkg/services/provisioning/datasources/config_reader_test.go @@ -74,7 +74,7 @@ func TestDatasourceAsConfig(t *testing.T) { }) }) - Convey("Multiple datasources in different organizations with is_default in each organization", func() { + Convey("Multiple datasources in different organizations with isDefault in each organization", func() { dc := newDatasourceProvisioner(logger) err := dc.applyChanges(multipleOrgsWithDefault) Convey("should not raise error", func() { diff --git a/pkg/services/provisioning/datasources/testdata/multiple-org-default/config.yaml b/pkg/services/provisioning/datasources/testdata/multiple-org-default/config.yaml index 447317a8c77..f185abb6f53 100644 --- a/pkg/services/provisioning/datasources/testdata/multiple-org-default/config.yaml +++ b/pkg/services/provisioning/datasources/testdata/multiple-org-default/config.yaml @@ -11,7 +11,6 @@ datasources: type: graphite access: proxy url: http://localhost:8080 - is_default: true - orgId: 2 name: prometheus type: prometheus @@ -23,5 +22,4 @@ datasources: type: graphite access: proxy url: http://localhost:8080 - is_default: true