|
|
|
|
@ -9,7 +9,6 @@ import ( |
|
|
|
|
"testing" |
|
|
|
|
"time" |
|
|
|
|
|
|
|
|
|
"github.com/grafana/grafana-azure-sdk-go/azsettings" |
|
|
|
|
sdkhttpclient "github.com/grafana/grafana-plugin-sdk-go/backend/httpclient" |
|
|
|
|
"github.com/grafana/grafana/pkg/services/secrets" |
|
|
|
|
secretsManager "github.com/grafana/grafana/pkg/services/secrets/manager" |
|
|
|
|
@ -545,169 +544,6 @@ func TestService_getTimeout(t *testing.T) { |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func TestService_HTTPClientOptions(t *testing.T) { |
|
|
|
|
cfg := &setting.Cfg{ |
|
|
|
|
Azure: &azsettings.AzureSettings{}, |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
emptyJsonData := simplejson.New() |
|
|
|
|
emptySecureJsonData := map[string][]byte{} |
|
|
|
|
|
|
|
|
|
ds := models.DataSource{ |
|
|
|
|
Id: 1, |
|
|
|
|
Url: "https://api.example.com", |
|
|
|
|
Type: "prometheus", |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
t.Run("Azure authentication", func(t *testing.T) { |
|
|
|
|
t.Run("given feature flag enabled", func(t *testing.T) { |
|
|
|
|
features := featuremgmt.WithFeatures(featuremgmt.FlagPrometheusAzureAuth) |
|
|
|
|
|
|
|
|
|
t.Run("should set Azure middleware when JsonData contains valid credentials", func(t *testing.T) { |
|
|
|
|
t.Cleanup(func() { ds.JsonData = emptyJsonData; ds.SecureJsonData = emptySecureJsonData }) |
|
|
|
|
|
|
|
|
|
ds.JsonData = simplejson.NewFromAny(map[string]interface{}{ |
|
|
|
|
"httpMethod": "POST", |
|
|
|
|
"azureCredentials": map[string]interface{}{ |
|
|
|
|
"authType": "msi", |
|
|
|
|
}, |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
secretsStore := kvstore.SetupTestService(t) |
|
|
|
|
secretsService := secretsManager.SetupTestService(t, fakes.NewFakeSecretsStore()) |
|
|
|
|
dsService := ProvideService(nil, secretsService, secretsStore, cfg, features, acmock.New(), acmock.NewMockedPermissionsService()) |
|
|
|
|
|
|
|
|
|
opts, err := dsService.httpClientOptions(context.Background(), &ds) |
|
|
|
|
require.NoError(t, err) |
|
|
|
|
|
|
|
|
|
require.NotNil(t, opts.Middlewares) |
|
|
|
|
assert.Len(t, opts.Middlewares, 1) |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
t.Run("should not set Azure middleware when JsonData doesn't contain valid credentials", func(t *testing.T) { |
|
|
|
|
t.Cleanup(func() { ds.JsonData = emptyJsonData; ds.SecureJsonData = emptySecureJsonData }) |
|
|
|
|
|
|
|
|
|
ds.JsonData = simplejson.NewFromAny(map[string]interface{}{ |
|
|
|
|
"httpMethod": "POST", |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
secretsStore := kvstore.SetupTestService(t) |
|
|
|
|
secretsService := secretsManager.SetupTestService(t, fakes.NewFakeSecretsStore()) |
|
|
|
|
dsService := ProvideService(nil, secretsService, secretsStore, cfg, features, acmock.New(), acmock.NewMockedPermissionsService()) |
|
|
|
|
|
|
|
|
|
opts, err := dsService.httpClientOptions(context.Background(), &ds) |
|
|
|
|
require.NoError(t, err) |
|
|
|
|
|
|
|
|
|
if opts.Middlewares != nil { |
|
|
|
|
assert.Len(t, opts.Middlewares, 0) |
|
|
|
|
} |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
t.Run("should return error when JsonData contains invalid credentials", func(t *testing.T) { |
|
|
|
|
t.Cleanup(func() { ds.JsonData = emptyJsonData; ds.SecureJsonData = emptySecureJsonData }) |
|
|
|
|
|
|
|
|
|
ds.JsonData = simplejson.NewFromAny(map[string]interface{}{ |
|
|
|
|
"httpMethod": "POST", |
|
|
|
|
"azureCredentials": "invalid", |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
secretsStore := kvstore.SetupTestService(t) |
|
|
|
|
secretsService := secretsManager.SetupTestService(t, fakes.NewFakeSecretsStore()) |
|
|
|
|
dsService := ProvideService(nil, secretsService, secretsStore, cfg, features, acmock.New(), acmock.NewMockedPermissionsService()) |
|
|
|
|
|
|
|
|
|
_, err := dsService.httpClientOptions(context.Background(), &ds) |
|
|
|
|
assert.Error(t, err) |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
t.Run("should set Azure middleware when JsonData contains credentials and valid audience", func(t *testing.T) { |
|
|
|
|
t.Cleanup(func() { ds.JsonData = emptyJsonData; ds.SecureJsonData = emptySecureJsonData }) |
|
|
|
|
|
|
|
|
|
ds.JsonData = simplejson.NewFromAny(map[string]interface{}{ |
|
|
|
|
"httpMethod": "POST", |
|
|
|
|
"azureCredentials": map[string]interface{}{ |
|
|
|
|
"authType": "msi", |
|
|
|
|
}, |
|
|
|
|
"azureEndpointResourceId": "https://api.example.com/abd5c4ce-ca73-41e9-9cb2-bed39aa2adb5", |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
secretsStore := kvstore.SetupTestService(t) |
|
|
|
|
secretsService := secretsManager.SetupTestService(t, fakes.NewFakeSecretsStore()) |
|
|
|
|
dsService := ProvideService(nil, secretsService, secretsStore, cfg, features, acmock.New(), acmock.NewMockedPermissionsService()) |
|
|
|
|
|
|
|
|
|
opts, err := dsService.httpClientOptions(context.Background(), &ds) |
|
|
|
|
require.NoError(t, err) |
|
|
|
|
|
|
|
|
|
require.NotNil(t, opts.Middlewares) |
|
|
|
|
assert.Len(t, opts.Middlewares, 1) |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
t.Run("should not set Azure middleware when JsonData doesn't contain credentials", func(t *testing.T) { |
|
|
|
|
t.Cleanup(func() { ds.JsonData = emptyJsonData; ds.SecureJsonData = emptySecureJsonData }) |
|
|
|
|
|
|
|
|
|
ds.JsonData = simplejson.NewFromAny(map[string]interface{}{ |
|
|
|
|
"httpMethod": "POST", |
|
|
|
|
"azureEndpointResourceId": "https://api.example.com/abd5c4ce-ca73-41e9-9cb2-bed39aa2adb5", |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
secretsStore := kvstore.SetupTestService(t) |
|
|
|
|
secretsService := secretsManager.SetupTestService(t, fakes.NewFakeSecretsStore()) |
|
|
|
|
dsService := ProvideService(nil, secretsService, secretsStore, cfg, features, acmock.New(), acmock.NewMockedPermissionsService()) |
|
|
|
|
|
|
|
|
|
opts, err := dsService.httpClientOptions(context.Background(), &ds) |
|
|
|
|
require.NoError(t, err) |
|
|
|
|
|
|
|
|
|
if opts.Middlewares != nil { |
|
|
|
|
assert.Len(t, opts.Middlewares, 0) |
|
|
|
|
} |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
t.Run("should return error when JsonData contains invalid audience", func(t *testing.T) { |
|
|
|
|
t.Cleanup(func() { ds.JsonData = emptyJsonData; ds.SecureJsonData = emptySecureJsonData }) |
|
|
|
|
|
|
|
|
|
ds.JsonData = simplejson.NewFromAny(map[string]interface{}{ |
|
|
|
|
"httpMethod": "POST", |
|
|
|
|
"azureCredentials": map[string]interface{}{ |
|
|
|
|
"authType": "msi", |
|
|
|
|
}, |
|
|
|
|
"azureEndpointResourceId": "invalid", |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
secretsStore := kvstore.SetupTestService(t) |
|
|
|
|
secretsService := secretsManager.SetupTestService(t, fakes.NewFakeSecretsStore()) |
|
|
|
|
dsService := ProvideService(nil, secretsService, secretsStore, cfg, features, acmock.New(), acmock.NewMockedPermissionsService()) |
|
|
|
|
|
|
|
|
|
_, err := dsService.httpClientOptions(context.Background(), &ds) |
|
|
|
|
assert.Error(t, err) |
|
|
|
|
}) |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
t.Run("given feature flag not enabled", func(t *testing.T) { |
|
|
|
|
t.Run("should not set Azure middleware even when JsonData contains credentials", func(t *testing.T) { |
|
|
|
|
t.Cleanup(func() { ds.JsonData = emptyJsonData; ds.SecureJsonData = emptySecureJsonData }) |
|
|
|
|
|
|
|
|
|
ds.JsonData = simplejson.NewFromAny(map[string]interface{}{ |
|
|
|
|
"httpMethod": "POST", |
|
|
|
|
"azureCredentials": map[string]interface{}{ |
|
|
|
|
"authType": "msi", |
|
|
|
|
}, |
|
|
|
|
"azureEndpointResourceId": "https://api.example.com/abd5c4ce-ca73-41e9-9cb2-bed39aa2adb5", |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
secretsStore := kvstore.SetupTestService(t) |
|
|
|
|
secretsService := secretsManager.SetupTestService(t, fakes.NewFakeSecretsStore()) |
|
|
|
|
dsService := ProvideService(nil, secretsService, secretsStore, cfg, featuremgmt.WithFeatures(), acmock.New(), acmock.NewMockedPermissionsService()) |
|
|
|
|
|
|
|
|
|
opts, err := dsService.httpClientOptions(context.Background(), &ds) |
|
|
|
|
require.NoError(t, err) |
|
|
|
|
|
|
|
|
|
if opts.Middlewares != nil { |
|
|
|
|
assert.Len(t, opts.Middlewares, 0) |
|
|
|
|
} |
|
|
|
|
}) |
|
|
|
|
}) |
|
|
|
|
}) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func TestService_GetDecryptedValues(t *testing.T) { |
|
|
|
|
t.Run("should migrate and retrieve values from secure json data", func(t *testing.T) { |
|
|
|
|
ds := &models.DataSource{ |
|
|
|
|
|