Skip to content

Commit d2ab5bf

Browse files
robo-caphyder
authored andcommitted
Fix the selection of latest node image available
1 parent ffd9b1d commit d2ab5bf

File tree

4 files changed

+33
-21
lines changed

4 files changed

+33
-21
lines changed

data-images.tf

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ locals {
1616
node_pool_images = try(one(data.oci_containerengine_node_pool_option.oke[*].sources), [])
1717

1818
# Parse platform/operating system information from node pool image names
19-
parsed_images = try({
19+
indexed_images = try({
2020
for k, v in local.node_pool_images : v.image_id => merge(
2121
try(element(regexall("OKE-(?P<k8s_version>[0-9\\.]+)-(?P<build>[0-9]+)", v.source_name), 0), { k8s_version = "none" }),
2222
{
@@ -25,25 +25,26 @@ locals {
2525
is_gpu = length(regexall("GPU", v.source_name)) > 0
2626
os = trimspace(replace(element(regexall("^[a-zA-Z-]+", v.source_name), 0), "-", " "))
2727
os_version = element(regexall("[0-9\\.]+", v.source_name), 0)
28+
sort_key = replace(try(join(".", regex("-([0-9]{4}\\.[01][0-9].[0-9]{1,2}).*?-([0-9]+)$", v.source_name)), v.source_name), ".", "")
2829
source_name = v.source_name
2930
},
3031
)
3132
}, {})
3233

3334
# Create non-exclusive groupings of image IDs for intersection when selecting based on config and instance shape
3435
image_ids = try(merge({
35-
x86_64 = [for k, v in local.parsed_images : k if v.arch == "x86_64"]
36-
aarch64 = [for k, v in local.parsed_images : k if v.arch == "aarch64"]
37-
oke = [for k, v in local.parsed_images : k if v.image_type == "oke" && contains(local.k8s_versions_only, v.k8s_version)]
38-
platform = [for k, v in local.parsed_images : k if v.image_type == "platform"]
39-
gpu = [for k, v in local.parsed_images : k if v.is_gpu]
40-
nongpu = [for k, v in local.parsed_images : k if !v.is_gpu]
36+
x86_64 = [for k, v in local.indexed_images : k if v.arch == "x86_64"]
37+
aarch64 = [for k, v in local.indexed_images : k if v.arch == "aarch64"]
38+
oke = [for k, v in local.indexed_images : k if v.image_type == "oke" && contains(local.k8s_versions_only, v.k8s_version)]
39+
platform = [for k, v in local.indexed_images : k if v.image_type == "platform"]
40+
gpu = [for k, v in local.indexed_images : k if v.is_gpu]
41+
nongpu = [for k, v in local.indexed_images : k if !v.is_gpu]
4142
}, {
4243
# Include groups for OS name and major version
4344
# https://developer.hashicorp.com/terraform/language/expressions/for#grouping-results
44-
for k, v in local.parsed_images : format("%v %v", v.os, split(".", v.os_version)[0]) => k...
45+
for k, v in local.indexed_images : format("%v %v", v.os, split(".", v.os_version)[0]) => k...
4546
}, {
4647
# Include groups for referenced Kubernetes versions
47-
for k, v in local.parsed_images : format("%v", v.k8s_version) => k... if contains(local.k8s_versions_only, v.k8s_version)
48+
for k, v in local.indexed_images : format("%v", v.k8s_version) => k... if contains(local.k8s_versions_only, v.k8s_version)
4849
}), {})
4950
}

module-workers.tf

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ module "workers" {
5656
image_os = var.worker_image_os
5757
image_os_version = var.worker_image_os_version
5858
image_type = var.worker_image_type
59+
indexed_images = local.indexed_images
5960
kubeproxy_mode = var.kubeproxy_mode
6061
max_pods_per_node = var.max_pods_per_node
6162
node_labels = alltrue([var.cluster_type == "basic", var.cilium_install == true]) ? merge(var.worker_node_labels, {"oci.oraclecloud.com/custom-k8s-networking" = true}) : var.worker_node_labels

modules/workers/locals.tf

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -103,18 +103,22 @@ locals {
103103
])
104104

105105
# Use provided image_id for 'custom' type, or first match for all shape + OS criteria
106-
image_id = (pool.image_type == "custom" ? pool.image_id : element(tolist(setintersection([
107-
pool.image_type == "oke" ?
108-
setintersection(
109-
lookup(var.image_ids, "oke", null),
110-
lookup(var.image_ids, trimprefix(lower(pool.kubernetes_version), "v"), null)
111-
) :
112-
lookup(var.image_ids, "platform", null),
113-
lookup(var.image_ids, pool.image_type, null),
114-
length(regexall("GPU", pool.shape)) > 0 ? var.image_ids.gpu : var.image_ids.nongpu,
115-
length(regexall("A1\\.", pool.shape)) > 0 ? var.image_ids.aarch64 : var.image_ids.x86_64,
116-
lookup(var.image_ids, format("%v %v", pool.os, split(".", pool.os_version)[0]), null),
117-
]...)), 0))
106+
image_id = (
107+
pool.image_type == "custom" ?
108+
pool.image_id :
109+
element(split("###", element(reverse(sort([for entry in tolist(setintersection([
110+
pool.image_type == "oke" ?
111+
setintersection(
112+
lookup(var.image_ids, "oke", null),
113+
lookup(var.image_ids, trimprefix(lower(pool.kubernetes_version), "v"), null)
114+
) :
115+
lookup(var.image_ids, "platform", null),
116+
lookup(var.image_ids, pool.image_type, null),
117+
length(regexall("GPU", pool.shape)) > 0 ? var.image_ids.gpu : var.image_ids.nongpu,
118+
length(regexall("A1\\.", pool.shape)) > 0 ? var.image_ids.aarch64 : var.image_ids.x86_64,
119+
lookup(var.image_ids, format("%v %v", pool.os, split(".", pool.os_version)[0]), null),
120+
]...)): "${var.indexed_images[entry].sort_key}###${entry}"])), 0)), 1)
121+
)
118122

119123
# Standard tags as defined if enabled for use
120124
# User-provided freeform tags are merged and take precedence

modules/workers/variables.tf

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,12 @@ variable "image_ids" {
138138
type = any
139139
}
140140

141+
variable "indexed_images" {
142+
default = {}
143+
description = "Map of images."
144+
type = any
145+
}
146+
141147
variable "ssh_public_key" {
142148
default = null
143149
description = "The contents of the SSH public key file. Used to allow login for workers/bastion/operator with corresponding private key."

0 commit comments

Comments
 (0)