civo/terraform-provider-civo

Terraform tries to perform in-place update when there is no `firewall_id` set in configuration file

zulh-civo opened this issue · 0 comments

We added firewall support when launching Kubernetes cluster in #73 where we are saving firewall_id in the state after the cluster is created.

Example configuration file:

# Query xsmall instance size
data "civo_instances_size" "xsmall" {
    filter {
        key = "type"
        values = ["kubernetes"]
    }

    sort {
        key = "ram"
        direction = "asc"
    }
}

# Create a cluster
resource "civo_kubernetes_cluster" "my-cluster" {
    name = "my-cluster"
    applications = "Portainer,Linkerd:Linkerd & Jaeger"
    num_target_nodes = 2
    target_nodes_size = element(data.civo_instances_size.xsmall.sizes, 0).name
}

Now, when we run terraform apply command again after the first terraform apply, the following error will appear:

$ tf apply --auto-approve

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # civo_kubernetes_cluster.my-cluster will be created
  + resource "civo_kubernetes_cluster" "my-cluster" {
      + api_endpoint           = (known after apply)
      + applications           = "Portainer,Linkerd:Linkerd & Jaeger"
      + created_at             = (known after apply)
      + dns_entry              = (known after apply)
      + id                     = (known after apply)
      + installed_applications = (known after apply)
      + instances              = (known after apply)
      + kubeconfig             = (sensitive value)
      + kubernetes_version     = (known after apply)
      + master_ip              = (known after apply)
      + name                   = "my-cluster"
      + network_id             = (known after apply)
      + num_target_nodes       = 2
      + pools                  = (known after apply)
      + ready                  = (known after apply)
      + region                 = (known after apply)
      + status                 = (known after apply)
      + target_nodes_size      = "g3.k3s.xsmall"
    }

Plan: 1 to add, 0 to change, 0 to destroy.
civo_kubernetes_cluster.my-cluster: Creating...
civo_kubernetes_cluster.my-cluster: Still creating... [10s elapsed]
civo_kubernetes_cluster.my-cluster: Still creating... [20s elapsed]
civo_kubernetes_cluster.my-cluster: Still creating... [30s elapsed]
civo_kubernetes_cluster.my-cluster: Still creating... [40s elapsed]
civo_kubernetes_cluster.my-cluster: Still creating... [50s elapsed]
civo_kubernetes_cluster.my-cluster: Still creating... [1m0s elapsed]
civo_kubernetes_cluster.my-cluster: Still creating... [1m10s elapsed]
civo_kubernetes_cluster.my-cluster: Still creating... [1m20s elapsed]
civo_kubernetes_cluster.my-cluster: Still creating... [1m30s elapsed]
civo_kubernetes_cluster.my-cluster: Still creating... [1m40s elapsed]
civo_kubernetes_cluster.my-cluster: Still creating... [1m50s elapsed]
civo_kubernetes_cluster.my-cluster: Still creating... [2m0s elapsed]
civo_kubernetes_cluster.my-cluster: Creation complete after 2m3s [id=ada61c67-3a2e-41d6-a4e1-cd508390f1ba]

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.



$ tf apply --auto-approve
civo_kubernetes_cluster.my-cluster: Refreshing state... [id=ada61c67-3a2e-41d6-a4e1-cd508390f1ba]

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:

  # civo_kubernetes_cluster.my-cluster will be updated in-place
  ~ resource "civo_kubernetes_cluster" "my-cluster" {
      - firewall_id            = "2634fdcf-1048-4da2-af4c-83f7c84d8670" -> null
        id                     = "ada61c67-3a2e-41d6-a4e1-cd508390f1ba"
        name                   = "my-cluster"
        # (15 unchanged attributes hidden)
    }

Plan: 0 to add, 1 to change, 0 to destroy.
civo_kubernetes_cluster.my-cluster: Modifying... [id=ada61c67-3a2e-41d6-a4e1-cd508390f1ba]
╷
│ Error: [ERR] Firewall change ("firewall_id") for existing cluster is not available at this moment
│
│   with civo_kubernetes_cluster.my-cluster,
│   on main.tf line 15, in resource "civo_kubernetes_cluster" "my-cluster":
│   15: resource "civo_kubernetes_cluster" "my-cluster" {
│
╵

The error was caused by this line since Civo API does not yet support firewall change for cluster after it's been created.

The issue here is, we didn't declare firewall_id in our configuration file and when we rerun the terraform apply command again, it thinks we want to change it to empty/null.

To fix this, we need to mark both Computed: true and Optional: true into the firewall_id schema. Currently, it only has Optional: true.