11package grafana
22
33import (
4+ "encoding/json"
5+ "os"
6+
47 "github.com/hashicorp/terraform/helper/logging"
58 "github.com/hashicorp/terraform/helper/schema"
69 "github.com/hashicorp/terraform/terraform"
@@ -24,6 +27,14 @@ func Provider() terraform.ResourceProvider {
2427 DefaultFunc : schema .EnvDefaultFunc ("GRAFANA_AUTH" , nil ),
2528 Description : "Credentials for accessing the Grafana API." ,
2629 },
30+ "headers" : {
31+ Type : schema .TypeMap ,
32+ Optional : true ,
33+ Sensitive : true ,
34+ Elem : & schema.Schema {Type : schema .TypeString },
35+ Description : "Optional. HTTP headers mapping keys to values used for accessing the Grafana API." ,
36+ DefaultFunc : EnvDefaultJsonFunc ("GRAFANA_HTTP_HEADERS" , nil ),
37+ },
2738 },
2839
2940 ResourcesMap : map [string ]* schema.Resource {
@@ -39,9 +50,26 @@ func Provider() terraform.ResourceProvider {
3950}
4051
4152func providerConfigure (d * schema.ResourceData ) (interface {}, error ) {
53+ headersObj := d .Get ("headers" ).(map [string ]interface {})
54+ if len (headersObj ) == 0 {
55+ // Workaround for a bug when DefaultFunc returns a TypeMap
56+ headersObjAbs , _ := EnvDefaultJsonFunc ("GRAFANA_HTTP_HEADERS" , nil )()
57+ headersObj = headersObjAbs .(map [string ]interface {})
58+ }
59+
60+ // Convert headers from map[string]interface{} to map[string]string
61+ headers := make (map [string ]string )
62+ for k , v := range headersObj {
63+ switch v := v .(type ) {
64+ case string :
65+ headers [k ] = v
66+ }
67+ }
68+
4269 client , err := gapi .New (
4370 d .Get ("auth" ).(string ),
4471 d .Get ("url" ).(string ),
72+ headers ,
4573 )
4674 if err != nil {
4775 return nil , err
@@ -51,3 +79,20 @@ func providerConfigure(d *schema.ResourceData) (interface{}, error) {
5179
5280 return client , nil
5381}
82+
83+ // EnvDefaultJsonFunc is a helper function that parses the given environment
84+ // variable as a JSON object, or returns the default value otherwise.
85+ func EnvDefaultJsonFunc (k string , dv interface {}) schema.SchemaDefaultFunc {
86+ return func () (interface {}, error ) {
87+ if valStr := os .Getenv (k ); valStr != "" {
88+ var valObj map [string ]interface {}
89+ err := json .Unmarshal ([]byte (valStr ), & valObj )
90+ if err != nil {
91+ return nil , err
92+ }
93+ return valObj , nil
94+ }
95+
96+ return dv , nil
97+ }
98+ }
0 commit comments