terraform-provider-cloudflare icon indicating copy to clipboard operation
terraform-provider-cloudflare copied to clipboard

panic: interface conversion: interface {} is nil, not []interface {}

Open Evesy opened this issue 2 years ago • 1 comments

Confirmation

  • [X] My issue isn't already found on the issue tracker.
  • [X] I have replicated my issue using the latest version of the provider and it is still present.

Terraform and Cloudflare provider version

1.0.0

Affected resource(s)

  • cloudflare_firewall_rule
  • cloudflare_load_balancer
  • cloudflare_zone_settings_override
  • cloudflare_rate_limit
  • cloudflare_filter

Terraform configuration files

resource "cloudflare_load_balancer_pool" "dealer-websites" {
  for_each = var.load_balancer_pools

  name            = "dealer-websites-${each.key}"
  description     = "Dealer Websites - ${title(each.key)}"
  enabled         = true
  check_regions   = ["WEU"]
  minimum_origins = 1

  dynamic "origins" {
    for_each = each.value.origins
    content {
      name    = origins.value["name"]
      address = origins.value["address"]
      weight  = lookup(origins.value, "weight", 1)
    }
  }

  monitor = cloudflare_load_balancer_monitor.healthcheck[each.key].id

  lifecycle {
    ignore_changes = [
      origins
    ]
  }
}

resource "cloudflare_load_balancer_monitor" "healthcheck" {
  for_each = var.load_balancer_pools

  type             = "https"
  expected_body    = ""
  expected_codes   = lookup(lookup(each.value, "monitor", {}), "expected_codes", "2xx")
  method           = "GET"
  timeout          = 7
  path             = lookup(lookup(each.value, "monitor", {}), "path", "/healthz")
  interval         = 60
  retries          = 5
  description      = lookup(lookup(each.value, "monitor", {}), "description", title(each.key))
  allow_insecure   = true
  follow_redirects = true

  dynamic "header" {
    for_each = lookup(lookup(each.value, "monitor", {}), "headers", [])
    content {
      header = header.value["header"]
      values = header.value["values"]
    }
  }
}

resource "cloudflare_load_balancer" "dealer-websites" {
  for_each = var.load_balancer_pools

  zone_id = cloudflare_zone.default.id
  name    = "${each.key}-lb.dw1.${var.env}.tld"

  fallback_pool_id = cloudflare_load_balancer_pool.dealer-websites[each.key].id
  default_pool_ids = [cloudflare_load_balancer_pool.dealer-websites[each.key].id]
  description      = "Dealer Websites - ${title(each.key)}"
  proxied          = true
  session_affinity = "ip_cookie"
  steering_policy  = "off"
}

Debug output

2021-11-23T15:28:29.910Z [INFO]  provider.terraform-provider-cloudflare_v3.4.0: 2021/11/23 15:28:29 [DEBUG] Read Cloudflare Load Balancer Pool from API as struct: {ID:dae5a71d5ef9db70c3d46a9138a6f3f3 CreatedOn:2020-02-14 14:31:46.226945 +0000 UTC ModifiedOn:2020-03-24 13:50:52.435041 +0000 UTC Description:Dealer Websites - Preprod Name:dealer-websites-preprod Enabled:true MinimumOrigins:1 Monitor:7b13add1698776aa8c411c94e533824f Origins:[{Name:onprem Address<redacted> Enabled:true Weight:0 Header:map[]} {Name:preprod Address:<redacted> Enabled:true Weight:1 Header:map[]}] NotificationEmail: Latitude:<nil> Longitude:<nil> LoadShedding:<nil> OriginSteering:<nil> CheckRegions:[WEU]}: timestamp=2021-11-23T15:28:29.909Z
2021-11-23T15:28:29.923Z [INFO]  provider.terraform-provider-cloudflare_v3.4.0: 2021/11/23 15:28:29 [WARN] Truncating attribute path of 0 diagnostics for TypeSet: timestamp=2021-11-23T15:28:29.923Z
2021-11-23T15:28:29.923Z [INFO]  provider.terraform-provider-cloudflare_v3.4.0: 2021/11/23 15:28:29 [WARN] Truncating attribute path of 0 diagnostics for TypeSet: timestamp=2021-11-23T15:28:29.923Z
2021-11-23T15:28:29.934Z [WARN]  Provider "registry.terraform.io/hashicorp/cloudflare" produced an invalid plan for cloudflare_load_balancer_pool.dealer-websites["preprod"], but we are tolerating it because it is using the legacy plugin SDK.
    The following problems may be the cause of any confusing errors from downstream operations:
      - .notification_email: planned value cty.StringVal("") for a non-computed attribute
