labd / terraform-provider-commercetools

Terraform provider for commercetools
https://registry.terraform.io/providers/labd/commercetools/latest/docs
Mozilla Public License 2.0
65 stars 70 forks source link

Terraform plan inaccurate output when removing attributes to product types #508

Open elachance1 opened 4 months ago

elachance1 commented 4 months ago

Version information

Describe the bug

There seems to be a bug with the terraform plan when removing attributes of product type when they are not the last one in the file. (I haven't tried with other ressources)

To Reproduce

  1. Execute terraform apply with the following product type :

    resource "commercetools_product_type" "my-product-type" {
    key         = "my-product-type"
    name        = "My Product Type"
    description = "My Product Type Description"
    
    attribute {
    name = "my-first-attribute"
    label = {
      en-US = "My First Attribute"
    }
    required = true
    type {
      name = "text"
    }
    constraint = "SameForAll"
    searchable = true
    input_hint = "SingleLine"
    }
    
    attribute {
    name = "my-second-attribute"
    label = {
      en-US = "My Second Attribute"
    }
    required = true
    type {
      name = "text"
    }
    constraint = "SameForAll"
    searchable = true
    input_hint = "SingleLine"
    }
    }
  2. Remove the first attribute. You should end up with a file like this :

    resource "commercetools_product_type" "my-product-type" {
    key         = "my-product-type"
    name        = "My Product Type"
    description = "My Product Type Description"
    
    attribute {
    name = "my-second-attribute"
    label = {
      en-US = "My Second Attribute"
    }
    required = true
    type {
      name = "text"
    }
    constraint = "SameForAll"
    searchable = true
    input_hint = "SingleLine"
    }
    }
  3. Execute a terraform plan

  4. Terraform will give the following output :

    Terraform will perform the following actions:
    # commercetools_product_type.my-product-type will be updated in-place
    ~ resource "commercetools_product_type" "my-product-type" {
        id          = "NOT_IMPORTANT_GENERATED_UUID_FOR_MY_RESSOURCE"
        name        = "My Product Type"
        # (3 unchanged attributes hidden)
      ~ attribute {
          ~ label      = {
              ~ "en-US" = "My First Attribute" -> "My Second Attribute"
            }
          ~ name       = "my-first-attribute" -> "my-second-attribute"
            # (5 unchanged attributes hidden)
            # (1 unchanged block hidden)
        }
      - attribute {
          - constraint = "SameForAll" -> null
          - input_hint = "SingleLine" -> null
          - input_tip  = {} -> null
          - label      = {
              - "en-US" = "My Second Attribute"
            } -> null
          - name       = "my-second-attribute" -> null
          - required   = true -> null
          - searchable = true -> null
          - type {
              - name = "text" -> null
            }
        }
    }
    Plan: 0 to add, 1 to change, 0 to destroy.

The plan is misleading. It does not rename the first attribute into the second attribute. Otherwise, there should be inconsistencies with the data after the apply (second attribute should end up with the first attribute data) if the plan was accurate. But, it actually remove the first attribute as expected on CommerceTools.

Expected behavior

I would expect the same behaviour as we remove the last attribute of the file. Here is an example of the output we get when we remove the last attribute :

Terraform will perform the following actions:
  # commercetools_product_type.my-product-type will be updated in-place
  ~ resource "commercetools_product_type" "my-product-type" {
        id          = "NOT_IMPORTANT_GENERATED_UUID_FOR_MY_RESSOURCE"
        name        = "My Product Type"
        # (3 unchanged attributes hidden)
      - attribute {
          - constraint = "SameForAll" -> null
          - input_hint = "SingleLine" -> null
          - input_tip  = {} -> null
          - label      = {
              - "en-US" = "My Second Attribute"
            } -> null
          - name       = "my-second-attribute" -> null
          - required   = true -> null
          - searchable = true -> null
          - type {
              - name = "text" -> null
            }
        }
        # (1 unchanged block hidden)
    }
Plan: 0 to add, 1 to change, 0 to destroy.
demeyerthom commented 4 months ago

Hi @elachance1 I think this happens because we store the attributes as a slice of structs, so when storing the data terraform sees that the attribute at position 0 (was first attribute, now second attribute) has changed instead of correctly deducing that the attribute at 0 was removed.

I will have to dive in to this to see how to fix it

sgoian commented 1 month ago

Do you happen to have any updates on this one? It's a nasty one causing us serious headaches.

rawwebdesign commented 1 month ago

Also looking for an update on this one. Thank you!

stanislavhordiyenko commented 3 weeks ago

Hello, started a POC with this terraform provider and also faced with this issue. Decided to postpone all activities until this issue is resolved.

ijn-kruso commented 3 days ago

Hi, I'm facing the same issue, and looking for a solution as well.

lillpitch commented 1 day ago

Hello, I'm in the ditch with you guys. Hoping this one gets resolved.