Skip to content

Commit f5509c9

Browse files
EmanueleFWMalexott
andauthored
[Feature] Add TF support for setting DisableLegacyFeatures (#4676)
## Changes <!-- Summary of your changes that are easy to understand --> This PR adds TF support for the DisableLegacyFeatures account level setting. ## Tests <!-- How is this tested? Please see the checklist below and also describe any other relevant tests --> - [x] `make test` run locally - [x] relevant change in `docs/` folder - [x] covered with integration tests in `internal/acceptance` - [ ] using Go SDK - [x] using TF Plugin Framework --------- Co-authored-by: Alex Ott <[email protected]> Co-authored-by: Alex Ott <[email protected]>
1 parent 329ae58 commit f5509c9

7 files changed

+457
-3
lines changed

NEXT_CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
### New Features and Improvements
66

7+
* Add `databricks_disable_legacy_features_setting` account-level resource ([#4676](https://github.com/databricks/terraform-provider-databricks/pull/4676))
8+
79
### Bug Fixes
810

911
### Documentation
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
---
2+
subcategory: "Settings"
3+
---
4+
5+
# databricks_disable_legacy_features_setting Resource
6+
7+
-> This resource can only be used with an account-level provider!
8+
9+
-> This setting is currently in private preview, and only available for enrolled customers.
10+
11+
The `databricks_disable_legacy_features_setting` resource allows you to disable legacy features on newly created workspaces.
12+
13+
When this setting is on, the following applies to new workspaces:
14+
- Disables the use of DBFS root and mounts.
15+
- Hive Metastore will not be provisioned.
16+
- Disables the use of ‘No-isolation clusters’.
17+
- Disables Databricks Runtime versions prior to 13.3LTS
18+
19+
## Example Usage
20+
21+
```hcl
22+
resource "databricks_disable_legacy_features_setting" "this" {
23+
disable_legacy_features {
24+
value = true
25+
}
26+
}
27+
```
28+
29+
## Argument Reference
30+
31+
The resource supports the following arguments:
32+
33+
- `disable_legacy_features` block with following attributes:
34+
- `value` - (Required) The boolean value for the setting.
35+
36+
## Import
37+
38+
This resource can be imported by predefined name `global`:
39+
40+
```bash
41+
terraform import databricks_disable_legacy_features_setting.this global
42+
```

settings/all_settings.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,5 +24,6 @@ func AllSettingsResources() map[string]common.Resource {
2424
"aibi_dashboard_embedding_approved_domains": makeSettingResource[settings.AibiDashboardEmbeddingApprovedDomainsSetting, *databricks.WorkspaceClient](aibiDashboardEmbeddingApprovedDomainsSetting),
2525
"disable_legacy_access": makeSettingResource[settings.DisableLegacyAccess, *databricks.WorkspaceClient](disableLegacyAccess),
2626
"disable_legacy_dbfs": makeSettingResource[settings.DisableLegacyDbfs, *databricks.WorkspaceClient](disableLegacyDbfs),
27+
"disable_legacy_features": makeSettingResource[settings.DisableLegacyFeatures, *databricks.AccountClient](disableLegacyFeatures),
2728
}
2829
}
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
package settings_test
2+
3+
import (
4+
"context"
5+
"errors"
6+
"testing"
7+
8+
"github.com/databricks/databricks-sdk-go/apierr"
9+
"github.com/databricks/databricks-sdk-go/service/settings"
10+
"github.com/databricks/terraform-provider-databricks/common"
11+
"github.com/databricks/terraform-provider-databricks/internal/acceptance"
12+
"github.com/hashicorp/terraform-plugin-testing/terraform"
13+
"github.com/stretchr/testify/assert"
14+
"github.com/stretchr/testify/require"
15+
)
16+
17+
func TestMwsAccDisableLegacyFeaturesSetting(t *testing.T) {
18+
template := `
19+
resource "databricks_disable_legacy_features_setting" "this" {
20+
disable_legacy_features {
21+
value = "true"
22+
}
23+
}
24+
`
25+
acceptance.AccountLevel(t, acceptance.Step{
26+
Template: template,
27+
Check: acceptance.ResourceCheckWithState("databricks_disable_legacy_features_setting.this",
28+
func(ctx context.Context, client *common.DatabricksClient, state *terraform.InstanceState) error {
29+
ctx = context.WithValue(ctx, common.Api, common.API_2_1)
30+
w, err := client.AccountClient()
31+
require.NoError(t, err)
32+
etag := state.Attributes["etag"]
33+
require.NotEmpty(t, etag)
34+
res, err := w.Settings.DisableLegacyFeatures().Get(ctx, settings.GetDisableLegacyFeaturesRequest{
35+
Etag: etag,
36+
})
37+
require.NoError(t, err)
38+
// Check that the resource has been created and that it has the correct value.
39+
assert.Equal(t, res.DisableLegacyFeatures.Value, true)
40+
return nil
41+
}),
42+
},
43+
acceptance.Step{
44+
Template: template,
45+
Destroy: true,
46+
Check: acceptance.ResourceCheck("databricks_disable_legacy_features_setting.this", func(ctx context.Context, client *common.DatabricksClient, id string) error {
47+
ctx = context.WithValue(ctx, common.Api, common.API_2_1)
48+
w, err := client.AccountClient()
49+
require.NoError(t, err)
50+
// Terraform Check returns the latest resource status before it is destroyed, which has an outdated eTag.
51+
// We are making an update call to get the correct eTag in the response error.
52+
_, err = w.Settings.DisableLegacyFeatures().Update(ctx, settings.UpdateDisableLegacyFeaturesRequest{
53+
AllowMissing: true,
54+
Setting: settings.DisableLegacyFeatures{
55+
DisableLegacyFeatures: settings.BooleanMessage{
56+
Value: false,
57+
},
58+
},
59+
FieldMask: "disable_legacy_features.value",
60+
})
61+
assert.Error(t, err)
62+
var aerr *apierr.APIError
63+
if !errors.As(err, &aerr) {
64+
assert.FailNow(t, "cannot parse error message %v", err)
65+
}
66+
etag := aerr.Details[0].Metadata["etag"]
67+
res, err := w.Settings.DisableLegacyFeatures().Get(ctx, settings.GetDisableLegacyFeaturesRequest{
68+
Etag: etag,
69+
})
70+
// we should not be getting any error
71+
assert.NoError(t, err)
72+
// setting should go back to default
73+
assert.Equal(t, res.DisableLegacyFeatures.Value, false)
74+
return nil
75+
}),
76+
},
77+
)
78+
}

settings/generic_setting.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -230,15 +230,15 @@ func (w accountSetting[T]) GetId(t *T) string {
230230
}
231231

232232
func (w accountSetting[T]) GetCustomizeSchemaFunc() func(map[string]*schema.Schema) map[string]*schema.Schema {
233-
if w.customizeSchemaFunc != nil {
234-
return w.customizeSchemaFunc
235-
}
236233
return func(s map[string]*schema.Schema) map[string]*schema.Schema {
237234
s[etagAttrName].Computed = true
238235
// Note: this may not always be computed, but it is for the default namespace setting. If other settings
239236
// are added for which setting_name is not computed, we'll need to expose this somehow as part of the setting
240237
// definition.
241238
s["setting_name"].Computed = true
239+
if w.customizeSchemaFunc != nil {
240+
return w.customizeSchemaFunc(s)
241+
}
242242
return s
243243
}
244244
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package settings
2+
3+
import (
4+
"context"
5+
6+
"github.com/databricks/databricks-sdk-go"
7+
"github.com/databricks/databricks-sdk-go/service/settings"
8+
"github.com/databricks/terraform-provider-databricks/common"
9+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
10+
)
11+
12+
// Disable Legacy Features setting
13+
var disableLegacyFeatures = accountSetting[settings.DisableLegacyFeatures]{
14+
settingStruct: settings.DisableLegacyFeatures{},
15+
customizeSchemaFunc: func(s map[string]*schema.Schema) map[string]*schema.Schema {
16+
common.CustomizeSchemaPath(s, "disable_legacy_features", "value").SetRequired()
17+
return s
18+
},
19+
readFunc: func(ctx context.Context, w *databricks.AccountClient, etag string) (*settings.DisableLegacyFeatures, error) {
20+
return w.Settings.DisableLegacyFeatures().Get(ctx, settings.GetDisableLegacyFeaturesRequest{
21+
Etag: etag,
22+
})
23+
},
24+
updateFunc: func(ctx context.Context, w *databricks.AccountClient, t settings.DisableLegacyFeatures) (string, error) {
25+
t.SettingName = "disable_legacy_features"
26+
res, err := w.Settings.DisableLegacyFeatures().Update(ctx, settings.UpdateDisableLegacyFeaturesRequest{
27+
AllowMissing: true,
28+
Setting: t,
29+
FieldMask: "disable_legacy_features.value",
30+
})
31+
if err != nil {
32+
return "", err
33+
}
34+
return res.Etag, nil
35+
},
36+
deleteFunc: func(ctx context.Context, w *databricks.AccountClient, etag string) (string, error) {
37+
res, err := w.Settings.DisableLegacyFeatures().Delete(ctx, settings.DeleteDisableLegacyFeaturesRequest{
38+
Etag: etag,
39+
})
40+
if err != nil {
41+
return "", err
42+
}
43+
return res.Etag, err
44+
},
45+
}

0 commit comments

Comments
 (0)