From 5ca6d4bec2c50e08f51d7e4cddd784e64a42593f Mon Sep 17 00:00:00 2001 From: Catriona Date: Fri, 1 Apr 2022 11:06:35 +0100 Subject: [PATCH 1/4] add new property ledger_enabled --- .../services/mssql/mssql_database_resource.go | 20 ++++++++++++-- .../mssql/mssql_database_resource_test.go | 27 +++++++++++++++++++ 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/internal/services/mssql/mssql_database_resource.go b/internal/services/mssql/mssql_database_resource.go index 8f93af652b5a..2c80ffb6f9d3 100644 --- a/internal/services/mssql/mssql_database_resource.go +++ b/internal/services/mssql/mssql_database_resource.go @@ -179,6 +179,11 @@ func resourceMsSqlDatabaseCreateUpdate(d *pluginsdk.ResourceData, meta interface } } + if d.HasChange("ledger_enabled") && !d.IsNewResource() { + return fmt.Errorf("cannot change `ledger_enabled` after initial creation") + } + ledgerEnabled := d.Get("ledger_enabled").(bool) + // When databases are replicating, the primary cannot have a SKU belonging to a higher service tier than any of its // partner databases. To work around this, we'll try to identify any partner databases that are secondary to this // database, and where the new SKU tier for this database is going to be higher, first upgrade those databases to @@ -249,6 +254,7 @@ func resourceMsSqlDatabaseCreateUpdate(d *pluginsdk.ResourceData, meta interface SampleName: sql.SampleName(d.Get("sample_name").(string)), RequestedBackupStorageRedundancy: expandMsSqlBackupStorageRedundancy(d.Get("storage_account_type").(string)), ZoneRedundant: utils.Bool(d.Get("zone_redundant").(bool)), + IsLedgerOn: utils.Bool(ledgerEnabled), }, Tags: tags.Expand(d.Get("tags").(map[string]interface{})), @@ -435,7 +441,7 @@ func resourceMsSqlDatabaseCreateUpdate(d *pluginsdk.ResourceData, meta interface return nil } - if d.HasChange("long_term_retention_policy") { + if d.HasChange("long_term_retention_policy") && !ledgerEnabled { v := d.Get("long_term_retention_policy") longTermRetentionProps := helper.ExpandLongTermRetentionPolicy(v.([]interface{})) if longTermRetentionProps != nil { @@ -513,6 +519,7 @@ func resourceMsSqlDatabaseRead(d *pluginsdk.ResourceData, meta interface{}) erro d.Set("server_id", serverId.ID()) skuName := "" + ledgerEnabled := false if props := resp.DatabaseProperties; props != nil { d.Set("auto_pause_delay_in_minutes", props.AutoPauseDelay) d.Set("collation", props.Collation) @@ -534,6 +541,8 @@ func resourceMsSqlDatabaseRead(d *pluginsdk.ResourceData, meta interface{}) erro d.Set("sku_name", skuName) d.Set("storage_account_type", flattenMsSqlBackupStorageRedundancy(props.CurrentBackupStorageRedundancy)) d.Set("zone_redundant", props.ZoneRedundant) + ledgerEnabled = *props.IsLedgerOn + d.Set("ledger_enabled", ledgerEnabled) } securityAlertPolicy, err := securityAlertPoliciesClient.Get(ctx, id.ResourceGroup, id.ServerName, id.Name) @@ -546,7 +555,7 @@ func resourceMsSqlDatabaseRead(d *pluginsdk.ResourceData, meta interface{}) erro geoBackupPolicy := true // Hyper Scale SKU's do not currently support LRP and do not honour normal SRP operations - if !strings.HasPrefix(skuName, "HS") && !strings.HasPrefix(skuName, "DW") { + if !strings.HasPrefix(skuName, "HS") && !strings.HasPrefix(skuName, "DW") && !ledgerEnabled { longTermPolicy, err := longTermRetentionClient.Get(ctx, id.ResourceGroup, id.ServerName, id.Name) if err != nil { return fmt.Errorf("retrieving Long Term Retention Policies for %s: %+v", id, err) @@ -1011,6 +1020,13 @@ func resourceMsSqlDatabaseSchema() map[string]*pluginsdk.Schema { Optional: true, Default: true, }, + + "ledger_enabled": { + Type: pluginsdk.TypeBool, + Optional: true, + Computed: true, + }, + "tags": tags.Schema(), } diff --git a/internal/services/mssql/mssql_database_resource_test.go b/internal/services/mssql/mssql_database_resource_test.go index bb6f38576e0b..37e1b0170c30 100644 --- a/internal/services/mssql/mssql_database_resource_test.go +++ b/internal/services/mssql/mssql_database_resource_test.go @@ -665,6 +665,21 @@ func TestAccMsSqlDatabase_errorOnDisabledEncryption(t *testing.T) { }) } +func TestAccMsSqlDatabase_ledgerEnabled(t *testing.T) { + data := acceptance.BuildTestData(t, "azurerm_mssql_database", "test") + r := MsSqlDatabaseResource{} + + data.ResourceTest(t, r, []acceptance.TestStep{ + { + Config: r.ledgerEnabled(data), + Check: acceptance.ComposeTestCheckFunc( + check.That(data.ResourceName).ExistsInAzure(r), + ), + }, + data.ImportStep(), + }) +} + func (MsSqlDatabaseResource) Exists(ctx context.Context, client *clients.Client, state *pluginsdk.InstanceState) (*bool, error) { id, err := parse.DatabaseID(state.ID) if err != nil { @@ -1479,3 +1494,15 @@ resource "azurerm_mssql_database" "test" { } `, r.template(data), data.RandomInteger) } + +func (r MsSqlDatabaseResource) ledgerEnabled(data acceptance.TestData) string { + return fmt.Sprintf(` +%[1]s + +resource "azurerm_mssql_database" "test" { + name = "acctest-db-%[2]d" + server_id = azurerm_mssql_server.test.id + ledger_enabled = true +} +`, r.template(data), data.RandomInteger) +} From 5bf533e289426e190b7345fbd51ddd8d9cea787d Mon Sep 17 00:00:00 2001 From: Catriona Date: Fri, 1 Apr 2022 11:10:29 +0100 Subject: [PATCH 2/4] add ledger_enabled to docs --- website/docs/r/mssql_database.html.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/website/docs/r/mssql_database.html.markdown b/website/docs/r/mssql_database.html.markdown index 3533438de87c..086f1730da35 100644 --- a/website/docs/r/mssql_database.html.markdown +++ b/website/docs/r/mssql_database.html.markdown @@ -94,6 +94,8 @@ The following arguments are supported: ~> **Note:** `geo_backup_enabled` is only applicable for DataWarehouse SKUs (DW*). This setting is ignored for all other SKUs. +* `ledger_enabled` - (Optional) A boolean that specifies if this is a ledger database. This cannot be changed after the database has been created. Defaults to `false`. + * `license_type` - (Optional) Specifies the license type applied to this database. Possible values are `LicenseIncluded` and `BasePrice`. * `long_term_retention_policy` - (Optional) A `long_term_retention_policy` block as defined below. From e00fd36ee70a5544a8c7d01df3a9e8f675ed8459 Mon Sep 17 00:00:00 2001 From: Catriona Date: Fri, 1 Apr 2022 12:13:17 +0100 Subject: [PATCH 3/4] linting --- internal/services/mssql/mssql_database_resource_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/internal/services/mssql/mssql_database_resource_test.go b/internal/services/mssql/mssql_database_resource_test.go index 37e1b0170c30..c9a83260daa4 100644 --- a/internal/services/mssql/mssql_database_resource_test.go +++ b/internal/services/mssql/mssql_database_resource_test.go @@ -1500,8 +1500,8 @@ func (r MsSqlDatabaseResource) ledgerEnabled(data acceptance.TestData) string { %[1]s resource "azurerm_mssql_database" "test" { - name = "acctest-db-%[2]d" - server_id = azurerm_mssql_server.test.id + name = "acctest-db-%[2]d" + server_id = azurerm_mssql_server.test.id ledger_enabled = true } `, r.template(data), data.RandomInteger) From a6eb334d0a1a0c12403e734797137e205095d8cf Mon Sep 17 00:00:00 2001 From: Catriona Date: Mon, 4 Apr 2022 11:02:36 +0100 Subject: [PATCH 4/4] add forcenew to ledger_enabled --- internal/services/mssql/mssql_database_resource.go | 8 ++++---- website/docs/r/mssql_database.html.markdown | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/internal/services/mssql/mssql_database_resource.go b/internal/services/mssql/mssql_database_resource.go index 2c80ffb6f9d3..f21eb138f4ca 100644 --- a/internal/services/mssql/mssql_database_resource.go +++ b/internal/services/mssql/mssql_database_resource.go @@ -179,9 +179,6 @@ func resourceMsSqlDatabaseCreateUpdate(d *pluginsdk.ResourceData, meta interface } } - if d.HasChange("ledger_enabled") && !d.IsNewResource() { - return fmt.Errorf("cannot change `ledger_enabled` after initial creation") - } ledgerEnabled := d.Get("ledger_enabled").(bool) // When databases are replicating, the primary cannot have a SKU belonging to a higher service tier than any of its @@ -541,7 +538,9 @@ func resourceMsSqlDatabaseRead(d *pluginsdk.ResourceData, meta interface{}) erro d.Set("sku_name", skuName) d.Set("storage_account_type", flattenMsSqlBackupStorageRedundancy(props.CurrentBackupStorageRedundancy)) d.Set("zone_redundant", props.ZoneRedundant) - ledgerEnabled = *props.IsLedgerOn + if props.IsLedgerOn != nil { + ledgerEnabled = *props.IsLedgerOn + } d.Set("ledger_enabled", ledgerEnabled) } @@ -1025,6 +1024,7 @@ func resourceMsSqlDatabaseSchema() map[string]*pluginsdk.Schema { Type: pluginsdk.TypeBool, Optional: true, Computed: true, + ForceNew: true, }, "tags": tags.Schema(), diff --git a/website/docs/r/mssql_database.html.markdown b/website/docs/r/mssql_database.html.markdown index 086f1730da35..08f727fe03ce 100644 --- a/website/docs/r/mssql_database.html.markdown +++ b/website/docs/r/mssql_database.html.markdown @@ -94,7 +94,7 @@ The following arguments are supported: ~> **Note:** `geo_backup_enabled` is only applicable for DataWarehouse SKUs (DW*). This setting is ignored for all other SKUs. -* `ledger_enabled` - (Optional) A boolean that specifies if this is a ledger database. This cannot be changed after the database has been created. Defaults to `false`. +* `ledger_enabled` - (Optional) A boolean that specifies if this is a ledger database. Defaults to `false`. Changing this forces a new resource to be created. * `license_type` - (Optional) Specifies the license type applied to this database. Possible values are `LicenseIncluded` and `BasePrice`.