Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 47 additions & 0 deletions grafana/provider.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
package grafana

import (
"encoding/json"
"os"

"github.com/hashicorp/terraform/helper/logging"
"github.com/hashicorp/terraform/helper/schema"
"github.com/hashicorp/terraform/terraform"
Expand All @@ -24,6 +27,14 @@ func Provider() terraform.ResourceProvider {
DefaultFunc: schema.EnvDefaultFunc("GRAFANA_AUTH", nil),
Description: "Credentials for accessing the Grafana API.",
},
"headers": {
Type: schema.TypeMap,
Optional: true,
Sensitive: true,
Elem: &schema.Schema{Type: schema.TypeString},
Description: "Optional. HTTP headers mapping keys to values used for accessing the Grafana API.",
DefaultFunc: EnvDefaultJsonFunc("GRAFANA_HTTP_HEADERS", nil),
},
},

ResourcesMap: map[string]*schema.Resource{
Expand All @@ -39,9 +50,28 @@ func Provider() terraform.ResourceProvider {
}

func providerConfigure(d *schema.ResourceData) (interface{}, error) {
headersObj := d.Get("headers").(map[string]interface{})
if headersObj != nil && len(headersObj) == 0 {
// Workaround for a bug when DefaultFunc returns a TypeMap
headersObjAbs, _ := EnvDefaultJsonFunc("GRAFANA_HTTP_HEADERS", nil)()
headersObj = headersObjAbs.(map[string]interface{})
}

// Convert headers from map[string]interface{} to map[string]string
headers := make(map[string]string)
if headersObj != nil {
for k, v := range headersObj {
switch v := v.(type) {
case string:
headers[k] = v
}
}
}

client, err := gapi.New(
d.Get("auth").(string),
d.Get("url").(string),
headers,
)
if err != nil {
return nil, err
Expand All @@ -51,3 +81,20 @@ func providerConfigure(d *schema.ResourceData) (interface{}, error) {

return client, nil
}

// EnvDefaultJsonFunc is a helper function that parses the given environment
// variable as a JSON object, or returns the default value otherwise.
func EnvDefaultJsonFunc(k string, dv interface{}) schema.SchemaDefaultFunc {
return func() (interface{}, error) {
if valStr := os.Getenv(k); valStr != "" {
var valObj map[string]interface{}
err := json.Unmarshal([]byte(valStr), &valObj)
if err != nil {
return nil, err
}
return valObj, nil
}

return dv, nil
}
}