Encryption: Refactor securejsondata.SecureJsonData to stop relying on global functions (#38865)
* Encryption: Add support to encrypt/decrypt sjd * Add datasources.Service as a proxy to datasources db operations * Encrypt ds.SecureJsonData before calling SQLStore * Move ds cache code into ds service * Fix tlsmanager tests * Fix pluginproxy tests * Remove some securejsondata.GetEncryptedJsonData usages * Add pluginsettings.Service as a proxy for plugin settings db operations * Add AlertNotificationService as a proxy for alert notification db operations * Remove some securejsondata.GetEncryptedJsonData usages * Remove more securejsondata.GetEncryptedJsonData usages * Fix lint errors * Minor fixes * Remove encryption global functions usages from ngalert * Fix lint errors * Minor fixes * Minor fixes * Remove securejsondata.DecryptedValue usage * Refactor the refactor * Remove securejsondata.DecryptedValue usage * Move securejsondata to migrations package * Move securejsondata to migrations package * Minor fix * Fix integration test * Fix integration tests * Undo undesired changes * Fix tests * Add context.Context into encryption methods * Fix tests * Fix tests * Fix tests * Trigger CI * Fix test * Add names to params of encryption service interface * Remove bus from CacheServiceImpl * Add logging * Add keys to logger Co-authored-by: Emil Tullstedt <emil.tullstedt@grafana.com> * Add missing key to logger Co-authored-by: Emil Tullstedt <emil.tullstedt@grafana.com> * Undo changes in markdown files * Fix formatting * Add context to secrets service * Rename decryptSecureJsonData to decryptSecureJsonDataFn * Name args in GetDecryptedValueFn * Add template back to NewAlertmanagerNotifier * Copy GetDecryptedValueFn to ngalert * Add logging to pluginsettings * Fix pluginsettings test Co-authored-by: Tania B <yalyna.ts@gmail.com> Co-authored-by: Emil Tullstedt <emil.tullstedt@grafana.com>
This commit is contained in:
committed by
GitHub
parent
da813877fb
commit
722c414fef
@@ -33,13 +33,13 @@ func TestDataAccess(t *testing.T) {
|
||||
Url: "http://test",
|
||||
}
|
||||
|
||||
initDatasource := func() *models.DataSource {
|
||||
initDatasource := func(sqlStore *SQLStore) *models.DataSource {
|
||||
cmd := defaultAddDatasourceCommand
|
||||
err := AddDataSource(&cmd)
|
||||
err := sqlStore.AddDataSource(&cmd)
|
||||
require.NoError(t, err)
|
||||
|
||||
query := models.GetDataSourcesQuery{OrgId: 10}
|
||||
err = GetDataSources(&query)
|
||||
err = sqlStore.GetDataSources(&query)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, 1, len(query.Result))
|
||||
|
||||
@@ -48,9 +48,9 @@ func TestDataAccess(t *testing.T) {
|
||||
|
||||
t.Run("AddDataSource", func(t *testing.T) {
|
||||
t.Run("Can add datasource", func(t *testing.T) {
|
||||
InitTestDB(t)
|
||||
sqlStore := InitTestDB(t)
|
||||
|
||||
err := AddDataSource(&models.AddDataSourceCommand{
|
||||
err := sqlStore.AddDataSource(&models.AddDataSourceCommand{
|
||||
OrgId: 10,
|
||||
Name: "laban",
|
||||
Type: models.DS_GRAPHITE,
|
||||
@@ -62,7 +62,7 @@ func TestDataAccess(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
|
||||
query := models.GetDataSourcesQuery{OrgId: 10}
|
||||
err = GetDataSources(&query)
|
||||
err = sqlStore.GetDataSources(&query)
|
||||
require.NoError(t, err)
|
||||
|
||||
require.Equal(t, 1, len(query.Result))
|
||||
@@ -74,26 +74,26 @@ func TestDataAccess(t *testing.T) {
|
||||
})
|
||||
|
||||
t.Run("generates uid if not specified", func(t *testing.T) {
|
||||
InitTestDB(t)
|
||||
ds := initDatasource()
|
||||
sqlStore := InitTestDB(t)
|
||||
ds := initDatasource(sqlStore)
|
||||
require.NotEmpty(t, ds.Uid)
|
||||
})
|
||||
|
||||
t.Run("fails to insert ds with same uid", func(t *testing.T) {
|
||||
InitTestDB(t)
|
||||
sqlStore := InitTestDB(t)
|
||||
cmd1 := defaultAddDatasourceCommand
|
||||
cmd2 := defaultAddDatasourceCommand
|
||||
cmd1.Uid = "test"
|
||||
cmd2.Uid = "test"
|
||||
err := AddDataSource(&cmd1)
|
||||
err := sqlStore.AddDataSource(&cmd1)
|
||||
require.NoError(t, err)
|
||||
err = AddDataSource(&cmd2)
|
||||
err = sqlStore.AddDataSource(&cmd2)
|
||||
require.Error(t, err)
|
||||
require.IsType(t, models.ErrDataSourceUidExists, err)
|
||||
})
|
||||
|
||||
t.Run("fires an event when the datasource is added", func(t *testing.T) {
|
||||
InitTestDB(t)
|
||||
sqlStore := InitTestDB(t)
|
||||
|
||||
var created *events.DataSourceCreated
|
||||
bus.AddEventListener(func(e *events.DataSourceCreated) error {
|
||||
@@ -101,7 +101,7 @@ func TestDataAccess(t *testing.T) {
|
||||
return nil
|
||||
})
|
||||
|
||||
err := AddDataSource(&defaultAddDatasourceCommand)
|
||||
err := sqlStore.AddDataSource(&defaultAddDatasourceCommand)
|
||||
require.NoError(t, err)
|
||||
|
||||
require.Eventually(t, func() bool {
|
||||
@@ -109,7 +109,7 @@ func TestDataAccess(t *testing.T) {
|
||||
}, time.Second, time.Millisecond)
|
||||
|
||||
query := models.GetDataSourcesQuery{OrgId: 10}
|
||||
err = GetDataSources(&query)
|
||||
err = sqlStore.GetDataSources(&query)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, 1, len(query.Result))
|
||||
|
||||
@@ -122,34 +122,34 @@ func TestDataAccess(t *testing.T) {
|
||||
|
||||
t.Run("UpdateDataSource", func(t *testing.T) {
|
||||
t.Run("updates datasource with version", func(t *testing.T) {
|
||||
InitTestDB(t)
|
||||
ds := initDatasource()
|
||||
sqlStore := InitTestDB(t)
|
||||
ds := initDatasource(sqlStore)
|
||||
cmd := defaultUpdateDatasourceCommand
|
||||
cmd.Id = ds.Id
|
||||
cmd.Version = ds.Version
|
||||
err := UpdateDataSource(&cmd)
|
||||
err := sqlStore.UpdateDataSource(&cmd)
|
||||
require.NoError(t, err)
|
||||
})
|
||||
|
||||
t.Run("does not overwrite Uid if not specified", func(t *testing.T) {
|
||||
InitTestDB(t)
|
||||
ds := initDatasource()
|
||||
sqlStore := InitTestDB(t)
|
||||
ds := initDatasource(sqlStore)
|
||||
require.NotEmpty(t, ds.Uid)
|
||||
|
||||
cmd := defaultUpdateDatasourceCommand
|
||||
cmd.Id = ds.Id
|
||||
err := UpdateDataSource(&cmd)
|
||||
err := sqlStore.UpdateDataSource(&cmd)
|
||||
require.NoError(t, err)
|
||||
|
||||
query := models.GetDataSourceQuery{Id: ds.Id, OrgId: 10}
|
||||
err = GetDataSource(&query)
|
||||
err = sqlStore.GetDataSource(&query)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, ds.Uid, query.Result.Uid)
|
||||
})
|
||||
|
||||
t.Run("prevents update if version changed", func(t *testing.T) {
|
||||
InitTestDB(t)
|
||||
ds := initDatasource()
|
||||
sqlStore := InitTestDB(t)
|
||||
ds := initDatasource(sqlStore)
|
||||
|
||||
cmd := models.UpdateDataSourceCommand{
|
||||
Id: ds.Id,
|
||||
@@ -163,16 +163,16 @@ func TestDataAccess(t *testing.T) {
|
||||
// Make a copy as UpdateDataSource modifies it
|
||||
cmd2 := cmd
|
||||
|
||||
err := UpdateDataSource(&cmd)
|
||||
err := sqlStore.UpdateDataSource(&cmd)
|
||||
require.NoError(t, err)
|
||||
|
||||
err = UpdateDataSource(&cmd2)
|
||||
err = sqlStore.UpdateDataSource(&cmd2)
|
||||
require.Error(t, err)
|
||||
})
|
||||
|
||||
t.Run("updates ds without version specified", func(t *testing.T) {
|
||||
InitTestDB(t)
|
||||
ds := initDatasource()
|
||||
sqlStore := InitTestDB(t)
|
||||
ds := initDatasource(sqlStore)
|
||||
|
||||
cmd := &models.UpdateDataSourceCommand{
|
||||
Id: ds.Id,
|
||||
@@ -183,13 +183,13 @@ func TestDataAccess(t *testing.T) {
|
||||
Url: "http://test",
|
||||
}
|
||||
|
||||
err := UpdateDataSource(cmd)
|
||||
err := sqlStore.UpdateDataSource(cmd)
|
||||
require.NoError(t, err)
|
||||
})
|
||||
|
||||
t.Run("updates ds without higher version", func(t *testing.T) {
|
||||
InitTestDB(t)
|
||||
ds := initDatasource()
|
||||
sqlStore := InitTestDB(t)
|
||||
ds := initDatasource(sqlStore)
|
||||
|
||||
cmd := &models.UpdateDataSourceCommand{
|
||||
Id: ds.Id,
|
||||
@@ -201,34 +201,34 @@ func TestDataAccess(t *testing.T) {
|
||||
Version: 90000,
|
||||
}
|
||||
|
||||
err := UpdateDataSource(cmd)
|
||||
err := sqlStore.UpdateDataSource(cmd)
|
||||
require.NoError(t, err)
|
||||
})
|
||||
})
|
||||
|
||||
t.Run("DeleteDataSourceById", func(t *testing.T) {
|
||||
t.Run("can delete datasource", func(t *testing.T) {
|
||||
InitTestDB(t)
|
||||
ds := initDatasource()
|
||||
sqlStore := InitTestDB(t)
|
||||
ds := initDatasource(sqlStore)
|
||||
|
||||
err := DeleteDataSource(&models.DeleteDataSourceCommand{ID: ds.Id, OrgID: ds.OrgId})
|
||||
err := sqlStore.DeleteDataSource(&models.DeleteDataSourceCommand{ID: ds.Id, OrgID: ds.OrgId})
|
||||
require.NoError(t, err)
|
||||
|
||||
query := models.GetDataSourcesQuery{OrgId: 10}
|
||||
err = GetDataSources(&query)
|
||||
err = sqlStore.GetDataSources(&query)
|
||||
require.NoError(t, err)
|
||||
|
||||
require.Equal(t, 0, len(query.Result))
|
||||
})
|
||||
|
||||
t.Run("Can not delete datasource with wrong orgId", func(t *testing.T) {
|
||||
InitTestDB(t)
|
||||
ds := initDatasource()
|
||||
sqlStore := InitTestDB(t)
|
||||
ds := initDatasource(sqlStore)
|
||||
|
||||
err := DeleteDataSource(&models.DeleteDataSourceCommand{ID: ds.Id, OrgID: 123123})
|
||||
err := sqlStore.DeleteDataSource(&models.DeleteDataSourceCommand{ID: ds.Id, OrgID: 123123})
|
||||
require.NoError(t, err)
|
||||
query := models.GetDataSourcesQuery{OrgId: 10}
|
||||
err = GetDataSources(&query)
|
||||
err = sqlStore.GetDataSources(&query)
|
||||
require.NoError(t, err)
|
||||
|
||||
require.Equal(t, 1, len(query.Result))
|
||||
@@ -236,8 +236,8 @@ func TestDataAccess(t *testing.T) {
|
||||
})
|
||||
|
||||
t.Run("fires an event when the datasource is deleted", func(t *testing.T) {
|
||||
InitTestDB(t)
|
||||
ds := initDatasource()
|
||||
sqlStore := InitTestDB(t)
|
||||
ds := initDatasource(sqlStore)
|
||||
|
||||
var deleted *events.DataSourceDeleted
|
||||
bus.AddEventListener(func(e *events.DataSourceDeleted) error {
|
||||
@@ -245,7 +245,7 @@ func TestDataAccess(t *testing.T) {
|
||||
return nil
|
||||
})
|
||||
|
||||
err := DeleteDataSource(&models.DeleteDataSourceCommand{ID: ds.Id, UID: "nisse-uid", Name: "nisse", OrgID: 123123})
|
||||
err := sqlStore.DeleteDataSource(&models.DeleteDataSourceCommand{ID: ds.Id, UID: "nisse-uid", Name: "nisse", OrgID: 123123})
|
||||
require.NoError(t, err)
|
||||
|
||||
require.Eventually(t, func() bool {
|
||||
@@ -259,14 +259,14 @@ func TestDataAccess(t *testing.T) {
|
||||
})
|
||||
|
||||
t.Run("DeleteDataSourceByName", func(t *testing.T) {
|
||||
InitTestDB(t)
|
||||
ds := initDatasource()
|
||||
sqlStore := InitTestDB(t)
|
||||
ds := initDatasource(sqlStore)
|
||||
query := models.GetDataSourcesQuery{OrgId: 10}
|
||||
|
||||
err := DeleteDataSource(&models.DeleteDataSourceCommand{Name: ds.Name, OrgID: ds.OrgId})
|
||||
err := sqlStore.DeleteDataSource(&models.DeleteDataSourceCommand{Name: ds.Name, OrgID: ds.OrgId})
|
||||
require.NoError(t, err)
|
||||
|
||||
err = GetDataSources(&query)
|
||||
err = sqlStore.GetDataSources(&query)
|
||||
require.NoError(t, err)
|
||||
|
||||
require.Equal(t, 0, len(query.Result))
|
||||
@@ -274,10 +274,10 @@ func TestDataAccess(t *testing.T) {
|
||||
|
||||
t.Run("GetDataSources", func(t *testing.T) {
|
||||
t.Run("Number of data sources returned limited to 6 per organization", func(t *testing.T) {
|
||||
InitTestDB(t)
|
||||
sqlStore := InitTestDB(t)
|
||||
datasourceLimit := 6
|
||||
for i := 0; i < datasourceLimit+1; i++ {
|
||||
err := AddDataSource(&models.AddDataSourceCommand{
|
||||
err := sqlStore.AddDataSource(&models.AddDataSourceCommand{
|
||||
OrgId: 10,
|
||||
Name: "laban" + strconv.Itoa(i),
|
||||
Type: models.DS_GRAPHITE,
|
||||
@@ -290,17 +290,17 @@ func TestDataAccess(t *testing.T) {
|
||||
}
|
||||
query := models.GetDataSourcesQuery{OrgId: 10, DataSourceLimit: datasourceLimit}
|
||||
|
||||
err := GetDataSources(&query)
|
||||
err := sqlStore.GetDataSources(&query)
|
||||
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, datasourceLimit, len(query.Result))
|
||||
})
|
||||
|
||||
t.Run("No limit should be applied on the returned data sources if the limit is not set", func(t *testing.T) {
|
||||
InitTestDB(t)
|
||||
sqlStore := InitTestDB(t)
|
||||
numberOfDatasource := 5100
|
||||
for i := 0; i < numberOfDatasource; i++ {
|
||||
err := AddDataSource(&models.AddDataSourceCommand{
|
||||
err := sqlStore.AddDataSource(&models.AddDataSourceCommand{
|
||||
OrgId: 10,
|
||||
Name: "laban" + strconv.Itoa(i),
|
||||
Type: models.DS_GRAPHITE,
|
||||
@@ -313,17 +313,17 @@ func TestDataAccess(t *testing.T) {
|
||||
}
|
||||
query := models.GetDataSourcesQuery{OrgId: 10}
|
||||
|
||||
err := GetDataSources(&query)
|
||||
err := sqlStore.GetDataSources(&query)
|
||||
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, numberOfDatasource, len(query.Result))
|
||||
})
|
||||
|
||||
t.Run("No limit should be applied on the returned data sources if the limit is negative", func(t *testing.T) {
|
||||
InitTestDB(t)
|
||||
sqlStore := InitTestDB(t)
|
||||
numberOfDatasource := 5100
|
||||
for i := 0; i < numberOfDatasource; i++ {
|
||||
err := AddDataSource(&models.AddDataSourceCommand{
|
||||
err := sqlStore.AddDataSource(&models.AddDataSourceCommand{
|
||||
OrgId: 10,
|
||||
Name: "laban" + strconv.Itoa(i),
|
||||
Type: models.DS_GRAPHITE,
|
||||
@@ -336,7 +336,7 @@ func TestDataAccess(t *testing.T) {
|
||||
}
|
||||
query := models.GetDataSourcesQuery{OrgId: 10, DataSourceLimit: -1}
|
||||
|
||||
err := GetDataSources(&query)
|
||||
err := sqlStore.GetDataSources(&query)
|
||||
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, numberOfDatasource, len(query.Result))
|
||||
@@ -345,9 +345,9 @@ func TestDataAccess(t *testing.T) {
|
||||
|
||||
t.Run("GetDataSourcesByType", func(t *testing.T) {
|
||||
t.Run("Only returns datasources of specified type", func(t *testing.T) {
|
||||
InitTestDB(t)
|
||||
sqlStore := InitTestDB(t)
|
||||
|
||||
err := AddDataSource(&models.AddDataSourceCommand{
|
||||
err := sqlStore.AddDataSource(&models.AddDataSourceCommand{
|
||||
OrgId: 10,
|
||||
Name: "Elasticsearch",
|
||||
Type: models.DS_ES,
|
||||
@@ -358,7 +358,7 @@ func TestDataAccess(t *testing.T) {
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
||||
err = AddDataSource(&models.AddDataSourceCommand{
|
||||
err = sqlStore.AddDataSource(&models.AddDataSourceCommand{
|
||||
OrgId: 10,
|
||||
Name: "Graphite",
|
||||
Type: models.DS_GRAPHITE,
|
||||
@@ -371,16 +371,18 @@ func TestDataAccess(t *testing.T) {
|
||||
|
||||
query := models.GetDataSourcesByTypeQuery{Type: models.DS_ES}
|
||||
|
||||
err = GetDataSourcesByType(&query)
|
||||
err = sqlStore.GetDataSourcesByType(&query)
|
||||
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, 1, len(query.Result))
|
||||
})
|
||||
|
||||
t.Run("Returns an error if no type specified", func(t *testing.T) {
|
||||
sqlStore := InitTestDB(t)
|
||||
|
||||
query := models.GetDataSourcesByTypeQuery{}
|
||||
|
||||
err := GetDataSourcesByType(&query)
|
||||
err := sqlStore.GetDataSourcesByType(&query)
|
||||
|
||||
require.Error(t, err)
|
||||
})
|
||||
@@ -391,6 +393,8 @@ func TestGetDefaultDataSource(t *testing.T) {
|
||||
InitTestDB(t)
|
||||
|
||||
t.Run("should return error if there is no default datasource", func(t *testing.T) {
|
||||
sqlStore := InitTestDB(t)
|
||||
|
||||
cmd := models.AddDataSourceCommand{
|
||||
OrgId: 10,
|
||||
Name: "nisse",
|
||||
@@ -399,16 +403,18 @@ func TestGetDefaultDataSource(t *testing.T) {
|
||||
Url: "http://test",
|
||||
}
|
||||
|
||||
err := AddDataSource(&cmd)
|
||||
err := sqlStore.AddDataSource(&cmd)
|
||||
require.NoError(t, err)
|
||||
|
||||
query := models.GetDefaultDataSourceQuery{OrgId: 10}
|
||||
err = GetDefaultDataSource(&query)
|
||||
err = sqlStore.GetDefaultDataSource(&query)
|
||||
require.Error(t, err)
|
||||
assert.True(t, errors.Is(err, models.ErrDataSourceNotFound))
|
||||
})
|
||||
|
||||
t.Run("should return default datasource if exists", func(t *testing.T) {
|
||||
sqlStore := InitTestDB(t)
|
||||
|
||||
cmd := models.AddDataSourceCommand{
|
||||
OrgId: 10,
|
||||
Name: "default datasource",
|
||||
@@ -418,18 +424,19 @@ func TestGetDefaultDataSource(t *testing.T) {
|
||||
IsDefault: true,
|
||||
}
|
||||
|
||||
err := AddDataSource(&cmd)
|
||||
err := sqlStore.AddDataSource(&cmd)
|
||||
require.NoError(t, err)
|
||||
|
||||
query := models.GetDefaultDataSourceQuery{OrgId: 10}
|
||||
err = GetDefaultDataSource(&query)
|
||||
err = sqlStore.GetDefaultDataSource(&query)
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, "default datasource", query.Result.Name)
|
||||
})
|
||||
|
||||
t.Run("should not return default datasource of other organisation", func(t *testing.T) {
|
||||
sqlStore := InitTestDB(t)
|
||||
query := models.GetDefaultDataSourceQuery{OrgId: 1}
|
||||
err := GetDefaultDataSource(&query)
|
||||
err := sqlStore.GetDefaultDataSource(&query)
|
||||
require.Error(t, err)
|
||||
assert.True(t, errors.Is(err, models.ErrDataSourceNotFound))
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user