Skip to content

Commit 8640e87

Browse files
authored
Fix destroy of SQL Global config with instance profile setup (#1080)
Also added a new parameter `sql_config_params` this fixes #1076
1 parent f0b00d8 commit 8640e87

File tree

4 files changed

+49
-25
lines changed

4 files changed

+49
-25
lines changed

CHANGELOG.md

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

55
* Added support for `tf:suppress_diff` on primitive types ([#984](https://github.com/databrickslabs/terraform-provider-databricks/issues/984)).
6+
* Fixed issue arises when destroying `databricks_sql_global_config` with instance profile set ([#1076](https://github.com/databrickslabs/terraform-provider-databricks/issues/1076)).
7+
* Added setting of SQL configuration parameters in `databricks_sql_global_config` ([#1080](https://github.com/databrickslabs/terraform-provider-databricks/pull/1080)).
68

79
Updated dependency versions:
810

docs/resources/sql_global_config.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@ resource "databricks_sql_global_config" "this" {
3333
"spark.hadoop.fs.azure.account.oauth2.client.secret" : "{{secrets/${local.secret_scope}/${local.secret_key}}}",
3434
"spark.hadoop.fs.azure.account.oauth2.client.endpoint" : "https://login.microsoftonline.com/${var.tenant_id}/oauth2/token"
3535
}
36+
sql_config_params = {
37+
"ANSI_MODE": "true"
38+
}
3639
}
3740
```
3841

@@ -44,6 +47,7 @@ The following arguments are supported (see [documentation](https://docs.databric
4447
* `security_policy` (Optional, String) - The policy for controlling access to datasets. Default value: `DATA_ACCESS_CONTROL`, consult documentation for list of possible values
4548
* `data_access_config` (Optional, Map) - data access configuration for [databricks_sql_endpoint](sql_endpoint.md), such as configuration for an external Hive metastore, Hadoop Filesystem configuration, etc. Please note that the list of supported configuration properties is limited, so refer to the [documentation](https://docs.databricks.com/sql/admin/data-access-configuration.html#supported-properties) for a full list. Apply will fail if you're specifying not permitted configuration.
4649
* `instance_profile_arn` (Optional, String) - [databricks_instance_profile](instance_profile.md) used to access storage from [databricks_sql_endpoint](sql_endpoint.md). Please note that this parameter is only for AWS, and will generate an error if used on other clouds.
50+
* `sql_config_params` (Optional, Map) - SQL Configuration Parameters let you override the default behavior for all sessions with all endpoints.
4751

4852
## Import
4953

sqlanalytics/resource_sql_global_config.go

Lines changed: 27 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,25 +9,31 @@ import (
99
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
1010
)
1111

12-
type ConfPair struct {
12+
type confPair struct {
1313
Key string `json:"key"`
1414
Value string `json:"value"`
1515
}
1616

17+
type repeatedEndpointConfPairs struct {
18+
ConfigPairs []confPair `json:"configuration_pairs,omitempty"`
19+
}
20+
1721
// GlobalConfig used to generate Terraform resource schema and bind to resource data
1822
type GlobalConfig struct {
1923
SecurityPolicy string `json:"security_policy,omitempty" tf:"default:DATA_ACCESS_CONTROL"`
2024
DataAccessConfig map[string]string `json:"data_access_config,omitempty"`
2125
InstanceProfileARN string `json:"instance_profile_arn,omitempty"`
2226
EnableServerlessCompute bool `json:"enable_serverless_compute,omitempty" tf:"default:false"`
27+
SqlConfigParams map[string]string `json:"sql_config_params,omitempty"`
2328
}
2429

2530
// GlobalConfigForRead used to talk to REST API
2631
type GlobalConfigForRead struct {
27-
SecurityPolicy string `json:"security_policy"`
28-
DataAccessConfig []ConfPair `json:"data_access_config"`
29-
InstanceProfileARN string `json:"instance_profile_arn,omitempty"`
30-
EnableServerlessCompute bool `json:"enable_serverless_compute,omitempty"`
32+
SecurityPolicy string `json:"security_policy"`
33+
DataAccessConfig []confPair `json:"data_access_config"`
34+
InstanceProfileARN string `json:"instance_profile_arn,omitempty"`
35+
EnableServerlessCompute bool `json:"enable_serverless_compute"`
36+
SqlConfigurationParameters *repeatedEndpointConfPairs `json:"sql_configuration_parameters,omitempty"`
3137
}
3238

3339
func NewSqlGlobalConfigAPI(ctx context.Context, m interface{}) globalConfigAPI {
@@ -50,16 +56,26 @@ func (a globalConfigAPI) Set(gc GlobalConfig) error {
5056
return err
5157
}
5258
}
53-
if a.client.IsAws() {
54-
data["instance_profile_arn"] = gc.InstanceProfileARN
55-
} else if gc.InstanceProfileARN != "" {
56-
return fmt.Errorf("can't use instance_profile_arn outside of AWS")
59+
if gc.InstanceProfileARN != "" {
60+
if a.client.IsAws() {
61+
data["instance_profile_arn"] = gc.InstanceProfileARN
62+
} else {
63+
return fmt.Errorf("can't use instance_profile_arn outside of AWS")
64+
}
5765
}
58-
cfg := make([]ConfPair, 0, len(gc.DataAccessConfig))
66+
cfg := make([]confPair, 0, len(gc.DataAccessConfig))
5967
for k, v := range gc.DataAccessConfig {
60-
cfg = append(cfg, ConfPair{Key: k, Value: v})
68+
cfg = append(cfg, confPair{Key: k, Value: v})
6169
}
6270
data["data_access_config"] = cfg
71+
if len(gc.SqlConfigParams) > 0 {
72+
sql_params := repeatedEndpointConfPairs{}
73+
sql_params.ConfigPairs = make([]confPair, 0, len(gc.SqlConfigParams))
74+
for k, v := range gc.SqlConfigParams {
75+
sql_params.ConfigPairs = append(sql_params.ConfigPairs, confPair{Key: k, Value: v})
76+
}
77+
data["sql_configuration_parameters"] = sql_params
78+
}
6379

6480
return a.client.Put(a.context, "/sql/config/endpoints", data)
6581
}
@@ -84,7 +100,6 @@ func (a globalConfigAPI) Get() (GlobalConfig, error) {
84100
func ResourceSQLGlobalConfig() *schema.Resource {
85101
s := common.StructToSchema(GlobalConfig{}, func(
86102
m map[string]*schema.Schema) map[string]*schema.Schema {
87-
m["instance_profile_arn"].Default = ""
88103
return m
89104
})
90105
setGlobalConfig := func(ctx context.Context, d *schema.ResourceData, c *common.DatabricksClient) error {

sqlanalytics/resource_sql_global_config_test.go

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ func TestResourceSQLGlobalConfigCreateDefault(t *testing.T) {
1818
ExpectedRequest: map[string]interface{}{
1919
"data_access_config": []interface{}{},
2020
"enable_serverless_compute": false,
21-
"instance_profile_arn": "",
2221
"security_policy": "DATA_ACCESS_CONTROL",
2322
},
2423
},
@@ -50,7 +49,6 @@ func TestResourceSQLGlobalConfigDelete(t *testing.T) {
5049
ExpectedRequest: map[string]interface{}{
5150
"data_access_config": []interface{}{},
5251
"enable_serverless_compute": false,
53-
"instance_profile_arn": "",
5452
"security_policy": "DATA_ACCESS_CONTROL",
5553
},
5654
},
@@ -80,27 +78,29 @@ func TestResourceSQLGlobalConfigCreateWithData(t *testing.T) {
8078
{
8179
Method: "PUT",
8280
Resource: "/api/2.0/sql/config/endpoints",
83-
ExpectedRequest: map[string]interface{}{
84-
"data_access_config": []interface{}{
85-
map[string]interface{}{
86-
"key": "spark.sql.session.timeZone",
87-
"value": "UTC",
88-
},
89-
},
90-
"enable_serverless_compute": false,
91-
"instance_profile_arn": "arn:...",
92-
"security_policy": "PASSTHROUGH"},
81+
ExpectedRequest: GlobalConfigForRead{
82+
DataAccessConfig: []confPair{{Key: "spark.sql.session.timeZone", Value: "UTC"}},
83+
SqlConfigurationParameters: &repeatedEndpointConfPairs{ConfigPairs: []confPair{{Key: "ANSI_MODE", Value: "true"}}},
84+
EnableServerlessCompute: false,
85+
SecurityPolicy: "PASSTHROUGH",
86+
InstanceProfileARN: "arn:...",
87+
},
9388
},
9489
{
9590
Method: "GET",
9691
Resource: "/api/2.0/sql/config/endpoints",
9792
ReuseRequest: true,
9893
Response: GlobalConfigForRead{
9994
SecurityPolicy: "PASSTHROUGH",
100-
DataAccessConfig: []ConfPair{
95+
DataAccessConfig: []confPair{
10196
{Key: "spark.sql.session.timeZone", Value: "UTC"},
10297
},
10398
InstanceProfileARN: "arn:...",
99+
SqlConfigurationParameters: &repeatedEndpointConfPairs{
100+
ConfigPairs: []confPair{
101+
{Key: "ANSI_MODE", Value: "true"},
102+
},
103+
},
104104
},
105105
},
106106
},
@@ -112,6 +112,9 @@ func TestResourceSQLGlobalConfigCreateWithData(t *testing.T) {
112112
"data_access_config": map[string]interface{}{
113113
"spark.sql.session.timeZone": "UTC",
114114
},
115+
"sql_config_params": map[string]interface{}{
116+
"ANSI_MODE": "true",
117+
},
115118
},
116119
}.Apply(t)
117120
require.NoError(t, err, err)

0 commit comments

Comments
 (0)