Skip to content

Commit c08fb39

Browse files
Config Generation: Add some missing listers (#1692)
* Config Generation: Add some missing listers - SA - Team - User - SM Checks * Fix integration test * Run generate tests on a specific instance
1 parent 8021cf9 commit c08fb39

File tree

9 files changed

+150
-35
lines changed

9 files changed

+150
-35
lines changed

.github/workflows/acc-tests.yml

+12-5
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ jobs:
5555
# OSS tests, run on all versions
5656
version: ['11.0.0', '10.4.3', '9.5.18']
5757
type: ['oss']
58-
subset: ['basic', 'other', 'long', 'generate']
58+
subset: ['basic', 'other', 'long']
5959
include:
6060
- version: '11.0.0'
6161
type: 'oss'
@@ -74,13 +74,20 @@ jobs:
7474
# Enterprise tests
7575
- version: '11.0.0'
7676
type: 'enterprise'
77-
subset: 'all'
77+
subset: 'enterprise'
7878
- version: '10.4.3'
7979
type: 'enterprise'
80-
subset: 'all'
80+
subset: 'enterprise'
8181
- version: '9.5.18'
8282
type: 'enterprise'
83-
subset: 'all'
83+
subset: 'enterprise'
84+
# Generate tests
85+
- version: '11.0.0'
86+
type: 'enterprise'
87+
subset: 'generate'
88+
- version: '10.4.3'
89+
type: 'enterprise'
90+
subset: 'generate'
8491
name: ${{ matrix.version }} - ${{ matrix.type }} - ${{ matrix.subset }}
8592
runs-on: ubuntu-latest
8693
steps:
@@ -103,7 +110,7 @@ jobs:
103110
env:
104111
GRAFANA_VERSION: ${{ matrix.version }}
105112
TESTARGS: >-
106-
${{ matrix.subset == 'all' && '-parallel 2' || '' }}
113+
${{ matrix.subset == 'enterprise' && '-skip="TestAccGenerate" -parallel 2' || '' }}
107114
${{ matrix.subset == 'basic' && '-run=".*_basic" -short -parallel 2' || '' }}
108115
${{ matrix.subset == 'other' && '-skip=".*_basic" -short -parallel 2' || '' }}
109116
${{ matrix.subset == 'long' && '-run=".*longtest" -parallel 1' || '' }}

cmd/without-lister/main.go

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
6+
"github.com/grafana/terraform-provider-grafana/v3/pkg/provider"
7+
)
8+
9+
func main() {
10+
fmt.Println("Listing resources without lister functions:")
11+
for _, r := range provider.Resources() {
12+
if r.ListIDsFunc == nil {
13+
fmt.Println(r.Name)
14+
}
15+
}
16+
}

internal/resources/grafana/resource_data_source.go

+3
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,9 @@ func listDatasources(ctx context.Context, client *goapi.GrafanaHTTPAPI, data *Li
197197
}
198198

199199
for _, ds := range resp.Payload {
200+
if ds.ReadOnly {
201+
continue
202+
}
200203
ids = append(ids, MakeOrgResourceID(orgID, ds.UID))
201204
}
202205
}

internal/resources/grafana/resource_service_account.go

+35-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"sync"
77
"time"
88

