diff --git a/internal/features/defaults.go b/internal/features/defaults.go index 183ac1b3d379..0e57dcc72320 100644 --- a/internal/features/defaults.go +++ b/internal/features/defaults.go @@ -75,8 +75,9 @@ func Default() UserFeatures { PurgeSoftDeletedWorkspaceOnDestroy: false, }, RecoveryService: RecoveryServiceFeatures{ - VMBackupStopProtectionAndRetainDataOnDestroy: false, - PurgeProtectedItemsFromVaultOnDestroy: false, + VMBackupStopProtectionAndRetainDataOnDestroy: false, + VMBackupSuspendProtectionAndRetainDataOnDestroy: false, + PurgeProtectedItemsFromVaultOnDestroy: false, }, NetApp: NetAppFeatures{ DeleteBackupsOnBackupVaultDestroy: false, diff --git a/internal/features/user_flags.go b/internal/features/user_flags.go index 53d1351ea2b7..9afd936df809 100644 --- a/internal/features/user_flags.go +++ b/internal/features/user_flags.go @@ -107,8 +107,9 @@ type MachineLearningFeatures struct { } type RecoveryServiceFeatures struct { - VMBackupStopProtectionAndRetainDataOnDestroy bool - PurgeProtectedItemsFromVaultOnDestroy bool + VMBackupStopProtectionAndRetainDataOnDestroy bool + VMBackupSuspendProtectionAndRetainDataOnDestroy bool + PurgeProtectedItemsFromVaultOnDestroy bool } type NetAppFeatures struct { diff --git a/internal/provider/features.go b/internal/provider/features.go index 0becb67ac8db..25b07caab50b 100644 --- a/internal/provider/features.go +++ b/internal/provider/features.go @@ -375,9 +375,16 @@ func schemaFeatures(supportLegacyTestSuite bool) *pluginsdk.Schema { Elem: &pluginsdk.Resource{ Schema: map[string]*pluginsdk.Schema{ "vm_backup_stop_protection_and_retain_data_on_destroy": { - Type: pluginsdk.TypeBool, - Optional: true, - Default: false, + Type: pluginsdk.TypeBool, + Optional: true, + Default: false, + ExactlyOneOf: []string{"features.0.recovery_service.0.vm_backup_stop_protection_and_retain_data_on_destroy", "features.0.recovery_service.0.vm_backup_suspend_protection_and_retain_data_on_destroy"}, + }, + "vm_backup_suspend_protection_and_retain_data_on_destroy": { + Type: pluginsdk.TypeBool, + Optional: true, + Default: false, + ExactlyOneOf: []string{"features.0.recovery_service.0.vm_backup_stop_protection_and_retain_data_on_destroy", "features.0.recovery_service.0.vm_backup_suspend_protection_and_retain_data_on_destroy"}, }, "purge_protected_items_from_vault_on_destroy": { Type: pluginsdk.TypeBool, @@ -417,6 +424,8 @@ func schemaFeatures(supportLegacyTestSuite bool) *pluginsdk.Schema { return &pluginsdk.Schema{ Type: pluginsdk.TypeList, Optional: true, + MaxItems: 1, + MinItems: 1, Elem: &pluginsdk.Resource{ Schema: featuresMap, }, @@ -664,6 +673,9 @@ func expandFeatures(input []interface{}) features.UserFeatures { if v, ok := recoveryServicesRaw["vm_backup_stop_protection_and_retain_data_on_destroy"]; ok { featuresMap.RecoveryService.VMBackupStopProtectionAndRetainDataOnDestroy = v.(bool) } + if v, ok := recoveryServicesRaw["vm_backup_suspend_protection_and_retain_data_on_destroy"]; ok { + featuresMap.RecoveryService.VMBackupSuspendProtectionAndRetainDataOnDestroy = v.(bool) + } if v, ok := recoveryServicesRaw["purge_protected_items_from_vault_on_destroy"]; ok { featuresMap.RecoveryService.PurgeProtectedItemsFromVaultOnDestroy = v.(bool) } diff --git a/internal/provider/features_test.go b/internal/provider/features_test.go index e9191a67aa0a..e0c6151bcdf9 100644 --- a/internal/provider/features_test.go +++ b/internal/provider/features_test.go @@ -88,8 +88,9 @@ func TestExpandFeatures(t *testing.T) { PurgeSoftDeletedWorkspaceOnDestroy: false, }, RecoveryService: features.RecoveryServiceFeatures{ - VMBackupStopProtectionAndRetainDataOnDestroy: false, - PurgeProtectedItemsFromVaultOnDestroy: false, + VMBackupStopProtectionAndRetainDataOnDestroy: false, + VMBackupSuspendProtectionAndRetainDataOnDestroy: false, + PurgeProtectedItemsFromVaultOnDestroy: false, }, NetApp: features.NetAppFeatures{ DeleteBackupsOnBackupVaultDestroy: false, @@ -201,8 +202,9 @@ func TestExpandFeatures(t *testing.T) { }, "recovery_service": []interface{}{ map[string]interface{}{ - "vm_backup_stop_protection_and_retain_data_on_destroy": true, - "purge_protected_items_from_vault_on_destroy": true, + "vm_backup_stop_protection_and_retain_data_on_destroy": true, + "vm_backup_suspend_protection_and_retain_data_on_destroy": true, + "purge_protected_items_from_vault_on_destroy": true, }, }, "netapp": []interface{}{ @@ -281,8 +283,9 @@ func TestExpandFeatures(t *testing.T) { PurgeSoftDeletedWorkspaceOnDestroy: true, }, RecoveryService: features.RecoveryServiceFeatures{ - VMBackupStopProtectionAndRetainDataOnDestroy: true, - PurgeProtectedItemsFromVaultOnDestroy: true, + VMBackupStopProtectionAndRetainDataOnDestroy: true, + VMBackupSuspendProtectionAndRetainDataOnDestroy: true, + PurgeProtectedItemsFromVaultOnDestroy: true, }, NetApp: features.NetAppFeatures{ DeleteBackupsOnBackupVaultDestroy: true, @@ -394,8 +397,9 @@ func TestExpandFeatures(t *testing.T) { }, "recovery_service": []interface{}{ map[string]interface{}{ - "vm_backup_stop_protection_and_retain_data_on_destroy": false, - "purge_protected_items_from_vault_on_destroy": false, + "vm_backup_stop_protection_and_retain_data_on_destroy": false, + "vm_backup_suspend_protection_and_retain_data_on_destroy": false, + "purge_protected_items_from_vault_on_destroy": false, }, }, "netapp": []interface{}{ @@ -474,8 +478,9 @@ func TestExpandFeatures(t *testing.T) { PurgeSoftDeletedWorkspaceOnDestroy: false, }, RecoveryService: features.RecoveryServiceFeatures{ - VMBackupStopProtectionAndRetainDataOnDestroy: false, - PurgeProtectedItemsFromVaultOnDestroy: false, + VMBackupStopProtectionAndRetainDataOnDestroy: false, + VMBackupSuspendProtectionAndRetainDataOnDestroy: false, + PurgeProtectedItemsFromVaultOnDestroy: false, }, NetApp: features.NetAppFeatures{ DeleteBackupsOnBackupVaultDestroy: false, @@ -1716,8 +1721,9 @@ func TestExpandFeaturesRecoveryService(t *testing.T) { }, Expected: features.UserFeatures{ RecoveryService: features.RecoveryServiceFeatures{ - VMBackupStopProtectionAndRetainDataOnDestroy: false, - PurgeProtectedItemsFromVaultOnDestroy: false, + VMBackupStopProtectionAndRetainDataOnDestroy: false, + VMBackupSuspendProtectionAndRetainDataOnDestroy: false, + PurgeProtectedItemsFromVaultOnDestroy: false, }, }, }, @@ -1727,16 +1733,18 @@ func TestExpandFeaturesRecoveryService(t *testing.T) { map[string]interface{}{ "recovery_service": []interface{}{ map[string]interface{}{ - "vm_backup_stop_protection_and_retain_data_on_destroy": true, - "purge_protected_items_from_vault_on_destroy": true, + "vm_backup_stop_protection_and_retain_data_on_destroy": true, + "vm_backup_suspend_protection_and_retain_data_on_destroy": true, + "purge_protected_items_from_vault_on_destroy": true, }, }, }, }, Expected: features.UserFeatures{ RecoveryService: features.RecoveryServiceFeatures{ - VMBackupStopProtectionAndRetainDataOnDestroy: true, - PurgeProtectedItemsFromVaultOnDestroy: true, + VMBackupStopProtectionAndRetainDataOnDestroy: true, + VMBackupSuspendProtectionAndRetainDataOnDestroy: true, + PurgeProtectedItemsFromVaultOnDestroy: true, }, }, }, @@ -1746,16 +1754,18 @@ func TestExpandFeaturesRecoveryService(t *testing.T) { map[string]interface{}{ "recovery_service": []interface{}{ map[string]interface{}{ - "vm_backup_stop_protection_and_retain_data_on_destroy": false, - "purge_protected_items_from_vault_on_destroy": false, + "vm_backup_stop_protection_and_retain_data_on_destroy": false, + "vm_backup_suspend_protection_and_retain_data_on_destroy": false, + "purge_protected_items_from_vault_on_destroy": false, }, }, }, }, Expected: features.UserFeatures{ RecoveryService: features.RecoveryServiceFeatures{ - VMBackupStopProtectionAndRetainDataOnDestroy: false, - PurgeProtectedItemsFromVaultOnDestroy: false, + VMBackupStopProtectionAndRetainDataOnDestroy: false, + VMBackupSuspendProtectionAndRetainDataOnDestroy: false, + PurgeProtectedItemsFromVaultOnDestroy: false, }, }, }, diff --git a/internal/provider/framework/config.go b/internal/provider/framework/config.go index e15a877224be..c7f55646c463 100644 --- a/internal/provider/framework/config.go +++ b/internal/provider/framework/config.go @@ -473,6 +473,11 @@ func (p *ProviderConfig) Load(ctx context.Context, data *ProviderModel, tfVersio f.RecoveryService.VMBackupStopProtectionAndRetainDataOnDestroy = feature[0].VMBackupStopProtectionAndRetainDataOnDestroy.ValueBool() } + f.RecoveryService.VMBackupSuspendProtectionAndRetainDataOnDestroy = false + if !feature[0].VMBackupSuspendProtectionAndRetainDataOnDestroy.IsNull() && !feature[0].VMBackupSuspendProtectionAndRetainDataOnDestroy.IsUnknown() { + f.RecoveryService.VMBackupSuspendProtectionAndRetainDataOnDestroy = feature[0].VMBackupSuspendProtectionAndRetainDataOnDestroy.ValueBool() + } + f.RecoveryService.PurgeProtectedItemsFromVaultOnDestroy = false if !feature[0].PurgeProtectedItemsFromVaultOnDestroy.IsNull() && !feature[0].PurgeProtectedItemsFromVaultOnDestroy.IsUnknown() { f.RecoveryService.PurgeProtectedItemsFromVaultOnDestroy = feature[0].PurgeProtectedItemsFromVaultOnDestroy.ValueBool() diff --git a/internal/provider/framework/config_test.go b/internal/provider/framework/config_test.go index 70a8cd6c0499..7cefb14a90c9 100644 --- a/internal/provider/framework/config_test.go +++ b/internal/provider/framework/config_test.go @@ -192,7 +192,11 @@ func TestProviderConfig_LoadDefault(t *testing.T) { } if features.RecoveryService.VMBackupStopProtectionAndRetainDataOnDestroy { - t.Errorf("expected recver_services.vm_backup_stop_protection_and_retain_data_on_destroy to be false") + t.Errorf("expected recovery_service.vm_backup_stop_protection_and_retain_data_on_destroy to be false") + } + + if features.RecoveryService.VMBackupSuspendProtectionAndRetainDataOnDestroy { + t.Errorf("expected recovery_service.vm_backup_suspend_protection_and_retain_data_on_destroy to be false") } if features.RecoveryService.PurgeProtectedItemsFromVaultOnDestroy { @@ -306,14 +310,16 @@ func defaultFeaturesList() types.List { machineLearningList, _ := basetypes.NewListValue(types.ObjectType{}.WithAttributeTypes(MachineLearningAttributes), []attr.Value{machineLearning}) recoveryServices, _ := basetypes.NewObjectValueFrom(context.Background(), RecoveryServiceAttributes, map[string]attr.Value{ - "vm_backup_stop_protection_and_retain_data_on_destroy": basetypes.NewBoolNull(), - "purge_protected_items_from_vault_on_destroy": basetypes.NewBoolNull(), + "vm_backup_stop_protection_and_retain_data_on_destroy": basetypes.NewBoolNull(), + "vm_backup_suspend_protection_and_retain_data_on_destroy": basetypes.NewBoolNull(), + "purge_protected_items_from_vault_on_destroy": basetypes.NewBoolNull(), }) recoveryServicesList, _ := basetypes.NewListValue(types.ObjectType{}.WithAttributeTypes(RecoveryServiceAttributes), []attr.Value{recoveryServices}) recoveryServicesVaults, _ := basetypes.NewObjectValueFrom(context.Background(), RecoveryServiceVaultsAttributes, map[string]attr.Value{ - "vm_backup_stop_protection_and_retain_data_on_destroy": basetypes.NewBoolNull(), - "purge_protected_items_from_vault_on_destroy": basetypes.NewBoolNull(), + "vm_backup_stop_protection_and_retain_data_on_destroy": basetypes.NewBoolNull(), + "vm_backup_suspend_protection_and_retain_data_on_destroy": basetypes.NewBoolNull(), + "purge_protected_items_from_vault_on_destroy": basetypes.NewBoolNull(), }) recoveryServicesVaultsList, _ := basetypes.NewListValue(types.ObjectType{}.WithAttributeTypes(RecoveryServiceVaultsAttributes), []attr.Value{recoveryServicesVaults}) diff --git a/internal/provider/framework/model.go b/internal/provider/framework/model.go index 082edef187c8..ec1563bb6843 100644 --- a/internal/provider/framework/model.go +++ b/internal/provider/framework/model.go @@ -241,13 +241,15 @@ var MachineLearningAttributes = map[string]attr.Type{ } type RecoveryService struct { - VMBackupStopProtectionAndRetainDataOnDestroy types.Bool `tfsdk:"vm_backup_stop_protection_and_retain_data_on_destroy"` - PurgeProtectedItemsFromVaultOnDestroy types.Bool `tfsdk:"purge_protected_items_from_vault_on_destroy"` + VMBackupStopProtectionAndRetainDataOnDestroy types.Bool `tfsdk:"vm_backup_stop_protection_and_retain_data_on_destroy"` + VMBackupSuspendProtectionAndRetainDataOnDestroy types.Bool `tfsdk:"vm_backup_suspend_protection_and_retain_data_on_destroy"` + PurgeProtectedItemsFromVaultOnDestroy types.Bool `tfsdk:"purge_protected_items_from_vault_on_destroy"` } var RecoveryServiceAttributes = map[string]attr.Type{ - "vm_backup_stop_protection_and_retain_data_on_destroy": types.BoolType, - "purge_protected_items_from_vault_on_destroy": types.BoolType, + "vm_backup_stop_protection_and_retain_data_on_destroy": types.BoolType, + "vm_backup_suspend_protection_and_retain_data_on_destroy": types.BoolType, + "purge_protected_items_from_vault_on_destroy": types.BoolType, } type RecoveryServiceVaults struct { diff --git a/internal/provider/framework/provider.go b/internal/provider/framework/provider.go index f44dd24be3e4..5a5ed51daa97 100644 --- a/internal/provider/framework/provider.go +++ b/internal/provider/framework/provider.go @@ -453,6 +453,9 @@ func (p *azureRmFrameworkProvider) Schema(_ context.Context, _ provider.SchemaRe "vm_backup_stop_protection_and_retain_data_on_destroy": schema.BoolAttribute{ Optional: true, }, + "vm_backup_suspend_protection_and_retain_data_on_destroy": schema.BoolAttribute{ + Optional: true, + }, "purge_protected_items_from_vault_on_destroy": schema.BoolAttribute{ Optional: true, }, diff --git a/internal/services/recoveryservices/backup_protected_vm_resource.go b/internal/services/recoveryservices/backup_protected_vm_resource.go index 68b2ec87fa58..8a5315283dc1 100644 --- a/internal/services/recoveryservices/backup_protected_vm_resource.go +++ b/internal/services/recoveryservices/backup_protected_vm_resource.go @@ -357,7 +357,9 @@ func resourceRecoveryServicesBackupProtectedVMDelete(d *pluginsdk.ResourceData, return err } - if meta.(*clients.Client).Features.RecoveryService.VMBackupStopProtectionAndRetainDataOnDestroy { + features := meta.(*clients.Client).Features.RecoveryService + + if features.VMBackupStopProtectionAndRetainDataOnDestroy || features.VMBackupSuspendProtectionAndRetainDataOnDestroy { log.Printf("[DEBUG] Retaining Data and Stopping Protection for %s", id) existing, err := client.Get(ctx, *id, protecteditems.GetOperationOptions{}) @@ -370,19 +372,24 @@ func resourceRecoveryServicesBackupProtectedVMDelete(d *pluginsdk.ResourceData, return fmt.Errorf("making Read request on %s: %+v", id, err) } + desiredState := protecteditems.ProtectionStateProtectionStopped + if features.VMBackupSuspendProtectionAndRetainDataOnDestroy { + desiredState = protecteditems.ProtectionStateBackupsSuspended + } + if model := existing.Model; model != nil { if properties := model.Properties; properties != nil { if vm, ok := properties.(protecteditems.AzureIaaSComputeVMProtectedItem); ok { updateInput := protecteditems.ProtectedItemResource{ Properties: &protecteditems.AzureIaaSComputeVMProtectedItem{ - ProtectionState: pointer.To(protecteditems.ProtectionStateProtectionStopped), + ProtectionState: pointer.To(desiredState), SourceResourceId: vm.SourceResourceId, }, } resp, err := client.CreateOrUpdate(ctx, *id, updateInput) if err != nil { - return fmt.Errorf("stopping protection and retaining data for %s: %+v", id, err) + return fmt.Errorf("setting protection to %s and retaining data for %s: %+v", desiredState, id, err) } operationId, err := parseBackupOperationId(resp.HttpResponse) @@ -415,7 +422,7 @@ func resourceRecoveryServicesBackupProtectedVMDelete(d *pluginsdk.ResourceData, } if err = resourceRecoveryServicesBackupProtectedVMWaitForDeletion(ctx, client, opResultClient, *id, operationId); err != nil { - return err + return fmt.Errorf("waiting for deletion %s: %+v", id, err) } return nil @@ -442,8 +449,7 @@ func resourceRecoveryServicesBackupProtectedVMWaitForStateCreateUpdate(ctx conte }, } - _, err := state.WaitForStateContext(ctx) - if err != nil { + if _, err := state.WaitForStateContext(ctx); err != nil { return fmt.Errorf("waiting for %s to provision: %+v", id, err) } diff --git a/internal/services/recoveryservices/backup_protected_vm_resource_test.go b/internal/services/recoveryservices/backup_protected_vm_resource_test.go index 0adcf7c8284e..8c6ce18b09bf 100644 --- a/internal/services/recoveryservices/backup_protected_vm_resource_test.go +++ b/internal/services/recoveryservices/backup_protected_vm_resource_test.go @@ -251,6 +251,25 @@ func TestAccBackupProtectedVm_protectionStoppedOnDestroy(t *testing.T) { }) } +func TestAccBackupProtectedVm_protectionSuspendedOnDestroy(t *testing.T) { + data := acceptance.BuildTestData(t, "azurerm_backup_protected_vm", "test") + r := BackupProtectedVmResource{} + + data.ResourceTest(t, r, []acceptance.TestStep{ + { + Config: r.basicWithSuspendProtection(data, false), + Check: acceptance.ComposeTestCheckFunc( + check.That(data.ResourceName).ExistsInAzure(r), + check.That(data.ResourceName).Key("resource_group_name").Exists(), + ), + }, + data.ImportStep(), + { + Config: r.basicWithSuspendProtection(data, true), + }, + }) +} + func TestAccBackupProtectedVm_recoverSoftDeletedVM(t *testing.T) { data := acceptance.BuildTestData(t, "azurerm_backup_protected_vm", "test") r := BackupProtectedVmResource{} @@ -1127,3 +1146,158 @@ provider "azurerm" { %s `, r.baseWithSoftDelete(data), protectedVMBlock) } + +func (r BackupProtectedVmResource) basicWithSuspendProtection(data acceptance.TestData, deleted bool) string { + protectedVMBlock := ` +resource "azurerm_backup_protected_vm" "test" { + resource_group_name = azurerm_resource_group.test.name + recovery_vault_name = azurerm_recovery_services_vault.test.name + source_vm_id = azurerm_virtual_machine.test.id + backup_policy_id = join("/", [azurerm_recovery_services_vault.test.id, "backupPolicies/EnhancedPolicy"]) + + include_disk_luns = [0] +} +` + if deleted { + protectedVMBlock = "" + } + + return fmt.Sprintf(` +provider "azurerm" { + features { + recovery_service { + vm_backup_suspend_protection_and_retain_data_on_destroy = true + purge_protected_items_from_vault_on_destroy = true + } + } +} + +resource "azurerm_resource_group" "test" { + name = "acctestRG-backup-%[1]d" + location = "%[2]s" +} + +resource "azurerm_virtual_network" "test" { + name = "vnet" + location = azurerm_resource_group.test.location + address_space = ["10.0.0.0/16"] + resource_group_name = azurerm_resource_group.test.name +} + +resource "azurerm_subnet" "test" { + name = "acctest_subnet" + virtual_network_name = azurerm_virtual_network.test.name + resource_group_name = azurerm_resource_group.test.name + address_prefixes = ["10.0.10.0/24"] +} + +resource "azurerm_network_interface" "test" { + name = "acctest_nic" + location = azurerm_resource_group.test.location + resource_group_name = azurerm_resource_group.test.name + + ip_configuration { + name = "acctestipconfig" + subnet_id = azurerm_subnet.test.id + private_ip_address_allocation = "Dynamic" + public_ip_address_id = azurerm_public_ip.test.id + } +} + +resource "azurerm_public_ip" "test" { + name = "acctest-ip" + location = azurerm_resource_group.test.location + resource_group_name = azurerm_resource_group.test.name + sku = "Basic" + allocation_method = "Dynamic" + domain_name_label = "acctestip%[1]d" +} + +resource "azurerm_storage_account" "test" { + name = "acctest%[3]s" + location = azurerm_resource_group.test.location + resource_group_name = azurerm_resource_group.test.name + account_tier = "Standard" + account_replication_type = "LRS" +} + +resource "azurerm_managed_disk" "test" { + name = "acctest-datadisk" + location = azurerm_resource_group.test.location + resource_group_name = azurerm_resource_group.test.name + storage_account_type = "Standard_LRS" + create_option = "Empty" + disk_size_gb = "1023" +} + +resource "azurerm_virtual_machine" "test" { + name = "acctestvm" + location = azurerm_resource_group.test.location + resource_group_name = azurerm_resource_group.test.name + vm_size = "Standard_D1_v2" + network_interface_ids = [azurerm_network_interface.test.id] + + delete_os_disk_on_termination = true + delete_data_disks_on_termination = true + + storage_image_reference { + publisher = "Canonical" + offer = "0001-com-ubuntu-server-jammy" + sku = "22_04-lts" + version = "latest" + } + + storage_os_disk { + name = "acctest-osdisk" + managed_disk_type = "Standard_LRS" + caching = "ReadWrite" + create_option = "FromImage" + } + + storage_data_disk { + name = "acctest-datadisk" + managed_disk_id = azurerm_managed_disk.test.id + managed_disk_type = "Standard_LRS" + disk_size_gb = azurerm_managed_disk.test.disk_size_gb + create_option = "Attach" + lun = 0 + } + + storage_data_disk { + name = "acctest-another-datadisk" + create_option = "Empty" + disk_size_gb = "1" + lun = 1 + managed_disk_type = "Standard_LRS" + } + + os_profile { + computer_name = "acctest" + admin_username = "vmadmin" + admin_password = "Password123!@#" + } + + os_profile_linux_config { + disable_password_authentication = false + } + + boot_diagnostics { + enabled = true + storage_uri = azurerm_storage_account.test.primary_blob_endpoint + } + +} + +resource "azurerm_recovery_services_vault" "test" { + name = "acctest-%[1]d" + location = azurerm_resource_group.test.location + resource_group_name = azurerm_resource_group.test.name + sku = "Standard" + + soft_delete_enabled = false + immutability = "Unlocked" +} + +%[4]s +`, data.RandomInteger, data.Locations.Primary, data.RandomString, protectedVMBlock) +} diff --git a/website/docs/guides/features-block.html.markdown b/website/docs/guides/features-block.html.markdown index 0ae8ac8639d3..234ab915f8ac 100644 --- a/website/docs/guides/features-block.html.markdown +++ b/website/docs/guides/features-block.html.markdown @@ -72,8 +72,9 @@ provider "azurerm" { } recovery_service { - vm_backup_stop_protection_and_retain_data_on_destroy = true - purge_protected_items_from_vault_on_destroy = true + vm_backup_stop_protection_and_retain_data_on_destroy = true + vm_backup_suspend_protection_and_retain_data_on_destroy = true + purge_protected_items_from_vault_on_destroy = true } resource_group { @@ -241,6 +242,8 @@ The `recovery_service` block supports the following: * `vm_backup_stop_protection_and_retain_data_on_destroy` - (Optional) Should we retain the data and stop protection instead of destroying the backup protected vm? Defaults to `false`. +* `vm_backup_suspend_protection_and_retain_data_on_destroy` - (Optional) Should we retain the data and suspend protection instead of destroying the backup protected vm? Defaults to `false`. + * `purge_protected_items_from_vault_on_destroy` - (Optional) Should we purge all protected items when destroying the vault. Defaults to `false`. ---