2021-11-23T15:28:29.940Z [INFO]  ReferenceTransformer: reference not found: "var.load_balancer_pools"
2021-11-23T15:28:29.940Z [INFO]  ReferenceTransformer: reference not found: "cloudflare_load_balancer_pool.dealer-websites"
2021-11-23T15:28:29.940Z [INFO]  ReferenceTransformer: reference not found: "each.key"
2021-11-23T15:28:29.940Z [INFO]  ReferenceTransformer: reference not found: "each.key"
2021-11-23T15:28:29.941Z [INFO]  ReferenceTransformer: reference not found: "var.env"
2021-11-23T15:28:29.941Z [INFO]  ReferenceTransformer: reference not found: "each.key"
2021-11-23T15:28:29.941Z [INFO]  ReferenceTransformer: reference not found: "cloudflare_load_balancer_pool.dealer-websites"
2021-11-23T15:28:29.941Z [INFO]  ReferenceTransformer: reference not found: "each.key"
2021-11-23T15:28:29.941Z [DEBUG] ReferenceTransformer: "cloudflare_load_balancer.dealer-websites[\"preprod\"]" references: []
2021-11-23T15:28:29.947Z [DEBUG] provider.terraform-provider-cloudflare_v3.4.0: PANIC: interface conversion: interface {} is nil, not []interface {}
2021-11-23T15:28:29.947Z [DEBUG] provider.terraform-provider-cloudflare_v3.4.0:
2021-11-23T15:28:29.947Z [DEBUG] provider.terraform-provider-cloudflare_v3.4.0: goroutine 504 [running]:
2021-11-23T15:28:29.947Z [DEBUG] provider.terraform-provider-cloudflare_v3.4.0: github.com/cloudflare/terraform-provider-cloudflare/cloudflare.resourceCloudflareLoadBalancerStateUpgradeV1({0xc00009ba40, 0x5064e5}, 0xc0003c4e10, {0xe3c460, 0xc000400648})
2021-11-23T15:28:29.947Z [DEBUG] provider.terraform-provider-cloudflare_v3.4.0: 	github.com/cloudflare/terraform-provider-cloudflare/cloudflare/resource_cloudflare_load_balancer_migrate.go:56 +0x29d
2021-11-23T15:28:29.947Z [DEBUG] provider.terraform-provider-cloudflare_v3.4.0: github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema.(*GRPCProviderServer).upgradeJSONState(0xc00000c690, {0x1213c68, 0xc0006b1840}, 0xe3c460, 0xc000400648, 0xc0003a8ab8)
2021-11-23T15:28:29.947Z [DEBUG] provider.terraform-provider-cloudflare_v3.4.0: 	github.com/hashicorp/terraform-plugin-sdk/[email protected]/helper/schema/grpc_provider.go:424 +0x97
2021-11-23T15:28:29.947Z [DEBUG] provider.terraform-provider-cloudflare_v3.4.0: github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema.(*GRPCProviderServer).UpgradeResourceState(0xc00000c690, {0x1213c68, 0xc0006b1840}, 0xc00056d620)
2021-11-23T15:28:29.947Z [DEBUG] provider.terraform-provider-cloudflare_v3.4.0: 	github.com/hashicorp/terraform-plugin-sdk/[email protected]/helper/schema/grpc_provider.go:300 +0x365
2021-11-23T15:28:29.947Z [DEBUG] provider.terraform-provider-cloudflare_v3.4.0: github.com/hashicorp/terraform-plugin-go/tfprotov5/tf5server.(*server).UpgradeResourceState(0xc0003819e0, {0x1213d10, 0xc000769da0}, 0xc00059a780)
2021-11-23T15:28:29.947Z [DEBUG] provider.terraform-provider-cloudflare_v3.4.0: 	github.com/hashicorp/[email protected]/tfprotov5/tf5server/server.go:281 +0x130
2021-11-23T15:28:29.947Z [DEBUG] provider.terraform-provider-cloudflare_v3.4.0: github.com/hashicorp/terraform-plugin-go/tfprotov5/internal/tfplugin5._Provider_UpgradeResourceState_Handler({0xfa9160, 0xc0003819e0}, {0x1213d10, 0xc000769da0}, 0xc000387260, 0x0)
2021-11-23T15:28:29.948Z [DEBUG] provider.terraform-provider-cloudflare_v3.4.0: 	github.com/hashicorp/[email protected]/tfprotov5/internal/tfplugin5/tfplugin5_grpc.pb.go:308 +0x170
2021-11-23T15:28:29.948Z [DEBUG] provider.terraform-provider-cloudflare_v3.4.0: google.golang.org/grpc.(*Server).processUnaryRPC(0xc0000cb180, {0x12255a8, 0xc000262600}, 0xc00090fd40, 0xc000241dd0, 0x18c2e00, 0x0)
2021-11-23T15:28:29.948Z [DEBUG] provider.terraform-provider-cloudflare_v3.4.0: 	google.golang.org/[email protected]/server.go:1297 +0xccf
2021-11-23T15:28:29.948Z [DEBUG] provider.terraform-provider-cloudflare_v3.4.0: google.golang.org/grpc.(*Server).handleStream(0xc0000cb180, {0x12255a8, 0xc000262600}, 0xc00090fd40, 0x0)
2021-11-23T15:28:29.948Z [DEBUG] provider.terraform-provider-cloudflare_v3.4.0: 	google.golang.org/[email protected]/server.go:1626 +0xa2a
2021-11-23T15:28:29.948Z [DEBUG] provider.terraform-provider-cloudflare_v3.4.0: google.golang.org/grpc.(*Server).serveStreams.func1.2()
2021-11-23T15:28:29.949Z [DEBUG] provider.terraform-provider-cloudflare_v3.4.0: 	google.golang.org/[email protected]/server.go:941 +0x98
2021-11-23T15:28:29.949Z [DEBUG] provider.terraform-provider-cloudflare_v3.4.0: created by google.golang.org/grpc.(*Server).serveStreams.func1
2021-11-23T15:28:29.949Z [DEBUG] provider.terraform-provider-cloudflare_v3.4.0: 	google.golang.org/[email protected]/server.go:939 +0x294
2021-11-23T15:28:29.957Z [DEBUG] provider: plugin process exited: path=.terraform/providers/registry.terraform.io/hashicorp/cloudflare/3.4.0/linux_amd64/terraform-provider-cloudflare_v3.4.0 pid=141 error="exit status 2"
2021-11-23T15:28:29.957Z [DEBUG] provider.stdio: received EOF, stopping recv loop: err="rpc error: code = Unavailable desc = transport is closing"
2021-11-23T15:28:29.958Z [ERROR] plugin.(*GRPCProvider).ReadResource: error="rpc error: code = Unavailable desc = transport is closing"
2021-11-23T15:28:29.958Z [ERROR] plugin.(*GRPCProvider).ReadResource: error="rpc error: code = Unavailable desc = transport is closing"
2021-11-23T15:28:29.958Z [ERROR] plugin.(*GRPCProvider).ReadResource: error="rpc error: code = Unavailable desc = transport is closing"
2021-11-23T15:28:29.958Z [ERROR] plugin.(*GRPCProvider).ReadResource: error="rpc error: code = Unavailable desc = transport is closing"
2021-11-23T15:28:29.958Z [ERROR] plugin.(*GRPCProvider).UpgradeResourceState: error="rpc error: code = Unavailable desc = transport is closing"
2021-11-23T15:28:29.961Z [INFO]  backend/local: plan operation completed

