CiscoDevNet / terraform-provider-aci

Terraform Cisco ACI provider
https://registry.terraform.io/providers/CiscoDevNet/aci/latest/docs
Mozilla Public License 2.0
88 stars 101 forks source link

aci_rest doesn't store correct id in state #150

Closed euphdk closed 3 years ago

euphdk commented 3 years ago

Community Note

Terraform Version

Terraform v0.13.5
+ provider registry.terraform.io/ciscodevnet/aci v0.5.0

APIC version and APIC Platform

Affected Resource(s)

Terraform Configuration Files

terraform {
  required_providers {
    aci = {
      source = "CiscoDevNet/aci"
    }
  }
  required_version = ">= 0.13"
}

provider "aci" {
  username = "admin"
  password = "pass"
  url      = "https://acisim/"
  insecure = true
  version  = "0.5.0"
}

resource "aci_rest" "StpBpduFilter-enabled" {
  path    = "/api/node/mo/uni/infra/ifPol-StpBpduFilter-enabled.json"
  payload = <<EOF
  stpIfPol:
    attributes:
      dn: "uni/infra/ifPol-StpBpduFilter-enabled"
      name: "StpBpduFilter-enabled"
      ctrl: "bpdu-filter"
      rn: "ifPol-StpBpduFilter-enabled"
EOF
}

output "stp-bpdu" {
  value = aci_rest.StpBpduFilter-enabled.id
}

Debug Output

https://gist.github.com/euphdk/5f086814772218bada7970acf7cb8ee2

Expected Behavior

Actual Behavior

Output of state:

$ terraform state show aci_rest.StpBpduFilter-enabled
# aci_rest.StpBpduFilter-enabled:
resource "aci_rest" "StpBpduFilter-enabled" {
    id      = jsonencode({})
    path    = "/api/node/mo/uni/infra/ifPol-StpBpduFilter-enabled.json"
    payload = <<~EOT
          stpIfPol:
            attributes:
              dn: "uni/infra/ifPol-StpBpduFilter-enabled"
              name: "StpBpduFilter-enabled"
              ctrl: "bpdu-filter"
              rn: "ifPol-StpBpduFilter-enabled"
    EOT
}

Steps to Reproduce

  1. terraform apply
nkatarmal-crest commented 3 years ago

@euphdk You have to give class name as an argument as it is used to extract DN. So try after giving class name into same definition and let me know if you need anything else.

euphdk commented 3 years ago

@nkatarmal-crest Thanks, that helped :)

Now I just encountered that it puts the value en qoutes, so it gets "double qouted", and errors out when I try to use it elsewhere? Edit: Unless I do a "trim()" on it - but I don't think this should be necessary?

New config:

resource "aci_rest" "StpBpduFilter-enabled" {
  path       = "/api/node/mo/uni/infra/ifPol-StpBpduFilter-enabled.json"
  class_name = "stpIfPol"
  payload    = <<EOF
  stpIfPol:
    attributes:
      dn: "uni/infra/ifPol-StpBpduFilter-enabled"
      name: "StpBpduFilter-enabled"
      ctrl: "bpdu-filter"
      rn: "ifPol-StpBpduFilter-enabled"
EOF
}

Output:

stp-bpdu = "uni/infra/ifPol-StpBpduFilter-enabled"

And state:

# aci_rest.StpBpduFilter-enabled:
resource "aci_rest" "StpBpduFilter-enabled" {
    class_name = "stpIfPol"
    id         = "\"uni/infra/ifPol-StpBpduFilter-enabled\""
    path       = "/api/node/mo/uni/infra/ifPol-StpBpduFilter-enabled.json"
    payload    = <<~EOT
          stpIfPol:
            attributes:
              dn: "uni/infra/ifPol-StpBpduFilter-enabled"
              name: "StpBpduFilter-enabled"
              ctrl: "bpdu-filter"
              rn: "ifPol-StpBpduFilter-enabled"
    EOT
}
nkatarmal-crest commented 3 years ago

This issue has been fixed in the provider version 0.5.1.

euphdk commented 3 years ago

Works like a charm πŸ‘