From 9d6a1b2c77ea132855b6f689b14b7c92e44242fe Mon Sep 17 00:00:00 2001 From: Julien Duchesne Date: Thu, 25 Jul 2024 13:20:55 -0400 Subject: [PATCH] Deny importing read-only datasource Closes https://github.com/grafana/terraform-provider-grafana/issues/1682 --- .../resources/grafana/resource_data_source.go | 15 ++++++++++++++- .../grafana/resource_data_source_test.go | 18 ++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/internal/resources/grafana/resource_data_source.go b/internal/resources/grafana/resource_data_source.go index 5cea23cb7..9067f03ce 100644 --- a/internal/resources/grafana/resource_data_source.go +++ b/internal/resources/grafana/resource_data_source.go @@ -36,7 +36,20 @@ source selected (via the 'type' argument). SchemaVersion: 1, Importer: &schema.ResourceImporter{ - StateContext: schema.ImportStatePassthroughContext, + StateContext: func(ctx context.Context, d *schema.ResourceData, meta interface{}) ([]*schema.ResourceData, error) { + client, _, idStr := OAPIClientFromExistingOrgResource(meta, d.Id()) + + resp, err := client.Datasources.GetDataSourceByUID(idStr) + if err != nil { + return nil, err + } + + if resp.Payload.ReadOnly { + return nil, fmt.Errorf("this Grafana data source is read-only. It cannot be imported as a resource. Use the `data_grafana_data_source` data source instead") + } + + return schema.ImportStatePassthroughContext(ctx, d, meta) + }, }, Schema: map[string]*schema.Schema{ diff --git a/internal/resources/grafana/resource_data_source_test.go b/internal/resources/grafana/resource_data_source_test.go index 5bb14b96a..3c6269c4e 100644 --- a/internal/resources/grafana/resource_data_source_test.go +++ b/internal/resources/grafana/resource_data_source_test.go @@ -426,6 +426,24 @@ func TestAccDataSource_SeparateConfig(t *testing.T) { }) } +func TestAccDataSource_ImportReadOnly(t *testing.T) { + testutils.CheckCloudInstanceTestsEnabled(t) + + resource.ParallelTest(t, resource.TestCase{ + ProtoV5ProviderFactories: testutils.ProtoV5ProviderFactories, + Steps: []resource.TestStep{ + { + Config: `resource "grafana_data_source" "prometheus" {}`, + ImportState: true, + ResourceName: "grafana_data_source.prometheus", + ImportStateVerify: true, + ImportStateId: "grafanacloud-prom", + ExpectError: regexp.MustCompile("this Grafana data source is read-only. It cannot be imported as a resource. Use the `data_grafana_data_source` data source instead"), + }, + }, + }) +} + func testAccDatasourceInOrganization(orgName string) string { return fmt.Sprintf(` resource "grafana_organization" "test" {