From c14398edc8d23c17e6651a42b2af3ab18e2003b3 Mon Sep 17 00:00:00 2001 From: Shavonn Brown Date: Fri, 13 Dec 2019 11:02:39 -0500 Subject: [PATCH] Azure Monitor: Copy AM Creds to Log Analytics When Using Same As (#21032) * copy creds draft * copy azure monitor creds to log analystics for sameas * alert * update snapshot --- .../azure_log_analytics_datasource.test.ts | 4 +- .../azure_log_analytics_datasource.ts | 4 +- .../components/AnalyticsConfig.test.tsx | 2 + .../components/AnalyticsConfig.tsx | 43 ++++++++++++++++++- .../components/ConfigEditor.tsx | 29 +++++++++++-- .../components/MonitorConfig.tsx | 9 +++- .../__snapshots__/ConfigEditor.test.tsx.snap | 3 ++ .../plugin.json | 19 -------- 8 files changed, 82 insertions(+), 31 deletions(-) diff --git a/public/app/plugins/datasource/grafana-azure-monitor-datasource/azure_log_analytics/azure_log_analytics_datasource.test.ts b/public/app/plugins/datasource/grafana-azure-monitor-datasource/azure_log_analytics/azure_log_analytics_datasource.test.ts index 1261d9196bf..18fb82f23cd 100644 --- a/public/app/plugins/datasource/grafana-azure-monitor-datasource/azure_log_analytics/azure_log_analytics_datasource.test.ts +++ b/public/app/plugins/datasource/grafana-azure-monitor-datasource/azure_log_analytics/azure_log_analytics_datasource.test.ts @@ -71,9 +71,9 @@ describe('AzureLogAnalyticsDatasource', () => { await ctx.ds.metricFindQuery('workspace("aworkspace").AzureActivity | distinct Category'); }); - it('should use the sameasloganalyticsazure plugin route', () => { + it('should use the loganalyticsazure plugin route', () => { expect(workspacesUrl).toContain('azuremonitor'); - expect(azureLogAnalyticsUrl).toContain('sameasloganalyticsazure'); + expect(azureLogAnalyticsUrl).toContain('loganalyticsazure'); }); }); diff --git a/public/app/plugins/datasource/grafana-azure-monitor-datasource/azure_log_analytics/azure_log_analytics_datasource.ts b/public/app/plugins/datasource/grafana-azure-monitor-datasource/azure_log_analytics/azure_log_analytics_datasource.ts index d5dd3f0ca21..d05209d0a6a 100644 --- a/public/app/plugins/datasource/grafana-azure-monitor-datasource/azure_log_analytics/azure_log_analytics_datasource.ts +++ b/public/app/plugins/datasource/grafana-azure-monitor-datasource/azure_log_analytics/azure_log_analytics_datasource.ts @@ -22,9 +22,7 @@ export default class AzureLogAnalyticsDatasource { private templateSrv: TemplateSrv ) { this.id = instanceSettings.id; - this.baseUrl = this.instanceSettings.jsonData.azureLogAnalyticsSameAs - ? '/sameasloganalyticsazure' - : `/loganalyticsazure`; + this.baseUrl = '/loganalyticsazure'; this.url = instanceSettings.url; this.defaultOrFirstWorkspace = this.instanceSettings.jsonData.logAnalyticsDefaultWorkspace; diff --git a/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/AnalyticsConfig.test.tsx b/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/AnalyticsConfig.test.tsx index 9fa2a5c27ae..f0959695914 100644 --- a/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/AnalyticsConfig.test.tsx +++ b/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/AnalyticsConfig.test.tsx @@ -38,6 +38,8 @@ const setup = (propOverrides?: object) => { }, subscriptions: [], workspaces: [], + makeSameAs: jest.fn(), + onUpdateOptions: jest.fn(), onUpdateOption: jest.fn(), onResetOptionKey: jest.fn(), onLoadSubscriptions: jest.fn(), diff --git a/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/AnalyticsConfig.tsx b/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/AnalyticsConfig.tsx index 08c47d00a47..05b257f81f1 100644 --- a/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/AnalyticsConfig.tsx +++ b/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/AnalyticsConfig.tsx @@ -8,6 +8,8 @@ export interface Props { options: AzureDataSourceSettings; subscriptions: SelectableValue[]; workspaces: SelectableValue[]; + makeSameAs: () => void; + onUpdateOptions: (options: AzureDataSourceSettings) => void; onUpdateOption: (key: string, val: any, secure: boolean) => void; onResetOptionKey: (key: string) => void; onLoadSubscriptions: (type?: string) => void; @@ -35,8 +37,31 @@ export class AnalyticsConfig extends PureComponent { }; onAzureLogAnalyticsSameAsChange = () => { - const { options } = this.props; - this.props.onUpdateOption('azureLogAnalyticsSameAs', !options.jsonData.azureLogAnalyticsSameAs, false); + const { options, onUpdateOptions, makeSameAs } = this.props; + + if (!options.jsonData.azureLogAnalyticsSameAs && options.secureJsonData.clientSecret) { + makeSameAs(); + } else if (!options.jsonData.azureLogAnalyticsSameAs) { + // if currently off, clear monitor secret + onUpdateOptions({ + ...options, + jsonData: { + ...options.jsonData, + azureLogAnalyticsSameAs: !options.jsonData.azureLogAnalyticsSameAs, + }, + secureJsonData: { + ...options.secureJsonData, + clientSecret: '', + }, + secureJsonFields: { + clientSecret: false, + }, + }); + } else { + this.props.onUpdateOption('azureLogAnalyticsSameAs', !options.jsonData.azureLogAnalyticsSameAs, false); + } + + // init popover to warn secret needs to be re-entered }; onLogAnalyticsResetClientSecret = () => { @@ -83,6 +108,13 @@ export class AnalyticsConfig extends PureComponent { tooltip: 'Workspaces are pulled from default subscription selected above.', }), }; + + const showSameAsHelpMsg = + jsonData.azureLogAnalyticsSameAs && + secureJsonFields && + !secureJsonFields.clientSecret && + !secureJsonData.clientSecret; + return ( <>

Azure Log Analytics API Details

@@ -92,6 +124,13 @@ export class AnalyticsConfig extends PureComponent { onChange={this.onAzureLogAnalyticsSameAsChange} {...addtlAttrs} /> + {showSameAsHelpMsg && ( +
+
+

Re-enter your Azure Monitor Client Secret to use this setting.

+
+
+ )} {!jsonData.azureLogAnalyticsSameAs && ( { updateDatasourcePluginResetKeyOption(this.props, key); }; + makeSameAs = (updatedClientSecret?: string) => { + const { options } = this.props; + const clientSecret = updatedClientSecret || options.secureJsonData.clientSecret; + + this.updateOptions({ + ...options, + jsonData: { + ...options.jsonData, + azureLogAnalyticsSameAs: true, + logAnalyticsSubscriptionId: options.jsonData.subscriptionId, + logAnalyticsTenantId: options.jsonData.tenantId, + logAnalyticsClientId: options.jsonData.clientId, + }, + secureJsonData: { + ...options.secureJsonData, + clientSecret, + logAnalyticsClientSecret: clientSecret, + }, + }); + }; + updateOptions = (options: AzureDataSourceSettings) => { if (options.hasOwnProperty('secureJsonData')) { if (options.secureJsonData.hasOwnProperty('clientSecret') && options.secureJsonData.clientSecret.length === 0) { @@ -134,10 +155,7 @@ export class ConfigEditor extends PureComponent { await this.backendSrv .put(`/api/datasources/${this.props.options.id}`, this.props.options) .then((result: AzureDataSourceSettings) => { - this.updateOptions({ - ...this.props.options, - version: result.version, - }); + updateDatasourcePluginOption(this.props, 'version', result.version); }); if (type && type === 'workspacesloganalytics') { @@ -257,6 +275,7 @@ export class ConfigEditor extends PureComponent { { options={options} workspaces={logAnalyticsWorkspaces} subscriptions={logAnalyticsSubscriptions} + makeSameAs={this.makeSameAs} + onUpdateOptions={this.updateOptions} onUpdateOption={this.updateOption} onResetOptionKey={this.resetKey} onLoadSubscriptions={this.onLoadSubscriptions} diff --git a/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/MonitorConfig.tsx b/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/MonitorConfig.tsx index c4a3f3b0c43..49d6bf67af0 100644 --- a/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/MonitorConfig.tsx +++ b/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/MonitorConfig.tsx @@ -13,6 +13,7 @@ const azureClouds = [ export interface Props { options: AzureDataSourceSettings; subscriptions: SelectableValue[]; + makeSameAs: (updatedClientSecret?: string) => void; onUpdateOption: (key: string, val: any, secure: boolean) => void; onResetOptionKey: (key: string) => void; onLoadSubscriptions: () => void; @@ -32,7 +33,13 @@ export class MonitorConfig extends PureComponent { }; onClientSecretChange = (event: ChangeEvent) => { - this.props.onUpdateOption('clientSecret', event.target.value, true); + const { options, makeSameAs } = this.props; + + if (options.jsonData.azureLogAnalyticsSameAs && event.target.value) { + makeSameAs(event.target.value); + } else { + this.props.onUpdateOption('clientSecret', event.target.value, true); + } }; onResetClientSecret = () => { diff --git a/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/__snapshots__/ConfigEditor.test.tsx.snap b/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/__snapshots__/ConfigEditor.test.tsx.snap index da445103cde..85d51449286 100644 --- a/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/__snapshots__/ConfigEditor.test.tsx.snap +++ b/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/__snapshots__/ConfigEditor.test.tsx.snap @@ -3,6 +3,7 @@ exports[`Render should render component 1`] = `