Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

azurerm_postgresql_flexible_server: fix storage_tier calculation #25947

Merged
merged 4 commits into from
May 16, 2024

Conversation

HappyTobi
Copy link
Contributor

@HappyTobi HappyTobi commented May 13, 2024

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 "+1" or "me too" comments, they generate extra noise for PR followers and do not help prioritize for review

Description

The PR fix an issue with azurerm_postgresql_flexible_server.
The issue can be reproduces when deploying an instance without a storage_tier property.
The redeployment of the same instance will fail when updating the storage_mb without setting the storage_tier.

The fix will handle the "autoupdate" of the storage_tier property when the value is not updated manually. (like the azure portal).

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)
image

For state migrations please test the changes locally and provide details here, such as the versions involved in testing the migration path. For further details on testing state migration changes please see our guide on state migrations in the contributor documentation. -->

Change Log

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

  • azurerm_resource - support for the thing1 property [GH-00000]

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 #25938

Note

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

@@ -382,7 +382,6 @@ func resourcePostgresqlFlexibleServer() *pluginsdk.Resource {
}
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggest run all related test cases to ensure this fix wouldn't introduce the regression issue.

Copy link
Contributor

@neil-yechenwei neil-yechenwei May 14, 2024

Choose a reason for hiding this comment

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

There is a regression issue on the existing test case.

------- Stdout: -------
=== RUN   TestAccPostgresqlFlexibleServer_geoRestore
=== PAUSE TestAccPostgresqlFlexibleServer_geoRestore
=== CONT  TestAccPostgresqlFlexibleServer_geoRestore
    testcase.go:113: Step 3/4 error: After applying this test step, the plan was not empty.
        stdout:
        Terraform used the selected providers to generate the following execution
        plan. Resource actions are indicated with the following symbols:
          ~ update in-place
        Terraform will perform the following actions:
          # azurerm_postgresql_flexible_server.geo_restore will be updated in-place
          ~ resource "azurerm_postgresql_flexible_server" "geo_restore" {
                id                                = "/subscriptions/*******/resourceGroups/acctestRG-postgresql-240514110942768666/providers/Microsoft.DBforPostgreSQL/flexibleServers/acctest-fs-restore-240514110942768666"
                name                              = "acctest-fs-restore-240514110942768666"
              + storage_tier                      = "P4"
                # (14 unchanged attributes hidden)
                # (1 unchanged block hidden)
            }
        Plan: 0 to add, 1 to change, 0 to destroy.
--- FAIL: TestAccPostgresqlFlexibleServer_geoRestore (2753.46s)
FAIL

@neil-yechenwei
Copy link
Contributor

neil-yechenwei commented May 14, 2024

Thanks for this PR - I've taken a look through and left some comments inline.

@WodansSon WodansSon self-assigned this May 14, 2024
@HappyTobi
Copy link
Contributor Author

Test runs fine:
TF_ACC=1 go test -v ./internal/services/postgres -run=TestAccPostgresqlFlexibleServer_updateOnlyWithStorageMb -timeout 60m -ldflags="-X=github.com/hashicorp/terraform-provider-azurerm/version.ProviderVersion=acc"
=== RUN TestAccPostgresqlFlexibleServer_updateOnlyWithStorageMb
=== PAUSE TestAccPostgresqlFlexibleServer_updateOnlyWithStorageMb
=== CONT TestAccPostgresqlFlexibleServer_updateOnlyWithStorageMb
--- PASS: TestAccPostgresqlFlexibleServer_updateOnlyWithStorageMb (683.51s)
PASS
ok github.com/hashicorp/terraform-provider-azurerm/internal/services/postgres 683.547s

@WodansSon
Copy link
Collaborator

@HappyTobi, thank you for opening this PR! Love to see the community contributions! Thank you so much for that! Looking at the linked issue and the PR, I think there maybe an easier way to fix this, but by all means please correct me if I am overlooking something. There is a hierarchy here, top level being storage_mb, that field trumps all, secondly is the storage_tier. In the update function the only thing we should have to do is get the new storage_mb field value and see if the current storage_tier is in the returned valid values for the defined storage_mb from the already exposed InitializeFlexibleServerStorageTierDefaults function. We should then check to see if the storage_tier is actually in the configuration file or not, as Neil has stated above. If the storage_tier field is not in the configuration file we should just update that field value to be the default value that was returned from the InitializeFlexibleServerStorageTierDefaults function, if it is in the configuration file and the storage_tier is not in the list of of valid storage tiers from the InitializeFlexibleServerStorageTierDefaults function, we should then raise the error that it is not a supported storage_tier for the defined storage_mb? Does that make sense, am I overlooking something?

