diff --git a/catalog/data_shares.go b/catalog/data_shares.go index f7d32920c1..6f0a3299d2 100644 --- a/catalog/data_shares.go +++ b/catalog/data_shares.go @@ -3,22 +3,21 @@ package catalog import ( "context" + "github.com/databricks/databricks-sdk-go" "github.com/databricks/terraform-provider-databricks/common" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) func DataSourceShares() *schema.Resource { - type sharesData struct { + return common.WorkspaceData(func(ctx context.Context, data *struct { Shares []string `json:"shares,omitempty" tf:"computed,slice_set"` - } - return common.DataResource(sharesData{}, func(ctx context.Context, e any, c *common.DatabricksClient) error { - data := e.(*sharesData) - sharesAPI := NewSharesAPI(ctx, c) - shares, err := sharesAPI.list() + }, w *databricks.WorkspaceClient) error { + + shares, err := w.Shares.ListAll(ctx) if err != nil { return err } - for _, share := range shares.Shares { + for _, share := range shares { data.Shares = append(data.Shares, share.Name) } return nil diff --git a/catalog/resource_share.go b/catalog/resource_share.go index d59dad2466..2e49235872 100644 --- a/catalog/resource_share.go +++ b/catalog/resource_share.go @@ -84,11 +84,6 @@ func (si *ShareInfo) suppressCDFEnabledDiff() { } } -func (a SharesAPI) list() (shares Shares, err error) { - err = a.client.Get(a.context, "/unity-catalog/shares", nil, &shares) - return -} - func (a SharesAPI) create(si *ShareInfo) error { si.sortSharesByName() return a.client.Post(a.context, "/unity-catalog/shares", si, si) diff --git a/internal/acceptance/data_shares_test.go b/internal/acceptance/data_shares_test.go new file mode 100644 index 0000000000..d749314422 --- /dev/null +++ b/internal/acceptance/data_shares_test.go @@ -0,0 +1,97 @@ +package acceptance + +import ( + "strconv" + "testing" + + "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func checkSharesDataSourcePopulated(t *testing.T) func(s *terraform.State) error { + return func(s *terraform.State) error { + _, ok := s.Modules[0].Resources["data.databricks_shares.this"] + require.True(t, ok, "data.databricks_shares.this has to be there") + num_shares, _ := strconv.Atoi(s.Modules[0].Outputs["shares"].Value.(string)) + assert.GreaterOrEqual(t, num_shares, 1) + return nil + } +} +func TestUcAccDataSourceShares(t *testing.T) { + unityWorkspaceLevel(t, step{ + Template: ` + resource "databricks_catalog" "sandbox" { + name = "sandbox{var.RANDOM}" + comment = "this catalog is managed by terraform" + properties = { + purpose = "testing" + } + } + + resource "databricks_schema" "things" { + catalog_name = databricks_catalog.sandbox.id + name = "things{var.RANDOM}" + comment = "this database is managed by terraform" + properties = { + kind = "various" + } + } + + resource "databricks_table" "mytable" { + catalog_name = databricks_catalog.sandbox.id + schema_name = databricks_schema.things.name + name = "bar" + table_type = "MANAGED" + data_source_format = "DELTA" + + column { + name = "id" + position = 0 + type_name = "INT" + type_text = "int" + type_json = "{\"name\":\"id\",\"type\":\"integer\",\"nullable\":true,\"metadata\":{}}" + } + } + + resource "databricks_table" "mytable_2" { + catalog_name = databricks_catalog.sandbox.id + schema_name = databricks_schema.things.name + name = "bar_2" + table_type = "MANAGED" + data_source_format = "DELTA" + + column { + name = "id" + position = 0 + type_name = "INT" + type_text = "int" + type_json = "{\"name\":\"id\",\"type\":\"integer\",\"nullable\":true,\"metadata\":{}}" + } + } + + resource "databricks_share" "myshare" { + name = "{var.RANDOM}-terraform-delta-share" + object { + name = databricks_table.mytable.id + comment = "c" + data_object_type = "TABLE" + } + object { + name = databricks_table.mytable_2.id + cdf_enabled = false + comment = "c" + data_object_type = "TABLE" + } + } + + data "databricks_shares" "this" { + depends_on = [databricks_share.myshare] + } + output "shares" { + value = length(data.databricks_shares.this.shares) + } + `, + Check: checkSharesDataSourcePopulated(t), + }) +}