9+
goapi "github.com/grafana/grafana-openapi-client-go/client"
910
"github.com/grafana/grafana-openapi-client-go/client/service_accounts"
1011
"github.com/grafana/grafana-openapi-client-go/models"
1112
"github.com/grafana/terraform-provider-grafana/v3/internal/common"
@@ -61,7 +62,40 @@ func resourceServiceAccount() *common.Resource {
6162
"grafana_service_account",
6263
orgResourceIDInt("id"),
6364
schema,
64-
)
65+
).WithLister(listerFunction(listServiceAccounts))
66+
}
67+
68+
func listServiceAccounts(ctx context.Context, client *goapi.GrafanaHTTPAPI, data *ListerData) ([]string, error) {
69+
orgIDs, err := data.OrgIDs(client)
70+
if err != nil {
71+
return nil, err
72+
}
73+
74+
var ids []string
75+
for _, orgID := range orgIDs {
76+
client = client.Clone().WithOrgID(orgID)
77+
78+
var page int64 = 1
79+
for {
80+
params := service_accounts.NewSearchOrgServiceAccountsWithPagingParams().WithPage(&page)
81+
resp, err := client.ServiceAccounts.SearchOrgServiceAccountsWithPaging(params)
82+
if err != nil {
83+
return nil, err
84+
}
85+
86+
for _, sa := range resp.Payload.ServiceAccounts {
87+
ids = append(ids, MakeOrgResourceID(orgID, sa.ID))
88+
}
89+
90+
if resp.Payload.TotalCount <= int64(len(ids)) {
91+
break
92+
}
93+
94+
page++
95+
}
96+
}
97+
98+
return ids, nil
6599
}
66100

