Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add team preferences functionality to provider #131

Merged
merged 10 commits into from
Oct 29, 2020
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ module github.com/terraform-providers/terraform-provider-grafana
go 1.14

require (
github.com/grafana/grafana-api-golang-client v0.0.0-20201019145005-e01a63d40166
github.com/grafana/grafana-api-golang-client v0.0.0-20201026050958-d171908f4835
github.com/hashicorp/go-cleanhttp v0.5.1
github.com/hashicorp/hcl v1.0.0 // indirect
github.com/hashicorp/terraform v0.12.2
Expand Down
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -139,8 +139,8 @@ github.com/gophercloud/utils v0.0.0-20190128072930-fbb6ab446f01 h1:OgCNGSnEalfkR
github.com/gophercloud/utils v0.0.0-20190128072930-fbb6ab446f01/go.mod h1:wjDF8z83zTeg5eMLml5EBSlAhbF7G8DobyI1YsMuyzw=
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
github.com/grafana/grafana-api-golang-client v0.0.0-20201019145005-e01a63d40166 h1:Kl177VV8TQuyCQVYPF3grDYdRcINbSGP2aIuRqM7VZI=
github.com/grafana/grafana-api-golang-client v0.0.0-20201019145005-e01a63d40166/go.mod h1:jFjwT3lvwl4JKqCw3guRJvlQ1/fmhER1h3Zgix3z7jw=
github.com/grafana/grafana-api-golang-client v0.0.0-20201026050958-d171908f4835 h1:IdYj5SLuW3BuQfw3eyIlpB+IKeEgKa1Mmen9Hr521Sk=
github.com/grafana/grafana-api-golang-client v0.0.0-20201026050958-d171908f4835/go.mod h1:jFjwT3lvwl4JKqCw3guRJvlQ1/fmhER1h3Zgix3z7jw=
github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=
github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
Expand Down
1 change: 1 addition & 0 deletions grafana/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ func Provider() terraform.ResourceProvider {
"grafana_folder_permission": ResourceFolderPermission(),
"grafana_organization": ResourceOrganization(),
"grafana_team": ResourceTeam(),
"grafana_team_preferences": ResourceTeamPreferences(),
"grafana_user": ResourceUser(),
},

Expand Down
6 changes: 6 additions & 0 deletions grafana/resource_dashboard.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,11 @@ func ResourceDashboard() *schema.Resource {
Computed: true,
},

"dashboard_id": {
Type: schema.TypeInt,
Computed: true,
},

"folder": {
Type: schema.TypeInt,
Optional: true,
Expand Down Expand Up @@ -89,6 +94,7 @@ func ReadDashboard(d *schema.ResourceData, meta interface{}) error {
d.Set("slug", dashboard.Meta.Slug)
d.Set("config_json", configJSON)
d.Set("folder", dashboard.Folder)
d.Set("dashboard_id", int64(dashboard.Model["id"].(float64)))

return nil
}
Expand Down
104 changes: 104 additions & 0 deletions grafana/resource_team_preferences.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
package grafana

import (
"strconv"
"strings"

"github.com/hashicorp/terraform/helper/schema"
"github.com/hashicorp/terraform/helper/validation"

gapi "github.com/grafana/grafana-api-golang-client"
)

func ResourceTeamPreferences() *schema.Resource {
return &schema.Resource{
Create: UpdateTeamPreferences,
Read: ReadTeamPreferences,
Update: UpdateTeamPreferences,
Delete: DeleteTeamPreferences,

Schema: map[string]*schema.Schema{
"team_id": {
Type: schema.TypeInt,
Required: true,
ForceNew: true,
},
"theme": {
Type: schema.TypeString,
Optional: true,
ValidateFunc: validation.StringInSlice([]string{"light", "dark", ""}, false),
},
"home_dashboard_id": {
Type: schema.TypeInt,
Optional: true,
},
"timezone": {
Type: schema.TypeString,
Optional: true,
ValidateFunc: validation.StringInSlice([]string{"utc", "browser", ""}, false),
},
},
}
}

func UpdateTeamPreferences(d *schema.ResourceData, meta interface{}) error {
client := meta.(*gapi.Client)

teamID := int64(d.Get("team_id").(int))
theme := d.Get("theme").(string)
homeDashboardID := int64(d.Get("home_dashboard_id").(int))
timezone := d.Get("timezone").(string)

preferences := gapi.Preferences{
Theme: theme,
HomeDashboardID: homeDashboardID,
Timezone: timezone,
}

err := client.UpdateTeamPreferences(teamID, preferences)
if err != nil {
return err
}

return ReadTeamPreferences(d, meta)
}

func ReadTeamPreferences(d *schema.ResourceData, meta interface{}) error {
client := meta.(*gapi.Client)

teamID := int64(d.Get("team_id").(int))

preferences, err := client.TeamPreferences(teamID)
if err != nil {
return err
}

d.SetId(strconv.FormatInt(teamID, 10))
d.Set("theme", preferences.Theme)
d.Set("home_dashboard_id", preferences.HomeDashboardID)
d.Set("timezone", preferences.Timezone)

return nil
}

func DeleteTeamPreferences(d *schema.ResourceData, meta interface{}) error {
//there is no delete call for team preferences. instead we will just remove
//the specified preferences and go back to the default values. note: if the
//call fails because the team no longer exists - we'll just ignore the error

client := meta.(*gapi.Client)

teamID := int64(d.Get("team_id").(int))
defaultPreferences := gapi.Preferences{}

err := client.UpdateTeamPreferences(teamID, defaultPreferences)
if err != nil {
if strings.HasPrefix(err.Error(), "status: 404") {
d.SetId("")
return nil
}
return err
}

return nil
}
84 changes: 84 additions & 0 deletions grafana/resource_team_preferences_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
package grafana

import (
"testing"

"github.com/hashicorp/terraform/helper/resource"
"github.com/hashicorp/terraform/terraform"
)

func TestAccTeamPreferences_basic(t *testing.T) {

resource.Test(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
Providers: testAccProviders,
CheckDestroy: testAccTeamPreferencesCheckDestroy(),
Steps: []resource.TestStep{
{
Config: testAccTeamPreferencesConfig_Basic,
Check: resource.ComposeAggregateTestCheckFunc(
resource.TestCheckResourceAttr("grafana_team_preferences.testTeamPreferences", "theme", "dark"),
resource.TestCheckResourceAttr("grafana_team_preferences.testTeamPreferences", "timezone", "utc"),
),
},
{
Config: testAccTeamPreferencesConfig_Update,
Check: resource.ComposeAggregateTestCheckFunc(
resource.TestCheckResourceAttr("grafana_team_preferences.testTeamPreferences", "theme", "light"),
resource.TestCheckResourceAttr("grafana_team_preferences.testTeamPreferences", "timezone", "browser"),
),
},
},
})
}

func testAccTeamPreferencesCheckDestroy() resource.TestCheckFunc {
return func(s *terraform.State) error {
//you can't really destroy team preferences so nothing to check for
return nil
}
}

const testAccTeamPreferencesConfig_Basic = `
resource "grafana_team" "testTeam" {
name = "terraform-test-team-preferences"
}

resource "grafana_dashboard" "test" {
config_json = <<EOT
{
"title": "Terraform Team Preferences Acceptance Test",
"id": 13,
"version": "43"
}
EOT
}

resource "grafana_team_preferences" "testTeamPreferences" {
team_id = grafana_team.testTeam.id
theme = "dark"
home_dashboard_id = grafana_dashboard.test.dashboard_id
timezone = "utc"
}
`
const testAccTeamPreferencesConfig_Update = `
resource "grafana_team" "testTeam" {
name = "terraform-test-team-preferences"
}

resource "grafana_dashboard" "test" {
config_json = <<EOT
{
"title": "Terraform Team Preferences Acceptance Test",
"id": 13,
"version": "43"
}
EOT
}
resource "grafana_team_preferences" "testTeamPreferences" {
team_id = grafana_team.testTeam.id
theme = "light"
home_dashboard_id = grafana_dashboard.test.dashboard_id
timezone = "browser"
}
`

This file was deleted.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion vendor/modules.txt
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ github.com/google/go-cmp/cmp/internal/function
github.com/google/go-cmp/cmp/internal/value
# github.com/googleapis/gax-go/v2 v2.0.3
github.com/googleapis/gax-go/v2
# github.com/grafana/grafana-api-golang-client v0.0.0-20201019145005-e01a63d40166
# github.com/grafana/grafana-api-golang-client v0.0.0-20201026050958-d171908f4835
## explicit
github.com/grafana/grafana-api-golang-client
# github.com/hashicorp/errwrap v1.0.0
Expand Down
1 change: 1 addition & 0 deletions website/docs/r/dashboard.html.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ In addition to all arguments above, the following attributes are exported:
* `slug` - A URL "slug" for this dashboard, generated by Grafana by removing
certain characters from the dashboard name given as part of the `config_json`
argument. This can be used to generate the URL for a dashboard.
* `dashboard_id` - The numeric ID of the dashboard computed by Grafana.

## Import

Expand Down
45 changes: 45 additions & 0 deletions website/docs/r/team_preferences.html.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
---
layout: "grafana"
page_title: "Grafana: grafana_team_preferences"
sidebar_current: "docs-grafana-resource-team-preferences"
description: |-
The grafana_team_preferences resource allows Team Preferences to be maintained.
---

# grafana\_team\_preferences

The team preferences resource allows for team preferences to be set once a team
has been created. Available preferences are a light or dark theme, the default
timezone to be used, and the dashboard to be displayed upon login.

## Example Usage

```hcl
resource "grafana_dashboard" "metrics" {
config_json = file("grafana-dashboard.json")
}

resource "grafana_team" "team" {
name = "Team Name"
}

resource "grafana_team_preferences" "team_preferences" {
team_id = grafana_team.team.id
theme = "dark"
timezone = "browser"
home_dashboard_id = grafana_dashboard.metrics.dashboard_id
}
```

## Argument Reference

The following arguments are supported:

* `team_id` - (Required) The numeric team ID.
* `theme` - (Optional) The theme for the specified team. Available themes are `light`, `dark`, or an empty string for the default theme.
* `timezone` - (Optional) The timezone for the specified team. Available values are `utc`, `browser`, or an empty string for the default.
* `home_dashboard_id` - (Optional) The numeric ID of the dashboard to display when a team member logs in.

## Import

Team preferences cannot be imported.
3 changes: 3 additions & 0 deletions website/grafana.erb
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,9 @@
<li<%= sidebar_current("docs-grafana-resource-team") %>>
<a href="/docs/providers/grafana/r/team.html">grafana_team</a>
</li>
<li<%= sidebar_current("docs-grafana-resource-team-preferences") %>>
<a href="/docs/providers/grafana/r/team_preferences.html">grafana_team_preferences</a>
</li>
</ul>
</li>
</ul>
Expand Down