From f26f6556155a6e90164eb01bb8ea6a5c2f3d2bd8 Mon Sep 17 00:00:00 2001 From: "Arati R." <33031346+suntala@users.noreply.github.com> Date: Mon, 2 Sep 2024 15:48:13 +0200 Subject: [PATCH] Provisioning: Fix admin reloading of dashboard configuration (#92462) * Set dashboard provisioner before provisioning dashboards * Test provisioner instantiation during dashboard provisioning --- pkg/services/provisioning/provisioning.go | 7 ++++++- pkg/services/provisioning/provisioning_test.go | 16 ++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/pkg/services/provisioning/provisioning.go b/pkg/services/provisioning/provisioning.go index 13cdf4b5458..86330a869ff 100644 --- a/pkg/services/provisioning/provisioning.go +++ b/pkg/services/provisioning/provisioning.go @@ -235,13 +235,18 @@ func (ps *ProvisioningServiceImpl) ProvisionPlugins(ctx context.Context) error { } func (ps *ProvisioningServiceImpl) ProvisionDashboards(ctx context.Context) error { + err := ps.setDashboardProvisioner() + if err != nil { + return fmt.Errorf("%v: %w", "Failed to create provisioner", err) + } + ps.mutex.Lock() defer ps.mutex.Unlock() ps.cancelPolling() ps.dashboardProvisioner.CleanUpOrphanedDashboards(ctx) - err := ps.dashboardProvisioner.Provision(ctx) + err = ps.dashboardProvisioner.Provision(ctx) if err != nil { // If we fail to provision with the new provisioner, the mutex will unlock and the polling will restart with the // old provisioner as we did not switch them yet. diff --git a/pkg/services/provisioning/provisioning_test.go b/pkg/services/provisioning/provisioning_test.go index c2e9e08fbaa..de84250512a 100644 --- a/pkg/services/provisioning/provisioning_test.go +++ b/pkg/services/provisioning/provisioning_test.go @@ -108,6 +108,19 @@ func TestProvisioningServiceImpl(t *testing.T) { assert.True(t, errors.Is(serviceTest.serviceError, provisioningErr)) }) + t.Run("Should set dashboard provisioner when provisioning dashboards", func(t *testing.T) { + // The first dashboard provisioner instantiation takes place when + // setDashboardProvisioner() is called in setup(t). + serviceTest := setup(t) + // The second dashboard provisioner instantiation takes place when + // Run(ctx) is executed. + serviceTest.startService() + + serviceTest.cancel() + serviceTest.waitForStop() + + assert.Equal(t, 2, serviceTest.dashboardProvisionerInstantiations) + }) } type serviceTestStruct struct { @@ -121,6 +134,8 @@ type serviceTestStruct struct { startService func() cancel func() + dashboardProvisionerInstantiations int + mock *dashboards.ProvisionerMock service *ProvisioningServiceImpl } @@ -141,6 +156,7 @@ func setup(t *testing.T) *serviceTestStruct { service, err := newProvisioningServiceImpl( func(context.Context, string, dashboardstore.DashboardProvisioningService, org.Service, utils.DashboardStore, folder.Service) (dashboards.DashboardProvisioner, error) { + serviceTest.dashboardProvisionerInstantiations++ return serviceTest.mock, nil }, nil,