@@ -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,27 @@ 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+ headersMap = headersMapAbs .(map [string ]interface {})
288+ }
289+ if headersMap != nil {
290+ // Convert headers from map[string]interface{} to map[string]string
291+ headers := make (map [string ]string )
292+ for k , v := range headersMap {
293+ if v , ok := v .(string ); ok {
294+ headers [k ] = v
295+ }
296+ }
297+ cfg .HTTPHeaders = headers
298+ }
299+
270300 gclient , err := gapi .New (apiURL , cfg )
271301 if err != nil {
272302 return "" , nil , nil , err
@@ -305,3 +335,20 @@ func createSMClient(d *schema.ResourceData) *smapi.Client {
305335 smURL := d .Get ("sm_url" ).(string )
306336 return smapi .NewClient (smURL , smToken , nil )
307337}
338+
339+ // JSONEnvDefaultFunc is a helper function that parses the given environment
340+ // variable as a JSON object, or returns the default value otherwise.
341+ func JSONEnvDefaultFunc (k string , dv interface {}) schema.SchemaDefaultFunc {
342+ return func () (interface {}, error ) {
343+ if valStr := os .Getenv (k ); valStr != "" {
344+ var valObj map [string ]interface {}
345+ err := json .Unmarshal ([]byte (valStr ), & valObj )
346+ if err != nil {
347+ return nil , err
348+ }
349+ return valObj , nil
350+ }
351+
352+ return dv , nil
353+ }
354+ }
0 commit comments