From c5fc286a0c40a018f1c9e559c3d43a4be3d8ed59 Mon Sep 17 00:00:00 2001 From: rammanoj Date: Mon, 5 Jan 2026 15:49:40 -0500 Subject: [PATCH 1/2] make nodepools optional in cluster_create --- linode_api4/groups/lke.py | 11 +++- .../linode_client/test_linode_client.py | 2 +- test/integration/models/lke/test_lke.py | 10 ++-- test/unit/groups/lke_test.py | 52 ++++++++++++++++++- test/unit/linode_client_test.py | 4 +- test/unit/objects/lke_test.py | 4 +- 6 files changed, 71 insertions(+), 12 deletions(-) diff --git a/linode_api4/groups/lke.py b/linode_api4/groups/lke.py index c3d6fdc5d..330c1d378 100644 --- a/linode_api4/groups/lke.py +++ b/linode_api4/groups/lke.py @@ -62,8 +62,8 @@ def cluster_create( self, region, label, - node_pools, kube_version, + node_pools: Optional[list] = None, control_plane: Union[ LKEClusterControlPlaneOptions, Dict[str, Any] ] = None, @@ -119,6 +119,15 @@ def cluster_create( :returns: The new LKE Cluster :rtype: LKECluster """ + if node_pools is None: + node_pools = [] + + if len(node_pools) == 0 and ( + tier is None or tier.lower() != "enterprise" + ): + raise ValueError( + "LKE standard clusters must have at least one node pool." + ) params = { "label": label, diff --git a/test/integration/linode_client/test_linode_client.py b/test/integration/linode_client/test_linode_client.py index da7e93cef..ef5baa959 100644 --- a/test/integration/linode_client/test_linode_client.py +++ b/test/integration/linode_client/test_linode_client.py @@ -354,8 +354,8 @@ def test_fails_to_create_cluster_with_invalid_version(test_linode_client): cluster = client.lke.cluster_create( region, "example-cluster", - {"type": "g6-standard-1", "count": 3}, invalid_version, + {"type": "g6-standard-1", "count": 3}, ) except ApiError as e: assert "not valid" in str(e.json) diff --git a/test/integration/models/lke/test_lke.py b/test/integration/models/lke/test_lke.py index 71ebc1ff2..116665df6 100644 --- a/test/integration/models/lke/test_lke.py +++ b/test/integration/models/lke/test_lke.py @@ -38,7 +38,7 @@ def lke_cluster(test_linode_client): label = get_test_label() + "_cluster" cluster = test_linode_client.lke.cluster_create( - region, label, node_pools, version + region, label, version, node_pools ) yield cluster @@ -57,8 +57,8 @@ def lke_cluster_with_acl(test_linode_client): cluster = test_linode_client.lke.cluster_create( region, label, - node_pools, version, + node_pools, control_plane=LKEClusterControlPlaneOptions( acl=LKEClusterControlPlaneACLOptions( enabled=True, @@ -103,7 +103,7 @@ def lke_cluster_with_labels_and_taints(test_linode_client): label = get_test_label() + "_cluster" cluster = test_linode_client.lke.cluster_create( - region, label, node_pools, version + region, label, version, node_pools ) yield cluster @@ -124,8 +124,8 @@ def lke_cluster_with_apl(test_linode_client): cluster = test_linode_client.lke.cluster_create( region, label, - node_pools, version, + node_pools, control_plane=LKEClusterControlPlaneOptions( high_availability=True, ), @@ -160,8 +160,8 @@ def lke_cluster_enterprise(e2e_test_firewall, test_linode_client): cluster = test_linode_client.lke.cluster_create( region, label, - node_pools, version, + node_pools, tier="enterprise", ) diff --git a/test/unit/groups/lke_test.py b/test/unit/groups/lke_test.py index a39db81a6..802960192 100644 --- a/test/unit/groups/lke_test.py +++ b/test/unit/groups/lke_test.py @@ -21,8 +21,8 @@ def test_cluster_create_with_acl(self): self.client.lke.cluster_create( "us-mia", "test-acl-cluster", - [self.client.lke.node_pool("g6-nanode-1", 3)], "1.29", + [self.client.lke.node_pool("g6-nanode-1", 3)], control_plane=LKEClusterControlPlaneOptions( acl=LKEClusterControlPlaneACLOptions( enabled=True, @@ -41,3 +41,53 @@ def test_cluster_create_with_acl(self): assert m.call_data["control_plane"]["acl"]["addresses"]["ipv6"] == [ "1234::5678" ] + + def test_cluster_create_enterprise_without_node_pools(self): + """ + Tests that an enterprise LKE cluster can be created without node pools. + """ + with self.mock_post("lke/clusters") as m: + self.client.lke.cluster_create( + "us-west", + "test-enterprise-cluster", + "1.29", + tier="enterprise", + ) + + assert m.call_data["region"] == "us-west" + assert m.call_data["label"] == "test-enterprise-cluster" + assert m.call_data["k8s_version"] == "1.29" + assert m.call_data["tier"] == "enterprise" + assert m.call_data["node_pools"] == [] + + def test_cluster_create_enterprise_case_insensitive(self): + """ + Tests that tier comparison is case-insensitive for enterprise tier. + """ + with self.mock_post("lke/clusters") as m: + self.client.lke.cluster_create( + "us-west", + "test-enterprise-cluster", + "1.29", + tier="ENTERPRISE", + ) + + assert m.call_data["tier"] == "ENTERPRISE" + assert m.call_data["node_pools"] == [] + + def test_cluster_create_standard_without_node_pools_raises_error(self): + """ + Tests that creating a standard LKE cluster without node pools raises ValueError. + """ + with self.assertRaises(ValueError) as context: + self.client.lke.cluster_create( + "us-east", + "test-standard-cluster", + "1.29", + tier="standard", + ) + + self.assertIn( + "LKE standard clusters must have at least one node pool", + str(context.exception), + ) diff --git a/test/unit/linode_client_test.py b/test/unit/linode_client_test.py index d87e08894..e82f3562d 100644 --- a/test/unit/linode_client_test.py +++ b/test/unit/linode_client_test.py @@ -817,7 +817,7 @@ def test_cluster_create_with_api_objects(self): node_pools = self.client.lke.node_pool(node_type, 3) with self.mock_post("lke/clusters") as m: cluster = self.client.lke.cluster_create( - region, "example-cluster", node_pools, version + region, "example-cluster", version, node_pools ) self.assertEqual(m.call_data["region"], "ap-west") self.assertEqual( @@ -850,8 +850,8 @@ def test_cluster_create_with_string_repr(self): cluster = self.client.lke.cluster_create( "ap-west", "example-cluster", - {"type": "g6-standard-1", "count": 3}, "1.19", + {"type": "g6-standard-1", "count": 3}, ) self.assertEqual(m.call_data["region"], "ap-west") self.assertEqual( diff --git a/test/unit/objects/lke_test.py b/test/unit/objects/lke_test.py index 10284a0c9..91f9ed3fe 100644 --- a/test/unit/objects/lke_test.py +++ b/test/unit/objects/lke_test.py @@ -302,6 +302,7 @@ def test_cluster_create_with_labels_and_taints(self): self.client.lke.cluster_create( "us-mia", "test-acl-cluster", + "1.29", [ self.client.lke.node_pool( "g6-nanode-1", @@ -317,7 +318,6 @@ def test_cluster_create_with_labels_and_taints(self): ], ) ], - "1.29", ) assert m.call_data["node_pools"][0] == { @@ -339,13 +339,13 @@ def test_cluster_create_with_apl(self): cluster = self.client.lke.cluster_create( "us-mia", "test-aapl-cluster", + "1.29", [ self.client.lke.node_pool( "g6-dedicated-4", 3, ) ], - "1.29", apl_enabled=True, control_plane=LKEClusterControlPlaneOptions( high_availability=True, From d3300d96f20f5cebfa0634c2d81288a166c0decf Mon Sep 17 00:00:00 2001 From: rammanoj Date: Mon, 5 Jan 2026 17:51:45 -0500 Subject: [PATCH 2/2] Update linode_api4/groups/lke.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- linode_api4/groups/lke.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/linode_api4/groups/lke.py b/linode_api4/groups/lke.py index 330c1d378..6e1749cf9 100644 --- a/linode_api4/groups/lke.py +++ b/linode_api4/groups/lke.py @@ -122,9 +122,7 @@ def cluster_create( if node_pools is None: node_pools = [] - if len(node_pools) == 0 and ( - tier is None or tier.lower() != "enterprise" - ): + if len(node_pools) == 0 and (tier is None or tier.lower() != "enterprise"): raise ValueError( "LKE standard clusters must have at least one node pool." )