-
Notifications
You must be signed in to change notification settings - Fork 398
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Introduce Generic Settings Resource #2997
Conversation
Codecov ReportAttention:
Additional details and impacted files@@ Coverage Diff @@
## master #2997 +/- ##
==========================================
- Coverage 83.82% 83.64% -0.19%
==========================================
Files 165 167 +2
Lines 14590 14636 +46
==========================================
+ Hits 12230 12242 +12
- Misses 1649 1682 +33
- Partials 711 712 +1
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If the schema is consistent, I'm wondering if we need to have individual resources, because we may have dozens of settings and this may lead to the proliferation of resources and resource instances that may significantly slow down Terraform in the big installations.
Why not define two resources - one for workspace settings, and another - for account? Both will support patch method, not put, so it will be possible to define multiple instances if necessary.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This should be tested by running the TF integration test for Default Namespace against a test shard
return nil | ||
} | ||
|
||
return common.Resource{ |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The common resource definition and the common methods should move out of this file
// Instructions for adding a new setting: | ||
// | ||
// 1. Add a new setting name constant. The resulting Terraform resource name will be "databricks_<your settings_name>_setting". | ||
// 2. Create a struct corresponding to your setting, and implement either the workspaceSettingDefinition or accountSettingDefinition interface. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Create a struct corresponding to your setting,
Are you referring to settings.DefaultNamespaceSetting
as this struct to be created or type defaultNamespaceSetting struct{}
?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The latter, I can clarify that.
@alexott We could also do that, however, 1) it probably has less to do with Terraform than it does with the API itself, as there are still many API calls that need to be made to retrieve all values of all settings. There definitely will be TF overhead, but I suspect it would be comparable or maybe even smaller than the cost of making requests to the backend. 2) This keeps TF as close as possible to the REST API, which is generally a design goal. I think for consistency & as a general principle we should keep these as close as possible to one another. |
@hectorcast-db Can you review this one as you did the TF integration for Default Namespace setting? Thanks. |
settings/generic_setting.go
Outdated
if err != nil { | ||
return err | ||
} | ||
res, err = retryOnEtagError(func(etag string) (*T, error) { return defn.Read(ctx, w, etag) }, d.Id(), func(req *string, newEtag string) { *req = newEtag }) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can read fail on a EtagError?
From the docs:
The server will accept any etag and respond with a response which is at least as recent as the etag.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Good point, removed need to retry in reads.
settings/generic_setting.go
Outdated
if err != nil { | ||
return err | ||
} | ||
etag, err = retryOnEtagError(func(etag string) (string, error) { return defn.Delete(ctx, w, etag) }, d.Id(), func(req *string, newEtag string) { *req = newEtag }) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Do we really need to retry on the NotFound error? If it's not found then this typically it means that it was removed by external agent, so we just need to record deletion...
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Good point. Removed retry on Not Found
, so we only retry on conflict.
### New Features and Improvements * Exporter: timestamps are now added to log entries ([#3146](#3146)). * Validate metastore id for databricks_grant and databricks_grants resources ([#3159](#3159)). * Exporter: Skip emitting of clusters that come from more cluster sources ([#3161](#3161)). * Fix typo in docs ([#3166](#3166)). * Migrate cluster schema to use the go-sdk struct ([#3076](#3076)). * Introduce Generic Settings Resource ([#2997](#2997)). * Update actions/setup-go to v5 ([#3154](#3154)). * Change default branch from `master` to `main` ([#3174](#3174)). * Add .codegen.json configuration ([#3180](#3180)). * Exporter: performance improvements for big workspaces ([#3167](#3167)). * update ([#3192](#3192)). * Exporter: fix generation of cluster policy resources ([#3185](#3185)). * Fix unit test ([#3201](#3201)). * Suppress diff should apply to new fields added in the same chained call to CustomizableSchema ([#3200](#3200)). * Various documentation updates ([#3198](#3198)). * Use common.Resource consistently throughout the provider ([#3193](#3193)). * Extending customizable schema with `AtLeastOneOf`, `ExactlyOneOf`, `RequiredWith` ([#3182](#3182)). * Fix `databricks_connection` regression when creating without owner ([#3186](#3186)). * add test code for job task order ([#3183](#3183)). * Allow using empty strings as job parameters ([#3158](#3158)). * Fix notebook parameters in acceptance test ([#3205](#3205)). * Exporter: Add retries for `Search`, `ReadContext` and `Import` operations when importing the resource ([#3202](#3202)). * Fixed updating owners for UC resources ([#3189](#3189)). * Adds `databricks_volumes` as data source ([#3150](#3150)). ### Documentation Changes ### Exporter ### Internal Changes
* Release v1.35.1 ### New Features and Improvements * Exporter: timestamps are now added to log entries ([#3146](#3146)). * Validate metastore id for databricks_grant and databricks_grants resources ([#3159](#3159)). * Exporter: Skip emitting of clusters that come from more cluster sources ([#3161](#3161)). * Fix typo in docs ([#3166](#3166)). * Migrate cluster schema to use the go-sdk struct ([#3076](#3076)). * Introduce Generic Settings Resource ([#2997](#2997)). * Update actions/setup-go to v5 ([#3154](#3154)). * Change default branch from `master` to `main` ([#3174](#3174)). * Add .codegen.json configuration ([#3180](#3180)). * Exporter: performance improvements for big workspaces ([#3167](#3167)). * update ([#3192](#3192)). * Exporter: fix generation of cluster policy resources ([#3185](#3185)). * Fix unit test ([#3201](#3201)). * Suppress diff should apply to new fields added in the same chained call to CustomizableSchema ([#3200](#3200)). * Various documentation updates ([#3198](#3198)). * Use common.Resource consistently throughout the provider ([#3193](#3193)). * Extending customizable schema with `AtLeastOneOf`, `ExactlyOneOf`, `RequiredWith` ([#3182](#3182)). * Fix `databricks_connection` regression when creating without owner ([#3186](#3186)). * add test code for job task order ([#3183](#3183)). * Allow using empty strings as job parameters ([#3158](#3158)). * Fix notebook parameters in acceptance test ([#3205](#3205)). * Exporter: Add retries for `Search`, `ReadContext` and `Import` operations when importing the resource ([#3202](#3202)). * Fixed updating owners for UC resources ([#3189](#3189)). * Adds `databricks_volumes` as data source ([#3150](#3150)). ### Documentation Changes ### Exporter ### Internal Changes * upd * readable * upd * upd
Changes
This is an experimental PR for a generic settings resource in the TF provider. Because all Settings API settings have a consistent schema & mechanism for interaction, the definition of a setting resource in Terraform can also be made generic with several simple assumptions about each setting:
These above requirements are encapsulated in the
genericSettingDefinition
interface. Because API calls require a specific client depending on whether the setting is an account-level or workspace-level setting, we define two interfaces, one for workspace-level settings where the workspace client is provided, and one for account-level settings where the account client is provided.After this change, to add a new setting:
workspaceSetting
oraccountSetting
for your setting. The type parameter should be your setting resource.Additionally, I migrated the tests for this resource to use the Go SDK.
Tests
all_settings.go
.internal/acceptance