master
go 90 lines 2.34 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 package sqladapter
4
5 import (
6 "fmt"
7 "net/url"
8 "strings"
9
10 "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/cloudauth"
11 )
12
13 const (
14 MSSQLDriverName = "sqlserver"
15 MSSQLAzureDriverName = "azuresql"
16
17 mssqlFedAuthDefault = "ActiveDirectoryDefault"
18 mssqlFedAuthManagedIdentity = "ActiveDirectoryManagedIdentity"
19 mssqlFedAuthServicePrincipal = "ActiveDirectoryServicePrincipal"
20 )
21
22 func MSSQLDriver(cfg cloudauth.Config) string {
23 if cfg.IsProvider(cloudauth.ProviderAzureAD) {
24 return MSSQLAzureDriverName
25 }
26 return MSSQLDriverName
27 }
28
29 func BuildMSSQLAzureADDSN(baseDSN string, cfg cloudauth.Config) (string, error) {
30 if err := cfg.Validate(); err != nil {
31 return "", err
32 }
33 if !cfg.IsProvider(cloudauth.ProviderAzureAD) {
34 return baseDSN, nil
35 }
36
37 aadCfg := cloudauth.AzureADAuthConfig{}
38 if cfg.AzureAD != nil {
39 aadCfg = *cfg.AzureAD
40 }
41
42 u, err := url.Parse(baseDSN)
43 if err != nil {
44 return "", fmt.Errorf("parsing SQL Server DSN: %w", err)
45 }
46 if !strings.EqualFold(u.Scheme, "sqlserver") {
47 return "", fmt.Errorf("cloud_auth.provider %q requires URL DSN with sqlserver scheme, got %q", cloudauth.ProviderAzureAD, u.Scheme)
48 }
49
50 q := u.Query()
51 for key := range q {
52 switch strings.ToLower(key) {
53 case "fedauth", "user id", "password":
54 q.Del(key)
55 }
56 }
57
58 switch aadCfg.NormalizedMode() {
59 case cloudauth.AzureADAuthModeServicePrincipal:
60 sp := aadCfg.ModeServicePrincipal
61 if sp == nil {
62 return "", fmt.Errorf("unsupported cloud_auth.azure_ad.mode %q", aadCfg.Mode)
63 }
64 q.Set("fedauth", mssqlFedAuthServicePrincipal)
65 clientID := strings.TrimSpace(sp.ClientID)
66 clientSecret := strings.TrimSpace(sp.ClientSecret)
67 userID := clientID
68 if tenantID := strings.TrimSpace(sp.TenantID); tenantID != "" {
69 userID = userID + "@" + tenantID
70 }
71 u.User = url.UserPassword(userID, clientSecret)
72 case cloudauth.AzureADAuthModeManagedIdentity:
73 mi := aadCfg.ModeManagedIdentity
74 q.Set("fedauth", mssqlFedAuthManagedIdentity)
75 u.User = nil
76 if mi != nil && strings.TrimSpace(mi.ClientID) != "" {
77 id := strings.TrimSpace(mi.ClientID)
78 q.Set("user id", id)
79 }
80 case cloudauth.AzureADAuthModeDefault:
81 q.Set("fedauth", mssqlFedAuthDefault)
82 u.User = nil
83 default:
84 return "", fmt.Errorf("unsupported cloud_auth.azure_ad.mode %q", aadCfg.Mode)
85 }
86
87 u.RawQuery = q.Encode()
88
89 return u.String(), nil
90 }