From ac56c21aad9c4b5e34e68cab5ffeefc852cce4fe Mon Sep 17 00:00:00 2001 From: "Grot (@grafanabot)" <43478413+grafanabot@users.noreply.github.com> Date: Wed, 8 Mar 2023 18:37:21 +0000 Subject: [PATCH] [v9.3.x] Plugins: Fix bug with copying grafanaData (#64453) Plugins: Fix bug with copying grafanaData (#64446) (cherry picked from commit 39a4634ae9e336eab505680416ca700c19c04d10) Co-authored-by: Stephanie Hingtgen --- pkg/services/datasources/service/datasource.go | 5 +++-- pkg/services/datasources/service/datasource_test.go | 4 ++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/pkg/services/datasources/service/datasource.go b/pkg/services/datasources/service/datasource.go index 03ab6d45404..0b16dde7a1e 100644 --- a/pkg/services/datasources/service/datasource.go +++ b/pkg/services/datasources/service/datasource.go @@ -417,10 +417,11 @@ func (s *Service) httpClientOptions(ctx context.Context, ds *datasources.DataSou if ds.JsonData != nil { opts.CustomOptions = ds.JsonData.MustMap() // allow the plugin sdk to get the json data in JSONDataFromHTTPClientOptions - opts.CustomOptions["grafanaData"] = make(map[string]interface{}) + deepJsonDataCopy := make(map[string]interface{}, len(opts.CustomOptions)) for k, v := range opts.CustomOptions { - opts.CustomOptions[k] = v + deepJsonDataCopy[k] = v } + opts.CustomOptions["grafanaData"] = deepJsonDataCopy } if ds.BasicAuth { password, err := s.DecryptedBasicAuthPassword(ctx, ds) diff --git a/pkg/services/datasources/service/datasource_test.go b/pkg/services/datasources/service/datasource_test.go index f4e41d0a175..0fda5cd6bfc 100644 --- a/pkg/services/datasources/service/datasource_test.go +++ b/pkg/services/datasources/service/datasource_test.go @@ -363,6 +363,10 @@ func TestService_GetHttpTransport(t *testing.T) { require.NotNil(t, rt) tr := configuredTransport + opts, err := dsService.httpClientOptions(context.Background(), &ds) + require.NoError(t, err) + require.Equal(t, ds.JsonData.MustMap()["grafanaData"], opts.CustomOptions["grafanaData"]) + // make sure we can still marshal the JsonData after httpClientOptions (avoid cycles) _, err = ds.JsonData.MarshalJSON() require.NoError(t, err)