Skip to content

Commit 08d98c8

Browse files
rammanojyec-akamailgarber-akamaiCopilotzliang-akamai
authored
Make NodePool optional for LKE-E (#741)
* make nodepools optional in cluster_create * Update plugins/modules/lke_cluster.py Co-authored-by: Copilot <[email protected]> * Update plugins/modules/lke_cluster.py Co-authored-by: Copilot <[email protected]> * use cluster.tier as it is immutable * address feedback * address feedback * Update plugins/modules/lke_cluster.py Co-authored-by: Copilot <[email protected]> * Fix node pool check for standard LKE clusters * Fix test * Apply suggestion from @Copilot Co-authored-by: Copilot <[email protected]> * Update tests/integration/targets/lke_cluster_enterprise_no_pools/tasks/main.yaml Co-authored-by: Copilot <[email protected]> --------- Co-authored-by: Ye Chen <[email protected]> Co-authored-by: Lena Garber <[email protected]> Co-authored-by: Copilot <[email protected]> Co-authored-by: Zhiwei Liang <[email protected]> Co-authored-by: Zhiwei Liang <[email protected]>
1 parent e182312 commit 08d98c8

File tree

3 files changed

+123
-7
lines changed

3 files changed

+123
-7
lines changed

plugins/modules/lke_cluster.py

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -369,6 +369,18 @@ def _get_cluster_by_name(self, name: str) -> Optional[LKECluster]:
369369
msg="failed to get lke cluster {0}: {1}".format(name, exception)
370370
)
371371

372+
def _get_node_pools(self, tier: str, params: dict) -> Optional[List[dict]]:
373+
nodepools = []
374+
if "node_pools" in params:
375+
nodepools = params.pop("node_pools")
376+
377+
if not nodepools and (not tier or tier == "standard"):
378+
# throw error if no node pools specified for standard clusters
379+
self.fail(
380+
msg="At least one node pool must be specified when creating a standard LKE cluster."
381+
)
382+
return nodepools
383+
372384
def _wait_for_all_nodes_ready(
373385
self, cluster: LKECluster, timeout: int
374386
) -> None:
@@ -417,11 +429,13 @@ def _create_cluster(self) -> Optional[LKECluster]:
417429
self.register_action("Created LKE cluster {0}".format(label))
418430

419431
# This is necessary to use fields not yet supported by linode_api4
432+
nodepools = self._get_node_pools(tier, params)
433+
420434
result = self.client.lke.cluster_create(
421-
params.pop("region"),
422-
label,
423-
params.pop("node_pools"),
424-
params.pop("k8s_version"),
435+
region=params.pop("region"),
436+
label=label,
437+
node_pools=nodepools,
438+
kube_version=params.pop("k8s_version"),
425439
**params,
426440
)
427441

@@ -514,8 +528,7 @@ def _update_cluster(self, cluster: LKECluster) -> None:
514528
copy.deepcopy(self.module.params)
515529
)
516530
new_params = {k: v for k, v in new_params.items() if k in CREATE_FIELDS}
517-
518-
pools = new_params.pop("node_pools")
531+
pools = self._get_node_pools(cluster.tier, new_params)
519532

520533
# This is handled separately
521534
new_params.pop("k8s_version")
@@ -803,7 +816,9 @@ def _populate_results(self, cluster: LKECluster) -> None:
803816
return
804817

805818
self._populate_kubeconfig_poll(cluster)
806-
self._populate_dashboard_url_poll(cluster)
819+
# enterprise clusters don't have dashboards.
820+
if cluster.tier != "enterprise":
821+
self._populate_dashboard_url_poll(cluster)
807822

