Skip to content

Commit f691ed7

Browse files
authored
feat: Add input validation for all Openshift add-on versions (#913)
1 parent 0d42caf commit f691ed7

File tree

3 files changed

+58
-17
lines changed

3 files changed

+58
-17
lines changed

main.tf

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ locals {
5454
}
5555

5656
########################################################################################################################
57-
# Get OCP AI Add-on Versions
57+
# Get OCP addon versions
5858
########################################################################################################################
5959

6060
data "ibm_iam_auth_token" "tokendata" {}
@@ -67,6 +67,14 @@ data "external" "ocp_addon_versions" {
6767
}
6868
}
6969

70+
# Local block to decode the json strings returned by the external data source
71+
locals {
72+
ocp_all_addon_versions = {
73+
for addon, value in data.external.ocp_addon_versions.result :
74+
addon => jsondecode(value)
75+
}
76+
}
77+
7078
# Local block to verify validations for OCP AI Addon.
7179
locals {
7280

@@ -79,7 +87,6 @@ locals {
7987
is_gpu = contains(["gx2", "gx3", "gx4"], split(".", pool.machine_type)[0])
8088
}
8189
}
82-
ocp_ai_addon_supported_versions = jsondecode(data.external.ocp_addon_versions.result["openshift-ai"])
8390
}
8491

8592
# Separate local block to handle os validations

