@@ -4,9 +4,11 @@ import (
44 "context"
55 "crypto/tls"
66 "crypto/x509"
7+ "encoding/json"
78 "fmt"
89 "io/ioutil"
910 "net/url"
11+ "os"
1012 "regexp"
1113 "strings"
1214
@@ -60,6 +62,13 @@ func Provider(version string) func() *schema.Provider {
6062 Description : "API token or basic auth username:password. May alternatively be set via the `GRAFANA_AUTH` environment variable." ,
6163 AtLeastOneOf : []string {"auth" , "cloud_api_key" , "sm_access_token" },
6264 },
65+ "http_headers" : {
66+ Type : schema .TypeMap ,
67+ Optional : true ,
68+ Sensitive : true ,
69+ DefaultFunc : JSONEnvDefaultFunc ("GRAFANA_HTTP_HEADERS" , nil ),
70+ Description : "Optional. HTTP headers mapping keys to values used for accessing the Grafana API." ,
71+ },
6372 "retries" : {
6473 Type : schema .TypeInt ,
6574 Optional : true ,
@@ -267,6 +276,29 @@ func createGrafanaClient(d *schema.ResourceData) (string, *gapi.Config, *gapi.Cl
267276 } else {
268277 cfg .APIKey = auth [0 ]
269278 }
279+
280+ headersMap := d .Get ("http_headers" ).(map [string ]interface {})
281+ if headersMap != nil && len (headersMap ) == 0 {
282+ // Workaround for a bug when DefaultFunc returns a schema.TypeMap
283+ headersMapAbs , err := JSONEnvDefaultFunc ("GRAFANA_HTTP_HEADERS" , nil )()
284+ if err != nil {
285+ return "" , nil , nil , err
286+ }
287+ if headersMapAbs != nil {
288+ headersMap = headersMapAbs .(map [string ]interface {})
289+ }
290+ }
291+ if headersMap != nil {
292+ // Convert headers from map[string]interface{} to map[string]string
293+ headers := make (map [string ]string )
294+ for k , v := range headersMap {
295+ if v , ok := v .(string ); ok {
296+ headers [k ] = v
297+ }
298+ }
299+ cfg .HTTPHeaders = headers
300+ }
301+
270302 gclient , err := gapi .New (apiURL , cfg )
271303 if err != nil {
272304 return "" , nil , nil , err
@@ -305,3 +337,20 @@ func createSMClient(d *schema.ResourceData) *smapi.Client {
305337 smURL := d .Get ("sm_url" ).(string )
306338 return smapi .NewClient (smURL , smToken , nil )
307339}
340+
341+ // JSONEnvDefaultFunc is a helper function that parses the given environment
342+ // variable as a JSON object, or returns the default value otherwise.
343+ func JSONEnvDefaultFunc (k string , dv interface {}) schema.SchemaDefaultFunc {
344+ return func () (interface {}, error ) {
345+ if valStr := os .Getenv (k ); valStr != "" {
346+ var valObj map [string ]interface {}
347+ err := json .Unmarshal ([]byte (valStr ), & valObj )
348+ if err != nil {
349+ return nil , err
350+ }
351+ return valObj , nil
352+ }
353+
354+ return dv , nil
355+ }
356+ }
0 commit comments