Skip to content

Commit f479eab

Browse files
authored
azurerm_mssql_managed_instance - support for properties database_format and hybrid_secondary_usage (#28248)
* support new properties and * update code
1 parent fcd0ecb commit f479eab

File tree

3 files changed

+182
-2
lines changed

3 files changed

+182
-2
lines changed

internal/services/mssqlmanagedinstance/mssql_managed_instance_resource.go

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,8 @@ type MsSqlManagedInstanceModel struct {
6363
AzureActiveDirectoryAdministrator []AzureActiveDirectoryAdministrator `tfschema:"azure_active_directory_administrator"`
6464
ZoneRedundantEnabled bool `tfschema:"zone_redundant_enabled"`
6565
Tags map[string]string `tfschema:"tags"`
66+
DatabaseFormat string `tfschema:"database_format"`
67+
HybridSecondaryUsage string `tfschema:"hybrid_secondary_usage"`
6668
}
6769

6870
type AzureActiveDirectoryAdministrator struct {
@@ -230,12 +232,26 @@ func (r MsSqlManagedInstanceResource) Arguments() map[string]*pluginsdk.Schema {
230232
ForceNew: true,
231233
},
232234

235+
"database_format": {
236+
Type: schema.TypeString,
237+
Optional: true,
238+
Default: managedinstances.ManagedInstanceDatabaseFormatSQLServerTwoZeroTwoTwo,
239+
ValidateFunc: validation.StringInSlice(managedinstances.PossibleValuesForManagedInstanceDatabaseFormat(), false),
240+
},
241+
233242
"dns_zone_partner_id": {
234243
Type: schema.TypeString,
235244
Optional: true,
236245
ValidateFunc: validate.ManagedInstanceID,
237246
},
238247

248+
"hybrid_secondary_usage": {
249+
Type: schema.TypeString,
250+
Optional: true,
251+
Default: managedinstances.HybridSecondaryUsageActive,
252+
ValidateFunc: validation.StringInSlice(managedinstances.PossibleValuesForHybridSecondaryUsage(), false),
253+
},
254+
239255
"identity": commonschema.SystemAssignedUserAssignedIdentityOptional(),
240256

241257
"maintenance_configuration_name": {
@@ -361,6 +377,13 @@ func (r MsSqlManagedInstanceResource) CustomizeDiff() sdk.ResourceFunc {
361377
}
362378
}
363379

380+
// Once the `AlwaysUpToDate` is enabled, you can't go back to `SQLServer2022` update policy.
381+
if oldVal, newVal := rd.GetChange("database_format"); oldVal.(string) == string(managedinstances.ManagedInstanceDatabaseFormatAlwaysUpToDate) && newVal.(string) == string(managedinstances.ManagedInstanceDatabaseFormatSQLServerTwoZeroTwoTwo) {
382+
if err := rd.ForceNew("database_format"); err != nil {
383+
return err
384+
}
385+
}
386+
364387
_, aadAdminOk := rd.GetOk("azure_active_directory_administrator")
365388
authOnlyEnabled := rd.Get("azure_active_directory_administrator.0.azuread_authentication_only_enabled").(bool)
366389
_, loginOk := rd.GetOk("administrator_login")
@@ -426,7 +449,9 @@ func (r MsSqlManagedInstanceResource) Create() sdk.ResourceFunc {
426449
VCores: pointer.To(model.VCores),
427450
ZoneRedundant: pointer.To(model.ZoneRedundantEnabled),
428451
// `Administrators` is only valid when specified during creation`
429-
Administrators: expandMsSqlManagedInstanceExternalAdministrators(model.AzureActiveDirectoryAdministrator),
452+
Administrators: expandMsSqlManagedInstanceExternalAdministrators(model.AzureActiveDirectoryAdministrator),
453+
DatabaseFormat: pointer.To(managedinstances.ManagedInstanceDatabaseFormat(model.DatabaseFormat)),
454+
HybridSecondaryUsage: pointer.To(managedinstances.HybridSecondaryUsage(model.HybridSecondaryUsage)),
430455
},
431456
Tags: pointer.To(model.Tags),
432457
}
@@ -583,7 +608,13 @@ func (r MsSqlManagedInstanceResource) Update() sdk.ResourceFunc {
583608
}
584609
}
585610

