Skip to content

Commit

Permalink
feat: Parameters sdk v2 (#1914)
Browse files Browse the repository at this point in the history
* update session_parameter

* adds missing session parameters

* updatees object parameter to use new sdk implementation

* fixes tests

* add support for prevent_inline_from_url parameter

* adds support for enable_unredacted_query_syntax_error

* fixes formatting

* fixes returning null instead of error

* stuff

* changes

* fixes

* update parameters

* update parameters

* update parameters

* update parameters

* update parameters

* update parameters

* update parameters

* fix int test

* update parameters

* update parameters

---------

Co-authored-by: Scott Winkler <scott.winkler@snowflake.com>
  • Loading branch information
sfc-gh-pbosak and sfc-gh-swinkler authored Sep 12, 2023
1 parent 96b47e5 commit 1d15355
Show file tree
Hide file tree
Showing 49 changed files with 1,311 additions and 1,646 deletions.
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ lint-ci: ## run the fast go linters
.PHONY: lint-ci

test-acceptance: ## runs all tests, including the acceptance tests which create and destroys real resources
SKIP_MANAGED_ACCOUNT_TEST=1 SKIP_EMAIL_INTEGRATION_TESTS=1 TF_ACC=1 go test -timeout 1200s -v $(COVERAGE_FLAGS) ./...
SKIP_MANAGED_ACCOUNT_TEST=1 SKIP_EMAIL_INTEGRATION_TESTS=1 TF_ACC=1 go test -timeout 2000s -v $(COVERAGE_FLAGS) ./...
.PHONY: test-acceptance

build-local: ## build the binary locally
Expand Down
1 change: 0 additions & 1 deletion docs/data-sources/parameters.md
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,6 @@ Read-Only:
- `description` (String)
- `key` (String)
- `level` (String)
- `type` (String)
- `value` (String)


80 changes: 45 additions & 35 deletions pkg/datasources/parameters.go
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
package datasources

import (
"context"
"database/sql"
"errors"
"fmt"
"log"
"strings"

"github.com/Snowflake-Labs/terraform-provider-snowflake/pkg/snowflake"
"github.com/Snowflake-Labs/terraform-provider-snowflake/pkg/sdk"

"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
)
Expand All @@ -31,10 +31,9 @@ var parametersSchema = map[string]*schema.Schema{
Description: "If parameter_type is set to \"SESSION\" then user is the name of the user to display session parameters for.",
},
"object_type": {
Type: schema.TypeString,
Optional: true,
Description: "If parameter_type is set to \"OBJECT\" then object_type is the type of object to display object parameters for. Valid values are any object supported by the IN clause of the [SHOW PARAMETERS](https://docs.snowflake.com/en/sql-reference/sql/show-parameters.html#parameters) statement, including: WAREHOUSE | DATABASE | SCHEMA | TASK | TABLE",
ValidateFunc: validation.StringInSlice(snowflake.GetParameterObjectTypeSetAsStrings(), false),
Type: schema.TypeString,
Optional: true,
Description: "If parameter_type is set to \"OBJECT\" then object_type is the type of object to display object parameters for. Valid values are any object supported by the IN clause of the [SHOW PARAMETERS](https://docs.snowflake.com/en/sql-reference/sql/show-parameters.html#parameters) statement, including: WAREHOUSE | DATABASE | SCHEMA | TASK | TABLE",
},
"object_name": {
Type: schema.TypeString,
Expand Down Expand Up @@ -72,11 +71,6 @@ var parametersSchema = map[string]*schema.Schema{
Computed: true,
Description: "The description of the parameter",
},
"type": {
Type: schema.TypeString,
Computed: true,
Description: "The type of the parameter",
},
},
},
},
Expand All @@ -91,49 +85,65 @@ func Parameters() *schema.Resource {

func ReadParameters(d *schema.ResourceData, meta interface{}) error {
db := meta.(*sql.DB)
client := sdk.NewClientFromDB(db)
ctx := context.Background()
p, ok := d.GetOk("pattern")
pattern := ""
if ok {
pattern = p.(string)
}
var parameters []snowflake.Parameter
var parameters []*sdk.Parameter
var err error
parameterType := snowflake.ParameterType(strings.ToUpper(d.Get("parameter_type").(string)))
opts := sdk.ShowParametersOptions{
In: &sdk.ParametersIn{},
}
if pattern != "" {
opts.Like = &sdk.Like{Pattern: sdk.String(pattern)}
}
parameterType := strings.ToUpper(d.Get("parameter_type").(string))
switch parameterType {
case snowflake.ParameterTypeAccount:
parameters, err = snowflake.ListAccountParameters(db, pattern)
case snowflake.ParameterTypeSession:
case "ACCOUNT":
opts.In.Account = sdk.Bool(true)
case "SESSION":
user := d.Get("user").(string)
if user == "" {
return fmt.Errorf("user is required when parameter_type is set to SESSION")
}
parameters, err = snowflake.ListSessionParameters(db, pattern, user)
case snowflake.ParameterTypeObject:
oType := d.Get("object_type").(string)
objectType := snowflake.ObjectType(oType)
opts.In.User = sdk.NewAccountObjectIdentifier(user)
case "OBJECT":
objectType := sdk.ObjectType(d.Get("object_type").(string))
objectName := d.Get("object_name").(string)
parameters, err = snowflake.ListObjectParameters(db, objectType, objectName, pattern)
switch objectType {
case sdk.ObjectTypeWarehouse:
opts.In.Warehouse = sdk.NewAccountObjectIdentifier(objectName)
case sdk.ObjectTypeDatabase:
opts.In.Database = sdk.NewAccountObjectIdentifier(objectName)
case sdk.ObjectTypeSchema:
opts.In.Schema = sdk.NewDatabaseObjectIdentifierFromFullyQualifiedName(objectName)
case sdk.ObjectTypeTask:
opts.In.Task = sdk.NewSchemaObjectIdentifierFromFullyQualifiedName(objectName)
case sdk.ObjectTypeTable:
opts.In.Table = sdk.NewSchemaObjectIdentifierFromFullyQualifiedName(objectName)
default:
return fmt.Errorf("object_type %s is not supported", objectType)
}
}
if errors.Is(err, sql.ErrNoRows) {
log.Printf("[DEBUG] parameters not found")
d.SetId("")
return nil
} else if err != nil {
log.Printf("[DEBUG] error occurred during read: %v", err.Error())
return err
parameters, err = client.Parameters.ShowParameters(ctx, &opts)

if err != nil {
return fmt.Errorf("error listing parameters: %w", err)
}
d.SetId("parameters")

params := []map[string]interface{}{}
for _, param := range parameters {
paramMap := map[string]interface{}{}

paramMap["key"] = param.Key.String
paramMap["value"] = param.Value.String
paramMap["default"] = param.Default.String
paramMap["level"] = param.Level.String
paramMap["description"] = param.Description.String
paramMap["type"] = param.PType.String
paramMap["key"] = param.Key
paramMap["value"] = param.Value
paramMap["default"] = param.Default
paramMap["level"] = param.Level
paramMap["description"] = param.Description

params = append(params, paramMap)
}
Expand Down
1 change: 0 additions & 1 deletion pkg/datasources/parameters_acceptance_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,6 @@ func TestAcc_ParametersOnObject(t *testing.T) {
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttrSet("data.snowflake_parameters.p", "parameters.#"),
resource.TestCheckResourceAttrSet("data.snowflake_parameters.p", "parameters.0.key"),
resource.TestCheckResourceAttrSet("data.snowflake_parameters.p", "parameters.0.type"),
resource.TestCheckResourceAttr("data.snowflake_parameters.p", "object_type", "DATABASE"),
resource.TestCheckResourceAttr("data.snowflake_parameters.p", "object_name", dbName),
),
Expand Down
81 changes: 26 additions & 55 deletions pkg/resources/account_parameter.go
Original file line number Diff line number Diff line change
@@ -1,23 +1,20 @@
package resources

import (
"context"
"database/sql"
"fmt"
"reflect"

"github.com/Snowflake-Labs/terraform-provider-snowflake/pkg/snowflake"
"github.com/Snowflake-Labs/terraform-provider-snowflake/pkg/sdk"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
"golang.org/x/exp/maps"
)

var accountParameterSchema = map[string]*schema.Schema{
"key": {
Type: schema.TypeString,
Required: true,
ForceNew: true,
Description: "Name of account parameter. Valid values are those in [account parameters](https://docs.snowflake.com/en/sql-reference/parameters.html#account-parameters).",
ValidateFunc: validation.StringInSlice(maps.Keys(snowflake.GetParameterDefaults(snowflake.ParameterTypeAccount)), false),
Type: schema.TypeString,
Required: true,
ForceNew: true,
Description: "Name of account parameter. Valid values are those in [account parameters](https://docs.snowflake.com/en/sql-reference/parameters.html#account-parameters).",
},
"value": {
Type: schema.TypeString,
Expand Down Expand Up @@ -45,49 +42,30 @@ func CreateAccountParameter(d *schema.ResourceData, meta interface{}) error {
db := meta.(*sql.DB)
key := d.Get("key").(string)
value := d.Get("value").(string)

parameterDefault := snowflake.GetParameterDefaults(snowflake.ParameterTypeAccount)[key]
if parameterDefault.Validate != nil {
if err := parameterDefault.Validate(value); err != nil {
return err
}
}

// add quotes to value if it is a string
typeString := reflect.TypeOf("")
if reflect.TypeOf(parameterDefault.DefaultValue) == typeString {
value = fmt.Sprintf("'%s'", snowflake.EscapeString(value))
}

builder := snowflake.NewAccountParameter(key, value, db)
err := builder.SetParameter()
client := sdk.NewClientFromDB(db)
ctx := context.Background()
parameter := sdk.AccountParameter(key)
err := client.Parameters.SetAccountParameter(ctx, parameter, value)
if err != nil {
return fmt.Errorf("error creating account parameter err = %w", err)
return err
}

d.SetId(key)
p, err := snowflake.ShowAccountParameter(db, key)
if err != nil {
return fmt.Errorf("error reading account parameter err = %w", err)
}
err = d.Set("value", p.Value.String)
if err != nil {
return fmt.Errorf("error setting account parameter value err = %w", err)
}
return nil
return ReadAccountParameter(d, meta)
}

// ReadAccountParameter implements schema.ReadFunc.
func ReadAccountParameter(d *schema.ResourceData, meta interface{}) error {
db := meta.(*sql.DB)
key := d.Id()
p, err := snowflake.ShowAccountParameter(db, key)
client := sdk.NewClientFromDB(db)
ctx := context.Background()
parameterName := d.Id()
parameter, err := client.Parameters.ShowAccountParameter(ctx, sdk.AccountParameter(parameterName))
if err != nil {
return fmt.Errorf("error reading account parameter err = %w", err)
}
err = d.Set("value", p.Value.String)
err = d.Set("value", parameter.Value)
if err != nil {
return fmt.Errorf("error setting account parameter value err = %w", err)
return fmt.Errorf("error setting account parameter err = %w", err)
}
return nil
}
Expand All @@ -101,24 +79,17 @@ func UpdateAccountParameter(d *schema.ResourceData, meta interface{}) error {
func DeleteAccountParameter(d *schema.ResourceData, meta interface{}) error {
db := meta.(*sql.DB)
key := d.Get("key").(string)

parameterDefault := snowflake.GetParameterDefaults(snowflake.ParameterTypeAccount)[key]
defaultValue := parameterDefault.DefaultValue
value := fmt.Sprintf("%v", defaultValue)

// add quotes to value if it is a string
typeString := reflect.TypeOf("")
if reflect.TypeOf(parameterDefault.DefaultValue) == typeString {
value = fmt.Sprintf("'%s'", value)
}
builder := snowflake.NewAccountParameter(key, value, db)
err := builder.SetParameter()
client := sdk.NewClientFromDB(db)
ctx := context.Background()
parameter := sdk.AccountParameter(key)
defaultParameter, err := client.Parameters.ShowAccountParameter(ctx, sdk.AccountParameter(key))
if err != nil {
return fmt.Errorf("error creating account parameter err = %w", err)
return err
}
_, err = snowflake.ShowAccountParameter(db, key)
defaultValue := defaultParameter.Default
err = client.Parameters.SetAccountParameter(ctx, parameter, defaultValue)
if err != nil {
return fmt.Errorf("error reading account parameter err = %w", err)
return fmt.Errorf("error resetting account parameter err = %w", err)
}

d.SetId("")
Expand Down
6 changes: 3 additions & 3 deletions pkg/resources/account_parameter_acceptance_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -49,15 +49,15 @@ func TestAcc_AccountParameter_PREVENT_LOAD_FROM_INLINE_URL(t *testing.T) {
})
}

func TestAcc_AccountParameter_CLIENT_METADATA_USE_SESSION_DATABASE(t *testing.T) {
func TestAcc_AccountParameter_REQUIRE_STORAGE_INTEGRATION_FOR_STAGE_CREATION(t *testing.T) {
resource.ParallelTest(t, resource.TestCase{
Providers: providers(),
CheckDestroy: nil,
Steps: []resource.TestStep{
{
Config: accountParameterBasic("CLIENT_METADATA_USE_SESSION_DATABASE", "true"),
Config: accountParameterBasic("REQUIRE_STORAGE_INTEGRATION_FOR_STAGE_CREATION", "true"),
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttr("snowflake_account_parameter.p", "key", "CLIENT_METADATA_USE_SESSION_DATABASE"),
resource.TestCheckResourceAttr("snowflake_account_parameter.p", "key", "REQUIRE_STORAGE_INTEGRATION_FOR_STAGE_CREATION"),
resource.TestCheckResourceAttr("snowflake_account_parameter.p", "value", "true"),
),
},
Expand Down
4 changes: 3 additions & 1 deletion pkg/resources/database_grant.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ import (
"fmt"
"strings"

"github.com/Snowflake-Labs/terraform-provider-snowflake/pkg/sdk"

"github.com/Snowflake-Labs/terraform-provider-snowflake/pkg/helpers"
"github.com/Snowflake-Labs/terraform-provider-snowflake/pkg/snowflake"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
Expand Down Expand Up @@ -70,7 +72,7 @@ var databaseGrantSchema = map[string]*schema.Schema{
Default: "",
ValidateFunc: func(val interface{}, key string) ([]string, []error) {
additionalCharsToIgnoreValidation := []string{".", " ", ":", "(", ")"}
return snowflake.ValidateIdentifier(val, additionalCharsToIgnoreValidation)
return sdk.ValidateIdentifier(val, additionalCharsToIgnoreValidation)
},
},
}
Expand Down
4 changes: 3 additions & 1 deletion pkg/resources/external_table_grant.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ import (
"errors"
"strings"

"github.com/Snowflake-Labs/terraform-provider-snowflake/pkg/sdk"

"github.com/Snowflake-Labs/terraform-provider-snowflake/pkg/helpers"
"github.com/Snowflake-Labs/terraform-provider-snowflake/pkg/snowflake"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
Expand Down Expand Up @@ -92,7 +94,7 @@ var externalTableGrantSchema = map[string]*schema.Schema{
Default: "",
ValidateFunc: func(val interface{}, key string) ([]string, []error) {
additionalCharsToIgnoreValidation := []string{".", " ", ":", "(", ")"}
return snowflake.ValidateIdentifier(val, additionalCharsToIgnoreValidation)
return sdk.ValidateIdentifier(val, additionalCharsToIgnoreValidation)
},
},
}
Expand Down
4 changes: 3 additions & 1 deletion pkg/resources/failover_group_grant.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ import (
"fmt"
"strings"

"github.com/Snowflake-Labs/terraform-provider-snowflake/pkg/sdk"

"github.com/Snowflake-Labs/terraform-provider-snowflake/pkg/helpers"
"github.com/Snowflake-Labs/terraform-provider-snowflake/pkg/snowflake"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
Expand Down Expand Up @@ -61,7 +63,7 @@ var failoverGroupGrantSchema = map[string]*schema.Schema{
Default: "",
ValidateFunc: func(val interface{}, key string) ([]string, []error) {
additionalCharsToIgnoreValidation := []string{".", " ", ":", "(", ")"}
return snowflake.ValidateIdentifier(val, additionalCharsToIgnoreValidation)
return sdk.ValidateIdentifier(val, additionalCharsToIgnoreValidation)
},
},
}
Expand Down
4 changes: 3 additions & 1 deletion pkg/resources/file_format_grant.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ import (
"fmt"
"strings"

"github.com/Snowflake-Labs/terraform-provider-snowflake/pkg/sdk"

"github.com/Snowflake-Labs/terraform-provider-snowflake/pkg/helpers"
"github.com/Snowflake-Labs/terraform-provider-snowflake/pkg/snowflake"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
Expand Down Expand Up @@ -88,7 +90,7 @@ var fileFormatGrantSchema = map[string]*schema.Schema{
Default: "",
ValidateFunc: func(val interface{}, key string) ([]string, []error) {
additionalCharsToIgnoreValidation := []string{".", " ", ":", "(", ")"}
return snowflake.ValidateIdentifier(val, additionalCharsToIgnoreValidation)
return sdk.ValidateIdentifier(val, additionalCharsToIgnoreValidation)
},
},
}
Expand Down
4 changes: 3 additions & 1 deletion pkg/resources/function_grant.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ import (
"errors"
"strings"

"github.com/Snowflake-Labs/terraform-provider-snowflake/pkg/sdk"

"github.com/Snowflake-Labs/terraform-provider-snowflake/pkg/helpers"
"github.com/Snowflake-Labs/terraform-provider-snowflake/pkg/snowflake"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
Expand Down Expand Up @@ -100,7 +102,7 @@ var functionGrantSchema = map[string]*schema.Schema{
Default: "",
ValidateFunc: func(val interface{}, key string) ([]string, []error) {
additionalCharsToIgnoreValidation := []string{".", " ", ":", "(", ")"}
return snowflake.ValidateIdentifier(val, additionalCharsToIgnoreValidation)
return sdk.ValidateIdentifier(val, additionalCharsToIgnoreValidation)
},
},
}
Expand Down
Loading

0 comments on commit 1d15355

Please sign in to comment.