Skip to content

Commit

Permalink
feat: use SDK in schema resource and datasource (#2082)
Browse files Browse the repository at this point in the history
  • Loading branch information
sfc-gh-jcieslak committed Oct 16, 2023
1 parent 7013f83 commit f7d0d97
Show file tree
Hide file tree
Showing 10 changed files with 210 additions and 619 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ Integration status - indicates if given resource / datasource is using new SDK.
| Warehouse || snowflake_warehouse | snowflake_warehouse | 🟨 |
| Resource Monitor || snowflake_resource_monitor | snowflake_resource_monitor ||
| Database || snowflake_database | snowflake_database ||
| Schema || snowflake_schema | snowflake_schema | |
| Schema || snowflake_schema | snowflake_schema | |
| Share || snowflake_share | snowflake_share ||
| Table | 👨‍💻 | snowflake_table | snowflake_table ||
| Dynamic Table || snowflake_dynamic_table | snowflake_dynamic_table ||
Expand Down
42 changes: 20 additions & 22 deletions pkg/datasources/schemas.go
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
package datasources

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

"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"
)

Expand Down Expand Up @@ -48,32 +48,30 @@ func Schemas() *schema.Resource {

func ReadSchemas(d *schema.ResourceData, meta interface{}) error {
db := meta.(*sql.DB)
client := sdk.NewClientFromDB(db)
ctx := context.Background()
databaseName := d.Get("database").(string)
databaseID := sdk.NewAccountObjectIdentifier(databaseName)

log.Printf("[DEBUG] database name %s", databaseName)

currentSchemas, err := snowflake.ListSchemas(databaseName, db)
if errors.Is(err, sql.ErrNoRows) {
// If not found, mark resource to be removed from state file during apply or refresh
log.Printf("[DEBUG] schemas in database (%s) not found", d.Id())
d.SetId("")
return nil
} else if err != nil {
log.Printf("[DEBUG] unable to parse schemas in database (%s)", d.Id())
currentSchemas, err := client.Schemas.Show(ctx, &sdk.ShowSchemaOptions{
In: &sdk.SchemaIn{
Database: sdk.Bool(true),
Name: databaseID,
},
})
if err != nil {
log.Printf("[DEBUG] unable to show schemas in database (%s)", databaseName)
d.SetId("")
return nil
}

schemas := []map[string]interface{}{}

for _, schema := range currentSchemas {
schemaMap := map[string]interface{}{}

schemaMap["name"] = schema.Name.String
schemaMap["database"] = schema.DatabaseName.String
schemaMap["comment"] = schema.Comment.String

schemas = append(schemas, schemaMap)
schemas := make([]map[string]any, len(currentSchemas))
for i, cs := range currentSchemas {
schemas[i] = map[string]any{
"name": cs.Name,
"database": cs.DatabaseName,
"comment": cs.Comment,
}
}

d.SetId(databaseName)
Expand Down
3 changes: 0 additions & 3 deletions pkg/resources/alert.go
Original file line number Diff line number Diff line change
Expand Up @@ -132,9 +132,6 @@ func ReadAlert(d *schema.ResourceData, meta interface{}) error {
d.SetId("")
return nil
}
if err != nil {
return err
}

if err := d.Set("enabled", alert.State == sdk.AlertStateStarted); err != nil {
return err
Expand Down
38 changes: 38 additions & 0 deletions pkg/resources/helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -61,3 +61,41 @@ func setBoolProperty(d *schema.ResourceData, key string, property *sdk.BoolPrope
}
return nil
}

func getTagObjectIdentifier(v map[string]any) sdk.ObjectIdentifier {
if _, ok := v["database"]; ok {
if _, ok := v["schema"]; ok {
return sdk.NewSchemaObjectIdentifier(v["database"].(string), v["schema"].(string), v["name"].(string))
}
return sdk.NewDatabaseObjectIdentifier(v["database"].(string), v["name"].(string))
}
return sdk.NewAccountObjectIdentifier(v["name"].(string))
}

func getPropertyTags(d *schema.ResourceData, key string) []sdk.TagAssociation {
if from, ok := d.GetOk(key); ok {
tags := from.([]any)
to := make([]sdk.TagAssociation, len(tags))
for i, t := range tags {
v := t.(map[string]any)
to[i] = sdk.TagAssociation{
Name: getTagObjectIdentifier(v),
Value: v["value"].(string),
}
}
return to
}
return nil
}

func GetPropertyAsPointer[T any](d *schema.ResourceData, property string) *T {
value, ok := d.GetOk(property)
if !ok {
return nil
}
typedValue, ok := value.(T)
if !ok {
return nil
}
return &typedValue
}
29 changes: 29 additions & 0 deletions pkg/resources/helpers_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ package resources_test
import (
"testing"

"github.com/stretchr/testify/assert"

"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"github.com/stretchr/testify/require"

Expand All @@ -19,6 +21,33 @@ const (
onAll
)

func TestGetPropertyAsPointer(t *testing.T) {
d := schema.TestResourceDataRaw(t, map[string]*schema.Schema{
"integer": {
Type: schema.TypeInt,
Required: true,
},
"string": {
Type: schema.TypeString,
Required: true,
},
"boolean": {
Type: schema.TypeBool,
Required: true,
},
}, map[string]interface{}{
"integer": 123,
"string": "some string",
"boolean": true,
"invalid": true,
})

assert.Equal(t, 123, *resources.GetPropertyAsPointer[int](d, "integer"))
assert.Equal(t, "some string", *resources.GetPropertyAsPointer[string](d, "string"))
assert.Equal(t, true, *resources.GetPropertyAsPointer[bool](d, "boolean"))
assert.Nil(t, resources.GetPropertyAsPointer[bool](d, "invalid"))
}

func database(t *testing.T, id string, params map[string]interface{}) *schema.ResourceData {
t.Helper()
r := require.New(t)
Expand Down
Loading

0 comments on commit f7d0d97

Please sign in to comment.