Skip to content

Commit 2689148

Browse files
Self-contained cloud package (#1393)
Split from #1391 - Makes the resource functions private (exposed via a single map attribute) rather than each resource individually - Puts the client validation in the cloud package
1 parent 791c195 commit 2689148

16 files changed

+136
-167
lines changed

internal/provider/legacy_provider.go

Lines changed: 2 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -80,19 +80,6 @@ func Provider(version string) *schema.Provider {
8080
"grafana_synthetic_monitoring_probe": syntheticmonitoring.ResourceProbe(),
8181
})
8282

83-
// Resources that require the Cloud client to exist.
84-
cloudClientResources = addResourcesMetadataValidation(cloudClientPresent, map[string]*schema.Resource{
85-
"grafana_cloud_access_policy": cloud.ResourceAccessPolicy(),
86-
"grafana_cloud_access_policy_token": cloud.ResourceAccessPolicyToken(),
87-
"grafana_cloud_api_key": cloud.ResourceAPIKey(),
88-
"grafana_cloud_plugin_installation": cloud.ResourcePluginInstallation(),
89-
"grafana_cloud_stack": cloud.ResourceStack(),
90-
"grafana_cloud_stack_api_key": cloud.ResourceStackAPIKey(),
91-
"grafana_cloud_stack_service_account": cloud.ResourceStackServiceAccount(),
92-
"grafana_cloud_stack_service_account_token": cloud.ResourceStackServiceAccountToken(),
93-
"grafana_synthetic_monitoring_installation": cloud.ResourceInstallation(),
94-
})
95-
9683
// Resources that require the OnCall client to exist.
9784
onCallClientResources = addResourcesMetadataValidation(onCallClientPresent, map[string]*schema.Resource{
9885
"grafana_oncall_integration": oncall.ResourceIntegration(),
@@ -133,13 +120,6 @@ func Provider(version string) *schema.Provider {
133120
"grafana_synthetic_monitoring_probes": syntheticmonitoring.DataSourceProbes(),
134121
})
135122

136-
// Datasources that require the Cloud client to exist.
137-
cloudClientDatasources = addResourcesMetadataValidation(cloudClientPresent, map[string]*schema.Resource{
138-
"grafana_cloud_ips": cloud.DataSourceIPs(),
139-
"grafana_cloud_organization": cloud.DataSourceOrganization(),
140-
"grafana_cloud_stack": cloud.DataSourceStack(),
141-
})
142-
143123
// Datasources that require the OnCall client to exist.
144124
onCallClientDatasources = addResourcesMetadataValidation(onCallClientPresent, map[string]*schema.Resource{
145125
"grafana_oncall_user": oncall.DataSourceUser(),
@@ -275,15 +255,15 @@ func Provider(version string) *schema.Provider {
275255
machinelearning.ResourcesMap,
276256
smClientResources,
277257
onCallClientResources,
278-
cloudClientResources,
258+
cloud.ResourcesMap,
279259
),
280260

281261
DataSourcesMap: mergeResourceMaps(
282262
grafanaClientDatasources,
283263
machinelearning.DatasourcesMap,
284264
smClientDatasources,
285265
onCallClientDatasources,
286-
cloudClientDatasources,
266+
cloud.DatasourcesMap,
287267
),
288268
}
289269

internal/provider/legacy_provider_validation.go

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -42,13 +42,6 @@ func smClientPresent(resourceName string, d *schema.ResourceData, m interface{})
4242
return nil
4343
}
4444

45-
func cloudClientPresent(resourceName string, d *schema.ResourceData, m interface{}) error {
46-
if m.(*common.Client).GrafanaCloudAPI == nil {
47-
return fmt.Errorf("the Cloud API client is required for `%s`. Set the cloud_api_key provider attribute", resourceName)
48-
}
49-
return nil
50-
}
51-
5245
func onCallClientPresent(resourceName string, d *schema.ResourceData, m interface{}) error {
5346
if m.(*common.Client).OnCallClient == nil {
5447
return fmt.Errorf("the Oncall client is required for `%s`. Set the oncall_access_token provider attribute", resourceName)

internal/resources/cloud/common.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
package cloud
22

33
import (
4+
"context"
5+
46
"github.com/grafana/grafana-com-public-clients/go/gcom"
7+
"github.com/grafana/terraform-provider-grafana/internal/common"
58
"github.com/hashicorp/go-uuid"
69
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
10+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
711
)
812

913
func ClientRequestID() string {
@@ -14,6 +18,18 @@ func ClientRequestID() string {
1418
return "tf-" + uuid
1519
}
1620

21+
type crudWithClientFunc func(ctx context.Context, d *schema.ResourceData, client *gcom.APIClient) diag.Diagnostics
22+
23+
func withClient[T schema.CreateContextFunc | schema.UpdateContextFunc | schema.ReadContextFunc | schema.DeleteContextFunc](f crudWithClientFunc) T {
24+
return func(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
25+
client := meta.(*common.Client).GrafanaCloudAPI
26+
if client == nil {
27+
return diag.Errorf("the Cloud API client is required for this resource. Set the cloud_access_policy_token provider attribute")
28+
}
29+
return f(ctx, d, client)
30+
}
31+
}
32+
1733
func apiError(err error) diag.Diagnostics {
1834
if err == nil {
1935
return nil

internal/resources/cloud/data_source_cloud_ips.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@ import (
1010
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
1111
)
1212

13-
func DataSourceIPs() *schema.Resource {
13+
func datasourceIPs() *schema.Resource {
1414
return &schema.Resource{
1515
Description: "Data source for retrieving sets of cloud IPs. See https://grafana.com/docs/grafana-cloud/reference/allow-list/ for more info",
16-
ReadContext: DataSourceIPsRead,
16+
ReadContext: datasourceIPsRead,
1717
Schema: map[string]*schema.Schema{
1818
"hosted_alerts": {
1919
Description: "Set of IP addresses that are used for hosted alerts.",
@@ -59,7 +59,7 @@ func DataSourceIPs() *schema.Resource {
5959
}
6060
}
6161

62-
func DataSourceIPsRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
62+
func datasourceIPsRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
6363
d.SetId("cloud_ips")
6464
for attr, dataURL := range map[string]string{
6565
"hosted_alerts": "https://grafana.com/api/hosted-alerts/source-ips.txt",

internal/resources/cloud/data_source_cloud_organization.go

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,14 @@ import (
44
"context"
55
"strconv"
66

7-
"github.com/grafana/terraform-provider-grafana/internal/common"
7+
"github.com/grafana/grafana-com-public-clients/go/gcom"
88
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
99
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
1010
)
1111

12-
func DataSourceOrganization() *schema.Resource {
12+
func datasourceOrganization() *schema.Resource {
1313
return &schema.Resource{
14-
ReadContext: DataSourceOrganizationRead,
14+
ReadContext: withClient[schema.ReadContextFunc](datasourceOrganizationRead),
1515
Schema: map[string]*schema.Schema{
1616
"id": {
1717
Type: schema.TypeString,
@@ -43,9 +43,7 @@ func DataSourceOrganization() *schema.Resource {
4343
}
4444
}
4545

46-
func DataSourceOrganizationRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
47-
client := meta.(*common.Client).GrafanaCloudAPI
48-
46+
func datasourceOrganizationRead(ctx context.Context, d *schema.ResourceData, client *gcom.APIClient) diag.Diagnostics {
4947
id := d.Get("id").(string)
5048
if id == "" {
5149
id = d.Get("slug").(string)

internal/resources/cloud/data_source_cloud_stack.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,17 @@ package cloud
33
import (
44
"context"
55

6+
"github.com/grafana/grafana-com-public-clients/go/gcom"
67
"github.com/grafana/terraform-provider-grafana/internal/common"
78
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
89
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
910
)
1011

11-
func DataSourceStack() *schema.Resource {
12+
func datasourceStack() *schema.Resource {
1213
return &schema.Resource{
1314
Description: "Data source for Grafana Stack",
14-
ReadContext: DataSourceStackRead,
15-
Schema: common.CloneResourceSchemaForDatasource(ResourceStack(), map[string]*schema.Schema{
15+
ReadContext: withClient[schema.ReadContextFunc](datasourceStackRead),
16+
Schema: common.CloneResourceSchemaForDatasource(resourceStack(), map[string]*schema.Schema{
1617
"slug": {
1718
Type: schema.TypeString,
1819
Required: true,
@@ -31,7 +32,7 @@ available at “https://<stack_slug>.grafana.net".`,
3132
}
3233
}
3334

34-
func DataSourceStackRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
35+
func datasourceStackRead(ctx context.Context, d *schema.ResourceData, client *gcom.APIClient) diag.Diagnostics {
3536
d.SetId(d.Get("slug").(string))
36-
return ReadStack(ctx, d, meta)
37+
return readStack(ctx, d, client)
3738
}

internal/resources/cloud/resource_cloud_access_policy.go

Lines changed: 11 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import (
1515

1616
var ResourceAccessPolicyID = common.NewResourceIDWithLegacySeparator("grafana_cloud_access_policy", "/", "region", "policyId") //nolint:staticcheck
1717

18-
func ResourceAccessPolicy() *schema.Resource {
18+
func resourceAccessPolicy() *schema.Resource {
1919
return &schema.Resource{
2020

2121
Description: `
@@ -29,10 +29,10 @@ Required access policy scopes:
2929
* accesspolicies:delete
3030
`,
3131

32-
CreateContext: CreateCloudAccessPolicy,
33-
UpdateContext: UpdateCloudAccessPolicy,
34-
DeleteContext: DeleteCloudAccessPolicy,
35-
ReadContext: ReadCloudAccessPolicy,
32+
CreateContext: withClient[schema.CreateContextFunc](createCloudAccessPolicy),
33+
UpdateContext: withClient[schema.UpdateContextFunc](updateCloudAccessPolicy),
34+
DeleteContext: withClient[schema.DeleteContextFunc](deleteCloudAccessPolicy),
35+
ReadContext: withClient[schema.ReadContextFunc](readCloudAccessPolicy),
3636

3737
Importer: &schema.ResourceImporter{
3838
StateContext: schema.ImportStatePassthroughContext,
@@ -126,8 +126,7 @@ var cloudAccessPolicyRealmSchema = &schema.Resource{
126126
},
127127
}
128128

129-
func CreateCloudAccessPolicy(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
130-
client := meta.(*common.Client).GrafanaCloudAPI
129+
func createCloudAccessPolicy(ctx context.Context, d *schema.ResourceData, client *gcom.APIClient) diag.Diagnostics {
131130
region := d.Get("region").(string)
132131

133132
displayName := d.Get("display_name").(string)
@@ -149,12 +148,10 @@ func CreateCloudAccessPolicy(ctx context.Context, d *schema.ResourceData, meta i
149148

150149
d.SetId(ResourceAccessPolicyID.Make(region, result.Id))
151150

152-
return ReadCloudAccessPolicy(ctx, d, meta)
151+
return readCloudAccessPolicy(ctx, d, client)
153152
}
154153

155-
func UpdateCloudAccessPolicy(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
156-
client := meta.(*common.Client).GrafanaCloudAPI
157-
154+
func updateCloudAccessPolicy(ctx context.Context, d *schema.ResourceData, client *gcom.APIClient) diag.Diagnostics {
158155
split, err := ResourceAccessPolicyID.Split(d.Id())
159156
if err != nil {
160157
return diag.FromErr(err)
@@ -176,12 +173,10 @@ func UpdateCloudAccessPolicy(ctx context.Context, d *schema.ResourceData, meta i
176173
return apiError(err)
177174
}
178175

179-
return ReadCloudAccessPolicy(ctx, d, meta)
176+
return readCloudAccessPolicy(ctx, d, client)
180177
}
181178

182-
func ReadCloudAccessPolicy(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
183-
client := meta.(*common.Client).GrafanaCloudAPI
184-
179+
func readCloudAccessPolicy(ctx context.Context, d *schema.ResourceData, client *gcom.APIClient) diag.Diagnostics {
185180
split, err := ResourceAccessPolicyID.Split(d.Id())
186181
if err != nil {
187182
return diag.FromErr(err)
@@ -208,9 +203,7 @@ func ReadCloudAccessPolicy(ctx context.Context, d *schema.ResourceData, meta int
208203
return nil
209204
}
210205

211-
func DeleteCloudAccessPolicy(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
212-
client := meta.(*common.Client).GrafanaCloudAPI
213-
206+
func deleteCloudAccessPolicy(ctx context.Context, d *schema.ResourceData, client *gcom.APIClient) diag.Diagnostics {
214207
split, err := ResourceAccessPolicyID.Split(d.Id())
215208
if err != nil {
216209
return diag.FromErr(err)

internal/resources/cloud/resource_cloud_access_policy_token.go

Lines changed: 11 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import (
1313

1414
var ResourceAccessPolicyTokenID = common.NewResourceIDWithLegacySeparator("grafana_cloud_access_policy_token", "/", "region", "tokenId") //nolint:staticcheck
1515

16-
func ResourceAccessPolicyToken() *schema.Resource {
16+
func resourceAccessPolicyToken() *schema.Resource {
1717
return &schema.Resource{
1818

1919
Description: `
@@ -27,10 +27,10 @@ Required access policy scopes:
2727
* accesspolicies:delete
2828
`,
2929

30-
CreateContext: CreateCloudAccessPolicyToken,
31-
UpdateContext: UpdateCloudAccessPolicyToken,
32-
DeleteContext: DeleteCloudAccessPolicyToken,
33-
ReadContext: ReadCloudAccessPolicyToken,
30+
CreateContext: withClient[schema.CreateContextFunc](createCloudAccessPolicyToken),
31+
UpdateContext: withClient[schema.UpdateContextFunc](updateCloudAccessPolicyToken),
32+
DeleteContext: withClient[schema.DeleteContextFunc](deleteCloudAccessPolicyToken),
33+
ReadContext: withClient[schema.ReadContextFunc](readCloudAccessPolicyToken),
3434

3535
Importer: &schema.ResourceImporter{
3636
StateContext: schema.ImportStatePassthroughContext,
@@ -94,8 +94,7 @@ Required access policy scopes:
9494
}
9595
}
9696

97-
func CreateCloudAccessPolicyToken(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
98-
client := meta.(*common.Client).GrafanaCloudAPI
97+
func createCloudAccessPolicyToken(ctx context.Context, d *schema.ResourceData, client *gcom.APIClient) diag.Diagnostics {
9998
region := d.Get("region").(string)
10099

101100
tokenInput := gcom.PostTokensRequest{
@@ -121,12 +120,10 @@ func CreateCloudAccessPolicyToken(ctx context.Context, d *schema.ResourceData, m
121120
d.SetId(ResourceAccessPolicyTokenID.Make(region, result.Id))
122121
d.Set("token", result.Token)
123122

124-
return ReadCloudAccessPolicyToken(ctx, d, meta)
123+
return readCloudAccessPolicyToken(ctx, d, client)
125124
}
126125

127-
func UpdateCloudAccessPolicyToken(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
128-
client := meta.(*common.Client).GrafanaCloudAPI
129-
126+
func updateCloudAccessPolicyToken(ctx context.Context, d *schema.ResourceData, client *gcom.APIClient) diag.Diagnostics {
130127
split, err := ResourceAccessPolicyTokenID.Split(d.Id())
131128
if err != nil {
132129
return diag.FromErr(err)
@@ -145,12 +142,10 @@ func UpdateCloudAccessPolicyToken(ctx context.Context, d *schema.ResourceData, m
145142
return apiError(err)
146143
}
147144

148-
return ReadCloudAccessPolicyToken(ctx, d, meta)
145+
return readCloudAccessPolicyToken(ctx, d, client)
149146
}
150147

151-
func ReadCloudAccessPolicyToken(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
152-
client := meta.(*common.Client).GrafanaCloudAPI
153-
148+
func readCloudAccessPolicyToken(ctx context.Context, d *schema.ResourceData, client *gcom.APIClient) diag.Diagnostics {
154149
split, err := ResourceAccessPolicyTokenID.Split(d.Id())
155150
if err != nil {
156151
return diag.FromErr(err)
@@ -178,9 +173,7 @@ func ReadCloudAccessPolicyToken(ctx context.Context, d *schema.ResourceData, met
178173
return nil
179174
}
180175

181-
func DeleteCloudAccessPolicyToken(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
182-
client := meta.(*common.Client).GrafanaCloudAPI
183-
176+
func deleteCloudAccessPolicyToken(ctx context.Context, d *schema.ResourceData, client *gcom.APIClient) diag.Diagnostics {
184177
split, err := ResourceAccessPolicyTokenID.Split(d.Id())
185178
if err != nil {
186179
return diag.FromErr(err)

internal/resources/cloud/resource_cloud_api_key.go

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import (
1414
var ResourceAPIKeyID = common.NewResourceIDWithLegacySeparator("grafana_cloud_api_key", "-", "orgSlug", "apiKeyName") //nolint:staticcheck
1515
var cloudAPIKeyRoles = []string{"Viewer", "Editor", "Admin", "MetricsPublisher", "PluginPublisher"}
1616

17-
func ResourceAPIKey() *schema.Resource {
17+
func resourceAPIKey() *schema.Resource {
1818
return &schema.Resource{
1919
Description: `This resource is deprecated and will be removed in a future release. Please use grafana_cloud_access_policy instead.
2020
@@ -27,9 +27,9 @@ Required access policy scopes:
2727
* api-keys:write
2828
* api-keys:delete
2929
`,
30-
CreateContext: ResourceAPIKeyCreate,
31-
ReadContext: ResourceAPIKeyRead,
32-
DeleteContext: ResourceAPIKeyDelete,
30+
CreateContext: withClient[schema.CreateContextFunc](resourceAPIKeyCreate),
31+
ReadContext: withClient[schema.ReadContextFunc](resourceAPIKeyRead),
32+
DeleteContext: withClient[schema.DeleteContextFunc](resourceAPIKeyDelete),
3333
Importer: &schema.ResourceImporter{
3434
StateContext: schema.ImportStatePassthroughContext,
3535
},
@@ -65,9 +65,7 @@ Required access policy scopes:
6565
}
6666
}
6767

68-
func ResourceAPIKeyCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
69-
c := meta.(*common.Client).GrafanaCloudAPI
70-
68+
func resourceAPIKeyCreate(ctx context.Context, d *schema.ResourceData, c *gcom.APIClient) diag.Diagnostics {
7169
req := gcom.PostApiKeysRequest{
7270
Name: d.Get("name").(string),
7371
Role: d.Get("role").(string),
@@ -85,12 +83,10 @@ func ResourceAPIKeyCreate(ctx context.Context, d *schema.ResourceData, meta inte
8583
d.Set("key", *resp.Token)
8684
d.SetId(ResourceAPIKeyID.Make(org, resp.Name))
8785

88-
return ResourceAPIKeyRead(ctx, d, meta)
86+
return resourceAPIKeyRead(ctx, d, c)
8987
}
9088

91-
func ResourceAPIKeyRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
92-
c := meta.(*common.Client).GrafanaCloudAPI
93-
89+
func resourceAPIKeyRead(ctx context.Context, d *schema.ResourceData, c *gcom.APIClient) diag.Diagnostics {
9490
split, err := ResourceAPIKeyID.Split(d.Id())
9591
if err != nil {
9692
return diag.FromErr(err)
@@ -110,9 +106,7 @@ func ResourceAPIKeyRead(ctx context.Context, d *schema.ResourceData, meta interf
110106
return nil
111107
}
112108

113-
func ResourceAPIKeyDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
114-
c := meta.(*common.Client).GrafanaCloudAPI
115-
109+
func resourceAPIKeyDelete(ctx context.Context, d *schema.ResourceData, c *gcom.APIClient) diag.Diagnostics {
116110
split, err := ResourceAPIKeyID.Split(d.Id())
117111
if err != nil {
118112
return diag.FromErr(err)

0 commit comments

Comments
 (0)