scripts/get_ocp_addon_versions.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ def get_env_variable():
4646
"""
4747
api_endpoint = os.getenv("IBMCLOUD_CS_API_ENDPOINT")
4848
if not api_endpoint:
49-
api_endpoint = "https://containers.test.cloud.ibm.com/global"
49+
api_endpoint = "https://containers.cloud.ibm.com/global"
5050
return api_endpoint
5151

5252

variables.tf

Lines changed: 48 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -365,29 +365,63 @@ variable "addons" {
365365
default = {}
366366

367367
########################################################################################################################
368-
# OCP AI Addon version validation
368+
# OCP addons version validation
369369
########################################################################################################################
370370

371371
validation {
372-
condition = (
373-
try(var.addons["openshift-ai"].version, null) == null ||
374-
(
375-
contains(keys(local.ocp_ai_addon_supported_versions), try(var.addons["openshift-ai"].version, "") != null ? try(var.addons["openshift-ai"].version, "") : "") &&
372+
condition = alltrue([
373+
for addon_name, addon_cfg in var.addons : (
374+
try(addon_cfg.version, null) == null ? true :
375+
contains(keys(local.ocp_all_addon_versions), addon_name) &&
376+
contains(keys(local.ocp_all_addon_versions[addon_name]), tostring(addon_cfg.version)) &&
377+
(tonumber(split(".", local.ocp_version_num)[0]) * 100 + tonumber(split(".", local.ocp_version_num)[1])) >=
376378
(
377-
local.ocp_version_num >= tonumber(regexall("\\d+\\.\\d+", split(" ", lookup(local.ocp_ai_addon_supported_versions, try(var.addons["openshift-ai"].version, "") != null ? try(var.addons["openshift-ai"].version, "") : "", { supported_openshift_range = "0.0 0.0" }).supported_openshift_range)[0])[0])
379+
(
380+
tonumber(split(".", regex("\\d+\\.\\d+", split(" ", lookup(local.ocp_all_addon_versions[addon_name], tostring(addon_cfg.version), { "supported_openshift_range" = "0.0 0.0" }).supported_openshift_range)[0]))[0]) * 100 +
381+
tonumber(split(".", regex("\\d+\\.\\d+", split(" ", lookup(local.ocp_all_addon_versions[addon_name], tostring(addon_cfg.version), { "supported_openshift_range" = "0.0 0.0" }).supported_openshift_range)[0]))[1])
382+
)
378383
) &&
379384
(
380-
local.ocp_version_num < tonumber(regexall("\\d+\\.\\d+", split(" ", lookup(local.ocp_ai_addon_supported_versions, try(var.addons["openshift-ai"].version, "") != null ? try(var.addons["openshift-ai"].version, "") : "", { supported_openshift_range = "0.0 0.0" }).supported_openshift_range)[1])[0])
385+
(tonumber(split(".", local.ocp_version_num)[0]) * 100 + tonumber(split(".", local.ocp_version_num)[1])) <
386+
(
387+
(
388+
tonumber(split(".", regex("\\d+\\.\\d+", split(" ", lookup(local.ocp_all_addon_versions[addon_name], tostring(addon_cfg.version), { "supported_openshift_range" = "0.0 0.0" }).supported_openshift_range)[1]))[0]) * 100 +
389+
tonumber(split(".", regex("\\d+\\.\\d+", split(" ", lookup(local.ocp_all_addon_versions[addon_name], tostring(addon_cfg.version), { "supported_openshift_range" = "0.0 0.0" }).supported_openshift_range)[1]))[1])
390+
)
391+
)
381392
)
382393
)
383-
)
394+
])
384395

385-
error_message = (
386-
try(var.addons["openshift-ai"].version, null) != null ?
387-
(contains(keys(local.ocp_ai_addon_supported_versions), try(var.addons["openshift-ai"].version, "")) ?
388-
format("OCP AI add-on version %s requires OCP version %s", try(var.addons["openshift-ai"].version, ""), lookup(local.ocp_ai_addon_supported_versions, try(var.addons["openshift-ai"].version, ""), { supported_openshift_range = "" }).supported_openshift_range) :
389-
format("OCP AI add-on version %s is not supported.", try(var.addons["openshift-ai"].version, ""))) : "Invalid OCP AI configuration."
390-
)
396+
error_message = join("\n", flatten([
397+
"Addon validation failed:",
398+
[
399+
for addon_name, addon_cfg in var.addons : (
400+
try(addon_cfg.version, null) == null ? [] :
401+
!contains(keys(local.ocp_all_addon_versions), addon_name) ?
402+
["- Addon '${addon_name}' is not recognized."] :
403+
!contains(keys(local.ocp_all_addon_versions[addon_name]), tostring(addon_cfg.version)) ?
404+
["- Addon '${addon_name}' version '${addon_cfg.version}' is not supported."] :
405+
406+
(
407+
(tonumber(split(".", local.ocp_version_num)[0]) * 100 + tonumber(split(".", local.ocp_version_num)[1])) <
408+
(
409+
tonumber(split(".", regex("\\d+\\.\\d+", split(" ", lookup(local.ocp_all_addon_versions[addon_name], tostring(addon_cfg.version), { "supported_openshift_range" = "0.0 0.0" }).supported_openshift_range)[0]))[0]) * 100 +
410+
tonumber(split(".", regex("\\d+\\.\\d+", split(" ", lookup(local.ocp_all_addon_versions[addon_name], tostring(addon_cfg.version), { "supported_openshift_range" = "0.0 0.0" }).supported_openshift_range)[0]))[1])
411+
) ||
412+
(
413+
(tonumber(split(".", local.ocp_version_num)[0]) * 100 + tonumber(split(".", local.ocp_version_num)[1])) >=
414+
(
415+
tonumber(split(".", regex("\\d+\\.\\d+", split(" ", lookup(local.ocp_all_addon_versions[addon_name], tostring(addon_cfg.version), { "supported_openshift_range" = "0.0 0.0" }).supported_openshift_range)[1]))[0]) * 100 +
416+
tonumber(split(".", regex("\\d+\\.\\d+", split(" ", lookup(local.ocp_all_addon_versions[addon_name], tostring(addon_cfg.version), { "supported_openshift_range" = "0.0 0.0" }).supported_openshift_range)[1]))[1])
417+
)
418+
)
419+
) ?
420+
["- Addon '${addon_name}' version '${addon_cfg.version}' requires OCP version '${lookup(local.ocp_all_addon_versions[addon_name], tostring(addon_cfg.version), { "supported_openshift_range" = "0.0 0.0" }).supported_openshift_range}'"] :
421+
[]
422+
)
423+
]
424+
]))
391425
}
392426

393427
validation {

0 commit comments

Comments
 (0)