@WodansSon
Copy link
Collaborator

@HappyTobi, interesting side tangent... your test name got me thinking... updateOnlyWithStorageMb should the reverse be possible as well (e.g., updateOnlyWithStorageTier) ?

@HappyTobi
Copy link
Contributor Author

Added a 2nd test:

TF_ACC=1 go test -v ./internal/services/postgres -run=TestAccPostgresqlFlexibleServer_updateOnlyWithStorageTier -timeout 60m -ldflags="-X=github.com/hashicorp/terraform-provider-azurerm/version.ProviderVersion=acc"
=== RUN TestAccPostgresqlFlexibleServer_updateOnlyWithStorageTier
=== PAUSE TestAccPostgresqlFlexibleServer_updateOnlyWithStorageTier
=== CONT TestAccPostgresqlFlexibleServer_updateOnlyWithStorageTier

--- PASS: TestAccPostgresqlFlexibleServer_updateOnlyWithStorageTier (934.99s)
PASS

@github-actions github-actions bot added size/M and removed size/S labels May 14, 2024
@HappyTobi
Copy link
Contributor Author

ate that field value to be the default value that was returned from the InitializeFlexibleServerStorageTierDefaults function, if it is in the configuration file and the storage_tier is not in the list of of valid storage tiers from the InitializeFlexibleServerStorageTierDefaults function, we should then raise the error that it is not a supported storage_tier for the defined storage_mb? Does that make sense

Yes that make sense and the implementation reflect that already.
The change I've done is that I always use the "default" 'storage_tier' for the configures storage_mb / size.

Comment on lines 403 to 408
// set default tier for storage when there is now configuration available
if v := diff.GetRawConfig().AsValueMap()["storage_tier"]; v.IsNull() {
newTier = string(storageTiers.DefaultTier)
// set the new value that the update function will pickup and deploy new new storage tier.
diff.SetNew("storage_tier", newTier)
}
Copy link
Collaborator

Choose a reason for hiding this comment

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

I think we can remove all of this code and handle everything in the !isValid check below:

Suggested change
// set default tier for storage when there is now configuration available
if v := diff.GetRawConfig().AsValueMap()["storage_tier"]; v.IsNull() {
newTier = string(storageTiers.DefaultTier)
// set the new value that the update function will pickup and deploy new new storage tier.
diff.SetNew("storage_tier", newTier)
}

// set the new value that the update function will pickup and deploy new new storage tier.
diff.SetNew("storage_tier", newTier)
}

Copy link
Collaborator

Choose a reason for hiding this comment

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

What do you think if we just replace the current if !isValid { code below with this instead:

Suggested change
if !isValid {
if strings.EqualFold(oldTierRaw.(string), newTier) {
// The tier value did not change, so we need to determin if they are
// using the default value for the tier, or they actually defined the
// tier in the config or not... If they did not define
// the tier in the config we need to assign a new valid default
// tier for the newMb value. However, if the tier is in the config
// this is a valid error and should be returned...
if v := diff.GetRawConfig().AsValueMap()["storage_tier"]; v.IsNull() {
diff.SetNew("storage_tier", string(storageTiers.DefaultTier))
log.Printf("[DEBUG]: 'storage_tier' was not valid and was not in the config assigning new default 'storage_tier' %q -> %q\n", newTier, storageTiers.DefaultTier)
return nil
}
}
return fmt.Errorf("invalid 'storage_tier' %q for defined 'storage_mb' size '%d', expected one of [%s]", newTier, newMb, azure.QuotedStringSlice(*storageTiers.ValidTiers))
}

Copy link
Contributor Author

@HappyTobi HappyTobi May 15, 2024

Choose a reason for hiding this comment

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

This will change the logic a bit.
When you remove the "storage_tier" from you tf file, the default tier will not be set, it will use the one that you set before!

@@ -524,6 +524,48 @@ func TestAccPostgresqlFlexibleServer_invalidStorageTierScalingStorageMbStorageTi
})
}

