Skip to content

Conversation

@rammanoj
Copy link
Contributor

@rammanoj rammanoj commented Jan 2, 2026

📝 Description

What does this PR do and why is this change necessary?

  • Make node_pools optional for enterprise clusters in linode_lke_cluster

✔️ How to Test

  • Run make build and copy the generated binary to ~/.terraform.d/plugins/local/lab/linode/99.0.0/darwin_arm64.
  • Use the below code to create an enterprise cluster and ensure the cluster is successfully created.
terraform {
  required_providers {
    linode = {
      source  = "local/lab/linode"
      version = "~> 99.0.0"
    }
  }
}

provider "linode" {
  token       = "<token>"
  api_version = "v4beta"
}

resource "linode_lke_cluster" "my-cluster" {
  label       = "my-cluster"
  k8s_version = "v1.31.9+lke7"
  region      = "us-ord"
  tags        = ["prod"]
  tier        = "enterprise"
}
  • Output when executed the code:
(lke-tools) ➜  tmp_terra terraform apply

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:

  # linode_lke_cluster.my-cluster will be created
  + resource "linode_lke_cluster" "my-cluster" {
      + api_endpoints = (known after apply)
      + apl_enabled   = (known after apply)
      + dashboard_url = (known after apply)
      + id            = (known after apply)
      + k8s_version   = "v1.31.9+lke7"
      + kubeconfig    = (sensitive value)
      + label         = "my-cluster"
      + region        = "us-ord"
      + stack_type    = (known after apply)
      + status        = (known after apply)
      + subnet_id     = (known after apply)
      + tags          = [
          + "prod",
        ]
      + tier          = "enterprise"
      + vpc_id        = (known after apply)

      + control_plane (known after apply)
    }

Plan: 1 to add, 0 to change, 0 to destroy.

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

linode_lke_cluster.my-cluster: Creating...
linode_lke_cluster.my-cluster: Still creating... [10s elapsed]
linode_lke_cluster.my-cluster: Still creating... [20s elapsed]
linode_lke_cluster.my-cluster: Still creating... [30s elapsed]
linode_lke_cluster.my-cluster: Still creating... [40s elapsed]
linode_lke_cluster.my-cluster: Still creating... [50s elapsed]
linode_lke_cluster.my-cluster: Still creating... [1m0s elapsed]
linode_lke_cluster.my-cluster: Still creating... [1m10s elapsed]
linode_lke_cluster.my-cluster: Still creating... [1m20s elapsed]
linode_lke_cluster.my-cluster: Still creating... [1m30s elapsed]
linode_lke_cluster.my-cluster: Still creating... [1m40s elapsed]
linode_lke_cluster.my-cluster: Still creating... [1m50s elapsed]
linode_lke_cluster.my-cluster: Still creating... [2m0s elapsed]
linode_lke_cluster.my-cluster: Still creating... [2m10s elapsed]
linode_lke_cluster.my-cluster: Still creating... [2m20s elapsed]
linode_lke_cluster.my-cluster: Still creating... [2m30s elapsed]
linode_lke_cluster.my-cluster: Still creating... [2m40s elapsed]
linode_lke_cluster.my-cluster: Still creating... [2m50s elapsed]
linode_lke_cluster.my-cluster: Still creating... [3m0s elapsed]
linode_lke_cluster.my-cluster: Still creating... [3m10s elapsed]
linode_lke_cluster.my-cluster: Still creating... [3m20s elapsed]
linode_lke_cluster.my-cluster: Still creating... [3m30s elapsed]
linode_lke_cluster.my-cluster: Still creating... [3m40s elapsed]
linode_lke_cluster.my-cluster: Still creating... [3m50s elapsed]
linode_lke_cluster.my-cluster: Still creating... [4m0s elapsed]
linode_lke_cluster.my-cluster: Still creating... [4m10s elapsed]
linode_lke_cluster.my-cluster: Still creating... [4m20s elapsed]
linode_lke_cluster.my-cluster: Still creating... [4m30s elapsed]
linode_lke_cluster.my-cluster: Still creating... [4m40s elapsed]
linode_lke_cluster.my-cluster: Still creating... [4m50s elapsed]
linode_lke_cluster.my-cluster: Still creating... [5m0s elapsed]
linode_lke_cluster.my-cluster: Still creating... [5m10s elapsed]
linode_lke_cluster.my-cluster: Still creating... [5m20s elapsed]
linode_lke_cluster.my-cluster: Still creating... [5m30s elapsed]
linode_lke_cluster.my-cluster: Still creating... [5m40s elapsed]
linode_lke_cluster.my-cluster: Still creating... [5m50s elapsed]
linode_lke_cluster.my-cluster: Still creating... [6m0s elapsed]
linode_lke_cluster.my-cluster: Still creating... [6m10s elapsed]
linode_lke_cluster.my-cluster: Still creating... [6m20s elapsed]
linode_lke_cluster.my-cluster: Still creating... [6m30s elapsed]
linode_lke_cluster.my-cluster: Still creating... [6m40s elapsed]
linode_lke_cluster.my-cluster: Still creating... [6m50s elapsed]
linode_lke_cluster.my-cluster: Still creating... [7m0s elapsed]
linode_lke_cluster.my-cluster: Still creating... [7m10s elapsed]
linode_lke_cluster.my-cluster: Still creating... [7m20s elapsed]
linode_lke_cluster.my-cluster: Still creating... [7m30s elapsed]
linode_lke_cluster.my-cluster: Still creating... [7m40s elapsed]
linode_lke_cluster.my-cluster: Still creating... [7m50s elapsed]
linode_lke_cluster.my-cluster: Still creating... [8m0s elapsed]
linode_lke_cluster.my-cluster: Still creating... [8m10s elapsed]
linode_lke_cluster.my-cluster: Still creating... [8m20s elapsed]
linode_lke_cluster.my-cluster: Still creating... [8m30s elapsed]
linode_lke_cluster.my-cluster: Still creating... [8m40s elapsed]
linode_lke_cluster.my-cluster: Still creating... [8m50s elapsed]
linode_lke_cluster.my-cluster: Still creating... [9m0s elapsed]
linode_lke_cluster.my-cluster: Still creating... [9m10s elapsed]
linode_lke_cluster.my-cluster: Still creating... [9m20s elapsed]
linode_lke_cluster.my-cluster: Still creating... [9m30s elapsed]
linode_lke_cluster.my-cluster: Still creating... [9m40s elapsed]
linode_lke_cluster.my-cluster: Still creating... [9m50s elapsed]
linode_lke_cluster.my-cluster: Still creating... [10m0s elapsed]
linode_lke_cluster.my-cluster: Still creating... [10m10s elapsed]
linode_lke_cluster.my-cluster: Still creating... [10m20s elapsed]
linode_lke_cluster.my-cluster: Still creating... [10m30s elapsed]
linode_lke_cluster.my-cluster: Still creating... [10m40s elapsed]
linode_lke_cluster.my-cluster: Still creating... [10m50s elapsed]
linode_lke_cluster.my-cluster: Still creating... [11m0s elapsed]
linode_lke_cluster.my-cluster: Still creating... [11m10s elapsed]
linode_lke_cluster.my-cluster: Still creating... [11m20s elapsed]
linode_lke_cluster.my-cluster: Still creating... [11m30s elapsed]
linode_lke_cluster.my-cluster: Still creating... [11m40s elapsed]
linode_lke_cluster.my-cluster: Still creating... [11m50s elapsed]
linode_lke_cluster.my-cluster: Still creating... [12m0s elapsed]
linode_lke_cluster.my-cluster: Still creating... [12m10s elapsed]
linode_lke_cluster.my-cluster: Still creating... [12m20s elapsed]
linode_lke_cluster.my-cluster: Still creating... [12m30s elapsed]
linode_lke_cluster.my-cluster: Still creating... [12m40s elapsed]
linode_lke_cluster.my-cluster: Still creating... [12m50s elapsed]
linode_lke_cluster.my-cluster: Still creating... [13m0s elapsed]
linode_lke_cluster.my-cluster: Creation complete after 13m1s [id=551726]

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
  • Use the below code to create an standard cluster and ensure the cluster is successfully created.
