Skip to content

Commit

Permalink
Added databricks_instance_pool data source (databricks#1907)
Browse files Browse the repository at this point in the history
  • Loading branch information
alexott committed Jan 9, 2023
1 parent 73da600 commit a887ab5
Show file tree
Hide file tree
Showing 4 changed files with 175 additions and 0 deletions.
38 changes: 38 additions & 0 deletions docs/data-sources/instance_pool.md
Original file line number Diff line number Diff line change
@@ -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.

47 changes: 47 additions & 0 deletions pools/data_instance_pool.go
Original file line number Diff line number Diff line change
@@ -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)
},
}
}
89 changes: 89 additions & 0 deletions pools/data_instance_pool_test.go
Original file line number Diff line number Diff line change
@@ -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")
}
1 change: 1 addition & 0 deletions provider/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -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(),
Expand Down

0 comments on commit a887ab5

Please sign in to comment.