Skip to content

Commit 800cbff

Browse files
feat: add retry variable to all azapi resources (#272)
Add a configurable retry variable that is passed to all azapi_resource, azapi_update_resource, and azapi_resource_action resources across the root module, slot submodule, and all config submodules. The default retries on 409 Conflict errors caused by concurrent operations ('Cannot modify this site because another operation is in progress') with 10 second intervals and up to 3 retries.
1 parent 1f5d6c0 commit 800cbff

53 files changed

Lines changed: 566 additions & 3 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

README.md

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1615,6 +1615,34 @@ object({
16151615

16161616
Default: `null`
16171617

1618+
### <a name="input_retry"></a> [retry](#input\_retry)
1619+
1620+
Description: Retry configuration for all azapi resources. Defaults to retrying on 409 Conflict errors caused by concurrent operations.
1621+
1622+
- `error_message_regex` - (Required) A list of regular expressions to match against error messages. If any match, the operation will be retried.
1623+
- `interval_seconds` - (Optional) The initial interval in seconds between retries. Defaults to `10`.
1624+
- `max_retries` - (Optional) The maximum number of retries. Defaults to `3`.
1625+
1626+
Type:
1627+
1628+
```hcl
1629+
object({
1630+
error_message_regex = list(string)
1631+
interval_seconds = optional(number, 10)
1632+
max_retries = optional(number, 3)
1633+
})
1634+
```
1635+
1636+
Default:
1637+
1638+
```json
1639+
{
1640+
"error_message_regex": [
1641+
"Cannot modify this site because another operation is in progress"
1642+
]
1643+
}
1644+
```
1645+
16181646
### <a name="input_role_assignments"></a> [role\_assignments](#input\_role\_assignments)
16191647

16201648
Description: A map of role assignments to create on this resource. The map key is deliberately arbitrary to avoid issues where map keys maybe unknown at plan time.

examples/windows_dotnet10/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ resource "azapi_resource" "service_plan" {
3737
body = {
3838
kind = "app"
3939
sku = {
40-
name = "P1v2"
40+
name = "P1v3"
4141
}
4242
properties = {
4343
reserved = false

examples/windows_dotnet10/main.tf

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ resource "azapi_resource" "service_plan" {
2626
body = {
2727
kind = "app"
2828
sku = {
29-
name = "P1v2"
29+
name = "P1v3"
3030
}
3131
properties = {
3232
reserved = false

main.auth.tf

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ module "config_authsettings" {
1515
google = each.value.google
1616
issuer = each.value.issuer
1717
microsoft = each.value.microsoft
18+
retry = var.retry
1819
runtime_version = each.value.runtime_version
1920
token_refresh_extension_hours = each.value.token_refresh_extension_hours
2021
token_store_enabled = each.value.token_store_enabled
@@ -39,6 +40,7 @@ module "config_authsettingsv2" {
3940
redirect_to_provider = each.value.redirect_to_provider
4041
require_authentication = each.value.require_authentication
4142
require_https = each.value.require_https
43+
retry = var.retry
4244
runtime_version = each.value.runtime_version
4345
unauthenticated_client_action = each.value.unauthenticated_client_action
4446
}

main.backup.tf

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ module "config_backup" {
55
parent_id = azapi_resource.this.id
66
backup_name = coalesce(each.value.name, "backup-${var.name}")
77
enabled = each.value.enabled
8+
retry = var.retry
89
schedule = each.value.schedule != null ? {
910
for sk, sv in each.value.schedule : sk => sv
1011
}[keys(each.value.schedule)[0]] : null

main.config.tf

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,27 +3,31 @@ module "config_appsettings" {
33

44
app_settings = local.merged_app_settings
55
parent_id = azapi_resource.this.id
6+
retry = var.retry
67
}
78

89
module "config_connectionstrings" {
910
source = "./modules/config_connectionstrings"
1011

1112
connection_strings = var.connection_strings
1213
parent_id = azapi_resource.this.id
14+
retry = var.retry
1315
}
1416

1517
module "config_azurestorageaccounts" {
1618
source = "./modules/config_azurestorageaccounts"
1719

1820
parent_id = azapi_resource.this.id
1921
storage_shares_to_mount = var.storage_shares_to_mount
22+
retry = var.retry
2023
}
2124

2225
module "config_metadata" {
2326
source = "./modules/config_metadata"
2427

2528
metadata = { for m in coalesce(module.site_config_helpers.site_config_metadata, []) : m.name => m.value }
2629
parent_id = azapi_resource.this.id
30+
retry = var.retry
2731
}
2832

2933
module "config_slotconfignames" {
@@ -33,6 +37,7 @@ module "config_slotconfignames" {
3337
parent_id = azapi_resource.this.id
3438
app_setting_names = flatten([for k, v in var.sticky_settings : coalesce(v.app_setting_names, [])])
3539
connection_string_names = flatten([for k, v in var.sticky_settings : coalesce(v.connection_string_names, [])])
40+
retry = var.retry
3641
}
3742

3843
module "ftp_publishing_credential_policy" {
@@ -42,6 +47,7 @@ module "ftp_publishing_credential_policy" {
4247
name = "ftp"
4348
parent_id = azapi_resource.this.id
4449
allow = false
50+
retry = var.retry
4551
}
4652

4753
module "scm_publishing_credential_policy" {
@@ -51,4 +57,5 @@ module "scm_publishing_credential_policy" {
5157
name = "scm"
5258
parent_id = azapi_resource.this.id
5359
allow = false
60+
retry = var.retry
5461
}

main.custom_domains.tf

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ module "hostname_binding" {
44

55
hostname = each.value.hostname
66
parent_id = azapi_resource.this.id
7+
retry = var.retry
78
ssl_state = each.value.ssl_state
89
thumbprint = each.value.thumbprint
910
}
@@ -14,6 +15,7 @@ module "slot_hostname_binding" {
1415

1516
hostname = each.value.hostname
1617
parent_id = module.slot[each.value.app_service_slot_key].resource_id
18+
retry = var.retry
1719
ssl_state = each.value.ssl_state
1820
thumbprint = each.value.thumbprint
1921
}

main.deploy.tf

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ module "extensions_zipdeploy" {
2020

2121
parent_id = azapi_resource.this.id
2222
zip_deploy_file = var.zip_deploy_file
23+
retry = var.retry
2324

2425
depends_on = [
2526
time_sleep.wait_before_zip_deploy,

main.interfaces.tf

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ resource "azapi_resource" "lock" {
2727
delete_headers = var.enable_telemetry ? { "User-Agent" : local.avm_azapi_header } : null
2828
read_headers = var.enable_telemetry ? { "User-Agent" : local.avm_azapi_header } : null
2929
response_export_values = []
30+
retry = var.retry
3031
update_headers = var.enable_telemetry ? { "User-Agent" : local.avm_azapi_header } : null
3132
}
3233

@@ -42,6 +43,7 @@ resource "azapi_resource" "role_assignment" {
4243
ignore_null_property = true
4344
read_headers = var.enable_telemetry ? { "User-Agent" : local.avm_azapi_header } : null
4445
response_export_values = []
46+
retry = var.retry
4547
update_headers = var.enable_telemetry ? { "User-Agent" : local.avm_azapi_header } : null
4648
}
4749

@@ -57,6 +59,7 @@ resource "azapi_resource" "private_endpoint" {
5759
delete_headers = var.enable_telemetry ? { "User-Agent" : local.avm_azapi_header } : null
5860
read_headers = var.enable_telemetry ? { "User-Agent" : local.avm_azapi_header } : null
5961
response_export_values = []
62+
retry = var.retry
6063
tags = each.value.tags
6164
update_headers = var.enable_telemetry ? { "User-Agent" : local.avm_azapi_header } : null
6265
}
@@ -72,6 +75,7 @@ resource "azapi_resource" "private_dns_zone_group" {
7275
delete_headers = var.enable_telemetry ? { "User-Agent" : local.avm_azapi_header } : null
7376
read_headers = var.enable_telemetry ? { "User-Agent" : local.avm_azapi_header } : null
7477
response_export_values = []
78+
retry = var.retry
7579
update_headers = var.enable_telemetry ? { "User-Agent" : local.avm_azapi_header } : null
7680
}
7781

@@ -86,6 +90,7 @@ resource "azapi_resource" "lock_private_endpoint" {
8690
delete_headers = var.enable_telemetry ? { "User-Agent" : local.avm_azapi_header } : null
8791
read_headers = var.enable_telemetry ? { "User-Agent" : local.avm_azapi_header } : null
8892
response_export_values = []
93+
retry = var.retry
8994
update_headers = var.enable_telemetry ? { "User-Agent" : local.avm_azapi_header } : null
9095
}
9196

@@ -100,6 +105,7 @@ resource "azapi_resource" "role_assignment_private_endpoint" {
100105
delete_headers = var.enable_telemetry ? { "User-Agent" : local.avm_azapi_header } : null
101106
read_headers = var.enable_telemetry ? { "User-Agent" : local.avm_azapi_header } : null
102107
response_export_values = []
108+
retry = var.retry
103109
update_headers = var.enable_telemetry ? { "User-Agent" : local.avm_azapi_header } : null
104110
}
105111

@@ -115,6 +121,7 @@ resource "azapi_resource" "diagnostic_setting" {
115121
ignore_null_property = true
116122
read_headers = var.enable_telemetry ? { "User-Agent" : local.avm_azapi_header } : null
117123
response_export_values = []
124+
retry = var.retry
118125
update_headers = var.enable_telemetry ? { "User-Agent" : local.avm_azapi_header } : null
119126
}
120127

main.logs.tf

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,5 @@ module "config_logs" {
1111
http_logs = length(each.value.http_logs) > 0 ? {
1212
for hlk, hlv in each.value.http_logs : hlk => hlv
1313
}[keys(each.value.http_logs)[0]] : null
14+
retry = var.retry
1415
}

0 commit comments

Comments
 (0)