Skip to content

azurerm_postgresql_flexible_server: more support for in-place major version upgrade#28559

Merged
mbfrahry merged 5 commits intohashicorp:mainfrom
wuxu92:pg/update-version
Apr 22, 2025
Merged

azurerm_postgresql_flexible_server: more support for in-place major version upgrade#28559
mbfrahry merged 5 commits intohashicorp:mainfrom
wuxu92:pg/update-version

Conversation

@wuxu92
Copy link
Collaborator

@wuxu92 wuxu92 commented Jan 21, 2025

Community Note

  • Please vote on this PR by adding a 👍 reaction to the original PR to help the community and maintainers prioritize for review
  • Please do not leave comments along the lines of "+1", "me too" or "any updates", they generate extra noise for PR followers and do not help prioritize for review

Description

Per API's behavior of create_mode only works when creating the instance, and upgrade the version of the server should not cause a force-recreate of the resource. I have tested locally, whether create_mode set or not, the version can be upgrade successfully. So this PR changes the force-new logic to only when downgrading the version.

This PR also move some related validation logic from Create to CustomizeDiff, so all the errors can be exposed in plan stage.

The new version update psudo logic:

// if version downgrade
if new_version < old_version:
  set force new and continue

// if version upgrade
if create_mode != "Update" and allow_major_version_upgrade_enabled is not True:
  raise an error of forbidding version update
else:
  in-place update

PR Checklist

  • I have followed the guidelines in our Contributing Documentation.
  • I have checked to ensure there aren't other open Pull Requests for the same update/change.
  • I have checked if my changes close any open issues. If so please include appropriate closing keywords below.
  • I have updated/added Documentation as required written in a helpful and kind way to assist users that may be unfamiliar with the resource / data source.
  • I have used a meaningful PR title to help maintainers and other users understand this change and help prevent duplicate work.
    For example: “resource_name_here - description of change e.g. adding property new_property_name_here

Changes to existing Resource / Data Source

  • I have added an explanation of what my changes do and why I'd like you to include them (This may be covered by linking to an issue above, but may benefit from additional explanation).
  • I have written new tests for my resource or datasource changes & updated any relevent documentation.
  • I have successfully run tests with my changes locally. If not, please provide details on testing challenges that prevented you running the tests.
  • (For changes that include a state migration only). I have manually tested the migration path between relevant versions of the provider.

Testing

  • My submission includes Test coverage as described in the Contribution Guide and the tests pass. (if this is not possible for any reason, please include details of why you did or could not add test coverage)
--- PASS: TestAccPostgresqlFlexibleServer_upgradeVersion (2564.89s)
--- PASS: TestAccPostgresqlFlexibleServer_updateVersion (1623.36s)
PASS
ok      github.com/hashicorp/terraform-provider-azurerm/internal/services/postgres1623.389s

Change Log

Below please provide what should go into the changelog (if anything) conforming to the Changelog Format documented here.

This is a (please select all that apply):

  • Bug Fix
  • New Feature (ie adding a service, resource, or data source)
  • Enhancement
  • Breaking Change

Related Issue(s)

Fixes #25184

Note

If this PR changes meaningfully during the course of review please update the title and description as required.

@nachoalonsoportillo
Copy link

Here's my proposal to improve this experience...

Say the user has deployed a server using this block:

resource "azurerm_postgresql_flexible_server" "example" {
  name                          = "example-psqlflexibleserver"
  resource_group_name           = azurerm_resource_group.example.name
  location                      = azurerm_resource_group.example.location
  version                       = "13"
  public_network_access_enabled = true
  administrator_login           = "myadmin"
  administrator_password        = "mypassword"
  storage_mb                    = 32768
  sku_name                      = "B_Standard_B1ms"
  zone                          = 1
  create_mode                   = "Default"
  

My proposal is that we implement some additional allow_major_version_upgrade boolean property, which must be present and set to true for the MVU to be initiated. Although the backend doesn't expect or support any equivalent property, I think it would be good to have so that users don't shoot on their own food and accidentally initiate an irreversible major version upgrade operation:

resource "azurerm_postgresql_flexible_server" "example" {
  name                          = "example-psqlflexibleserver"
  resource_group_name           = azurerm_resource_group.example.name
  location                      = azurerm_resource_group.example.location
  version                       = "15" <<<<<<<<< Bumped up the version
  public_network_access_enabled = true
  administrator_login           = "myadmin"
  administrator_password        = "mypassword"
  storage_mb                    = 32768
  sku_name                      = "B_Standard_B1ms"
  zone                          = 1
  create_mode                   = "Default"
  allow_major_version_upgrade   = true  <<<<<<<<< If value set to version property is higher than current major version on instance, and this property isn't present and set to true, the provider would raise an error requiring its presence.
}

@wuxu92
Copy link
Collaborator Author

wuxu92 commented Mar 10, 2025

@nachoalonsoportillo Thank you for the proposal; it is valuable to some users. However, adding such a property may disrupt existing configurations where create_mode = true, and users can currently upgrade versions without errors. Adding a field like major_version_update_enabled would necessitate manual updates to their configurations. Therefore, I would prefer updating the resource's documentation to include a warning that a version upgrade will result in several minutes of out-of-service time, rather than adding a guardian property to the resource. What do you think?

I also tested to update the create_mode to an existing server and it works, although the GET api doesn't return the create_mode at all. and no matter what the create_mode I updated, the version can be updated in place. So I removed the whole create_mode check here.

@github-actions github-actions bot added size/M and removed size/S labels Mar 13, 2025
@wuxu92 wuxu92 force-pushed the pg/update-version branch from 3b8e41e to 905aa4d Compare March 13, 2025 00:25
@wuxu92 wuxu92 force-pushed the pg/update-version branch from 82ca51c to a78da30 Compare March 13, 2025 00:36
@adlerd1
Copy link

adlerd1 commented Apr 2, 2025

Hi, when will the fix be merged? We need it to have a proper in-place upgrade using Terraform.

Copy link
Member

@mbfrahry mbfrahry left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey @wuxu92 this looks like we're on the right track but I think we should remove allow_major_version_upgrade_enabled

Comment on lines +180 to +184
"allow_major_version_upgrade_enabled": {
Type: pluginsdk.TypeBool,
Optional: true,
Default: false,
},
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree with your initial assessment to not have a variable for this. Let's remove it

* `version` - (Optional) The version of PostgreSQL Flexible Server to use. Possible values are `11`,`12`, `13`, `14`, `15` and `16`. Required when `create_mode` is `Default`.

-> **Note:** When `create_mode` is `Update`, upgrading version wouldn't force a new resource to be created.
-> **Note:** Upgrading version wouldn't force a new resource to be created whilst it can still cause the server out of service for a while. Downgrading the version will force a new resource to be created.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
-> **Note:** Upgrading version wouldn't force a new resource to be created whilst it can still cause the server out of service for a while. Downgrading the version will force a new resource to be created.
-> **Note:** Downgrading `version` isn't supported and will force a new PostgreSQL Flexible Server to be created.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These have been updated. would you please take another look?

@adlerd1
Copy link

adlerd1 commented Apr 17, 2025

Hi, when will the fix be merged? We need it to have a proper in-place upgrade using Terraform.

Copy link
Collaborator

@katbyte katbyte left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM 🛋️

Copy link
Member

@mbfrahry mbfrahry left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!

@mbfrahry mbfrahry added this to the v4.27.0 milestone Apr 22, 2025
@mbfrahry mbfrahry merged commit 7382a42 into hashicorp:main Apr 22, 2025
34 checks passed
mbfrahry added a commit that referenced this pull request Apr 22, 2025
jackofallops added a commit that referenced this pull request Apr 25, 2025
* Update CHANGELOG.md #29285, #29294

* Update CHANGELOG.md for #29307

* Update CHANGELOG.md #29283

* Update CHANGELOG.md #29271

* Update CHANGELOG.md #29298

* Update CHANGELOG.md #29278

* Update CHANGELOG.md #29341

* Update CHANGELOG.md #29328

* Update CHANGELOG.md #29292

* Update CHANGELOG.md #29361

* Update CHANGELOG.md #29296

* Update CHANGELOG.md #28239

* Update CHANGELOG.md #28974

* Update CHANGELOG.md #29254

* Update CHANGELOG.md #29333

* Update CHANGELOG.md #29314

* Update CHANGELOG.md #28929

* Update CHANGELOG.md for #29382

* Update for #28676

* Update CHANGELOG.md for #28740

* Update CHANGELOG.md for #28559

* Update CHANGELOG.md #29143

* Update CHANGELOG.md #29329

* Update CHANGELOG.md #29380

* Update CHANGELOG.md #29309

* Update CHANGELOG.md #29317

* prep for release

---------

Co-authored-by: Matthew Frahry <mbfrahry@gmail.com>
Co-authored-by: catriona-m <86247157+catriona-m@users.noreply.github.com>
Co-authored-by: kt <kt@katbyte.me>
Co-authored-by: stephybun <steph@hashicorp.com>
Co-authored-by: jackofallops <ste@hashicorp.com>
teowa pushed a commit to teowa/terraform-provider-azurerm that referenced this pull request May 8, 2025
teowa pushed a commit to teowa/terraform-provider-azurerm that referenced this pull request May 8, 2025
* Update CHANGELOG.md hashicorp#29285, hashicorp#29294

* Update CHANGELOG.md for hashicorp#29307

* Update CHANGELOG.md hashicorp#29283

* Update CHANGELOG.md hashicorp#29271

* Update CHANGELOG.md hashicorp#29298

* Update CHANGELOG.md hashicorp#29278

* Update CHANGELOG.md hashicorp#29341

* Update CHANGELOG.md hashicorp#29328

* Update CHANGELOG.md hashicorp#29292

* Update CHANGELOG.md hashicorp#29361

* Update CHANGELOG.md hashicorp#29296

* Update CHANGELOG.md hashicorp#28239

* Update CHANGELOG.md hashicorp#28974

* Update CHANGELOG.md hashicorp#29254

* Update CHANGELOG.md hashicorp#29333

* Update CHANGELOG.md hashicorp#29314

* Update CHANGELOG.md hashicorp#28929

* Update CHANGELOG.md for hashicorp#29382

* Update for hashicorp#28676

* Update CHANGELOG.md for hashicorp#28740

* Update CHANGELOG.md for hashicorp#28559

* Update CHANGELOG.md hashicorp#29143

* Update CHANGELOG.md hashicorp#29329

* Update CHANGELOG.md hashicorp#29380

* Update CHANGELOG.md hashicorp#29309

* Update CHANGELOG.md hashicorp#29317

* prep for release

---------

Co-authored-by: Matthew Frahry <mbfrahry@gmail.com>
Co-authored-by: catriona-m <86247157+catriona-m@users.noreply.github.com>
Co-authored-by: kt <kt@katbyte.me>
Co-authored-by: stephybun <steph@hashicorp.com>
Co-authored-by: jackofallops <ste@hashicorp.com>
@github-actions
Copy link
Contributor

I'm going to lock this pull request because it has been closed for 30 days ⏳. This helps our maintainers find and focus on the active contributions.
If you have found a problem that seems related to this change, please open a new issue and complete the issue template so we can capture all the details necessary to investigate further.

@github-actions github-actions bot locked as resolved and limited conversation to collaborators May 23, 2025
@wuxu92 wuxu92 deleted the pg/update-version branch May 29, 2025 06:50
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

changing the azurerm_postgresql_flexible_server version from 11 to any other version forces a recreate

5 participants