586-
metadata.Logger.Infof("Updating %s", *id)
611+
if metadata.ResourceData.HasChange("database_format") {
612+
properties.Properties.DatabaseFormat = pointer.To(managedinstances.ManagedInstanceDatabaseFormat(state.DatabaseFormat))
613+
}
614+
615+
if metadata.ResourceData.HasChange("hybrid_secondary_usage") {
616+
properties.Properties.HybridSecondaryUsage = pointer.To(managedinstances.HybridSecondaryUsage(state.HybridSecondaryUsage))
617+
}
587618

588619
err = client.CreateOrUpdateThenPoll(ctx, *id, properties)
589620
if err != nil {
@@ -674,6 +705,8 @@ func (r MsSqlManagedInstanceResource) Read() sdk.ResourceFunc {
674705
if props.ServicePrincipal != nil {
675706
model.ServicePrincipalType = string(pointer.From(props.ServicePrincipal.Type))
676707
}
708+
model.DatabaseFormat = string(pointer.From(props.DatabaseFormat))
709+
model.HybridSecondaryUsage = string(pointer.From(props.HybridSecondaryUsage))
677710
}
678711
}
679712
return metadata.Encode(&model)

internal/services/mssqlmanagedinstance/mssql_managed_instance_resource_test.go

Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,57 @@ func TestAccMsSqlManagedInstance_update(t *testing.T) {
6464
})
6565
}
6666

