From b64c16d4a430547670d0ecca65a16256f5672bba Mon Sep 17 00:00:00 2001 From: Cem Mergenci Date: Fri, 13 Sep 2024 10:05:42 +0300 Subject: [PATCH 1/2] Filter empty length key diffs in Storage Account resource. Signed-off-by: Cem Mergenci --- config/storage/config.go | 39 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/config/storage/config.go b/config/storage/config.go index c3a4dfb4a..33081e1d3 100644 --- a/config/storage/config.go +++ b/config/storage/config.go @@ -5,14 +5,51 @@ package storage import ( + "errors" + "github.com/crossplane/upjet/pkg/config" + "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" "github.com/upbound/provider-azure/apis/rconfig" "github.com/upbound/provider-azure/config/common" ) // Configure configures storage group -func Configure(p *config.Provider) { +func Configure(p *config.Provider) { //nolint:gocyclo + p.AddResourceConfigurator("azurerm_storage_account", func(r *config.Resource) { + r.TerraformCustomDiff = func(diff *terraform.InstanceDiff, state *terraform.InstanceState, config *terraform.ResourceConfig) (*terraform.InstanceDiff, error) { + // skip diff customization on create + if state == nil || state.Empty() { + return diff, nil + } + if config == nil { + return nil, errors.New("resource config cannot be nil") + } + // skip no diff or destroy diffs + if diff == nil || diff.Empty() || diff.Destroy || diff.Attributes == nil { + return diff, nil + } + + lengthDiffKeys := []string{ + "blob_properties.#", + "share_properties.#", + "queue_properties.#", + } + for _, key := range lengthDiffKeys { + // Note(cem): We should consider filtering effectively-empty + // (Old = "" and New = "") length keys (`*.#` and `*.%`) in + // Upjet. Doing so _should be_ safe, but in case we are afraid + // to deploy at scale, we might tie the functionality to a + // resource configuration flag, as a precaution. + if diff.Attributes[key] != nil && diff.Attributes[key].Old == "" && diff.Attributes[key].New == "" { + delete(diff.Attributes, key) + } + } + + return diff, nil + } + }) + p.AddResourceConfigurator("azurerm_storage_blob", func(r *config.Resource) { r.References["storage_account_name"] = config.Reference{ TerraformName: "azurerm_storage_account", From c6a32bcca29db8ef48c4f6704b0431f860c8ded0 Mon Sep 17 00:00:00 2001 From: Cem Mergenci Date: Fri, 13 Sep 2024 10:19:19 +0300 Subject: [PATCH 2/2] Add Storage Account example manifest. Signed-off-by: Cem Mergenci --- examples/storage/v1beta1/account.yaml | 44 +++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 examples/storage/v1beta1/account.yaml diff --git a/examples/storage/v1beta1/account.yaml b/examples/storage/v1beta1/account.yaml new file mode 100644 index 000000000..c00cf25e1 --- /dev/null +++ b/examples/storage/v1beta1/account.yaml @@ -0,0 +1,44 @@ +# SPDX-FileCopyrightText: 2024 The Crossplane Authors +# +# SPDX-License-Identifier: CC0-1.0 + +# Note that this resource is not _properly_ Uptestable, because Uptest +# cannot generate a random string that conforms to Azure Storage +# Account naming criteria: +# https://learn.microsoft.com/en-us/azure/storage/common/storage-account-overview#storage-account-name +# +# Uptest should succeed, as long as the hardcoded `metadata.name` +# below is available. + +apiVersion: storage.azure.upbound.io/v1beta1 +kind: Account +metadata: + annotations: + meta.upbound.io/example-id: storage/v1beta1/account + labels: + testing.upbound.io/example-name: example-storage + name: examplesa539891 +spec: + forProvider: + accountReplicationType: LRS + accountTier: Standard + location: "West Europe" + resourceGroupNameSelector: + matchLabels: + testing.upbound.io/example-name: example-storage + +--- + +apiVersion: azure.upbound.io/v1beta1 +kind: ResourceGroup +metadata: + annotations: + meta.upbound.io/example-id: storage/v1beta1/account + labels: + testing.upbound.io/example-name: example-storage + name: example-storage-${Rand.RFC1123Subdomain} +spec: + forProvider: + location: "West Europe" + tags: + provisioner: crossplane