67101
func CreateServiceAccount(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {

internal/resources/grafana/resource_team.go

+38-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"strconv"
88

99
goapi "github.com/grafana/grafana-openapi-client-go/client"
10+
"github.com/grafana/grafana-openapi-client-go/client/teams"
1011
"github.com/grafana/grafana-openapi-client-go/models"
1112
"github.com/grafana/terraform-provider-grafana/v3/internal/common"
1213
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
@@ -85,6 +86,9 @@ to the team. Note: users specified here must already exist in Grafana.
8586
Type: schema.TypeBool,
8687
Optional: true,
8788
Default: true,
89+
DiffSuppressFunc: func(k, old, new string, d *schema.ResourceData) bool {
90+
return old == new || (old == "" && new == "true")
91+
},
8892
Description: `
8993
Ignores team members that have been added to team by [Team Sync](https://grafana.com/docs/grafana/latest/setup-grafana/configure-security/configure-team-sync/).
9094
Team Sync can be provisioned using [grafana_team_external_group resource](https://registry.terraform.io/providers/grafana/grafana/latest/docs/resources/team_external_group).
@@ -154,7 +158,40 @@ Team Sync can be provisioned using [grafana_team_external_group resource](https:
154158
"grafana_team",
155159
orgResourceIDInt("id"),
156160
schema,
157-
)
161+
).WithLister(listerFunction(listTeams))
162+
}
163+
164+
func listTeams(ctx context.Context, client *goapi.GrafanaHTTPAPI, data *ListerData) ([]string, error) {
165+
orgIDs, err := data.OrgIDs(client)
166+
if err != nil {
167+
return nil, err
168+
}
169+
170+
var ids []string
171+
for _, orgID := range orgIDs {
172+
client = client.Clone().WithOrgID(orgID)
173+
174+
var page int64 = 1
175+
for {
176+
params := teams.NewSearchTeamsParams().WithPage(&page)
177+
resp, err := client.Teams.SearchTeams(params)
178+
if err != nil {
179+
return nil, err
180+
}
181+
182+
for _, team := range resp.Payload.Teams {
183+
ids = append(ids, MakeOrgResourceID(orgID, team.ID))
184+
}
185+
186+
if resp.Payload.TotalCount <= int64(len(ids)) {
187+
break
188+
}
189+
190+
page++
191+
}
192+
}
193+
194+
return ids, nil
158195
}
159196

160197
func CreateTeam(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {

internal/resources/grafana/resource_user.go

+26
Original file line numberDiff line numberDiff line change
@@ -76,8 +76,34 @@ You must use basic auth.
7676
resourceUserID,
7777
schema,
7878
)
79+
// ).WithLister(listerFunction(listUsers))
7980
}
8081

82+
// TODO: Fix issues with password
83+
// func listUsers(ctx context.Context, client *goapi.GrafanaHTTPAPI, data *ListerData) ([]string, error) {
84+
// var ids []string
85+
// var page int64 = 1
86+
// for {
87+
// params := users.NewSearchUsersParams().WithPage(&page)
88+
// resp, err := client.Users.SearchUsers(params)
89+
// if err != nil {
90+
// return nil, err
91+
// }
92+
93+
// for _, user := range resp.Payload {
94+
// ids = append(ids, strconv.FormatInt(user.ID, 10))
95+
// }
96+
97+
// if len(resp.Payload) == 0 {
98+
// break
99+
// }
100+
101+
// page++
102+
// }
103+
104+
// return ids, nil
105+
// }
106+
81107
func CreateUser(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
82108
client, err := OAPIGlobalClient(meta)
83109
if err != nil {

internal/resources/syntheticmonitoring/resource_check.go

+18-20
Original file line numberDiff line numberDiff line change
@@ -790,28 +790,26 @@ multiple checks for a single endpoint to check different capabilities.
790790
"grafana_synthetic_monitoring_check",
791791
resourceCheckID,
792792
schema,
793-
)
793+
).WithLister(listChecks)
794794
}
795795

796-
// TODO: Fix lister
797-
// .WithLister(listChecks)
798-
// func listChecks(ctx context.Context, client *common.Client, data any) ([]string, error) {
799-
// smClient := client.SMAPI
800-
// if smClient == nil {
801-
// return nil, fmt.Errorf("client not configured for SM API")
802-
// }
803-
804-
// checkList, err := smClient.ListChecks(ctx)
805-
// if err != nil {
806-
// return nil, err
807-
// }
808-
809-
// var ids []string
810-
// for _, check := range checkList {
811-
// ids = append(ids, strconv.FormatInt(check.Id, 10))
812-
// }
813-
// return ids, nil
814-
// }
796+
func listChecks(ctx context.Context, client *common.Client, data any) ([]string, error) {
797+
smClient := client.SMAPI
798+
if smClient == nil {
799+
return nil, fmt.Errorf("client not configured for SM API")
800+
}
801+
802+
checkList, err := smClient.ListChecks(ctx)
803+
if err != nil {
804+
return nil, err
805+
}
806+
807+
var ids []string
808+
for _, check := range checkList {
809+
ids = append(ids, strconv.FormatInt(check.Id, 10))
810+
}
811+
return ids, nil
812+
}
815813

816814
func resourceCheckCreate(ctx context.Context, d *schema.ResourceData, c *smapi.Client) diag.Diagnostics {
817815
chk, err := makeCheck(d)

pkg/generate/generate_test.go

+1-7
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,7 @@ import (
2222
)
2323

2424
func TestAccGenerate(t *testing.T) {
25-
if testing.Short() {
26-
t.Skip("skipping long test")
27-
}
28-
testutils.CheckOSSTestsEnabled(t)
25+
testutils.CheckEnterpriseTestsEnabled(t, ">=10.0.0")
2926

3027
// Install Terraform to a temporary directory to avoid reinstalling it for each test case.
3128
installDir := t.TempDir()
@@ -234,9 +231,6 @@ func TestAccGenerate(t *testing.T) {
234231
}
235232

236233
func TestAccGenerate_RestrictedPermissions(t *testing.T) {
237-
if testing.Short() {
238-
t.Skip("skipping long test")
239-
}
240234
testutils.CheckEnterpriseTestsEnabled(t, ">=10.0.0")
241235

242236
// Create SA with no permissions

testdata/integration/test.sh

+1-1
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ ${REPO_ROOT}/terraform-provider-grafana-generate \
6868
# Test the generated code
6969
for dir in "generated" "generated-json" ; do
7070
cd ${SCRIPT_DIR}/${dir}
71-
terraform plan > plan.out
71+
terraform plan | tee plan.out
7272
# Expect a folder called "My Folder" and no changes in the plan
7373
grep "My Folder" plan.out || (echo "Expected a folder called 'My Folder'" && exit 1)
7474
grep ' to import, 0 to add, 0 to change, 0 to destroy' plan.out || (echo "Expected no changes in the plan" && exit 1)

0 commit comments

Comments
 (0)