From 07ea95ff307d5e630d50026f47fcadfaea22bc09 Mon Sep 17 00:00:00 2001 From: "grafana-delivery-bot[bot]" <132647405+grafana-delivery-bot[bot]@users.noreply.github.com> Date: Wed, 10 Jul 2024 14:25:56 +0300 Subject: [PATCH] [v11.0.x] Azure: Fix default subscription setting (#90262) * Azure: Fix default subscription setting (#90185) * Ensure default subscription is set * Include some info for when the default subscription is required * Rename settings mock - Add mockDatasourceSettings function * Add MonitorConfig test * Revert "Rename settings mock" - Avoid issues when backporting * Remove description * Remove required field * Remove unused import (cherry picked from commit bba26f8e13a0288044ad771deba49dd908471eaa) * Add react --------- Co-authored-by: Andreas Christou --- .../__mocks__/datasourceSettings.ts | 40 +++++++++++++++++ .../ConfigEditor/MonitorConfig.test.tsx | 43 +++++++++++++++++++ .../components/ConfigEditor/MonitorConfig.tsx | 4 +- 3 files changed, 85 insertions(+), 2 deletions(-) create mode 100644 public/app/plugins/datasource/azuremonitor/__mocks__/datasourceSettings.ts create mode 100644 public/app/plugins/datasource/azuremonitor/components/ConfigEditor/MonitorConfig.test.tsx diff --git a/public/app/plugins/datasource/azuremonitor/__mocks__/datasourceSettings.ts b/public/app/plugins/datasource/azuremonitor/__mocks__/datasourceSettings.ts new file mode 100644 index 00000000000..e6d5cf49c35 --- /dev/null +++ b/public/app/plugins/datasource/azuremonitor/__mocks__/datasourceSettings.ts @@ -0,0 +1,40 @@ +import { KeyValue } from '@grafana/data'; + +import { AzureDataSourceSettings } from '../types'; + +import { DeepPartial } from './utils'; + +export const createMockDatasourceSettings = ( + overrides?: DeepPartial, + secureJsonFieldsOverrides?: KeyValue +): AzureDataSourceSettings => { + return { + id: 1, + uid: 'uid', + orgId: 1, + name: 'test-data-source', + typeLogoUrl: 'logo', + type: 'grafana-azure-monitor-datasource', + typeName: 'datasource', + access: '', + url: '', + user: '', + database: '', + basicAuth: false, + basicAuthUser: '', + isDefault: false, + jsonData: { + cloudName: 'azuremonitor', + azureAuthType: 'clientsecret', + + tenantId: 'abc-123', + clientId: 'def-456', + subscriptionId: 'ghi-789', + ...overrides?.jsonData, + }, + secureJsonData: { ...overrides?.secureJsonData }, + secureJsonFields: { ...secureJsonFieldsOverrides }, + readOnly: false, + withCredentials: false, + }; +}; diff --git a/public/app/plugins/datasource/azuremonitor/components/ConfigEditor/MonitorConfig.test.tsx b/public/app/plugins/datasource/azuremonitor/components/ConfigEditor/MonitorConfig.test.tsx new file mode 100644 index 00000000000..cc106c3ac14 --- /dev/null +++ b/public/app/plugins/datasource/azuremonitor/components/ConfigEditor/MonitorConfig.test.tsx @@ -0,0 +1,43 @@ +import { render, screen, waitFor } from '@testing-library/react'; +import React from 'react'; + +import { createMockDatasourceSettings } from '../../__mocks__/datasourceSettings'; + +import { MonitorConfig, Props } from './MonitorConfig'; + +const mockDatasourceSettings = createMockDatasourceSettings(); + +const defaultProps: Props = { + options: mockDatasourceSettings, + updateOptions: jest.fn(), + getSubscriptions: jest.fn().mockResolvedValue([]), +}; + +describe('MonitorConfig', () => { + it('should render component', () => { + render(); + + expect(screen.getByText('Azure Cloud')).toBeInTheDocument(); + }); + + it('should render component and set the default auth type if unset', () => { + const mockDsSettingsWithoutAuth = createMockDatasourceSettings({ + jsonData: { azureAuthType: undefined, clientId: undefined, tenantId: undefined }, + }); + + render(); + + expect(defaultProps.updateOptions).toHaveBeenCalled(); + expect(screen.getByText('Azure Cloud')).toBeInTheDocument(); + }); + expect(defaultProps.options.jsonData.azureAuthType).toBe('clientsecret'); + + it('should render component and set the default subscription if specified', async () => { + const mockDsSettingsWithAuth = createMockDatasourceSettings(undefined, { clientSecret: true }); + const getSubscriptions = jest.fn().mockResolvedValue([{ label: 'Test Sub', value: 'ghi-789' }]); + render(); + + expect(screen.getByText('Azure Cloud')).toBeInTheDocument(); + await waitFor(() => expect(screen.getByText('Test Sub')).toBeInTheDocument()); + }); +}); diff --git a/public/app/plugins/datasource/azuremonitor/components/ConfigEditor/MonitorConfig.tsx b/public/app/plugins/datasource/azuremonitor/components/ConfigEditor/MonitorConfig.tsx index 8a2dd691284..beedad35781 100644 --- a/public/app/plugins/datasource/azuremonitor/components/ConfigEditor/MonitorConfig.tsx +++ b/public/app/plugins/datasource/azuremonitor/components/ConfigEditor/MonitorConfig.tsx @@ -51,8 +51,8 @@ export const MonitorConfig = (props: Props) => { // The auth type needs to be set on the first load of the data source useEffectOnce(() => { - if (!options.jsonData.authType) { - onCredentialsChange(credentials); + if (!options.jsonData.authType || !credentials.authType) { + onCredentialsChange(credentials, options.jsonData.subscriptionId); } });