From 3fa83ab80fe7738616623104636598dd566f8c47 Mon Sep 17 00:00:00 2001 From: Alex Ott Date: Thu, 5 Jan 2023 14:50:41 +0100 Subject: [PATCH] Add `databricks_instance_pool` data source --- docs/data-sources/instance_pool.md | 38 +++++++++++++ pools/data_instance_pool.go | 47 ++++++++++++++++ pools/data_instance_pool_test.go | 89 ++++++++++++++++++++++++++++++ provider/provider.go | 1 + 4 files changed, 175 insertions(+) create mode 100644 docs/data-sources/instance_pool.md create mode 100644 pools/data_instance_pool.go create mode 100644 pools/data_instance_pool_test.go diff --git a/docs/data-sources/instance_pool.md b/docs/data-sources/instance_pool.md new file mode 100644 index 0000000000..0885e0bd6d --- /dev/null +++ b/docs/data-sources/instance_pool.md @@ -0,0 +1,38 @@ +--- +subcategory: "Compute" +--- + +# databricks_instance_pool Data Source + +-> **Note** If you have a fully automated setup with workspaces created by [databricks_mws_workspaces](../resources/mws_workspaces.md) or [azurerm_databricks_workspace](https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/databricks_workspace), please make sure to add [depends_on attribute](../index.md#data-resources-and-authentication-is-not-configured-errors) in order to prevent _authentication is not configured for provider_ errors. + +Retrieves information about [databricks_instance_pool](../resources/instance_pool.md). + +## Example Usage + +Referring to an instance pool by name: + +```hcl +data "databricks_instance_pool" "Pool" { + name = "All spot" +} + +resource "databricks_cluster" "my_cluster" { + instance_pool_id = data.databricks_instance_pool.pool.id + ... +} +``` + +## Argument Reference + +Data source allows you to pick instance pool by the following attribute + +- `name` - Name of the instance pool. The instance pool must exist before this resource can be planned. + +## Attribute Reference + +Data source exposes the following attributes: + +- `id` - The id of the instance pool. +- `pool_info` - block describing instance pool and its state. Check documentation for [databricks_instance_pool](../resources/instance_pool.md) for a list of exposed attributes. + diff --git a/pools/data_instance_pool.go b/pools/data_instance_pool.go new file mode 100644 index 0000000000..b50c4fab11 --- /dev/null +++ b/pools/data_instance_pool.go @@ -0,0 +1,47 @@ +package pools + +import ( + "context" + "fmt" + + "github.com/databricks/terraform-provider-databricks/common" + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" +) + +func getPool(poolsAPI InstancePoolsAPI, name string) (*InstancePoolAndStats, error) { + poolList, err := poolsAPI.List() + if err != nil { + return nil, err + } + for _, pool := range poolList.InstancePools { + if pool.InstancePoolName == name { + return &pool, nil + } + } + + return nil, fmt.Errorf("instance pool '%s' doesn't exist", name) +} + +// DataSourceInstancePool returns information about instance pool specified by name +func DataSourceInstancePool() *schema.Resource { + type poolDetails struct { + Name string `json:"name"` + Attributes *InstancePoolAndStats `json:"pool_info,omitempty" tf:"computed"` + } + s := common.StructToSchema(poolDetails{}, nil) + return &schema.Resource{ + Schema: s, + ReadContext: func(ctx context.Context, d *schema.ResourceData, m any) diag.Diagnostics { + name := d.Get("name").(string) + poolsAPI := NewInstancePoolsAPI(ctx, m) + pool, err := getPool(poolsAPI, name) + if err != nil { + return diag.FromErr(err) + } + d.SetId(pool.InstancePoolID) + err = common.StructToData(poolDetails{Name: name, Attributes: pool}, s, d) + return diag.FromErr(err) + }, + } +} diff --git a/pools/data_instance_pool_test.go b/pools/data_instance_pool_test.go new file mode 100644 index 0000000000..4755a54e65 --- /dev/null +++ b/pools/data_instance_pool_test.go @@ -0,0 +1,89 @@ +package pools + +import ( + "context" + "testing" + + "github.com/databricks/terraform-provider-databricks/common" + "github.com/databricks/terraform-provider-databricks/qa" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestDataSourceInstnacePool(t *testing.T) { + d, err := qa.ResourceFixture{ + Fixtures: []qa.HTTPFixture{ + { + Method: "GET", + Resource: "/api/2.0/instance-pools/list", + Response: InstancePoolList{ + InstancePools: []InstancePoolAndStats{ + { + InstancePoolID: "abc", + InstancePoolName: "pool", + NodeTypeID: "node-type", + }, + }, + }, + }, + }, + Read: true, + NonWritable: true, + Resource: DataSourceInstancePool(), + ID: ".", + State: map[string]any{ + "name": "pool", + }, + }.Apply(t) + require.NoError(t, err) + assert.Equal(t, "abc", d.Id()) + assert.NotNil(t, d.Get("pool_info")) + assert.Equal(t, "node-type", d.Get("pool_info.0.node_type_id").(string)) +} + +func TestDataSourceInstancePoolsGetPool(t *testing.T) { + qa.HTTPFixturesApply(t, []qa.HTTPFixture{ + { + Method: "GET", + Resource: "/api/2.0/instance-pools/list", + Status: 404, + Response: common.APIError{ + Message: "searching_error", + }, + }, + { + Method: "GET", + Resource: "/api/2.0/instance-pools/list", + Response: InstancePoolList{}, + }, + }, func(ctx context.Context, client *common.DatabricksClient) { + poolsAPI := NewInstancePoolsAPI(ctx, client) + + _, err := getPool(poolsAPI, "searching_error") + assert.EqualError(t, err, "searching_error") + + _, err = getPool(poolsAPI, "unknown") + assert.EqualError(t, err, "instance pool 'unknown' doesn't exist") + }) +} + +func TestDataSourceInstnacePool_NotFound(t *testing.T) { + qa.ResourceFixture{ + Fixtures: []qa.HTTPFixture{ + { + Method: "GET", + Resource: "/api/2.0/instance-pools/list", + Response: InstancePoolList{ + InstancePools: []InstancePoolAndStats{}, + }, + }, + }, + Read: true, + NonWritable: true, + Resource: DataSourceInstancePool(), + ID: ".", + State: map[string]any{ + "name": "Unknown", + }, + }.ExpectError(t, "instance pool 'Unknown' doesn't exist") +} diff --git a/provider/provider.go b/provider/provider.go index da2ef6b0d0..4c489eaeb6 100644 --- a/provider/provider.go +++ b/provider/provider.go @@ -48,6 +48,7 @@ func DatabricksProvider() *schema.Provider { "databricks_dbfs_file_paths": storage.DataSourceDbfsFilePaths(), "databricks_directory": workspace.DataSourceDirectory(), "databricks_group": scim.DataSourceGroup(), + "databricks_instance_pool": pools.DataSourceInstancePool(), "databricks_jobs": jobs.DataSourceJobs(), "databricks_job": jobs.DataSourceJob(), "databricks_mws_workspaces": mws.DataSourceMwsWorkspaces(),