Skip to content

Commit aa9f394

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

File tree

2 files changed

+50
-0
lines changed

2 files changed

+50
-0
lines changed

docs/index.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ provider "grafana" {
2828
- **ca_cert** (String) Certificate CA bundle to use to verify the Grafana server's certificate. May alternatively be set via the `GRAFANA_CA_CERT` environment variable.
2929
- **cloud_api_key** (String, Sensitive) API key for Grafana Cloud. May alternatively be set via the `GRAFANA_CLOUD_API_KEY` environment variable.
3030
- **cloud_api_url** (String) Grafana Cloud's API URL. May alternatively be set via the `GRAFANA_CLOUD_API_URL` environment variable.
31+
- **http_headers** (Map of String, Sensitive) Optional. HTTP headers mapping keys to values used for accessing the Grafana API. May alternatively be set via the `GRAFANA_HTTP_HEADERS` environment variable in JSON format.
3132
- **insecure_skip_verify** (Boolean) Skip TLS certificate verification. May alternatively be set via the `GRAFANA_INSECURE_SKIP_VERIFY` environment variable.
3233
- **org_id** (Number) The organization id to operate on within grafana. May alternatively be set via the `GRAFANA_ORG_ID` environment variable.
3334
- **retries** (Number) The amount of retries to use for Grafana API calls. May alternatively be set via the `GRAFANA_RETRIES` environment variable.

grafana/provider.go

Lines changed: 49 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. May alternatively be set via the `GRAFANA_HTTP_HEADERS` environment variable in JSON format.",
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

Comments
 (0)