808823
def _handle_present(self) -> None:
809824
params = self.module.params
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
- name: lke_cluster_enterprise_no_pools
2+
block:
3+
- set_fact:
4+
r: "{{ 1000000000 | random }}"
5+
6+
- name: Resolve an enterprise K8s version
7+
linode.cloud.lke_version_list:
8+
api_version: v4beta
9+
tier: "enterprise"
10+
register: get_lke_versions_enterprise
11+
12+
- set_fact:
13+
lke_versions: '{{ get_lke_versions_enterprise.lke_versions|sort(attribute="id", reverse=True) }}'
14+
15+
- set_fact:
16+
kube_version: '{{ lke_versions[0].id }}'
17+
18+
- name: List regions that support LKE Enterprise
19+
linode.cloud.region_list:
20+
register: all_regions
21+
22+
- set_fact:
23+
lke_e_region: >-
24+
{{ all_regions.regions
25+
| selectattr("site_type", "equalto", "core")
26+
| selectattr("capabilities", "search", "Kubernetes Enterprise")
27+
| map(attribute="id")
28+
| first }}
29+
30+
- name: Create a Linode LKE Enterprise cluster without node pools
31+
linode.cloud.lke_cluster:
32+
api_version: v4beta
33+
tier: 'enterprise'
34+
label: 'ansible-test-{{ r }}'
35+
region: '{{ lke_e_region }}'
36+
k8s_version: '{{ kube_version }}'
37+
skip_polling: true
38+
state: present
39+
register: create_enterprise_cluster
40+
41+
- name: Assert LKE cluster is created
42+
assert:
43+
that:
44+
- create_enterprise_cluster.cluster.k8s_version == kube_version
45+
- create_enterprise_cluster.cluster.region == lke_e_region
46+
- create_enterprise_cluster.cluster.tier == 'enterprise'
47+
48+
always:
49+
- ignore_errors: yes
50+
block:
51+
- name: Delete the LKE cluster
52+
linode.cloud.lke_cluster:
53+
label: '{{ create_enterprise_cluster.cluster.label }}'
54+
state: absent
55+
56+
environment:
57+
LINODE_UA_PREFIX: '{{ ua_prefix }}'
58+
LINODE_API_TOKEN: '{{ api_token }}'
59+
LINODE_API_URL: '{{ api_url }}'
60+
LINODE_API_VERSION: '{{ api_version }}'
61+
LINODE_CA: '{{ ca_file or "" }}'
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
- name: lke_cluster_standard_no_pools
2+
block:
3+
- set_fact:
4+
r: "{{ 1000000000 | random }}"
5+
6+
- name: Resolve the latest K8s version
7+
linode.cloud.lke_version_list: {}
8+
register: get_lke_versions
9+
10+
- set_fact:
11+
lke_versions: '{{ get_lke_versions.lke_versions|sort(attribute="id", reverse=True) }}'
12+
13+
- set_fact:
14+
kube_version: '{{ lke_versions[0].id }}'
15+
16+
- name: Create a Linode LKE cluster without node_pools (should fail)
17+
linode.cloud.lke_cluster:
18+
label: 'ansible-test-{{ r }}'
19+
region: us-southeast
20+
k8s_version: '{{ kube_version }}'
21+
skip_polling: true
22+
state: present
23+
register: create_cluster
24+
ignore_errors: yes
25+
26+
- name: Verify that cluster creation failed as expected
27+
assert:
28+
that:
29+
- create_cluster.changed == false
30+
- "'At least one node pool must be specified when creating a standard LKE cluster.' in create_cluster.msg"
31+
fail_msg: "Expected cluster creation to fail without node_pools, but got: {{ create_cluster }}"
32+
success_msg: "Test passed: Cluster creation properly failed without node_pools"
33+
34+
environment:
35+
LINODE_UA_PREFIX: '{{ ua_prefix }}'
36+
LINODE_API_TOKEN: '{{ api_token }}'
37+
LINODE_API_URL: '{{ api_url }}'
38+
LINODE_API_VERSION: '{{ api_version }}'
39+
LINODE_CA: '{{ ca_file or "" }}'
40+

0 commit comments

Comments
 (0)