Panic output

No response

Expected output

Plan should execute successfully

Actual output

│ Error: Plugin did not respond
│
│   with cloudflare_load_balancer.dealer-websites["preprod"],
│   on loadbalancers.tf line 52, in resource "cloudflare_load_balancer" "dealer-websites":
│   52: resource "cloudflare_load_balancer" "dealer-websites" {
│
│ The plugin encountered an error, and failed to respond to the plugin.(*GRPCProvider).UpgradeResourceState call. The plugin logs may contain more details.
...
...
Stack trace from the terraform-provider-cloudflare_v3.4.0 plugin:

panic: interface conversion: interface {} is nil, not []interface {}

goroutine 394 [running]:
github.com/cloudflare/terraform-provider-cloudflare/cloudflare.resourceCloudflareLoadBalancerStateUpgradeV1({0xc00083fa40, 0x5064e5}, 0xc000744d80, {0xe3c460, 0xc0005caed0})
	github.com/cloudflare/terraform-provider-cloudflare/cloudflare/resource_cloudflare_load_balancer_migrate.go:56 +0x29d
github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema.(*GRPCProviderServer).upgradeJSONState(0xc0005c2120, {0x1213c68, 0xc0007cd840}, 0xe3c460, 0xc0005caed0, 0xc0007f2ab8)
	github.com/hashicorp/terraform-plugin-sdk/[email protected]/helper/schema/grpc_provider.go:424 +0x97
github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema.(*GRPCProviderServer).UpgradeResourceState(0xc0005c2120, {0x1213c68, 0xc0007cd840}, 0xc000381740)
	github.com/hashicorp/terraform-plugin-sdk/[email protected]/helper/schema/grpc_provider.go:300 +0x365
github.com/hashicorp/terraform-plugin-go/tfprotov5/tf5server.(*server).UpgradeResourceState(0xc00027ea60, {0x1213d10, 0xc000045950}, 0xc00079f270)
	github.com/hashicorp/[email protected]/tfprotov5/tf5server/server.go:281 +0x130
github.com/hashicorp/terraform-plugin-go/tfprotov5/internal/tfplugin5._Provider_UpgradeResourceState_Handler({0xfa9160, 0xc00027ea60}, {0x1213d10, 0xc000045950}, 0xc000387d40, 0x0)
	github.com/hashicorp/[email protected]/tfprotov5/internal/tfplugin5/tfplugin5_grpc.pb.go:308 +0x170
google.golang.org/grpc.(*Server).processUnaryRPC(0xc0005d08c0, {0x12255a8, 0xc000528000}, 0xc000751680, 0xc000279bc0, 0x18c2e00, 0x0)
	google.golang.org/[email protected]/server.go:1297 +0xccf
google.golang.org/grpc.(*Server).handleStream(0xc0005d08c0, {0x12255a8, 0xc000528000}, 0xc000751680, 0x0)
	google.golang.org/[email protected]/server.go:1626 +0xa2a
google.golang.org/grpc.(*Server).serveStreams.func1.2()
	google.golang.org/[email protected]/server.go:941 +0x98
created by google.golang.org/grpc.(*Server).serveStreams.func1
	google.golang.org/[email protected]/server.go:939 +0x294

Error: The terraform-provider-cloudflare_v3.4.0 plugin crashed!

Steps to reproduce

Still working on an exact reproduction scenario

Additional factoids

Upgrading cloudflare plugin version from 2.x to 3.4.0

We do have other Terraform repos using some of the same resources that are erroring that planned OK with the 3.4.0 plugin

References

No response

Evesy avatar Nov 23 '21 15:11 Evesy

I had the same issue attempting to run a plan on:

  • cloudflare_firewall_rule
  • cloudflare_load_balancer
  • cloudflare_zone_settings_override

Same Cloudflare provider version (3.4.0) using Terraform 1.0.9.

I found the issue was due to the state, specifically of the loadbalancer. Comparing the state of a working example and the failing one, I noticed these attributes were missing from the state:

            "rules": [],
            "session_affinity_attributes": null,
            "session_affinity_ttl": null,

Adding these manually to the state file resolved the issue for me.

rjl79 avatar Nov 25 '21 00:11 rjl79

closing this out since this is now quite old and shouldn't be an issue when upgrading.

jacobbednarz avatar Sep 28 '22 03:09 jacobbednarz