Skip to content

Commit edcc2a9

Browse files
grafana_oncall_team: Add retry
Follow-up to #540 Most of the time the datasource finds a team that was just created, but sometimes it takes a short time for the API to sync With a retry, it shouldn't be flaky anymore
1 parent beacc3e commit edcc2a9

File tree

2 files changed

+35
-16
lines changed

2 files changed

+35
-16
lines changed

internal/resources/oncall/data_source_team.go

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,12 @@ package oncall
22

33
import (
44
"context"
5+
"fmt"
6+
"time"
57

68
onCallAPI "github.com/grafana/amixr-api-go-client"
79
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
10+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/retry"
811
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
912
)
1013

@@ -30,24 +33,33 @@ func dataSourceTeam() *schema.Resource {
3033
}
3134

3235
func dataSourceTeamRead(ctx context.Context, d *schema.ResourceData, client *onCallAPI.Client) diag.Diagnostics {
33-
options := &onCallAPI.ListTeamOptions{}
34-
nameData := d.Get("name").(string)
36+
var team *onCallAPI.Team
3537

36-
options.Name = nameData
38+
// Retry because the team might not be immediately available
39+
err := retry.RetryContext(ctx, 1*time.Minute, func() *retry.RetryError {
40+
options := &onCallAPI.ListTeamOptions{}
41+
nameData := d.Get("name").(string)
3742

38-
teamsResponse, _, err := client.Teams.ListTeams(options)
43+
options.Name = nameData
44+
45+
teamsResponse, _, err := client.Teams.ListTeams(options)
46+
if err != nil {
47+
return retry.NonRetryableError(err)
48+
}
49+
50+
if len(teamsResponse.Teams) == 0 {
51+
return retry.RetryableError(fmt.Errorf("couldn't find a team matching: %s", options.Name))
52+
} else if len(teamsResponse.Teams) != 1 {
53+
return retry.RetryableError(fmt.Errorf("more than one team found matching: %s", options.Name))
54+
}
55+
56+
team = teamsResponse.Teams[0]
57+
return nil
58+
})
3959
if err != nil {
4060
return diag.FromErr(err)
4161
}
4262

43-
if len(teamsResponse.Teams) == 0 {
44-
return diag.Errorf("couldn't find a team matching: %s", options.Name)
45-
} else if len(teamsResponse.Teams) != 1 {
46-
return diag.Errorf("more than one team found matching: %s", options.Name)
47-
}
48-
49-
team := teamsResponse.Teams[0]
50-
5163
d.Set("name", team.Name)
5264
d.Set("email", team.Email)
5365
d.Set("avatar_url", team.AvatarUrl)

internal/resources/oncall/data_source_team_test.go

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package oncall_test
22

33
import (
44
"fmt"
5-
"regexp"
65
"testing"
76

87
"github.com/grafana/terraform-provider-grafana/v2/internal/testutils"
@@ -19,17 +18,25 @@ func TestAccDataSourceTeam_Basic(t *testing.T) {
1918
ProtoV5ProviderFactories: testutils.ProtoV5ProviderFactories,
2019
Steps: []resource.TestStep{
2120
{
22-
Config: testAccDataSourceTeamConfig(teamName),
23-
ExpectError: regexp.MustCompile(`couldn't find a team`),
21+
Config: testAccDataSourceTeamConfig(teamName),
22+
Check: resource.ComposeAggregateTestCheckFunc(
23+
resource.TestCheckResourceAttrSet("data.grafana_oncall_team.test-acc-team", "id"),
24+
resource.TestCheckResourceAttr("data.grafana_oncall_team.test-acc-team", "name", teamName),
25+
),
2426
},
2527
},
2628
})
2729
}
2830

2931
func testAccDataSourceTeamConfig(teamName string) string {
3032
return fmt.Sprintf(`
33+
resource "grafana_team" "test-acc-team" {
34+
name = "%[1]s"
35+
}
36+
3137
data "grafana_oncall_team" "test-acc-team" {
32-
name = "%s"
38+
depends_on = [grafana_team.test-acc-team]
39+
name = "%[1]s"
3340
}
3441
`, teamName)
3542
}

0 commit comments

Comments
 (0)