123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168 |
- import { config } from '@grafana/runtime';
- import {
- AzureAuthType,
- AzureCloud,
- AzureCredentials,
- AzureDataSourceInstanceSettings,
- AzureDataSourceSettings,
- ConcealedSecret,
- } from './types';
- const concealed: ConcealedSecret = Symbol('Concealed client secret');
- export function getAuthType(options: AzureDataSourceSettings | AzureDataSourceInstanceSettings): AzureAuthType {
- if (!options.jsonData.azureAuthType) {
- // If authentication type isn't explicitly specified and datasource has client credentials,
- // then this is existing datasource which is configured for app registration (client secret)
- if (options.jsonData.tenantId && options.jsonData.clientId) {
- return 'clientsecret';
- }
- // For newly created datasource with no configuration, managed identity is the default authentication type
- // if they are enabled in Grafana config
- return config.azure.managedIdentityEnabled ? 'msi' : 'clientsecret';
- }
- return options.jsonData.azureAuthType;
- }
- function getDefaultAzureCloud(): string {
- switch (config.azure.cloud) {
- case AzureCloud.Public:
- case AzureCloud.None:
- case undefined:
- return 'azuremonitor';
- case AzureCloud.China:
- return 'chinaazuremonitor';
- case AzureCloud.USGovernment:
- return 'govazuremonitor';
- case AzureCloud.Germany:
- return 'germanyazuremonitor';
- default:
- throw new Error(`The cloud '${config.azure.cloud}' not supported.`);
- }
- }
- export function getAzurePortalUrl(azureCloud: string): string {
- switch (azureCloud) {
- case 'azuremonitor':
- return 'https://portal.azure.com';
- case 'chinaazuremonitor':
- return 'https://portal.azure.cn';
- case 'govazuremonitor':
- return 'https://portal.azure.us';
- case 'germanyazuremonitor':
- return 'https://portal.microsoftazure.de';
- default:
- throw new Error('The cloud not supported.');
- }
- }
- export function getAzureCloud(options: AzureDataSourceSettings | AzureDataSourceInstanceSettings): string {
- const authType = getAuthType(options);
- switch (authType) {
- case 'msi':
- // In case of managed identity, the cloud is always same as where Grafana is hosted
- return getDefaultAzureCloud();
- case 'clientsecret':
- return options.jsonData.cloudName || getDefaultAzureCloud();
- }
- }
- function getSecret(options: AzureDataSourceSettings): undefined | string | ConcealedSecret {
- if (options.secureJsonFields.clientSecret) {
- // The secret is concealed on server
- return concealed;
- } else {
- const secret = options.secureJsonData?.clientSecret;
- return typeof secret === 'string' && secret.length > 0 ? secret : undefined;
- }
- }
- export function isCredentialsComplete(credentials: AzureCredentials): boolean {
- switch (credentials.authType) {
- case 'msi':
- return true;
- case 'clientsecret':
- return !!(credentials.azureCloud && credentials.tenantId && credentials.clientId && credentials.clientSecret);
- }
- }
- export function getCredentials(options: AzureDataSourceSettings): AzureCredentials {
- const authType = getAuthType(options);
- switch (authType) {
- case 'msi':
- if (config.azure.managedIdentityEnabled) {
- return {
- authType: 'msi',
- defaultSubscriptionId: options.jsonData.subscriptionId,
- };
- } else {
- // If authentication type is managed identity but managed identities were disabled in Grafana config,
- // then we should fallback to an empty app registration (client secret) configuration
- return {
- authType: 'clientsecret',
- azureCloud: getDefaultAzureCloud(),
- };
- }
- case 'clientsecret':
- return {
- authType: 'clientsecret',
- azureCloud: options.jsonData.cloudName || getDefaultAzureCloud(),
- tenantId: options.jsonData.tenantId,
- clientId: options.jsonData.clientId,
- clientSecret: getSecret(options),
- defaultSubscriptionId: options.jsonData.subscriptionId,
- };
- }
- }
- export function updateCredentials(
- options: AzureDataSourceSettings,
- credentials: AzureCredentials
- ): AzureDataSourceSettings {
- switch (credentials.authType) {
- case 'msi':
- if (!config.azure.managedIdentityEnabled) {
- throw new Error('Managed Identity authentication is not enabled in Grafana config.');
- }
- options = {
- ...options,
- jsonData: {
- ...options.jsonData,
- azureAuthType: 'msi',
- subscriptionId: credentials.defaultSubscriptionId,
- },
- };
- return options;
- case 'clientsecret':
- options = {
- ...options,
- jsonData: {
- ...options.jsonData,
- azureAuthType: 'clientsecret',
- cloudName: credentials.azureCloud || getDefaultAzureCloud(),
- tenantId: credentials.tenantId,
- clientId: credentials.clientId,
- subscriptionId: credentials.defaultSubscriptionId,
- },
- secureJsonData: {
- ...options.secureJsonData,
- clientSecret:
- typeof credentials.clientSecret === 'string' && credentials.clientSecret.length > 0
- ? credentials.clientSecret
- : undefined,
- },
- secureJsonFields: {
- ...options.secureJsonFields,
- clientSecret: typeof credentials.clientSecret === 'symbol',
- },
- };
- return options;
- }
- }
|