Files
grafana/pkg/tsdb/azuremonitor/credentials.go
Sergey Kostrukov db1191f3ef AzureMonitor: Refactor cloud and route resolution in the backend (#34342)
* Determine Azure cloud based on authentication type

* Route resolution for clouds

* Fix tests

* Constants for cloud names

* move arg cloud route logic to routes.go

Co-authored-by: Erik Sundell <erik.sundell87@gmail.com>
2021-05-19 14:36:16 +02:00

79 lines
2.3 KiB
Go

package azuremonitor
import (
"fmt"
"github.com/grafana/grafana/pkg/components/simplejson"
"github.com/grafana/grafana/pkg/setting"
)
const (
AzureAuthManagedIdentity = "msi"
AzureAuthClientSecret = "clientsecret"
)
// Azure cloud names specific to Azure Monitor
const (
azureMonitorPublic = "azuremonitor"
azureMonitorChina = "chinaazuremonitor"
azureMonitorUSGovernment = "govazuremonitor"
azureMonitorGermany = "germanyazuremonitor"
)
func getAuthType(cfg *setting.Cfg, pluginData *simplejson.Json) string {
if authType := pluginData.Get("azureAuthType").MustString(); authType != "" {
return authType
} else {
tenantId := pluginData.Get("tenantId").MustString()
clientId := pluginData.Get("clientId").MustString()
// 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 tenantId != "" && clientId != "" {
return AzureAuthClientSecret
}
// For newly created datasource with no configuration, managed identity is the default authentication type
// if they are enabled in Grafana config
if cfg.Azure.ManagedIdentityEnabled {
return AzureAuthManagedIdentity
} else {
return AzureAuthClientSecret
}
}
}
func getDefaultAzureCloud(cfg *setting.Cfg) (string, error) {
switch cfg.Azure.Cloud {
case setting.AzurePublic:
return azureMonitorPublic, nil
case setting.AzureChina:
return azureMonitorChina, nil
case setting.AzureUSGovernment:
return azureMonitorUSGovernment, nil
case setting.AzureGermany:
return azureMonitorGermany, nil
default:
err := fmt.Errorf("the cloud '%s' not supported", cfg.Azure.Cloud)
return "", err
}
}
func getAzureCloud(cfg *setting.Cfg, pluginData *simplejson.Json) (string, error) {
authType := getAuthType(cfg, pluginData)
switch authType {
case AzureAuthManagedIdentity:
// In case of managed identity, the cloud is always same as where Grafana is hosted
return getDefaultAzureCloud(cfg)
case AzureAuthClientSecret:
if cloud := pluginData.Get("cloudName").MustString(); cloud != "" {
return cloud, nil
} else {
return getDefaultAzureCloud(cfg)
}
default:
err := fmt.Errorf("the authentication type '%s' not supported", authType)
return "", err
}
}