Skip to content

Commit 9d882fe

Browse files
fix: external function header parsing and add missing privileges (#2961)
Changes: - Add CREATE NOTEBOOK privilege for on all/future grants (and other missing privileges based on the [Snowflake documentation](https://docs.snowflake.com/en/sql-reference/sql/grant-privilege)): #2960 - Fix header parsing in external function
1 parent dd01ce9 commit 9d882fe

8 files changed

+163
-17
lines changed

docs/resources/grant_privileges_to_account_role.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -300,14 +300,14 @@ Optional:
300300
- `all` (Block List, Max: 1) Configures the privilege to be granted on all objects in either a database or schema. (see [below for nested schema](#nestedblock--on_schema_object--all))
301301
- `future` (Block List, Max: 1) Configures the privilege to be granted on future objects in either a database or schema. (see [below for nested schema](#nestedblock--on_schema_object--future))
302302
- `object_name` (String) The fully qualified name of the object on which privileges will be granted.
303-
- `object_type` (String) The object type of the schema object on which privileges will be granted. Valid values are: AGGREGATION POLICY | ALERT | AUTHENTICATION POLICY | CORTEX SEARCH SERVICE | DATA METRIC FUNCTION | DYNAMIC TABLE | EVENT TABLE | EXTERNAL TABLE | FILE FORMAT | FUNCTION | GIT REPOSITORY | HYBRID TABLE | IMAGE REPOSITORY | ICEBERG TABLE | MASKING POLICY | MATERIALIZED VIEW | MODEL | NETWORK RULE | PACKAGES POLICY | PASSWORD POLICY | PIPE | PROCEDURE | PROJECTION POLICY | ROW ACCESS POLICY | SECRET | SERVICE | SESSION POLICY | SEQUENCE | STAGE | STREAM | TABLE | TAG | TASK | VIEW | STREAMLIT
303+
- `object_type` (String) The object type of the schema object on which privileges will be granted. Valid values are: AGGREGATION POLICY | ALERT | AUTHENTICATION POLICY | CORTEX SEARCH SERVICE | DATA METRIC FUNCTION | DYNAMIC TABLE | EVENT TABLE | EXTERNAL TABLE | FILE FORMAT | FUNCTION | GIT REPOSITORY | HYBRID TABLE | IMAGE REPOSITORY | ICEBERG TABLE | MASKING POLICY | MATERIALIZED VIEW | MODEL | NETWORK RULE | NOTEBOOK | PACKAGES POLICY | PASSWORD POLICY | PIPE | PROCEDURE | PROJECTION POLICY | ROW ACCESS POLICY | SECRET | SERVICE | SESSION POLICY | SEQUENCE | SNAPSHOT | STAGE | STREAM | TABLE | TAG | TASK | VIEW | STREAMLIT
304304

305305
<a id="nestedblock--on_schema_object--all"></a>
306306
### Nested Schema for `on_schema_object.all`
307307

308308
Required:
309309

310-
- `object_type_plural` (String) The plural object type of the schema object on which privileges will be granted. Valid values are: AGGREGATION POLICIES | ALERTS | AUTHENTICATION POLICIES | CORTEX SEARCH SERVICES | DATA METRIC FUNCTIONS | DYNAMIC TABLES | EVENT TABLES | EXTERNAL TABLES | FILE FORMATS | FUNCTIONS | GIT REPOSITORIES | HYBRID TABLES | IMAGE REPOSITORIES | ICEBERG TABLES | MASKING POLICIES | MATERIALIZED VIEWS | MODELS | NETWORK RULES | PACKAGES POLICIES | PASSWORD POLICIES | PIPES | PROCEDURES | PROJECTION POLICIES | ROW ACCESS POLICIES | SECRETS | SERVICES | SESSION POLICIES | SEQUENCES | STAGES | STREAMS | TABLES | TAGS | TASKS | VIEWS | STREAMLITS.
310+
- `object_type_plural` (String) The plural object type of the schema object on which privileges will be granted. Valid values are: AGGREGATION POLICIES | ALERTS | AUTHENTICATION POLICIES | CORTEX SEARCH SERVICES | DATA METRIC FUNCTIONS | DYNAMIC TABLES | EVENT TABLES | EXTERNAL TABLES | FILE FORMATS | FUNCTIONS | GIT REPOSITORIES | HYBRID TABLES | IMAGE REPOSITORIES | ICEBERG TABLES | MASKING POLICIES | MATERIALIZED VIEWS | MODELS | NETWORK RULES | NOTEBOOKS | PACKAGES POLICIES | PASSWORD POLICIES | PIPES | PROCEDURES | PROJECTION POLICIES | ROW ACCESS POLICIES | SECRETS | SERVICES | SESSION POLICIES | SEQUENCES | SNAPSHOTS | STAGES | STREAMS | TABLES | TAGS | TASKS | VIEWS | STREAMLITS.
311311

312312
Optional:
313313

@@ -320,7 +320,7 @@ Optional:
320320

321321
Required:
322322

323-
- `object_type_plural` (String) The plural object type of the schema object on which privileges will be granted. Valid values are: ALERTS | AUTHENTICATION POLICIES | DATA METRIC FUNCTIONS | DYNAMIC TABLES | EVENT TABLES | EXTERNAL TABLES | FILE FORMATS | FUNCTIONS | GIT REPOSITORIES | HYBRID TABLES | ICEBERG TABLES | MATERIALIZED VIEWS | MODELS | NETWORK RULES | PASSWORD POLICIES | PIPES | PROCEDURES | SECRETS | SERVICES | SEQUENCES | STAGES | STREAMS | TABLES | TASKS | VIEWS.
323+
- `object_type_plural` (String) The plural object type of the schema object on which privileges will be granted. Valid values are: ALERTS | AUTHENTICATION POLICIES | DATA METRIC FUNCTIONS | DYNAMIC TABLES | EVENT TABLES | EXTERNAL TABLES | FILE FORMATS | FUNCTIONS | GIT REPOSITORIES | HYBRID TABLES | ICEBERG TABLES | MATERIALIZED VIEWS | MODELS | NETWORK RULES | NOTEBOOKS | PASSWORD POLICIES | PIPES | PROCEDURES | SECRETS | SERVICES | SEQUENCES | SNAPSHOTS | STAGES | STREAMS | TABLES | TASKS | VIEWS.
324324

325325
Optional:
326326

docs/resources/grant_privileges_to_database_role.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -204,14 +204,14 @@ Optional:
204204
- `all` (Block List, Max: 1) Configures the privilege to be granted on all objects in either a database or schema. (see [below for nested schema](#nestedblock--on_schema_object--all))
205205
- `future` (Block List, Max: 1) Configures the privilege to be granted on future objects in either a database or schema. (see [below for nested schema](#nestedblock--on_schema_object--future))
206206
- `object_name` (String) The fully qualified name of the object on which privileges will be granted.
207-
- `object_type` (String) The object type of the schema object on which privileges will be granted. Valid values are: AGGREGATION POLICY | ALERT | AUTHENTICATION POLICY | CORTEX SEARCH SERVICE | DATA METRIC FUNCTION | DYNAMIC TABLE | EVENT TABLE | EXTERNAL TABLE | FILE FORMAT | FUNCTION | GIT REPOSITORY | HYBRID TABLE | IMAGE REPOSITORY | ICEBERG TABLE | MASKING POLICY | MATERIALIZED VIEW | MODEL | NETWORK RULE | PACKAGES POLICY | PASSWORD POLICY | PIPE | PROCEDURE | PROJECTION POLICY | ROW ACCESS POLICY | SECRET | SERVICE | SESSION POLICY | SEQUENCE | STAGE | STREAM | TABLE | TAG | TASK | VIEW | STREAMLIT
207+
- `object_type` (String) The object type of the schema object on which privileges will be granted. Valid values are: AGGREGATION POLICY | ALERT | AUTHENTICATION POLICY | CORTEX SEARCH SERVICE | DATA METRIC FUNCTION | DYNAMIC TABLE | EVENT TABLE | EXTERNAL TABLE | FILE FORMAT | FUNCTION | GIT REPOSITORY | HYBRID TABLE | IMAGE REPOSITORY | ICEBERG TABLE | MASKING POLICY | MATERIALIZED VIEW | MODEL | NETWORK RULE | NOTEBOOK | PACKAGES POLICY | PASSWORD POLICY | PIPE | PROCEDURE | PROJECTION POLICY | ROW ACCESS POLICY | SECRET | SERVICE | SESSION POLICY | SEQUENCE | SNAPSHOT | STAGE | STREAM | TABLE | TAG | TASK | VIEW | STREAMLIT
208208

209209
<a id="nestedblock--on_schema_object--all"></a>
210210
### Nested Schema for `on_schema_object.all`
211211

212212
Required:
213213

214-
- `object_type_plural` (String) The plural object type of the schema object on which privileges will be granted. Valid values are: AGGREGATION POLICIES | ALERTS | AUTHENTICATION POLICIES | CORTEX SEARCH SERVICES | DATA METRIC FUNCTIONS | DYNAMIC TABLES | EVENT TABLES | EXTERNAL TABLES | FILE FORMATS | FUNCTIONS | GIT REPOSITORIES | HYBRID TABLES | IMAGE REPOSITORIES | ICEBERG TABLES | MASKING POLICIES | MATERIALIZED VIEWS | MODELS | NETWORK RULES | PACKAGES POLICIES | PASSWORD POLICIES | PIPES | PROCEDURES | PROJECTION POLICIES | ROW ACCESS POLICIES | SECRETS | SERVICES | SESSION POLICIES | SEQUENCES | STAGES | STREAMS | TABLES | TAGS | TASKS | VIEWS | STREAMLITS.
214+
- `object_type_plural` (String) The plural object type of the schema object on which privileges will be granted. Valid values are: AGGREGATION POLICIES | ALERTS | AUTHENTICATION POLICIES | CORTEX SEARCH SERVICES | DATA METRIC FUNCTIONS | DYNAMIC TABLES | EVENT TABLES | EXTERNAL TABLES | FILE FORMATS | FUNCTIONS | GIT REPOSITORIES | HYBRID TABLES | IMAGE REPOSITORIES | ICEBERG TABLES | MASKING POLICIES | MATERIALIZED VIEWS | MODELS | NETWORK RULES | NOTEBOOKS | PACKAGES POLICIES | PASSWORD POLICIES | PIPES | PROCEDURES | PROJECTION POLICIES | ROW ACCESS POLICIES | SECRETS | SERVICES | SESSION POLICIES | SEQUENCES | SNAPSHOTS | STAGES | STREAMS | TABLES | TAGS | TASKS | VIEWS | STREAMLITS.
215215

216216
Optional:
217217

@@ -224,7 +224,7 @@ Optional:
224224

225225
Required:
226226

227-
- `object_type_plural` (String) The plural object type of the schema object on which privileges will be granted. Valid values are: ALERTS | AUTHENTICATION POLICIES | DATA METRIC FUNCTIONS | DYNAMIC TABLES | EVENT TABLES | EXTERNAL TABLES | FILE FORMATS | FUNCTIONS | GIT REPOSITORIES | HYBRID TABLES | ICEBERG TABLES | MATERIALIZED VIEWS | MODELS | NETWORK RULES | PASSWORD POLICIES | PIPES | PROCEDURES | SECRETS | SERVICES | SEQUENCES | STAGES | STREAMS | TABLES | TASKS | VIEWS.
227+
- `object_type_plural` (String) The plural object type of the schema object on which privileges will be granted. Valid values are: ALERTS | AUTHENTICATION POLICIES | DATA METRIC FUNCTIONS | DYNAMIC TABLES | EVENT TABLES | EXTERNAL TABLES | FILE FORMATS | FUNCTIONS | GIT REPOSITORIES | HYBRID TABLES | ICEBERG TABLES | MATERIALIZED VIEWS | MODELS | NETWORK RULES | NOTEBOOKS | PASSWORD POLICIES | PIPES | PROCEDURES | SECRETS | SERVICES | SEQUENCES | SNAPSHOTS | STAGES | STREAMS | TABLES | TASKS | VIEWS.
228228

229229
Optional:
230230

pkg/resources/external_function.go

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package resources
22

33
import (
44
"context"
5+
"encoding/json"
56
"log"
67
"regexp"
78
"strconv"
@@ -414,16 +415,18 @@ func ReadContextExternalFunction(ctx context.Context, d *schema.ResourceData, me
414415
case "headers":
415416
if row.Value != "" && row.Value != "null" {
416417
// Format in Snowflake DB is: {"head1":"val1","head2":"val2"}
417-
headerPairs := strings.Split(strings.ReplaceAll(strings.ReplaceAll(strings.ReplaceAll(row.Value, "{", ""), "}", ""), "\"", ""), ",")
418-
headers := []interface{}{}
419-
420-
for _, headerPair := range headerPairs {
421-
headerItem := strings.Split(headerPair, ":")
418+
var jsonHeaders map[string]string
419+
err := json.Unmarshal([]byte(row.Value), &jsonHeaders)
420+
if err != nil {
421+
return diag.Errorf("error unmarshalling headers: %v", err)
422+
}
422423

423-
header := map[string]interface{}{}
424-
header["name"] = headerItem[0]
425-
header["value"] = headerItem[1]
426-
headers = append(headers, header)
424+
headers := make([]any, 0, len(jsonHeaders))
425+
for key, value := range jsonHeaders {
426+
headers = append(headers, map[string]any{
427+
"name": key,
428+
"value": value,
429+
})
427430
}
428431

429432
if err := d.Set("header", headers); err != nil {

pkg/resources/external_function_acceptance_test.go

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -391,6 +391,53 @@ func TestAcc_ExternalFunction_issue2528(t *testing.T) {
391391
})
392392
}
393393

394+
// Proves that header parsing handles values wrapped in curly braces, e.g. `value = "{1}"`
395+
func TestAcc_ExternalFunction_HeaderParsing(t *testing.T) {
396+
id := acc.TestClient().Ids.RandomSchemaObjectIdentifier()
397+
398+
resourceName := "snowflake_external_function.f"
399+
400+
resource.Test(t, resource.TestCase{
401+
PreCheck: func() { acc.TestAccPreCheck(t) },
402+
TerraformVersionChecks: []tfversion.TerraformVersionCheck{
403+
tfversion.RequireAbove(tfversion.Version1_5_0),
404+
},
405+
CheckDestroy: acc.CheckDestroy(t, resources.ExternalFunction),
406+
Steps: []resource.TestStep{
407+
{
408+
ExternalProviders: map[string]resource.ExternalProvider{
409+
"snowflake": {
410+
VersionConstraint: "=0.93.0",
411+
Source: "Snowflake-Labs/snowflake",
412+
},
413+
},
414+
Config: externalFunctionConfigIssueCurlyHeader(id),
415+
// Previous implementation produces a plan with the following changes
416+
//
417+
// - header { # forces replacement
418+
// - name = "name" -> null
419+
// - value = "0" -> null
420+
// }
421+
//
422+
// + header { # forces replacement
423+
// + name = "name"
424+
// + value = "{0}"
425+
// }
426+
ExpectNonEmptyPlan: true,
427+
},
428+
{
429+
ProtoV6ProviderFactories: acc.TestAccProtoV6ProviderFactories,
430+
Config: externalFunctionConfigIssueCurlyHeader(id),
431+
Check: resource.ComposeTestCheckFunc(
432+
resource.TestCheckResourceAttr(resourceName, "header.#", "1"),
433+
resource.TestCheckResourceAttr(resourceName, "header.0.name", "name"),
434+
resource.TestCheckResourceAttr(resourceName, "header.0.value", "{0}"),
435+
),
436+
},
437+
},
438+
})
439+
}
440+
394441
func externalFunctionConfig(database string, schema string, name string) string {
395442
return externalFunctionConfigWithReturnNullAllowed(database, schema, name, nil)
396443
}
@@ -478,3 +525,38 @@ resource "snowflake_external_function" "f2" {
478525
}
479526
`, database, schema, name, schema2)
480527
}
528+
529+
func externalFunctionConfigIssueCurlyHeader(id sdk.SchemaObjectIdentifier) string {
530+
return fmt.Sprintf(`
531+
resource "snowflake_api_integration" "test_api_int" {
532+
name = "%[3]s"
533+
api_provider = "aws_api_gateway"
534+
api_aws_role_arn = "arn:aws:iam::000000000001:/role/test"
535+
api_allowed_prefixes = ["https://123456.execute-api.us-west-2.amazonaws.com/prod/"]
536+
enabled = true
537+
}
538+
539+
resource "snowflake_external_function" "f" {
540+
name = "%[3]s"
541+
database = "%[1]s"
542+
schema = "%[2]s"
543+
arg {
544+
name = "ARG1"
545+
type = "VARCHAR"
546+
}
547+
arg {
548+
name = "ARG2"
549+
type = "VARCHAR"
550+
}
551+
header {
552+
name = "name"
553+
value = "{0}"
554+
}
555+
return_type = "VARIANT"
556+
return_behavior = "IMMUTABLE"
557+
api_integration = snowflake_api_integration.test_api_int.name
558+
url_of_proxy_and_resource = "https://123456.execute-api.us-west-2.amazonaws.com/prod/test_func"
559+
}
560+
561+
`, id.DatabaseName(), id.SchemaName(), id.Name())
562+
}

pkg/resources/grant_privileges_to_database_role_acceptance_test.go

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1185,6 +1185,46 @@ func TestAcc_GrantPrivilegesToDatabaseRole_AlwaysApply_SetAfterCreate(t *testing
11851185
})
11861186
}
11871187

1188+
// proves https://github.com/Snowflake-Labs/terraform-provider-snowflake/issues/2960
1189+
func TestAcc_GrantPrivilegesToDatabaseRole_CreateNotebooks(t *testing.T) {
1190+
databaseRoleId := acc.TestClient().Ids.RandomDatabaseObjectIdentifier()
1191+
1192+
configVariables := config.Variables{
1193+
"name": config.StringVariable(databaseRoleId.Name()),
1194+
"privileges": config.ListVariable(
1195+
config.StringVariable(string(sdk.SchemaPrivilegeCreateNotebook)),
1196+
),
1197+
"database": config.StringVariable(acc.TestDatabaseName),
1198+
"with_grant_option": config.BoolVariable(false),
1199+
}
1200+
resourceName := "snowflake_grant_privileges_to_database_role.test"
1201+
1202+
resource.Test(t, resource.TestCase{
1203+
ProtoV6ProviderFactories: acc.TestAccProtoV6ProviderFactories,
1204+
PreCheck: func() { acc.TestAccPreCheck(t) },
1205+
TerraformVersionChecks: []tfversion.TerraformVersionCheck{
1206+
tfversion.RequireAbove(tfversion.Version1_5_0),
1207+
},
1208+
CheckDestroy: acc.CheckDatabaseRolePrivilegesRevoked(t),
1209+
Steps: []resource.TestStep{
1210+
{
1211+
PreConfig: func() {
1212+
_, databaseRoleCleanup := acc.TestClient().DatabaseRole.CreateDatabaseRoleWithName(t, databaseRoleId.Name())
1213+
t.Cleanup(databaseRoleCleanup)
1214+
},
1215+
ConfigDirectory: acc.ConfigurationDirectory("TestAcc_GrantPrivilegesToDatabaseRole/OnAllSchemasInDatabase"),
1216+
ConfigVariables: configVariables,
1217+
Check: resource.ComposeTestCheckFunc(
1218+
resource.TestCheckResourceAttr(resourceName, "database_role_name", databaseRoleId.FullyQualifiedName()),
1219+
resource.TestCheckResourceAttr(resourceName, "privileges.#", "1"),
1220+
resource.TestCheckResourceAttr(resourceName, "privileges.0", string(sdk.SchemaPrivilegeCreateNotebook)),
1221+
resource.TestCheckResourceAttr(resourceName, "id", fmt.Sprintf("%s|false|false|CREATE NOTEBOOK|OnSchema|OnAllSchemasInDatabase|%s", databaseRoleId.FullyQualifiedName(), acc.TestClient().Ids.DatabaseId().FullyQualifiedName())),
1222+
),
1223+
},
1224+
},
1225+
})
1226+
}
1227+
11881228
func queriedPrivilegesToDatabaseRoleEqualTo(databaseRoleName sdk.DatabaseObjectIdentifier, privileges ...string) func(s *terraform.State) error {
11891229
return queriedPrivilegesEqualTo(func(client *sdk.Client, ctx context.Context) ([]sdk.Grant, error) {
11901230
return client.Grants.Show(ctx, &sdk.ShowGrantOptions{

pkg/sdk/grants_validations.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ var validGrantToObjectTypes = []ObjectType{
8484
ObjectTypeMaterializedView,
8585
ObjectTypeModel,
8686
ObjectTypeNetworkRule,
87+
ObjectTypeNotebook,
8788
ObjectTypePackagesPolicy,
8889
ObjectTypePasswordPolicy,
8990
ObjectTypePipe,
@@ -94,6 +95,7 @@ var validGrantToObjectTypes = []ObjectType{
9495
ObjectTypeService,
9596
ObjectTypeSessionPolicy,
9697
ObjectTypeSequence,
98+
ObjectTypeSnapshot,
9799
ObjectTypeStage,
98100
ObjectTypeStream,
99101
ObjectTypeTable,

pkg/sdk/object_types.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ const (
4141
ObjectTypeView ObjectType = "VIEW"
4242
ObjectTypeMaterializedView ObjectType = "MATERIALIZED VIEW"
4343
ObjectTypeSequence ObjectType = "SEQUENCE"
44+
ObjectTypeSnapshot ObjectType = "SNAPSHOT"
4445
ObjectTypeFunction ObjectType = "FUNCTION"
4546
ObjectTypeExternalFunction ObjectType = "EXTERNAL FUNCTION"
4647
ObjectTypeProcedure ObjectType = "PROCEDURE"
@@ -62,6 +63,7 @@ const (
6263
ObjectTypeIcebergTable ObjectType = "ICEBERG TABLE"
6364
ObjectTypeExternalVolume ObjectType = "EXTERNAL VOLUME"
6465
ObjectTypeNetworkRule ObjectType = "NETWORK RULE"
66+
ObjectTypeNotebook ObjectType = "NOTEBOOK"
6567
ObjectTypePackagesPolicy ObjectType = "PACKAGES POLICY"
6668
ObjectTypeComputePool ObjectType = "COMPUTE POOL"
6769
ObjectTypeAggregationPolicy ObjectType = "AGGREGATION POLICY"
@@ -107,6 +109,7 @@ func objectTypeSingularToPluralMap() map[ObjectType]PluralObjectType {
107109
ObjectTypeView: PluralObjectTypeViews,
108110
ObjectTypeMaterializedView: PluralObjectTypeMaterializedViews,
109111
ObjectTypeSequence: PluralObjectTypeSequences,
112+
ObjectTypeSnapshot: PluralObjectTypeSnapshots,
110113
ObjectTypeFunction: PluralObjectTypeFunctions,
111114
ObjectTypeExternalFunction: PluralObjectTypeExternalFunctions,
112115
ObjectTypeProcedure: PluralObjectTypeProcedures,
@@ -127,6 +130,7 @@ func objectTypeSingularToPluralMap() map[ObjectType]PluralObjectType {
127130
ObjectTypeIcebergTable: PluralObjectTypeIcebergTables,
128131
ObjectTypeExternalVolume: PluralObjectTypeExternalVolumes,
129132
ObjectTypeNetworkRule: PluralObjectTypeNetworkRules,
133+
ObjectTypeNotebook: PluralObjectTypeNotebooks,
130134
ObjectTypePackagesPolicy: PluralObjectTypePackagesPolicies,
131135
ObjectTypeComputePool: PluralObjectTypeComputePool,
132136
ObjectTypeAggregationPolicy: PluralObjectTypeAggregationPolicies,
@@ -212,6 +216,7 @@ const (
212216
PluralObjectTypeViews PluralObjectType = "VIEWS"
213217
PluralObjectTypeMaterializedViews PluralObjectType = "MATERIALIZED VIEWS"
214218
PluralObjectTypeSequences PluralObjectType = "SEQUENCES"
219+
PluralObjectTypeSnapshots PluralObjectType = "SNAPSHOTS"
215220
PluralObjectTypeFunctions PluralObjectType = "FUNCTIONS"
216221
PluralObjectTypeExternalFunctions PluralObjectType = "EXTERNAL FUNCTIONS"
217222
PluralObjectTypeProcedures PluralObjectType = "PROCEDURES"
@@ -232,6 +237,7 @@ const (
232237
PluralObjectTypeIcebergTables PluralObjectType = "ICEBERG TABLES"
233238
PluralObjectTypeExternalVolumes PluralObjectType = "EXTERNAL VOLUMES"
234239
PluralObjectTypeNetworkRules PluralObjectType = "NETWORK RULES"
240+
PluralObjectTypeNotebooks PluralObjectType = "NOTEBOOKS"
235241
PluralObjectTypePackagesPolicies PluralObjectType = "PACKAGES POLICIES"
236242
PluralObjectTypeComputePool PluralObjectType = "COMPUTE POOLS"
237243
PluralObjectTypeAggregationPolicies PluralObjectType = "AGGREGATION POLICIES"

0 commit comments

Comments
 (0)