Skip to content

Commit 84d3c60

Browse files
committed
Add support for providing additional HTTP headers
1 parent b62ecac commit 84d3c60

File tree

1 file changed

+47
-0
lines changed

1 file changed

+47
-0
lines changed

grafana/provider.go

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)