diff --git a/public/app/plugins/datasource/grafana-azure-monitor-datasource/azure_monitor/response_parser.ts b/public/app/plugins/datasource/grafana-azure-monitor-datasource/azure_monitor/response_parser.ts index d67b1d74c1b..4a14e7067f5 100644 --- a/public/app/plugins/datasource/grafana-azure-monitor-datasource/azure_monitor/response_parser.ts +++ b/public/app/plugins/datasource/grafana-azure-monitor-datasource/azure_monitor/response_parser.ts @@ -128,4 +128,25 @@ export default class ResponseParser { return list; } + + static parseSubscriptionsForSelect(result: any): Array<{ label: string; value: string }> { + const list: Array<{ label: string; value: string }> = []; + + if (!result) { + return list; + } + + const valueFieldName = 'subscriptionId'; + const textFieldName = 'displayName'; + for (let i = 0; i < result.data.value.length; i++) { + if (!_.find(list, ['value', _.get(result.data.value[i], valueFieldName)])) { + list.push({ + label: `${_.get(result.data.value[i], textFieldName)} - ${_.get(result.data.value[i], valueFieldName)}`, + value: _.get(result.data.value[i], valueFieldName), + }); + } + } + + return list; + } } diff --git a/public/app/plugins/datasource/grafana-azure-monitor-datasource/ConfigEditor.test.tsx b/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/ConfigEditor.test.tsx similarity index 97% rename from public/app/plugins/datasource/grafana-azure-monitor-datasource/ConfigEditor.test.tsx rename to public/app/plugins/datasource/grafana-azure-monitor-datasource/components/ConfigEditor.test.tsx index 66bac97b0cc..c063c1c0128 100644 --- a/public/app/plugins/datasource/grafana-azure-monitor-datasource/ConfigEditor.test.tsx +++ b/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/ConfigEditor.test.tsx @@ -21,6 +21,7 @@ const setup = () => { withCredentials: false, isDefault: false, jsonData: { + subscriptionId: '', azureLogAnalyticsSameAs: true, cloudName: 'azuremonitor', }, diff --git a/public/app/plugins/datasource/grafana-azure-monitor-datasource/ConfigEditor.tsx b/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/ConfigEditor.tsx similarity index 70% rename from public/app/plugins/datasource/grafana-azure-monitor-datasource/ConfigEditor.tsx rename to public/app/plugins/datasource/grafana-azure-monitor-datasource/components/ConfigEditor.tsx index e040801d038..27012b232fe 100644 --- a/public/app/plugins/datasource/grafana-azure-monitor-datasource/ConfigEditor.tsx +++ b/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/ConfigEditor.tsx @@ -1,17 +1,19 @@ import React, { PureComponent } from 'react'; -import { SelectableValue, DataSourcePluginOptionsEditorProps } from '@grafana/data'; -import { MonitorConfig } from './components/MonitorConfig'; -import { AnalyticsConfig } from './components/AnalyticsConfig'; +import { SelectableValue, DataSourcePluginOptionsEditorProps, DataSourceSettings } from '@grafana/data'; +import { MonitorConfig } from './MonitorConfig'; +import { AnalyticsConfig } from './AnalyticsConfig'; import { TemplateSrv } from 'app/features/templating/template_srv'; import { getBackendSrv, BackendSrv } from 'app/core/services/backend_srv'; -import AzureMonitorDatasource from './azure_monitor/azure_monitor_datasource'; -import AzureLogAnalyticsDatasource from './azure_log_analytics/azure_log_analytics_datasource'; -import { InsightsConfig } from './components/InsightsConfig'; +import { InsightsConfig } from './InsightsConfig'; +import ResponseParser from '../azure_monitor/response_parser'; +import { AzureDataSourceJsonData, AzureDataSourceSecureJsonData } from '../types'; -export type Props = DataSourcePluginOptionsEditorProps; +export type Props = DataSourcePluginOptionsEditorProps; + +type AzureDataSourceSettings = DataSourceSettings; export interface State { - config: any; + config: AzureDataSourceSettings; subscriptions: SelectableValue[]; logAnalyticsSubscriptions: SelectableValue[]; logAnalyticsWorkspaces: SelectableValue[]; @@ -145,20 +147,63 @@ export class ConfigEditor extends PureComponent { } }; + loadSubscriptions = async (route?: string) => { + const url = `/${route || this.state.config.jsonData.cloudName}/subscriptions?api-version=2019-03-01`; + + return this.backendSrv + .datasourceRequest({ + url: this.state.config.url + url, + method: 'GET', + }) + .then((result: any) => { + return ResponseParser.parseSubscriptionsForSelect(result); + }) + .catch((error: any) => { + throw error; + }); + }; + + loadWorkspaces = async (subscription: string) => { + const { azureLogAnalyticsSameAs, cloudName, logAnalyticsSubscriptionId } = this.state.config.jsonData; + let azureMonitorUrl = '', + subscriptionId = this.templateSrv.replace(subscription || this.state.config.jsonData.subscriptionId); + + if (!!subscriptionId || !!azureLogAnalyticsSameAs) { + const azureCloud = cloudName || 'azuremonitor'; + azureMonitorUrl = `/${azureCloud}/subscriptions`; + } else { + subscriptionId = logAnalyticsSubscriptionId; + azureMonitorUrl = `/workspacesloganalytics/subscriptions`; + } + + const workspaceListUrl = + azureMonitorUrl + + `/${subscriptionId}/providers/Microsoft.OperationalInsights/workspaces?api-version=2017-04-26-preview`; + + return this.backendSrv + .datasourceRequest({ + url: this.state.config.url + workspaceListUrl, + method: 'GET', + }) + .then((result: any) => { + return result.data.value.map((val: any) => { + return { + value: val.properties.customerId, + label: val.name, + }; + }); + }) + .catch((error: any) => { + throw error; + }); + }; + getSubscriptions = async () => { if (!this.hasNecessaryCredentials()) { return; } - const azureMonitorDatasource = new AzureMonitorDatasource(this.state.config, this.backendSrv, this.templateSrv); - - let subscriptions = (await azureMonitorDatasource.getSubscriptions()) || []; - subscriptions = subscriptions.map((subscription: any) => { - return { - value: subscription.value, - label: subscription.text, - }; - }); + const subscriptions = (await this.loadSubscriptions()) || []; if (subscriptions && subscriptions.length > 0) { this.setState({ subscriptions }); @@ -176,15 +221,7 @@ export class ConfigEditor extends PureComponent { return; } - const azureMonitorDatasource = new AzureMonitorDatasource(this.state.config, this.backendSrv, this.templateSrv); - - let logAnalyticsSubscriptions = (await azureMonitorDatasource.getSubscriptions('workspacesloganalytics')) || []; - logAnalyticsSubscriptions = logAnalyticsSubscriptions.map((subscription: any) => { - return { - value: subscription.value, - label: subscription.text, - }; - }); + const logAnalyticsSubscriptions = (await this.loadSubscriptions('workspacesloganalytics')) || []; if (logAnalyticsSubscriptions && logAnalyticsSubscriptions.length > 0) { this.setState({ logAnalyticsSubscriptions }); @@ -204,21 +241,9 @@ export class ConfigEditor extends PureComponent { return; } - const azureLogAnalyticsDatasource = new AzureLogAnalyticsDatasource( - this.state.config, - this.backendSrv, - this.templateSrv - ); - - let logAnalyticsWorkspaces = await azureLogAnalyticsDatasource.getWorkspaces( + const logAnalyticsWorkspaces = await this.loadWorkspaces( sameAs ? this.state.config.jsonData.subscriptionId : this.state.config.jsonData.logAnalyticsSubscriptionId ); - logAnalyticsWorkspaces = logAnalyticsWorkspaces.map((workspace: any) => { - return { - value: workspace.value, - label: workspace.text, - }; - }); if (logAnalyticsWorkspaces.length > 0) { this.setState({ logAnalyticsWorkspaces }); 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 7baf0355529..c8d9bfb03bc 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 @@ -46,7 +46,7 @@ export class MonitorConfig extends PureComponent { ...this.state.config, jsonData: { ...this.state.config.jsonData, - cloudName, + cloudName: cloudName.value, }, }); }; diff --git a/public/app/plugins/datasource/grafana-azure-monitor-datasource/__snapshots__/ConfigEditor.test.tsx.snap b/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/__snapshots__/ConfigEditor.test.tsx.snap similarity index 100% rename from public/app/plugins/datasource/grafana-azure-monitor-datasource/__snapshots__/ConfigEditor.test.tsx.snap rename to public/app/plugins/datasource/grafana-azure-monitor-datasource/components/__snapshots__/ConfigEditor.test.tsx.snap diff --git a/public/app/plugins/datasource/grafana-azure-monitor-datasource/module.tsx b/public/app/plugins/datasource/grafana-azure-monitor-datasource/module.tsx index 44e60e97e4d..33ca27c6ace 100644 --- a/public/app/plugins/datasource/grafana-azure-monitor-datasource/module.tsx +++ b/public/app/plugins/datasource/grafana-azure-monitor-datasource/module.tsx @@ -1,10 +1,11 @@ import { DataSourcePlugin } from '@grafana/data'; import { AzureMonitorQueryCtrl } from './query_ctrl'; import Datasource from './datasource'; -import { ConfigEditor } from './ConfigEditor'; +import { ConfigEditor } from './components/ConfigEditor'; import { AzureMonitorAnnotationsQueryCtrl } from './annotations_query_ctrl'; +import { AzureMonitorQuery, AzureDataSourceJsonData } from './types'; -export const plugin = new DataSourcePlugin(Datasource) +export const plugin = new DataSourcePlugin(Datasource) .setConfigEditor(ConfigEditor) .setQueryCtrl(AzureMonitorQueryCtrl) .setAnnotationQueryCtrl(AzureMonitorAnnotationsQueryCtrl); diff --git a/public/app/plugins/datasource/grafana-azure-monitor-datasource/types.ts b/public/app/plugins/datasource/grafana-azure-monitor-datasource/types.ts index f6d0961d641..6f605361069 100644 --- a/public/app/plugins/datasource/grafana-azure-monitor-datasource/types.ts +++ b/public/app/plugins/datasource/grafana-azure-monitor-datasource/types.ts @@ -21,13 +21,18 @@ export interface AzureDataSourceJsonData extends DataSourceJsonData { logAnalyticsSubscriptionId?: string; logAnalyticsTenantId?: string; logAnalyticsClientId?: string; - azureLogAnalyticsSameAs?: string; + azureLogAnalyticsSameAs?: boolean; logAnalyticsDefaultWorkspace?: string; // App Insights appInsightsAppId?: string; } +export interface AzureDataSourceSecureJsonData { + clientSecret: string; + logAnalyticsClientSecret: string; +} + export interface AzureMetricQuery { resourceGroup: string; resourceName: string;