func TestAccPostgresqlFlexibleServer_updateOnlyWithStorageMb(t *testing.T) {
Copy link
Collaborator

Choose a reason for hiding this comment

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

I think this is a great start to the test coverage, yet I think there are many more scenarios around this especially if we are now setting defaults when storage mb changes. I would like to see tests for storage tier set above storage tier default value, then remove the storage tier from the configuration (e.g., storage mb set to 65536 with a storage tier of P10 in the config file) then remove the storage tier P10 in the config. It should then revert tier from P10 -> P6, etc. Does that make sense?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

For sure will add one more test

Copy link
Collaborator

@WodansSon WodansSon left a comment

Choose a reason for hiding this comment

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

@HappyTobi, thanks for pushing those changes, this LGTM now! 🚀

@WodansSon WodansSon merged commit 96ad2ff into hashicorp:main May 16, 2024
30 checks passed
@github-actions github-actions bot added this to the v3.104.0 milestone May 16, 2024
WodansSon added a commit that referenced this pull request May 16, 2024
WodansSon added a commit that referenced this pull request May 16, 2024
dduportal pushed a commit to jenkins-infra/azure that referenced this pull request May 20, 2024
<Actions>
<action
id="f410411e63aff4bb73a81c2aec1d373cf8a903e63b30dee2006b0030d8a94cc8">
        <h3>Bump Terraform `azurerm` provider version</h3>
<details
id="1d9343c012f5434ac9fe8a98135bae3667b399259be16d9b14302ea3bd424a24">
            <summary>Update Terraform lock file</summary>
<p>changes detected:&#xA;&#x9;&#34;hashicorp/azurerm&#34; updated from
&#34;3.103.1&#34; to &#34;3.104.0&#34; in file
&#34;.terraform.lock.hcl&#34;</p>
            <details>
                <summary>3.104.0</summary>
<pre>Changelog retrieved
from:&#xA;&#x9;https://github.com/hashicorp/terraform-provider-azurerm/releases/tag/v3.104.0&#xA;FEATURES:&#xA;&#xA;*
New Data Source: `azurerm_elastic_san`
([#25719](https://github.com/hashicorp/terraform-provider-azurerm/issues/25719))&#xA;&#xA;ENHANCEMENTS:&#xA;&#xA;*
New Resource - `azurerm_key_vault_managed_hardware_security_module_key`
([#25935](hashicorp/terraform-provider-azurerm#25935
Data Source - `azurerm_kubernetes_service_version` - support for the
`default_version` property
([#25953](hashicorp/terraform-provider-azurerm#25953
`network/applicationgateways` - update to use `hashicorp/go-azure-sdk`
([#25844](hashicorp/terraform-provider-azurerm#25844
`dataprotection` - update API version to `2024-04-01`
([#25882](hashicorp/terraform-provider-azurerm#25882
`databasemigration` - update API version to `2021-06-30`
([#25997](hashicorp/terraform-provider-azurerm#25997
`network/ips` - update to use `hashicorp/go-azure-sdk`
([#25905](hashicorp/terraform-provider-azurerm#25905
`network/localnetworkgateway` - update to use `hashicorp/go-azure-sdk`
([#25905](hashicorp/terraform-provider-azurerm#25905
`network/natgateway` - update to use `hashicorp/go-azure-sdk`
([#25905](hashicorp/terraform-provider-azurerm#25905
`network/networksecuritygroup` - update to use `hashicorp/go-azure-sdk`
([#25971](hashicorp/terraform-provider-azurerm#25971
`network/publicips` - update to use `hashicorp/go-azure-sdk`
([#25971](hashicorp/terraform-provider-azurerm#25971
`network/virtualwan` - update to use `hashicorp/go-azure-sdk`
([#25971](hashicorp/terraform-provider-azurerm#25971
`network/vpn` - update to use `hashicorp/go-azure-sdk`
([#25971](hashicorp/terraform-provider-azurerm#25971
`azurerm_databricks_workspace` - support for the
`default_storage_firewall_enabled` property
([#25919](hashicorp/terraform-provider-azurerm#25919
`azurerm_key_vault` - allow previously existing key vaults to continue
to manage the `contact` field prior to the `v3.93.0` conditional polling
change
([#25777](hashicorp/terraform-provider-azurerm#25777
`azurerm_linux_function_app` - support for the PowerShell `7.4`
([#25980](hashicorp/terraform-provider-azurerm#25980
`azurerm_log_analytics_cluster` - support for the value `UserAssigned`
in the `identity.type` property
([#25940](hashicorp/terraform-provider-azurerm#25940
`azurerm_pim_active_role_assignment` - remove hard dependency on the
`roleAssignmentScheduleRequests` API, so that role assignments will not
become unmanageable over time
([#25956](hashicorp/terraform-provider-azurerm#25956
`azurerm_pim_eligible_role_assignment` - remove hard dependency on the
`roleEligibilityScheduleRequests` API, so that role assignments will not
become unmanageable over time
([#25956](hashicorp/terraform-provider-azurerm#25956
`azurerm_windows_function_app` - support for the PowerShell `7.4`
([#25980](https://github.com/hashicorp/terraform-provider-azurerm/issues/25980))&#xA;&#xA;BUG
FIXES:&#xA;&#xA;* `azurerm_container_app_job` - Allow
`event_trigger_config.scale.min_executions` to be `0`
([#25931](hashicorp/terraform-provider-azurerm#25931
`azurerm_container_app_job` - update validation to allow the
`replica_retry_limit` property to be set to `0`
([#25984](hashicorp/terraform-provider-azurerm#25984
`azurerm_data_factory_trigger_custom_event` - one of
`subject_begins_with` and `subject_ends_with` no longer need to be set
([#25932](hashicorp/terraform-provider-azurerm#25932
`azurerm_kubernetes_cluster_node_pool` - prevent race condition by
checking the virtual network status when creating a node pool with a
subnet ID
([#25888](hashicorp/terraform-provider-azurerm#25888
`azurerm_postgresql_flexible_server` - fix for default `storage_tier`
value when `storage_mb` field has been changed
([#25947](hashicorp/terraform-provider-azurerm#25947
`azurerm_pim_active_role_assignment` - resolve a number of potential
crashes
([#25956](hashicorp/terraform-provider-azurerm#25956
`azurerm_pim_eligible_role_assignment` - resolve a number of potential
crashes
([#25956](hashicorp/terraform-provider-azurerm#25956
`azurerm_redis_enterprise_cluster_location_zone_support` - add `Central
India` zones support
([#26000](hashicorp/terraform-provider-azurerm#26000
`azurerm_sentinel_alert_rule_scheduled` - the
`alert_rule_template_version` property is no longer `ForceNew`
([#25688](hashicorp/terraform-provider-azurerm#25688
`azurerm_storage_sync_server_endpoint` - preventing a crashed due to
`initial_upload_policy`
([#25968](https://github.com/hashicorp/terraform-provider-azurerm/issues/25968))&#xA;&#xA;&#xA;</pre>
            </details>
        </details>
<a
href="https://infra.ci.jenkins.io/job/updatecli/job/azure/job/main/185/">Jenkins
pipeline link</a>
    </action>
</Actions>

---

<table>
  <tr>
    <td width="77">
<img src="https://www.updatecli.io/images/updatecli.png" alt="Updatecli
logo" width="50" height="50">
    </td>
    <td>
      <p>
Created automatically by <a
href="https://www.updatecli.io/">Updatecli</a>
      </p>
      <details><summary>Options:</summary>
        <br />
<p>Most of Updatecli configuration is done via <a
href="https://www.updatecli.io/docs/prologue/quick-start/">its
manifest(s)</a>.</p>
        <ul>
<li>If you close this pull request, Updatecli will automatically reopen
it, the next time it runs.</li>
<li>If you close this pull request and delete the base branch, Updatecli
will automatically recreate it, erasing all previous commits made.</li>
        </ul>
        <p>
Feel free to report any issues at <a
href="https://github.com/updatecli/updatecli/issues">github.com/updatecli/updatecli</a>.<br
/>
If you find this tool useful, do not hesitate to star <a
href="https://github.com/updatecli/updatecli/stargazers">our GitHub
repository</a> as a sign of appreciation, and/or to tell us directly on
our <a
href="https://matrix.to/#/#Updatecli_community:gitter.im">chat</a>!
        </p>
      </details>
    </td>
  </tr>
</table>

Co-authored-by: Jenkins Infra Bot (updatecli) <60776566+jenkins-infra-bot@users.noreply.github.com>
Copy link

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 Jun 16, 2024
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.

[Postgres] Changing storage_mb from 524288 to 1048576 fails with storage_tier error
3 participants