diff --git a/pkg/api/datasources.go b/pkg/api/datasources.go index 18b48cd8e29..2b9964f7a71 100644 --- a/pkg/api/datasources.go +++ b/pkg/api/datasources.go @@ -92,6 +92,11 @@ func AddDataSource(c *middleware.Context, cmd m.AddDataSourceCommand) { cmd.OrgId = c.OrgId if err := bus.Dispatch(&cmd); err != nil { + if err == m.ErrDataSourceNameExists { + c.JsonApiErr(409, err.Error(), err) + return + } + c.JsonApiErr(500, "Failed to add datasource", err) return } diff --git a/pkg/models/datasource.go b/pkg/models/datasource.go index 794266ba71e..883cc3a90bd 100644 --- a/pkg/models/datasource.go +++ b/pkg/models/datasource.go @@ -22,7 +22,8 @@ const ( // Typed errors var ( - ErrDataSourceNotFound = errors.New("Data source not found") + ErrDataSourceNotFound = errors.New("Data source not found") + ErrDataSourceNameExists = errors.New("Data source with same name already exists") ) type DsAccess string diff --git a/pkg/services/sqlstore/datasource.go b/pkg/services/sqlstore/datasource.go index 2f1b40b2d61..56ca4f859e9 100644 --- a/pkg/services/sqlstore/datasource.go +++ b/pkg/services/sqlstore/datasource.go @@ -60,6 +60,14 @@ func DeleteDataSource(cmd *m.DeleteDataSourceCommand) error { func AddDataSource(cmd *m.AddDataSourceCommand) error { return inTransaction(func(sess *xorm.Session) error { + + existing := m.DataSource{OrgId: cmd.OrgId, Name: cmd.Name} + has, _ := x.Get(&existing) + + if has { + return m.ErrDataSourceNameExists + } + ds := &m.DataSource{ OrgId: cmd.OrgId, Name: cmd.Name,