67+
func TestAccMsSqlManagedInstance_databaseFormat(t *testing.T) {
68+
data := acceptance.BuildTestData(t, "azurerm_mssql_managed_instance", "test")
69+
r := MsSqlManagedInstanceResource{}
70+
71+
data.ResourceTest(t, r, []acceptance.TestStep{
72+
{
73+
Config: r.databaseFormat(data, "SQLServer2022"),
74+
Check: acceptance.ComposeTestCheckFunc(
75+
check.That(data.ResourceName).ExistsInAzure(r),
76+
),
77+
},
78+
data.ImportStep("administrator_login_password"),
79+
{
80+
Config: r.databaseFormat(data, "AlwaysUpToDate"),
81+
Check: acceptance.ComposeTestCheckFunc(
82+
check.That(data.ResourceName).ExistsInAzure(r),
83+
),
84+
},
85+
data.ImportStep("administrator_login_password"),
86+
})
87+
}
88+
89+
func TestAccMsSqlManagedInstance_hybridSecondaryUsage(t *testing.T) {
90+
data := acceptance.BuildTestData(t, "azurerm_mssql_managed_instance", "test")
91+
r := MsSqlManagedInstanceResource{}
92+
93+
data.ResourceTest(t, r, []acceptance.TestStep{
94+
{
95+
Config: r.hybridSecondaryUsage(data, "Passive"),
96+
Check: acceptance.ComposeTestCheckFunc(
97+
check.That(data.ResourceName).ExistsInAzure(r),
98+
),
99+
},
100+
data.ImportStep("administrator_login_password"),
101+
{
102+
Config: r.hybridSecondaryUsage(data, "Active"),
103+
Check: acceptance.ComposeTestCheckFunc(
104+
check.That(data.ResourceName).ExistsInAzure(r),
105+
),
106+
},
107+
data.ImportStep("administrator_login_password"),
108+
{
109+
Config: r.hybridSecondaryUsage(data, "Passive"),
110+
Check: acceptance.ComposeTestCheckFunc(
111+
check.That(data.ResourceName).ExistsInAzure(r),
112+
),
113+
},
114+
data.ImportStep("administrator_login_password"),
115+
})
116+
}
117+
67118
func TestAccMsSqlManagedInstance_premium(t *testing.T) {
68119
data := acceptance.BuildTestData(t, "azurerm_mssql_managed_instance", "test")
69120
r := MsSqlManagedInstanceResource{}
@@ -394,6 +445,96 @@ resource "azurerm_mssql_managed_instance" "test" {
394445
`, r.template(data, data.Locations.Primary), data.RandomInteger)
395446
}
396447

448+
func (r MsSqlManagedInstanceResource) databaseFormat(data acceptance.TestData, databaseFormat string) string {
449+
return fmt.Sprintf(`
450+
%[1]s
451+
452+
provider "azurerm" {
453+
features {
454+
resource_group {
455+
/* Due to the creation of unmanaged Microsoft.Network/networkIntentPolicies in this service,
456+
prevent_deletion_if_contains_resources has been added here to allow the test resources to be
457+
deleted until this can be properly investigated
458+
*/
459+
prevent_deletion_if_contains_resources = false
460+
}
461+
}
462+
}
463+
464+
resource "azurerm_mssql_managed_instance" "test" {
465+
name = "acctestsqlserver%[2]d"
466+
resource_group_name = azurerm_resource_group.test.name
467+
location = azurerm_resource_group.test.location
468+
469+
license_type = "BasePrice"
470+
sku_name = "GP_Gen5"
471+
storage_size_in_gb = 32
472+
subnet_id = azurerm_subnet.test.id
473+
vcores = 4
474+
475+
administrator_login = "missadministrator"
476+
administrator_login_password = "NCC-1701-D"
477+
478+
database_format = "%[3]s"
479+
480+
depends_on = [
481+
azurerm_subnet_network_security_group_association.test,
482+
azurerm_subnet_route_table_association.test,
483+
]
484+
485+
tags = {
486+
environment = "staging"
487+
database = "test"
488+
}
489+
}
490+
`, r.template(data, data.Locations.Primary), data.RandomInteger, databaseFormat)
491+
}
492+
493+
func (r MsSqlManagedInstanceResource) hybridSecondaryUsage(data acceptance.TestData, hybridSecondaryUsage string) string {
494+
return fmt.Sprintf(`
495+
%[1]s
496+
497+
provider "azurerm" {
498+
features {
499+
resource_group {
500+
/* Due to the creation of unmanaged Microsoft.Network/networkIntentPolicies in this service,
501+
prevent_deletion_if_contains_resources has been added here to allow the test resources to be
502+
deleted until this can be properly investigated
503+
*/
504+
prevent_deletion_if_contains_resources = false
505+
}
506+
}
507+
}
508+
509+
resource "azurerm_mssql_managed_instance" "test" {
510+
name = "acctestsqlserver%[2]d"
511+
resource_group_name = azurerm_resource_group.test.name
512+
location = azurerm_resource_group.test.location
513+
514+
license_type = "BasePrice"
515+
sku_name = "GP_Gen5"
516+
storage_size_in_gb = 32
517+
subnet_id = azurerm_subnet.test.id
518+
vcores = 4
519+
520+
administrator_login = "missadministrator"
521+
administrator_login_password = "NCC-1701-D"
522+
523+
hybrid_secondary_usage = "%[3]s"
524+
525+
depends_on = [
526+
azurerm_subnet_network_security_group_association.test,
527+
azurerm_subnet_route_table_association.test,
528+
]
529+
530+
tags = {
531+
environment = "staging"
532+
database = "test"
533+
}
534+
}
535+
`, r.template(data, data.Locations.Primary), data.RandomInteger, hybridSecondaryUsage)
536+
}
537+
397538
func (r MsSqlManagedInstanceResource) basicZRS(data acceptance.TestData) string {
398539
return fmt.Sprintf(`
399540
%[1]s

website/docs/r/mssql_managed_instance.html.markdown

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,8 +233,14 @@ The following arguments are supported:
233233

234234
* `collation` - (Optional) Specifies how the SQL Managed Instance will be collated. Default value is `SQL_Latin1_General_CP1_CI_AS`. Changing this forces a new resource to be created.
235235

236+
* `database_format` - (Optional) Specifies the internal format of the SQL Managed Instance databases specific to the SQL engine version. Possible values are `AlwaysUpToDate` and `SQLServer2022`. Defaults to `SQLServer2022`.
237+
238+
~> **Note:** Changing `database_format` from `AlwaysUpToDate` to `SQLServer2022` forces a new SQL Managed Instance to be created.
239+
236240
* `dns_zone_partner_id` - (Optional) The ID of the SQL Managed Instance which will share the DNS zone. This is a prerequisite for creating an `azurerm_sql_managed_instance_failover_group`. Setting this after creation forces a new resource to be created.
237241

242+
* `hybrid_secondary_usage` - (Optional) Specifies the hybrid secondary usage for disaster recovery of the SQL Managed Instance. Possible values are `Active` and `Passive`. Defaults to `Active`.
243+
238244
* `identity` - (Optional) An `identity` block as defined below.
239245

240246
* `maintenance_configuration_name` - (Optional) The name of the Public Maintenance Configuration window to apply to the SQL Managed Instance. Valid values include `SQL_Default` or an Azure Location in the format `SQL_{Location}_MI_{Size}`(for example `SQL_EastUS_MI_1`). Defaults to `SQL_Default`.

0 commit comments

Comments
 (0)