terraform {
  required_providers {
    linode = {
      source  = "local/lab/linode"
      version = "~> 99.0.0"
    }
  }
}

provider "linode" {
  token       = "<token>"
  api_version = "v4beta"
}

resource "linode_lke_cluster" "my-second-cluster" {
  label       = "my-second-cluster"
  k8s_version = "1.33"
  region      = "us-ord"
  tags        = ["prod"]
  tier        = "standard"
}
  • Ensure that create fails with below error:
(lke-tools) ➜  tmp_terra terraform apply
╷
│ Error: at least one pool is required for standard tier clusters
│ 
│   with linode_lke_cluster.my-second-cluster,
│   on main.tf line 44, in resource "linode_lke_cluster" "my-second-cluster":
│   44: resource "linode_lke_cluster" "my-second-cluster" {
│ 
╵
(lke-tools) ➜  tmp_terra 

@rammanoj rammanoj requested a review from a team as a code owner January 2, 2026 20:49
@rammanoj rammanoj requested review from jriddle-linode and lgarber-akamai and removed request for a team January 2, 2026 20:49
@rammanoj rammanoj force-pushed the optional-nodepools branch 2 times, most recently from 9a7836f to 024698a Compare January 5, 2026 20:17
Copy link
Contributor

@ezilber-akamai ezilber-akamai left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Manual testing appears to work as intended! It looks like you may have forgotten to add integration tests using the new templates you added. Can you add those please.

@ezilber-akamai ezilber-akamai requested a review from Copilot January 9, 2026 16:17
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR makes node pools optional for enterprise tier LKE clusters in the Terraform provider, while maintaining the requirement that standard tier clusters must have at least one node pool.

Changes:

  • Updated the node_pools schema field from required to optional with updated documentation
  • Added custom diff validation to enforce pool requirement only for standard tier clusters
  • Added test template helper functions and a new template for creating clusters without node pools

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated 2 comments.

File Description
linode/lke/schema_resource.go Changed node_pools from required to optional and updated description
linode/lke/resource.go Added custom diff validation to enforce pool requirement for standard tier
linode/lke/tmpl/template.go Added helper functions for generating test templates without node pools
linode/lke/tmpl/lke_no_pools.gotf New template for creating LKE clusters without node pools

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Copy link
Contributor

@ezilber-akamai ezilber-akamai left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the contribution!

@zliang-akamai zliang-akamai requested a review from Copilot January 20, 2026 21:46
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 5 out of 5 changed files in this pull request and generated 1 comment.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@lgarber-akamai lgarber-akamai requested review from a team, Copilot, psnoch-akamai and vshanthe and removed request for a team January 21, 2026 16:03
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 5 out of 5 changed files in this pull request and generated no new comments.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Copy link
Contributor

@lgarber-akamai lgarber-akamai left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM and tests are passing on my end. Thanks for the contribution and sorry again for the delay!

@lgarber-akamai lgarber-akamai merged commit a678df8 into linode:dev Jan 22, 2026
9 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants