Skip to content
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

feat: Add stream on directory table #3129

Merged
merged 13 commits into from
Oct 22, 2024
13 changes: 12 additions & 1 deletion MIGRATION_GUIDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ across different versions.

## v0.97.0 ➞ v0.98.0

#### *(behavior change)* handling copy_grants
### *(behavior change)* handling copy_grants
Currently, resources like `snowflake_view`, `snowflake_stream_on_table`, `snowflake_stream_on_external_table` and `snowflake_stream_on_directory_table` support `copy_grants` field corresponding with `COPY GRANTS` during `CREATE`. The current behavior is that, when a change leading for recreation is detected (meaning a change that can not be handled by ALTER, but only by `CREATE OR REPLACE`), `COPY GRANTS` are used during recreation when `copy_grants` is set to `true`. Changing this field without changes in other field results in a noop because in this case there is no need to recreate a resource.

### *(new feature)* recovering stale streams
Expand Down Expand Up @@ -47,6 +47,17 @@ resource "snowflake_stream_on_directory_table" "stream" {

Then, follow our [Resource migration guide](https://github.com/Snowflake-Labs/terraform-provider-snowflake/blob/main/docs/technical-documentation/resource_migration.md).

### *(new feature)* Secret resources
Added a new secrets resources for managing secrets.
We decided to split each secret flow into individual resources.
This segregation was based on the secret flows in CREATE SECRET. i.e.:
- `snowflake_secret_with_client_credentials`
- `snowflake_secret_with_authorization_code_grant`
- `snowflake_secret_with_basic_authentication`
- `snowflake_secret_with_generic_string`


See reference [docs](https://docs.snowflake.com/en/sql-reference/sql/create-secret).

## v0.96.0 ➞ v0.97.0
sfc-gh-jcieslak marked this conversation as resolved.
Show resolved Hide resolved

Expand Down
34 changes: 5 additions & 29 deletions pkg/resources/stream_on_external_table_acceptance_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -565,7 +565,7 @@ func TestAcc_StreamOnExternalTable_PermadiffWhenIsStaleAndHasNoRetentionTime(t *
})
}

func TestAcc_StreamOnExternalTable_RecreateWhenStaleWithExternalChanges(t *testing.T) {
func TestAcc_StreamOnExternalTable_StaleWithExternalChanges(t *testing.T) {
_ = testenvs.GetOrSkipTest(t, testenvs.EnableAcceptance)
acc.TestAccPreCheck(t)
resourceName := "snowflake_stream_on_external_table.test"
Expand Down Expand Up @@ -611,7 +611,7 @@ func TestAcc_StreamOnExternalTable_RecreateWhenStaleWithExternalChanges(t *testi
})),
),
},
// changing the value externally on schema and checking manually that stream is stale
// changing the value externally on schema
{
PreConfig: func() {
acc.TestClient().Schema.Alter(t, schema.ID(), &sdk.AlterSchemaOptions{
Expand All @@ -624,32 +624,6 @@ func TestAcc_StreamOnExternalTable_RecreateWhenStaleWithExternalChanges(t *testi
HasName(id.Name()).
HasStale(true),
sfc-gh-asawicki marked this conversation as resolved.
Show resolved Hide resolved
)
},
Config: config.FromModel(t, model),
ConfigPlanChecks: resource.ConfigPlanChecks{
PostApplyPostRefresh: []plancheck.PlanCheck{
plancheck.ExpectResourceAction(resourceName, plancheck.ResourceActionUpdate),
planchecks.ExpectChange(resourceName, "stale", tfjson.ActionUpdate, sdk.String(r.BooleanTrue), sdk.String(r.BooleanFalse)),
},
},
ExpectNonEmptyPlan: true,
Check: assert.AssertThat(t, resourceassert.StreamOnExternalTableResource(t, resourceName).
HasNameString(id.Name()).
HasStaleString(r.BooleanTrue),
assert.Check(resource.TestCheckResourceAttr(resourceName, "show_output.0.stale", "true")),
assert.Check(resource.TestCheckResourceAttrWith(resourceName, "show_output.0.created_on", func(value string) error {
if value == createdOn {
return fmt.Errorf("stream was not recreated")
}
// the stream was recreated - update creation time for later comparison
createdOn = value
return nil
})),
),
},
// changing schema parameters back to non-zero values
{
PreConfig: func() {
acc.TestClient().Schema.Alter(t, schema.ID(), &sdk.AlterSchemaOptions{
Set: &sdk.SchemaSet{
DataRetentionTimeInDays: sdk.Int(1),
Expand All @@ -667,7 +641,9 @@ func TestAcc_StreamOnExternalTable_RecreateWhenStaleWithExternalChanges(t *testi
HasStaleString(r.BooleanFalse),
assert.Check(resource.TestCheckResourceAttr(resourceName, "show_output.0.stale", "false")),
assert.Check(resource.TestCheckResourceAttrWith(resourceName, "show_output.0.created_on", func(value string) error {
createdOn = value
if value != createdOn {
return fmt.Errorf("stream was recreated")
}
return nil
})),
),
Expand Down
59 changes: 16 additions & 43 deletions pkg/resources/stream_on_table_acceptance_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -401,7 +401,7 @@ func TestAcc_StreamOnTable_CheckGrantsAfterRecreation(t *testing.T) {
})
}

func TestAcc_StreamOnTable_RecreateWhenStale(t *testing.T) {
func TestAcc_StreamOnTable_PermadiffWhenIsStaleAndHasNoRetentionTime(t *testing.T) {
_ = testenvs.GetOrSkipTest(t, testenvs.EnableAcceptance)
acc.TestAccPreCheck(t)
resourceName := "snowflake_stream_on_table.test"
Expand Down Expand Up @@ -476,33 +476,11 @@ func TestAcc_StreamOnTable_RecreateWhenStale(t *testing.T) {
})),
),
},
// set schema parameters to bigger values ensuring that the stream is not stale
{
PreConfig: func() {
sfc-gh-jcieslak marked this conversation as resolved.
Show resolved Hide resolved
acc.TestClient().Schema.Alter(t, schema.ID(), &sdk.AlterSchemaOptions{
Set: &sdk.SchemaSet{
DataRetentionTimeInDays: sdk.Int(1),
MaxDataExtensionTimeInDays: sdk.Int(1),
},
})
},
RefreshState: true,
RefreshPlanChecks: resource.RefreshPlanChecks{
PostRefresh: []plancheck.PlanCheck{
plancheck.ExpectResourceAction(resourceName, plancheck.ResourceActionNoop),
},
},
Check: assert.AssertThat(t, resourceassert.StreamOnTableResource(t, resourceName).
HasNameString(id.Name()).
HasStaleString(r.BooleanFalse),
assert.Check(resource.TestCheckResourceAttr(resourceName, "show_output.0.stale", "false")),
),
},
},
})
}

func TestAcc_StreamOnTable_RecreateWhenStaleWithExternalChanges(t *testing.T) {
func TestAcc_StreamOnTable_StaleWithExternalChanges(t *testing.T) {
_ = testenvs.GetOrSkipTest(t, testenvs.EnableAcceptance)
acc.TestAccPreCheck(t)
resourceName := "snowflake_stream_on_table.test"
Expand All @@ -524,6 +502,8 @@ func TestAcc_StreamOnTable_RecreateWhenStaleWithExternalChanges(t *testing.T) {
table, cleanupTable := acc.TestClient().Table.CreateWithRequest(t, sdk.NewCreateTableRequest(acc.TestClient().Ids.RandomSchemaObjectIdentifierInSchema(schema.ID()), columns).WithChangeTracking(sdk.Pointer(true)))
t.Cleanup(cleanupTable)

var createdOn string

model := model.StreamOnTable("test", id.DatabaseName(), id.Name(), id.SchemaName(), table.ID().FullyQualifiedName())
resource.Test(t, resource.TestCase{
ProtoV6ProviderFactories: acc.TestAccProtoV6ProviderFactories,
Expand All @@ -539,9 +519,13 @@ func TestAcc_StreamOnTable_RecreateWhenStaleWithExternalChanges(t *testing.T) {
HasNameString(id.Name()).
HasStaleString(r.BooleanFalse),
assert.Check(resource.TestCheckResourceAttr(resourceName, "show_output.0.stale", "false")),
assert.Check(resource.TestCheckResourceAttrWith(resourceName, "show_output.0.created_on", func(value string) error {
createdOn = value
return nil
})),
),
},
// changing the value externally on schema and checking manually that stream is stale
// changing the value externally on schema
{
PreConfig: func() {
acc.TestClient().Schema.Alter(t, schema.ID(), &sdk.AlterSchemaOptions{
Expand All @@ -554,24 +538,7 @@ func TestAcc_StreamOnTable_RecreateWhenStaleWithExternalChanges(t *testing.T) {
HasName(id.Name()).
HasStale(true),
)
},
Config: config.FromModel(t, model),
ConfigPlanChecks: resource.ConfigPlanChecks{
PostApplyPostRefresh: []plancheck.PlanCheck{
plancheck.ExpectResourceAction(resourceName, plancheck.ResourceActionUpdate),
planchecks.ExpectChange(resourceName, "stale", tfjson.ActionUpdate, sdk.String(r.BooleanTrue), sdk.String(r.BooleanFalse)),
},
},
ExpectNonEmptyPlan: true,
Check: assert.AssertThat(t, resourceassert.StreamOnTableResource(t, resourceName).
HasNameString(id.Name()).
HasStaleString(r.BooleanTrue),
assert.Check(resource.TestCheckResourceAttr(resourceName, "show_output.0.stale", "true")),
),
},
// changing schema parameters back to non-zero values
{
PreConfig: func() {

acc.TestClient().Schema.Alter(t, schema.ID(), &sdk.AlterSchemaOptions{
Set: &sdk.SchemaSet{
DataRetentionTimeInDays: sdk.Int(1),
Expand All @@ -588,6 +555,12 @@ func TestAcc_StreamOnTable_RecreateWhenStaleWithExternalChanges(t *testing.T) {
HasNameString(id.Name()).
HasStaleString(r.BooleanFalse),
assert.Check(resource.TestCheckResourceAttr(resourceName, "show_output.0.stale", "false")),
assert.Check(resource.TestCheckResourceAttrWith(resourceName, "show_output.0.created_on", func(value string) error {
if value != createdOn {
return fmt.Errorf("stream was recreated")
}
return nil
})),
),
},
},
Expand Down
Loading