Skip to content

Commit 6879e52

Browse files
Config Generation: Various small fixes (#1596)
* Config Generation: Various small fixes - More robust alerting resource listing. Sometimes they fail to list in new orgs because the alertmanager hasn't been init yet - Run tests on a different runner (to avoid conflicts and ID increments) * Oops, rename testdata
1 parent 34f2936 commit 6879e52

File tree

8 files changed

+54
-22
lines changed

8 files changed

+54
-22
lines changed

.github/workflows/acc-tests.yml

+2-1
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']
58+
subset: ['basic', 'other', 'long', 'generate']
5959
include:
6060
- version: '11.0.0'
6161
type: 'oss'
@@ -108,3 +108,4 @@ jobs:
108108
${{ matrix.subset == 'other' && '-skip=".*_basic" -short -parallel 2' || '' }}
109109
${{ matrix.subset == 'long' && '-run=".*longtest" -parallel 1' || '' }}
110110
${{ matrix.subset == 'examples' && '-run=".*Examples" -parallel 1' || '' }}
111+
${{ matrix.subset == 'generate' && '-run="TestAccGenerate" -parallel 1' || '' }}

internal/resources/grafana/resource_alerting_message_template.go

+16-6
Original file line numberDiff line numberDiff line change
@@ -78,13 +78,23 @@ func listMessageTemplate(ctx context.Context, client *goapi.GrafanaHTTPAPI, data
7878
for _, orgID := range orgIDs {
7979
client = client.Clone().WithOrgID(orgID)
8080

81-
resp, err := client.Provisioning.GetTemplates()
82-
if err != nil {
83-
return nil, err
84-
}
81+
// Retry if the API returns 500 because it may be that the alertmanager is not ready in the org yet.
82+
// The alertmanager is provisioned asynchronously when the org is created.
83+
if err := retry.RetryContext(ctx, 2*time.Minute, func() *retry.RetryError {
84+
resp, err := client.Provisioning.GetTemplates()
85+
if err != nil {
86+
if orgID > 1 && (err.(*runtime.APIError).IsCode(500) || err.(*runtime.APIError).IsCode(403)) {
87+
return retry.RetryableError(err)
88+
}
89+
return retry.NonRetryableError(err)
90+
}
8591

86-
for _, template := range resp.Payload {
87-
ids = append(ids, MakeOrgResourceID(orgID, template.Name))
92+
for _, template := range resp.Payload {
93+
ids = append(ids, MakeOrgResourceID(orgID, template.Name))
94+
}
95+
return nil
96+
}); err != nil {
97+
return nil, err
8898
}
8999
}
90100

internal/resources/grafana/resource_alerting_mute_timing.go

+19-6
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,15 @@ import (
55
"fmt"
66
"strconv"
77
"strings"
8+
"time"
89

10+
"github.com/go-openapi/runtime"
911
goapi "github.com/grafana/grafana-openapi-client-go/client"
1012
"github.com/grafana/grafana-openapi-client-go/client/provisioning"
1113
"github.com/grafana/grafana-openapi-client-go/models"
1214
"github.com/grafana/terraform-provider-grafana/v3/internal/common"
1315
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
16+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/retry"
1417
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
1518
)
1619

@@ -142,13 +145,23 @@ func listMuteTimings(ctx context.Context, client *goapi.GrafanaHTTPAPI, data *Li
142145
for _, orgID := range orgIDs {
143146
client = client.Clone().WithOrgID(orgID)
144147

145-
resp, err := client.Provisioning.GetMuteTimings()
146-
if err != nil {
147-
return nil, err
148-
}
148+
// Retry if the API returns 500 because it may be that the alertmanager is not ready in the org yet.
149+
// The alertmanager is provisioned asynchronously when the org is created.
150+
if err := retry.RetryContext(ctx, 2*time.Minute, func() *retry.RetryError {
151+
resp, err := client.Provisioning.GetMuteTimings()
152+
if err != nil {
153+
if orgID > 1 && (err.(*runtime.APIError).IsCode(500) || err.(*runtime.APIError).IsCode(403)) {
154+
return retry.RetryableError(err)
155+
}
156+
return retry.NonRetryableError(err)
157+
}
149158

150-
for _, muteTiming := range resp.Payload {
151-
ids = append(ids, MakeOrgResourceID(orgID, muteTiming.Name))
159+
for _, muteTiming := range resp.Payload {
160+
ids = append(ids, MakeOrgResourceID(orgID, muteTiming.Name))
161+
}
162+
return nil
163+
}); err != nil {
164+
return nil, err
152165
}
153166
}
154167

internal/resources/grafana/resource_report.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,7 @@ func listReports(ctx context.Context, client *goapi.GrafanaHTTPAPI, data *Lister
262262
client = client.Clone().WithOrgID(orgID)
263263

264264
resp, err := client.Reports.GetReports()
265-
if common.IsNotFoundError(err) {
265+
if err != nil && common.IsNotFoundError(err) {
266266
return nil, nil // Reports are not available in the current Grafana version (Probably OSS)
267267
}
268268
if err != nil {

pkg/generate/generate_test.go

+16-8
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ import (
1717
)
1818

1919
func TestAccGenerate(t *testing.T) {
20+
if testing.Short() {
21+
t.Skip("skipping long test")
22+
}
2023
testutils.CheckOSSTestsEnabled(t)
2124

2225
cases := []struct {
@@ -29,7 +32,7 @@ func TestAccGenerate(t *testing.T) {
2932
name: "dashboard",
3033
config: testutils.TestAccExample(t, "resources/grafana_dashboard/resource.tf"),
3134
check: func(t *testing.T, tempDir string) {
32-
assertFiles(t, tempDir, "testdata/generate/dashboard-expected", "", []string{
35+
assertFiles(t, tempDir, "testdata/generate/dashboard", []string{
3336
".terraform",
3437
".terraform.lock.hcl",
3538
})
@@ -42,7 +45,7 @@ func TestAccGenerate(t *testing.T) {
4245
cfg.Format = generate.OutputFormatJSON
4346
},
4447
check: func(t *testing.T, tempDir string) {
45-
assertFiles(t, tempDir, "testdata/generate/dashboard-json", "", []string{
48+
assertFiles(t, tempDir, "testdata/generate/dashboard-json", []string{
4649
".terraform",
4750
".terraform.lock.hcl",
4851
})
@@ -55,7 +58,7 @@ func TestAccGenerate(t *testing.T) {
5558
cfg.IncludeResources = []string{"grafana_dashboard._1_my-dashboard-uid"}
5659
},
5760
check: func(t *testing.T, tempDir string) {
58-
assertFiles(t, tempDir, "testdata/generate/dashboard-filtered", "", []string{
61+
assertFiles(t, tempDir, "testdata/generate/dashboard-filtered", []string{
5962
".terraform",
6063
".terraform.lock.hcl",
6164
})
@@ -68,7 +71,7 @@ func TestAccGenerate(t *testing.T) {
6871
cfg.IncludeResources = []string{"*._1_my-dashboard-uid"}
6972
},
7073
check: func(t *testing.T, tempDir string) {
71-
assertFiles(t, tempDir, "testdata/generate/dashboard-filtered", "", []string{
74+
assertFiles(t, tempDir, "testdata/generate/dashboard-filtered", []string{
7275
".terraform",
7376
".terraform.lock.hcl",
7477
})
@@ -81,7 +84,7 @@ func TestAccGenerate(t *testing.T) {
8184
cfg.IncludeResources = []string{"grafana_dashboard.*"}
8285
},
8386
check: func(t *testing.T, tempDir string) {
84-
assertFiles(t, tempDir, "testdata/generate/dashboard-filtered", "", []string{
87+
assertFiles(t, tempDir, "testdata/generate/dashboard-filtered", []string{
8588
".terraform",
8689
".terraform.lock.hcl",
8790
})
@@ -125,7 +128,12 @@ func TestAccGenerate(t *testing.T) {
125128
}
126129

127130
// assertFiles checks that all files in the "expectedFilesDir" directory match the files in the "gotFilesDir" directory.
128-
func assertFiles(t *testing.T, gotFilesDir, expectedFilesDir, subdir string, ignoreDirEntries []string) {
131+
func assertFiles(t *testing.T, gotFilesDir, expectedFilesDir string, ignoreDirEntries []string) {
132+
t.Helper()
133+
assertFilesSubdir(t, gotFilesDir, expectedFilesDir, "", ignoreDirEntries)
134+
}
135+
136+
func assertFilesSubdir(t *testing.T, gotFilesDir, expectedFilesDir, subdir string, ignoreDirEntries []string) {
129137
t.Helper()
130138

131139
originalGotFilesDir := gotFilesDir
@@ -149,7 +157,7 @@ func assertFiles(t *testing.T, gotFilesDir, expectedFilesDir, subdir string, ign
149157
}
150158

151159
if gotFile.IsDir() {
152-
assertFiles(t, originalGotFilesDir, originalExpectedFilesDir, filepath.Join(subdir, gotFile.Name()), ignoreDirEntries)
160+
assertFilesSubdir(t, originalGotFilesDir, originalExpectedFilesDir, filepath.Join(subdir, gotFile.Name()), ignoreDirEntries)
153161
continue
154162
}
155163

@@ -169,7 +177,7 @@ func assertFiles(t *testing.T, gotFilesDir, expectedFilesDir, subdir string, ign
169177
}
170178
for _, expectedFile := range expectedFiles {
171179
if expectedFile.IsDir() {
172-
assertFiles(t, originalGotFilesDir, originalExpectedFilesDir, filepath.Join(subdir, expectedFile.Name()), ignoreDirEntries)
180+
assertFilesSubdir(t, originalGotFilesDir, originalExpectedFilesDir, filepath.Join(subdir, expectedFile.Name()), ignoreDirEntries)
173181
continue
174182
}
175183
expectedContent, err := os.ReadFile(filepath.Join(expectedFilesDir, expectedFile.Name()))

0 commit comments

Comments
 (0)