From a948854e710b28024cfb13fa0198f155eac2819b Mon Sep 17 00:00:00 2001 From: John McCall Date: Fri, 4 Sep 2026 19:33:20 -0400 Subject: [PATCH 01/16] Add missing check-mode and idempotency assertions to integration tests Fixes #381 --- .../fragments/381-integration-test-gaps.yml | 5 +++++ .../integration/targets/backup/tasks/main.yml | 13 +++++++++++++ .../targets/install_script/tasks/main.yml | 1 + .../targets/win_ag_replica/tasks/main.yml | 11 +++++++++++ .../win_availability_group/tasks/main.yml | 7 +++++++ .../targets/win_install_script/tasks/main.yml | 1 + .../targets/win_restore/tasks/main.yml | 18 ++++++++++++++++++ 7 files changed, 56 insertions(+) create mode 100644 changelogs/fragments/381-integration-test-gaps.yml diff --git a/changelogs/fragments/381-integration-test-gaps.yml b/changelogs/fragments/381-integration-test-gaps.yml new file mode 100644 index 00000000..acd3f9a2 --- /dev/null +++ b/changelogs/fragments/381-integration-test-gaps.yml @@ -0,0 +1,5 @@ +minor_changes: + - Add missing check-mode and idempotency assertions to the ``backup``, ``restore``, + ``availability_group``, and ``ag_replica`` integration test targets, and exercise a + non-default ``deployment_method`` in the ``install_script`` targets + (https://github.com/lowlydba/lowlydba.sqlserver/issues/381). diff --git a/tests/integration/targets/backup/tasks/main.yml b/tests/integration/targets/backup/tasks/main.yml index 98a1ace9..0b31e48d 100644 --- a/tests/integration/targets/backup/tasks/main.yml +++ b/tests/integration/targets/backup/tasks/main.yml @@ -23,3 +23,16 @@ - result.data.End != None - result.data.Duration != None - result is changed + + - name: Backup a database in check mode + lowlydba.sqlserver.backup: + sql_instance: "{{ sqlserver_instance }}" + sql_username: "{{ sqlserver_username }}" + sql_password: "{{ sqlserver_password }}" + database: "{{ database_name }}" + block_size: "16kb" + check_mode: true + register: result + - assert: + that: + - result is changed diff --git a/tests/integration/targets/install_script/tasks/main.yml b/tests/integration/targets/install_script/tasks/main.yml index d26599c8..11cddf0b 100644 --- a/tests/integration/targets/install_script/tasks/main.yml +++ b/tests/integration/targets/install_script/tasks/main.yml @@ -20,6 +20,7 @@ - name: Install a script in no log mode lowlydba.sqlserver.install_script: no_log_version: true + deployment_method: "SingleTransaction" register: result - assert: that: diff --git a/tests/integration/targets/win_ag_replica/tasks/main.yml b/tests/integration/targets/win_ag_replica/tasks/main.yml index feb3acb5..698939a1 100644 --- a/tests/integration/targets/win_ag_replica/tasks/main.yml +++ b/tests/integration/targets/win_ag_replica/tasks/main.yml @@ -78,6 +78,17 @@ - result.data.FailoverMode == failover_mode - result is changed + - name: Set replica again (idempotency check) + lowlydba.sqlserver.ag_replica: + session_timeout: 20 + endpoint_url: "TCP://{{ ag.data.SqlInstance }}:5022" + read_only_routing_list: "{{ ag.data.SqlInstance }}" + read_only_routing_connection_url: "TCP://{{ ag.data.SqlInstance }}:1433" + register: result + - assert: + that: + - result is not changed + always: - name: Drop availability group lowlydba.sqlserver.availability_group: diff --git a/tests/integration/targets/win_availability_group/tasks/main.yml b/tests/integration/targets/win_availability_group/tasks/main.yml index ff96d88e..677a0c40 100644 --- a/tests/integration/targets/win_availability_group/tasks/main.yml +++ b/tests/integration/targets/win_availability_group/tasks/main.yml @@ -64,6 +64,13 @@ - result.data.AvailabilityReplicas != None - result is changed + - name: Create availability group again (idempotency check) + lowlydba.sqlserver.availability_group: + register: result + - assert: + that: + - result is not changed + - name: Change availability group lowlydba.sqlserver.availability_group: dtc_support_enabled: true diff --git a/tests/integration/targets/win_install_script/tasks/main.yml b/tests/integration/targets/win_install_script/tasks/main.yml index 38a00a46..55745e8f 100644 --- a/tests/integration/targets/win_install_script/tasks/main.yml +++ b/tests/integration/targets/win_install_script/tasks/main.yml @@ -28,6 +28,7 @@ lowlydba.sqlserver.install_script: no_log_version: true path: "{{ script_file.dest }}" + deployment_method: "SingleTransaction" register: result - assert: that: diff --git a/tests/integration/targets/win_restore/tasks/main.yml b/tests/integration/targets/win_restore/tasks/main.yml index 88841633..d07d7da8 100644 --- a/tests/integration/targets/win_restore/tasks/main.yml +++ b/tests/integration/targets/win_restore/tasks/main.yml @@ -13,6 +13,23 @@ database: "{{ database_name }}" register: backup_result + - name: Restore a database in check mode + lowlydba.sqlserver.restore: + sql_instance: "{{ sqlserver_instance }}" + sql_username: "{{ sqlserver_username }}" + sql_password: "{{ sqlserver_password }}" + database: "{{ restore_database }}" + path: "{{ backup_result.data.BackupPath }}" + replace_db_name_in_file: true + block_size: "16kb" + destination_file_suffix: "_new" + destination_file_prefix: "db_" + check_mode: true + register: result + - assert: + that: + - result is changed + - name: Restore a database lowlydba.sqlserver.restore: sql_instance: "{{ sqlserver_instance }}" @@ -29,6 +46,7 @@ that: - result.data.SqlInstance != None - result.data.Database == restore_database + - result is changed - name: Test error when restoring to an existing database lowlydba.sqlserver.restore: From 2335ba0504cd5ef7d5a1c93a595b4e07f334f05a Mon Sep 17 00:00:00 2001 From: John McCall Date: Fri, 4 Sep 2026 19:44:40 -0400 Subject: [PATCH 02/16] Add hero image to README --- README.md | 1 + docs/images/hero.png | Bin 0 -> 74858 bytes docs/images/hero.svg | 60 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 61 insertions(+) create mode 100644 docs/images/hero.png create mode 100644 docs/images/hero.svg diff --git a/README.md b/README.md index 5ebcc7b4..7f022977 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,6 @@ # lowlydba.sqlserver Collection for Ansible +![lowlydba.sqlserver](docs/images/hero.png) [![CI](https://github.com/lowlydba/lowlydba.sqlserver/actions/workflows/ansible-test.yml/badge.svg)](https://github.com/lowlydba/lowlydba.sqlserver/actions/workflows/ansible-test.yml) [![CI (Windows)](https://github.com/lowlydba/lowlydba.sqlserver/actions/workflows/ansible-test-windows.yml/badge.svg)](https://github.com/lowlydba/lowlydba.sqlserver/actions/workflows/ansible-test-windows.yml) diff --git a/docs/images/hero.png b/docs/images/hero.png new file mode 100644 index 0000000000000000000000000000000000000000..93e02d9e7a4c4f09d4de049c71fbdb2545c3da1d GIT binary patch literal 74858 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%0A&eLK(G~igd(Dz52V7}< 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 TGwQ0R1wOts|1GstPUe3BT{8Pd literal 0 HcmV?d00001 diff --git a/docs/images/hero.svg b/docs/images/hero.svg new file mode 100644 index 00000000..023031a9 --- /dev/null +++ b/docs/images/hero.svg @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + lowlydba.sqlserver + + + + + Ansible collection for SQL Server management, powered by dbatools + + + + \ No newline at end of file From 1a351c0ba603df3f6a84318a7798aa87931b5738 Mon Sep 17 00:00:00 2001 From: John McCall Date: Fri, 4 Sep 2026 19:46:14 -0400 Subject: [PATCH 03/16] Unwrap changelog fragment line --- changelogs/fragments/381-integration-test-gaps.yml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/changelogs/fragments/381-integration-test-gaps.yml b/changelogs/fragments/381-integration-test-gaps.yml index acd3f9a2..0f511d27 100644 --- a/changelogs/fragments/381-integration-test-gaps.yml +++ b/changelogs/fragments/381-integration-test-gaps.yml @@ -1,5 +1,2 @@ minor_changes: - - Add missing check-mode and idempotency assertions to the ``backup``, ``restore``, - ``availability_group``, and ``ag_replica`` integration test targets, and exercise a - non-default ``deployment_method`` in the ``install_script`` targets - (https://github.com/lowlydba/lowlydba.sqlserver/issues/381). + - Add missing check-mode and idempotency assertions to the ``backup``, ``restore``, ``availability_group``, and ``ag_replica`` integration test targets, and exercise a non-default ``deployment_method`` in the ``install_script`` targets (https://github.com/lowlydba/lowlydba.sqlserver/issues/381). From 9b2b2019cc92799a7d65d7e765d14be822ed0482 Mon Sep 17 00:00:00 2001 From: John McCall Date: Fri, 4 Sep 2026 19:46:57 -0400 Subject: [PATCH 04/16] Drop redundant README header, hero image covers it --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index 7f022977..1aa91b96 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,3 @@ -# lowlydba.sqlserver Collection for Ansible - ![lowlydba.sqlserver](docs/images/hero.png) [![CI](https://github.com/lowlydba/lowlydba.sqlserver/actions/workflows/ansible-test.yml/badge.svg)](https://github.com/lowlydba/lowlydba.sqlserver/actions/workflows/ansible-test.yml) From c0406f8391c827549385704d35c75aa7200b3b8d Mon Sep 17 00:00:00 2001 From: John McCall <16843041+lowlydba@users.noreply.github.com> Date: Fri, 4 Sep 2026 19:52:02 -0400 Subject: [PATCH 05/16] Update README with CI badges and project title Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 1aa91b96..adcab67b 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,6 @@ ![lowlydba.sqlserver](docs/images/hero.png) +# lowlydba.sqlserver Collection for Ansible [![CI](https://github.com/lowlydba/lowlydba.sqlserver/actions/workflows/ansible-test.yml/badge.svg)](https://github.com/lowlydba/lowlydba.sqlserver/actions/workflows/ansible-test.yml) [![CI (Windows)](https://github.com/lowlydba/lowlydba.sqlserver/actions/workflows/ansible-test-windows.yml/badge.svg)](https://github.com/lowlydba/lowlydba.sqlserver/actions/workflows/ansible-test-windows.yml) [![codecov](https://codecov.io/gh/lowlydba/lowlydba.sqlserver/branch/main/graph/badge.svg?token=3TW3VBCn9N)](https://codecov.io/gh/lowlydba/lowlydba.sqlserver) From 34f2490e28ff9dab6c4fd5f5afb70bb6090e0256 Mon Sep 17 00:00:00 2001 From: John McCall <16843041+lowlydba@users.noreply.github.com> Date: Fri, 4 Sep 2026 19:52:13 -0400 Subject: [PATCH 06/16] Refine integration tests with check-mode and idempotency Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- changelogs/fragments/381-integration-test-gaps.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changelogs/fragments/381-integration-test-gaps.yml b/changelogs/fragments/381-integration-test-gaps.yml index 0f511d27..5fdc675c 100644 --- a/changelogs/fragments/381-integration-test-gaps.yml +++ b/changelogs/fragments/381-integration-test-gaps.yml @@ -1,2 +1,2 @@ minor_changes: - - Add missing check-mode and idempotency assertions to the ``backup``, ``restore``, ``availability_group``, and ``ag_replica`` integration test targets, and exercise a non-default ``deployment_method`` in the ``install_script`` targets (https://github.com/lowlydba/lowlydba.sqlserver/issues/381). + - Add check-mode assertions for the ``backup`` and ``restore`` integration test targets, add idempotency assertions for the ``availability_group`` and ``ag_replica`` targets, and exercise a non-default ``deployment_method`` in the ``install_script`` targets (https://github.com/lowlydba/lowlydba.sqlserver/issues/381). From c8980e39fb7178a4b96ee8992f5926e0e73ee246 Mon Sep 17 00:00:00 2001 From: John McCall Date: Fri, 4 Sep 2026 20:13:14 -0400 Subject: [PATCH 07/16] Fix backup/restore check_mode not reporting changed --- changelogs/fragments/381-integration-test-gaps.yml | 2 ++ plugins/modules/backup.ps1 | 4 ++++ plugins/modules/restore.ps1 | 4 ++++ 3 files changed, 10 insertions(+) diff --git a/changelogs/fragments/381-integration-test-gaps.yml b/changelogs/fragments/381-integration-test-gaps.yml index 5fdc675c..64d40f29 100644 --- a/changelogs/fragments/381-integration-test-gaps.yml +++ b/changelogs/fragments/381-integration-test-gaps.yml @@ -1,2 +1,4 @@ +bugfixes: + - backup, restore - Fix ``changed`` being reported as ``false`` in ``check_mode``, since ``Backup-DbaDatabase``/``Restore-DbaDatabase`` return no output under ``-WhatIf`` (https://github.com/lowlydba/lowlydba.sqlserver/issues/381). minor_changes: - Add check-mode assertions for the ``backup`` and ``restore`` integration test targets, add idempotency assertions for the ``availability_group`` and ``ag_replica`` targets, and exercise a non-default ``deployment_method`` in the ``install_script`` targets (https://github.com/lowlydba/lowlydba.sqlserver/issues/381). diff --git a/plugins/modules/backup.ps1 b/plugins/modules/backup.ps1 index f46b4906..cf20b0df 100644 --- a/plugins/modules/backup.ps1 +++ b/plugins/modules/backup.ps1 @@ -129,6 +129,10 @@ try { if ($null -ne $output) { $resultData = ConvertTo-SerializableObject -InputObject $output $module.Result.data = $resultData + } + # Backup-DbaDatabase returns nothing under -WhatIf, but a backup is never a no-op, so report + # changed based on check_mode too, not just on whether an output object came back. + if ($checkMode -or $null -ne $output) { $module.Result.changed = $true } $module.ExitJson() diff --git a/plugins/modules/restore.ps1 b/plugins/modules/restore.ps1 index 811b3272..4e040394 100644 --- a/plugins/modules/restore.ps1 +++ b/plugins/modules/restore.ps1 @@ -161,6 +161,10 @@ try { if ($null -ne $output) { $resultData = ConvertTo-SerializableObject -InputObject $output $module.Result.data = $resultData + } + # Restore-DbaDatabase returns nothing under -WhatIf, but a restore is never a no-op, so report + # changed based on check_mode too, not just on whether an output object came back. + if ($checkMode -or $null -ne $output) { $module.Result.changed = $true } $module.ExitJson() From e8aaa3f20b409b8df5bde66dc51dfd362b002e8f Mon Sep 17 00:00:00 2001 From: John McCall Date: Fri, 4 Sep 2026 20:36:12 -0400 Subject: [PATCH 08/16] Debug: temporarily surface AG idempotency diff details --- plugins/modules/availability_group.ps1 | 3 +++ 1 file changed, 3 insertions(+) diff --git a/plugins/modules/availability_group.ps1 b/plugins/modules/availability_group.ps1 index 911ea0fc..e51fe5d6 100644 --- a/plugins/modules/availability_group.ps1 +++ b/plugins/modules/availability_group.ps1 @@ -212,6 +212,9 @@ try { } $compareProperty = $setAgSplat.Keys | Where-Object { $_ -ne "AllAvailabilityGroups" } $agDiff = Get-DesiredStateDiff -Current $existingAG -Desired $setAgSplat -Property $compareProperty + $module.Result.debug_ag_diff = @($agDiff) + $module.Result.debug_ag_current = $compareProperty | ForEach-Object { "$($_)=$($existingAG.$_)" } + $module.Result.debug_ag_desired = $setAgSplat.GetEnumerator() | ForEach-Object { "$($_.Key)=$($_.Value)" } if ($agDiff.Count -gt 0) { $output = $existingAG | Set-DbaAvailabilityGroup @setAgSplat $module.Result.changed = $true From adb77fcec60c9259f8fa88986acc035e0f3109f3 Mon Sep 17 00:00:00 2001 From: John McCall Date: Fri, 4 Sep 2026 20:53:34 -0400 Subject: [PATCH 09/16] Fix availability_group/ag_replica idempotency false positive Get-DbaAvailabilityGroup/Get-DbaAgReplica return SMO objects that don't eager-load every property (FailureConditionLevel/HealthCheckTimeout came back as unset zero-value defaults). Refresh() before comparing against desired state so the diff reflects real server values. --- changelogs/fragments/381-integration-test-gaps.yml | 1 + plugins/modules/ag_replica.ps1 | 5 +++++ plugins/modules/availability_group.ps1 | 8 +++++--- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/changelogs/fragments/381-integration-test-gaps.yml b/changelogs/fragments/381-integration-test-gaps.yml index 64d40f29..bcadefb6 100644 --- a/changelogs/fragments/381-integration-test-gaps.yml +++ b/changelogs/fragments/381-integration-test-gaps.yml @@ -1,4 +1,5 @@ bugfixes: - backup, restore - Fix ``changed`` being reported as ``false`` in ``check_mode``, since ``Backup-DbaDatabase``/``Restore-DbaDatabase`` return no output under ``-WhatIf`` (https://github.com/lowlydba/lowlydba.sqlserver/issues/381). + - availability_group, ag_replica - Fix ``changed`` being incorrectly reported as ``true`` on an unchanged AG/replica, since ``Get-DbaAvailabilityGroup``/``Get-DbaAgReplica`` don't eager-load every SMO property and the idempotency diff compared unset defaults against the desired state (https://github.com/lowlydba/lowlydba.sqlserver/issues/381). minor_changes: - Add check-mode assertions for the ``backup`` and ``restore`` integration test targets, add idempotency assertions for the ``availability_group`` and ``ag_replica`` targets, and exercise a non-default ``deployment_method`` in the ``install_script`` targets (https://github.com/lowlydba/lowlydba.sqlserver/issues/381). diff --git a/plugins/modules/ag_replica.ps1 b/plugins/modules/ag_replica.ps1 index 1bb5a94d..4e076a84 100644 --- a/plugins/modules/ag_replica.ps1 +++ b/plugins/modules/ag_replica.ps1 @@ -105,6 +105,11 @@ try { $replicaInstance = Connect-DbaInstance -SqlInstance $replicaSqlInstance -SqlCredential $replicaSqlCredential $allReplicas = Get-DbaAgReplica -SqlInstance $replicaSqlInstance -SqlCredential $replicaSqlCredential -AvailabilityGroup $agName $existingReplica = $allReplicas | Where-Object Name -eq $replicaInstance.DomainInstanceName + # SMO only eager-loads a subset of AvailabilityReplica properties, so refresh before comparing + # against desired state (see availability_group.ps1 for the same fix and rationale). + if ($null -ne $existingReplica) { + $existingReplica.Refresh() + } if ($state -eq "present") { $addReplicaSplat = @{ diff --git a/plugins/modules/availability_group.ps1 b/plugins/modules/availability_group.ps1 index e51fe5d6..1c12fcd5 100644 --- a/plugins/modules/availability_group.ps1 +++ b/plugins/modules/availability_group.ps1 @@ -114,6 +114,11 @@ $PSDefaultParameterValues = @{ "*:EnableException" = $true; "*:Confirm" = $false try { $existingAG = Get-DbaAvailabilityGroup -SqlInstance $sqlInstance -SqlCredential $sqlCredential -AvailabilityGroup $agName + # SMO only eager-loads a subset of AvailabilityGroup properties (e.g. FailureConditionLevel, HealthCheckTimeout + # come back as unset defaults). Refresh so the idempotency diff below compares real server values. + if ($null -ne $existingAG) { + $existingAG.Refresh() + } if ($state -eq "present") { $agSplat = @{ @@ -212,9 +217,6 @@ try { } $compareProperty = $setAgSplat.Keys | Where-Object { $_ -ne "AllAvailabilityGroups" } $agDiff = Get-DesiredStateDiff -Current $existingAG -Desired $setAgSplat -Property $compareProperty - $module.Result.debug_ag_diff = @($agDiff) - $module.Result.debug_ag_current = $compareProperty | ForEach-Object { "$($_)=$($existingAG.$_)" } - $module.Result.debug_ag_desired = $setAgSplat.GetEnumerator() | ForEach-Object { "$($_.Key)=$($_.Value)" } if ($agDiff.Count -gt 0) { $output = $existingAG | Set-DbaAvailabilityGroup @setAgSplat $module.Result.changed = $true From a57ea405908b01c7669176f08416e0dbdb16d221 Mon Sep 17 00:00:00 2001 From: John McCall Date: Fri, 4 Sep 2026 21:14:26 -0400 Subject: [PATCH 10/16] Fix AG idempotency false positive: read FailureConditionLevel/HealthCheckTimeout from catalog Get-DbaAvailabilityGroup never populates these two properties (SMO Standalone facet properties the AvailabilityGroups collection doesn't retrieve), so they always read back as unset defaults (0) regardless of the real server value, and the idempotency diff compared those defaults against the desired state on every run. Read the real values from sys.availability_groups instead. --- plugins/modules/ag_replica.ps1 | 5 ----- plugins/modules/availability_group.ps1 | 21 ++++++++++++++++++--- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/plugins/modules/ag_replica.ps1 b/plugins/modules/ag_replica.ps1 index 4e076a84..1bb5a94d 100644 --- a/plugins/modules/ag_replica.ps1 +++ b/plugins/modules/ag_replica.ps1 @@ -105,11 +105,6 @@ try { $replicaInstance = Connect-DbaInstance -SqlInstance $replicaSqlInstance -SqlCredential $replicaSqlCredential $allReplicas = Get-DbaAgReplica -SqlInstance $replicaSqlInstance -SqlCredential $replicaSqlCredential -AvailabilityGroup $agName $existingReplica = $allReplicas | Where-Object Name -eq $replicaInstance.DomainInstanceName - # SMO only eager-loads a subset of AvailabilityReplica properties, so refresh before comparing - # against desired state (see availability_group.ps1 for the same fix and rationale). - if ($null -ne $existingReplica) { - $existingReplica.Refresh() - } if ($state -eq "present") { $addReplicaSplat = @{ diff --git a/plugins/modules/availability_group.ps1 b/plugins/modules/availability_group.ps1 index 1c12fcd5..41c85637 100644 --- a/plugins/modules/availability_group.ps1 +++ b/plugins/modules/availability_group.ps1 @@ -114,10 +114,25 @@ $PSDefaultParameterValues = @{ "*:EnableException" = $true; "*:Confirm" = $false try { $existingAG = Get-DbaAvailabilityGroup -SqlInstance $sqlInstance -SqlCredential $sqlCredential -AvailabilityGroup $agName - # SMO only eager-loads a subset of AvailabilityGroup properties (e.g. FailureConditionLevel, HealthCheckTimeout - # come back as unset defaults). Refresh so the idempotency diff below compares real server values. + # FailureConditionLevel/HealthCheckTimeout are SMO "Standalone" facet properties that the + # AvailabilityGroups collection never populates, so they always read back as unset defaults + # (0/"0") regardless of the real server value. Read them from sys.availability_groups instead + # so the idempotency diff below compares against what's actually configured. if ($null -ne $existingAG) { - $existingAG.Refresh() + $failureConditionLevelNames = @{ + 1 = "OnServerDown" + 2 = "OnServerUnresponsive" + 3 = "OnCriticalServerErrors" + 4 = "OnModerateServerErrors" + 5 = "OnAnyQualifiedFailureCondition" + } + $agCatalogState = Invoke-DbaQuery -SqlInstance $sqlInstance -SqlCredential $sqlCredential -Database "master" ` + -Query "SELECT failure_condition_level, health_check_timeout FROM sys.availability_groups WHERE name = @AgName" ` + -SqlParameter @{ AgName = $agName } + if ($agCatalogState) { + $existingAG | Add-Member -Force -NotePropertyName FailureConditionLevel -NotePropertyValue $failureConditionLevelNames[[int]$agCatalogState.failure_condition_level] + $existingAG | Add-Member -Force -NotePropertyName HealthCheckTimeout -NotePropertyValue ([int]$agCatalogState.health_check_timeout) + } } if ($state -eq "present") { From 77ecd5f8ec1fcfdb636f9644533b81e66be9d6c0 Mon Sep 17 00:00:00 2001 From: John McCall Date: Fri, 4 Sep 2026 21:33:21 -0400 Subject: [PATCH 11/16] Fix PSAvoidLongLines lint failure in availability_group.ps1 --- plugins/modules/availability_group.ps1 | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/plugins/modules/availability_group.ps1 b/plugins/modules/availability_group.ps1 index 41c85637..c8314bc6 100644 --- a/plugins/modules/availability_group.ps1 +++ b/plugins/modules/availability_group.ps1 @@ -130,8 +130,10 @@ try { -Query "SELECT failure_condition_level, health_check_timeout FROM sys.availability_groups WHERE name = @AgName" ` -SqlParameter @{ AgName = $agName } if ($agCatalogState) { - $existingAG | Add-Member -Force -NotePropertyName FailureConditionLevel -NotePropertyValue $failureConditionLevelNames[[int]$agCatalogState.failure_condition_level] - $existingAG | Add-Member -Force -NotePropertyName HealthCheckTimeout -NotePropertyValue ([int]$agCatalogState.health_check_timeout) + $failureConditionLevel = $failureConditionLevelNames[[int]$agCatalogState.failure_condition_level] + $healthCheckTimeoutValue = [int]$agCatalogState.health_check_timeout + $existingAG | Add-Member -Force -NotePropertyName FailureConditionLevel -NotePropertyValue $failureConditionLevel + $existingAG | Add-Member -Force -NotePropertyName HealthCheckTimeout -NotePropertyValue $healthCheckTimeoutValue } } From 60205288f8b5133796da7d394524790fc20c5e38 Mon Sep 17 00:00:00 2001 From: John McCall Date: Fri, 4 Sep 2026 22:02:26 -0400 Subject: [PATCH 12/16] Debug: surface AG idempotency diff details (temporary) --- plugins/modules/availability_group.ps1 | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/plugins/modules/availability_group.ps1 b/plugins/modules/availability_group.ps1 index c8314bc6..23241763 100644 --- a/plugins/modules/availability_group.ps1 +++ b/plugins/modules/availability_group.ps1 @@ -128,12 +128,16 @@ try { } $agCatalogState = Invoke-DbaQuery -SqlInstance $sqlInstance -SqlCredential $sqlCredential -Database "master" ` -Query "SELECT failure_condition_level, health_check_timeout FROM sys.availability_groups WHERE name = @AgName" ` - -SqlParameter @{ AgName = $agName } + -SqlParameter @{ AgName = $agName } -As PSObject + $module.Result.debugAgCatalogState = ($agCatalogState | ConvertTo-Json -Compress) + $module.Result.debugAgCatalogStateType = $agCatalogState.GetType().FullName if ($agCatalogState) { $failureConditionLevel = $failureConditionLevelNames[[int]$agCatalogState.failure_condition_level] $healthCheckTimeoutValue = [int]$agCatalogState.health_check_timeout $existingAG | Add-Member -Force -NotePropertyName FailureConditionLevel -NotePropertyValue $failureConditionLevel $existingAG | Add-Member -Force -NotePropertyName HealthCheckTimeout -NotePropertyValue $healthCheckTimeoutValue + $module.Result.debugPatchedFailureConditionLevel = $existingAG.FailureConditionLevel + $module.Result.debugPatchedHealthCheckTimeout = $existingAG.HealthCheckTimeout } } @@ -234,6 +238,9 @@ try { } $compareProperty = $setAgSplat.Keys | Where-Object { $_ -ne "AllAvailabilityGroups" } $agDiff = Get-DesiredStateDiff -Current $existingAG -Desired $setAgSplat -Property $compareProperty + $module.Result.debugAgDiff = $agDiff -join "," + $module.Result.debugSetAgSplat = ($setAgSplat | ConvertTo-Json -Compress) + $module.Result.debugCurrentValues = ($compareProperty | ForEach-Object { "$($_)=$($existingAG.$_)" }) -join ";" if ($agDiff.Count -gt 0) { $output = $existingAG | Set-DbaAvailabilityGroup @setAgSplat $module.Result.changed = $true From 67265c1e4d3123e15d3cce875094d961b1b936b3 Mon Sep 17 00:00:00 2001 From: John McCall Date: Fri, 4 Sep 2026 22:44:22 -0400 Subject: [PATCH 13/16] ci(windows): retry WSL apt-get install on transient mirror hash mismatch Split the WSL package install out of Vampire/setup-wsl's one-shot additional-packages so we can retry apt-get update/install (with Acquire::Retries) instead of failing the whole job on a transient archive.ubuntu.com mirror hash mismatch. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- .github/workflows/ansible-test-windows.yml | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ansible-test-windows.yml b/.github/workflows/ansible-test-windows.yml index 34b12011..f45275f4 100644 --- a/.github/workflows/ansible-test-windows.yml +++ b/.github/workflows/ansible-test-windows.yml @@ -121,11 +121,21 @@ jobs: update: "false" use-cache: "true" wsl-version: 1 - additional-packages: | - git - ${{ matrix.python }} - python3-pip - openssh-client + + # archive.ubuntu.com/security.ubuntu.com occasionally serve a Packages file that doesn't + # match the just-fetched InRelease hash (mirror mid-sync). Retrying almost always succeeds, + # so do our own apt-get here instead of relying on setup-wsl's one-shot additional-packages. + - name: Install WSL packages (with retry) # zizmor: ignore[template-injection] -- matrix.python is a controlled enum value (python3) + run: | + echo 'Acquire::Retries "3";' | sudo tee /etc/apt/apt.conf.d/80-retries > /dev/null + for attempt in 1 2 3; do + if sudo apt-get update && sudo apt-get install -y git ${{ matrix.python }} python3-pip openssh-client; then + exit 0 + fi + echo "apt-get failed (attempt $attempt), retrying..." + sleep 10 + done + exit 1 - name: Get Linux workspace path shell: pwsh From ea123b5a394b03348bfe89c93cc3848fff163f73 Mon Sep 17 00:00:00 2001 From: John McCall Date: Fri, 4 Sep 2026 22:58:34 -0400 Subject: [PATCH 14/16] test(win_ag_listener): rename reserved var 'port' to 'listener_port' Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- tests/integration/targets/win_ag_listener/tasks/main.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/integration/targets/win_ag_listener/tasks/main.yml b/tests/integration/targets/win_ag_listener/tasks/main.yml index 68604997..570b97ca 100644 --- a/tests/integration/targets/win_ag_listener/tasks/main.yml +++ b/tests/integration/targets/win_ag_listener/tasks/main.yml @@ -7,7 +7,7 @@ failover_mode: "Manual" availability_mode: "AsynchronousCommit" force: true - port: 1433 + listener_port: 1433 module_defaults: lowlydba.sqlserver.availability_group: sql_instance: "{{ sqlserver_instance }}" @@ -24,7 +24,7 @@ sql_password: "{{ sqlserver_password }}" ag_name: "{{ ag_name }}" listener_name: "{{ listener_name }}" - port: "{{ port }}" + port: "{{ listener_port }}" ip_address: - "192.168.6.9" subnet_mask: @@ -52,7 +52,7 @@ - result.data.SqlInstance != None - result.data.AvailabilityGroup == ag_name - result.data.Name == listener_name - - result.data.PortNumber == port + - result.data.PortNumber == listener_port - result is changed - name: Change ag listener port From 48ffdbeaca26decf9130edc5f3ca296c2e3c0506 Mon Sep 17 00:00:00 2001 From: John McCall Date: Fri, 4 Sep 2026 23:05:03 -0400 Subject: [PATCH 15/16] fix(availability_group): exclude FailureConditionLevel/HealthCheckTimeout from idempotency diff Get-DbaAvailabilityGroup's SMO object never populates these two properties, and sys.availability_groups (a cache of the WSFC cluster resource's copy) is empty for cluster_type: None groups since there's no cluster resource to cache from. Neither source can be trusted for change detection, so drop the catalog-query workaround and exclude both properties from the diff. They're still applied via Set-DbaAvailabilityGroup whenever another property change triggers an update. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- .../fragments/381-integration-test-gaps.yml | 2 +- plugins/modules/availability_group.ps1 | 37 ++++--------------- 2 files changed, 8 insertions(+), 31 deletions(-) diff --git a/changelogs/fragments/381-integration-test-gaps.yml b/changelogs/fragments/381-integration-test-gaps.yml index bcadefb6..bbac7489 100644 --- a/changelogs/fragments/381-integration-test-gaps.yml +++ b/changelogs/fragments/381-integration-test-gaps.yml @@ -1,5 +1,5 @@ bugfixes: - backup, restore - Fix ``changed`` being reported as ``false`` in ``check_mode``, since ``Backup-DbaDatabase``/``Restore-DbaDatabase`` return no output under ``-WhatIf`` (https://github.com/lowlydba/lowlydba.sqlserver/issues/381). - - availability_group, ag_replica - Fix ``changed`` being incorrectly reported as ``true`` on an unchanged AG/replica, since ``Get-DbaAvailabilityGroup``/``Get-DbaAgReplica`` don't eager-load every SMO property and the idempotency diff compared unset defaults against the desired state (https://github.com/lowlydba/lowlydba.sqlserver/issues/381). + - availability_group - Fix ``changed`` being incorrectly reported as ``true`` on an unchanged AG. ``Get-DbaAvailabilityGroup``'s SMO object never populates ``FailureConditionLevel``/``HealthCheckTimeout`` (they read back as unset defaults), and ``sys.availability_groups`` is a cache of the WSFC cluster resource's copy, so it's empty for ``cluster_type: None`` groups. Since neither source can be trusted, both properties are now excluded from the idempotency diff; they're still applied via ``Set-DbaAvailabilityGroup`` whenever another property change triggers an update (https://github.com/lowlydba/lowlydba.sqlserver/issues/381). minor_changes: - Add check-mode assertions for the ``backup`` and ``restore`` integration test targets, add idempotency assertions for the ``availability_group`` and ``ag_replica`` targets, and exercise a non-default ``deployment_method`` in the ``install_script`` targets (https://github.com/lowlydba/lowlydba.sqlserver/issues/381). diff --git a/plugins/modules/availability_group.ps1 b/plugins/modules/availability_group.ps1 index 23241763..0a004965 100644 --- a/plugins/modules/availability_group.ps1 +++ b/plugins/modules/availability_group.ps1 @@ -114,32 +114,6 @@ $PSDefaultParameterValues = @{ "*:EnableException" = $true; "*:Confirm" = $false try { $existingAG = Get-DbaAvailabilityGroup -SqlInstance $sqlInstance -SqlCredential $sqlCredential -AvailabilityGroup $agName - # FailureConditionLevel/HealthCheckTimeout are SMO "Standalone" facet properties that the - # AvailabilityGroups collection never populates, so they always read back as unset defaults - # (0/"0") regardless of the real server value. Read them from sys.availability_groups instead - # so the idempotency diff below compares against what's actually configured. - if ($null -ne $existingAG) { - $failureConditionLevelNames = @{ - 1 = "OnServerDown" - 2 = "OnServerUnresponsive" - 3 = "OnCriticalServerErrors" - 4 = "OnModerateServerErrors" - 5 = "OnAnyQualifiedFailureCondition" - } - $agCatalogState = Invoke-DbaQuery -SqlInstance $sqlInstance -SqlCredential $sqlCredential -Database "master" ` - -Query "SELECT failure_condition_level, health_check_timeout FROM sys.availability_groups WHERE name = @AgName" ` - -SqlParameter @{ AgName = $agName } -As PSObject - $module.Result.debugAgCatalogState = ($agCatalogState | ConvertTo-Json -Compress) - $module.Result.debugAgCatalogStateType = $agCatalogState.GetType().FullName - if ($agCatalogState) { - $failureConditionLevel = $failureConditionLevelNames[[int]$agCatalogState.failure_condition_level] - $healthCheckTimeoutValue = [int]$agCatalogState.health_check_timeout - $existingAG | Add-Member -Force -NotePropertyName FailureConditionLevel -NotePropertyValue $failureConditionLevel - $existingAG | Add-Member -Force -NotePropertyName HealthCheckTimeout -NotePropertyValue $healthCheckTimeoutValue - $module.Result.debugPatchedFailureConditionLevel = $existingAG.FailureConditionLevel - $module.Result.debugPatchedHealthCheckTimeout = $existingAG.HealthCheckTimeout - } - } if ($state -eq "present") { $agSplat = @{ @@ -236,11 +210,14 @@ try { if ($null -ne $isDistributedAg) { $setAgSplat.Add("IsDistributedAvailabilityGroup", [bool]$isDistributedAg) } - $compareProperty = $setAgSplat.Keys | Where-Object { $_ -ne "AllAvailabilityGroups" } + # FailureConditionLevel/HealthCheckTimeout are excluded from the diff: Get-DbaAvailabilityGroup's + # SMO object never populates them (they read back as unset defaults), and sys.availability_groups + # is just a cache of the WSFC cluster resource's copy, so it's empty for ClusterType None AGs + # (no cluster resource to cache from). There's no reliable way to read the real value back, so + # drift on these two can't be detected. They're still applied via Set-DbaAvailabilityGroup below + # whenever another property change triggers an update. + $compareProperty = $setAgSplat.Keys | Where-Object { $_ -notin @("AllAvailabilityGroups", "FailureConditionLevel", "HealthCheckTimeout") } $agDiff = Get-DesiredStateDiff -Current $existingAG -Desired $setAgSplat -Property $compareProperty - $module.Result.debugAgDiff = $agDiff -join "," - $module.Result.debugSetAgSplat = ($setAgSplat | ConvertTo-Json -Compress) - $module.Result.debugCurrentValues = ($compareProperty | ForEach-Object { "$($_)=$($existingAG.$_)" }) -join ";" if ($agDiff.Count -gt 0) { $output = $existingAG | Set-DbaAvailabilityGroup @setAgSplat $module.Result.changed = $true From 857c282ec8aa9b4ae62547f2ee0b5dd16ab2ad02 Mon Sep 17 00:00:00 2001 From: John McCall Date: Fri, 4 Sep 2026 23:09:11 -0400 Subject: [PATCH 16/16] fix(changelog): avoid colon-space in plain scalar breaking YAML parse Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- changelogs/fragments/381-integration-test-gaps.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changelogs/fragments/381-integration-test-gaps.yml b/changelogs/fragments/381-integration-test-gaps.yml index bbac7489..a09cbfe5 100644 --- a/changelogs/fragments/381-integration-test-gaps.yml +++ b/changelogs/fragments/381-integration-test-gaps.yml @@ -1,5 +1,5 @@ bugfixes: - backup, restore - Fix ``changed`` being reported as ``false`` in ``check_mode``, since ``Backup-DbaDatabase``/``Restore-DbaDatabase`` return no output under ``-WhatIf`` (https://github.com/lowlydba/lowlydba.sqlserver/issues/381). - - availability_group - Fix ``changed`` being incorrectly reported as ``true`` on an unchanged AG. ``Get-DbaAvailabilityGroup``'s SMO object never populates ``FailureConditionLevel``/``HealthCheckTimeout`` (they read back as unset defaults), and ``sys.availability_groups`` is a cache of the WSFC cluster resource's copy, so it's empty for ``cluster_type: None`` groups. Since neither source can be trusted, both properties are now excluded from the idempotency diff; they're still applied via ``Set-DbaAvailabilityGroup`` whenever another property change triggers an update (https://github.com/lowlydba/lowlydba.sqlserver/issues/381). + - availability_group - Fix ``changed`` being incorrectly reported as ``true`` on an unchanged AG. ``Get-DbaAvailabilityGroup``'s SMO object never populates ``FailureConditionLevel``/``HealthCheckTimeout`` (they read back as unset defaults), and ``sys.availability_groups`` is a cache of the WSFC cluster resource's copy, so it's empty for AGs with ``cluster_type`` set to ``None``. Since neither source can be trusted, both properties are now excluded from the idempotency diff; they're still applied via ``Set-DbaAvailabilityGroup`` whenever another property change triggers an update (https://github.com/lowlydba/lowlydba.sqlserver/issues/381). minor_changes: - Add check-mode assertions for the ``backup`` and ``restore`` integration test targets, add idempotency assertions for the ``availability_group`` and ``ag_replica`` targets, and exercise a non-default ``deployment_method`` in the ``install_script`` targets (https://github.com/lowlydba/lowlydba.sqlserver/issues/381).