From d1ce963299947d3eceb389fd04c89f1677e3ecbd Mon Sep 17 00:00:00 2001 From: Muhammad Atif Ali Date: Mon, 15 Apr 2024 04:46:27 +0300 Subject: [PATCH 1/4] feat(jetbrains-gateway): Allow fetching latest version dynamically --- jetbrains-gateway/main.tf | 62 +++++++++++++++++++++++++++++---------- 1 file changed, 47 insertions(+), 15 deletions(-) diff --git a/jetbrains-gateway/main.tf b/jetbrains-gateway/main.tf index 7c57bee2..25432291 100644 --- a/jetbrains-gateway/main.tf +++ b/jetbrains-gateway/main.tf @@ -6,6 +6,10 @@ terraform { source = "coder/coder" version = ">= 0.17" } + http = { + source = "hashicorp/http" + version = ">= 3.0" + } } } @@ -46,6 +50,12 @@ variable "coder_parameter_order" { default = null } +variable "latest" { + type = bool + description = "Whether to fetch the latest version of the IDE." + default = true +} + variable "jetbrains_ide_versions" { type = map(object({ build_number = string @@ -120,6 +130,11 @@ variable "jetbrains_ides" { } } +data "http" "jetbrains_ide_versions" { + for_each = var.latest ? toset(var.jetbrains_ides) : toset([]) + url = "https://data.services.jetbrains.com/products/releases?code=${each.key}&latest=true&type=release" +} + locals { jetbrains_ides = { "GO" = { @@ -128,6 +143,7 @@ locals { identifier = "GO", build_number = var.jetbrains_ide_versions["GO"].build_number, download_link = "https://download.jetbrains.com/go/goland-${var.jetbrains_ide_versions["GO"].version}.tar.gz" + version = var.jetbrains_ide_versions["GO"].version }, "WS" = { icon = "/icon/webstorm.svg", @@ -135,6 +151,7 @@ locals { identifier = "WS", build_number = var.jetbrains_ide_versions["WS"].build_number, download_link = "https://download.jetbrains.com/webstorm/WebStorm-${var.jetbrains_ide_versions["WS"].version}.tar.gz" + version = var.jetbrains_ide_versions["WS"].version }, "IU" = { icon = "/icon/intellij.svg", @@ -142,6 +159,7 @@ locals { identifier = "IU", build_number = var.jetbrains_ide_versions["IU"].build_number, download_link = "https://download.jetbrains.com/idea/ideaIU-${var.jetbrains_ide_versions["IU"].version}.tar.gz" + version = var.jetbrains_ide_versions["IU"].version }, "PY" = { icon = "/icon/pycharm.svg", @@ -149,6 +167,7 @@ locals { identifier = "PY", build_number = var.jetbrains_ide_versions["PY"].build_number, download_link = "https://download.jetbrains.com/python/pycharm-professional-${var.jetbrains_ide_versions["PY"].version}.tar.gz" + version = var.jetbrains_ide_versions["PY"].version }, "CL" = { icon = "/icon/clion.svg", @@ -156,6 +175,7 @@ locals { identifier = "CL", build_number = var.jetbrains_ide_versions["CL"].build_number, download_link = "https://download.jetbrains.com/cpp/CLion-${var.jetbrains_ide_versions["CL"].version}.tar.gz" + version = var.jetbrains_ide_versions["CL"].version }, "PS" = { icon = "/icon/phpstorm.svg", @@ -163,6 +183,7 @@ locals { identifier = "PS", build_number = var.jetbrains_ide_versions["PS"].build_number, download_link = "https://download.jetbrains.com/webide/PhpStorm-${var.jetbrains_ide_versions["PS"].version}.tar.gz" + version = var.jetbrains_ide_versions["PS"].version }, "RM" = { icon = "/icon/rubymine.svg", @@ -170,6 +191,7 @@ locals { identifier = "RM", build_number = var.jetbrains_ide_versions["RM"].build_number, download_link = "https://download.jetbrains.com/ruby/RubyMine-${var.jetbrains_ide_versions["RM"].version}.tar.gz" + version = var.jetbrains_ide_versions["RM"].version } "RD" = { icon = "/icon/rider.svg", @@ -177,8 +199,18 @@ locals { identifier = "RD", build_number = var.jetbrains_ide_versions["RD"].build_number, download_link = "https://download.jetbrains.com/rider/JetBrains.Rider-${var.jetbrains_ide_versions["RD"].version}.tar.gz" + version = var.jetbrains_ide_versions["RD"].version } } + + icon = try(lookup(local.jetbrains_ides, data.coder_parameter.jetbrains_ide.value).icon, "/icon/gateway.svg") + json_data = var.latest ? jsondecode(data.http.jetbrains_ide_versions[data.coder_parameter.jetbrains_ide.value].response_body) : {} + key = var.latest ? keys(local.json_data)[0] : "" + display_name = local.jetbrains_ides[data.coder_parameter.jetbrains_ide.value].name + identifier = data.coder_parameter.jetbrains_ide.value + download_link = var.latest ? local.json_data[local.key][0].downloads.linux.link : local.jetbrains_ides[data.coder_parameter.jetbrains_ide.value].download_link + build_number = var.latest ? local.json_data[local.key][0].build : local.jetbrains_ides[data.coder_parameter.jetbrains_ide.value].build_number + version = var.latest ? local.json_data[local.key][0].version : var.jetbrains_ide_versions[data.coder_parameter.jetbrains_ide.value].version } data "coder_parameter" "jetbrains_ide" { @@ -193,9 +225,9 @@ data "coder_parameter" "jetbrains_ide" { dynamic "option" { for_each = var.jetbrains_ides content { - icon = lookup(local.jetbrains_ides, option.value).icon - name = lookup(local.jetbrains_ides, option.value).name - value = lookup(local.jetbrains_ides, option.value).identifier + icon = local.jetbrains_ides[option.value].icon + name = local.jetbrains_ides[option.value].name + value = option.value } } } @@ -205,8 +237,8 @@ data "coder_workspace" "me" {} resource "coder_app" "gateway" { agent_id = var.agent_id slug = "gateway" - display_name = try(lookup(local.jetbrains_ides, data.coder_parameter.jetbrains_ide.value).name, "JetBrains IDE") - icon = try(lookup(local.jetbrains_ides, data.coder_parameter.jetbrains_ide.value).icon, "/icon/gateway.svg") + display_name = try(lookup(data.coder_parameter.jetbrains_ide.option, data.coder_parameter.jetbrains_ide.value).name, "JetBrains IDE") + icon = try(lookup(data.coder_parameter.jetbrains_ide.option, data.coder_parameter.jetbrains_ide.value).icon, "/icon/gateway.svg") external = true order = var.order url = join("", [ @@ -221,36 +253,36 @@ resource "coder_app" "gateway" { "&token=", "$SESSION_TOKEN", "&ide_product_code=", - local.jetbrains_ides[data.coder_parameter.jetbrains_ide.value].identifier, + data.coder_parameter.jetbrains_ide.value, "&ide_build_number=", - local.jetbrains_ides[data.coder_parameter.jetbrains_ide.value].build_number, + local.build_number, "&ide_download_link=", - local.jetbrains_ides[data.coder_parameter.jetbrains_ide.value].download_link + local.download_link, ]) } output "identifier" { - value = data.coder_parameter.jetbrains_ide.value + value = local.identifier } -output "name" { - value = coder_app.gateway.display_name +output "display_name" { + value = local.display_name } output "icon" { - value = coder_app.gateway.icon + value = local.icon } output "download_link" { - value = lookup(local.jetbrains_ides, data.coder_parameter.jetbrains_ide.value).download_link + value = local.download_link } output "build_number" { - value = lookup(local.jetbrains_ides, data.coder_parameter.jetbrains_ide.value).build_number + value = local.build_number } output "version" { - value = var.jetbrains_ide_versions[data.coder_parameter.jetbrains_ide.value].version + value = local.version } output "url" { From 210312ecb59e0e331e7e820c0f46d0fc94c8fddb Mon Sep 17 00:00:00 2001 From: Muhammad Atif Ali Date: Mon, 15 Apr 2024 05:10:39 +0300 Subject: [PATCH 2/4] Add channel --- jetbrains-gateway/main.tf | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/jetbrains-gateway/main.tf b/jetbrains-gateway/main.tf index 25432291..bac0c8bf 100644 --- a/jetbrains-gateway/main.tf +++ b/jetbrains-gateway/main.tf @@ -56,6 +56,16 @@ variable "latest" { default = true } +variable "channel" { + type = string + description = "The channel to fetch the IDE version from." + default = "release" + validation { + condition = can(regex("^(?:release|eap)$", var.channel)) + error_message = "The channel must be either release or eap." + } +} + variable "jetbrains_ide_versions" { type = map(object({ build_number = string @@ -132,7 +142,7 @@ variable "jetbrains_ides" { data "http" "jetbrains_ide_versions" { for_each = var.latest ? toset(var.jetbrains_ides) : toset([]) - url = "https://data.services.jetbrains.com/products/releases?code=${each.key}&latest=true&type=release" + url = "https://data.services.jetbrains.com/products/releases?code=${each.key}&latest=true&type=${var.channel}" } locals { From f927e438d0386fad236ed75a67688520451b5e66 Mon Sep 17 00:00:00 2001 From: Muhammad Atif Ali Date: Mon, 15 Apr 2024 05:16:05 +0300 Subject: [PATCH 3/4] Update description for channel variable in main.tf --- jetbrains-gateway/main.tf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jetbrains-gateway/main.tf b/jetbrains-gateway/main.tf index bac0c8bf..02b8edb1 100644 --- a/jetbrains-gateway/main.tf +++ b/jetbrains-gateway/main.tf @@ -58,7 +58,7 @@ variable "latest" { variable "channel" { type = string - description = "The channel to fetch the IDE version from." + description = "JetBrains IDE release channel. Valid values are release and eap." default = "release" validation { condition = can(regex("^(?:release|eap)$", var.channel)) From 016a1803664da9d86a07d1f86094f8efa107f0e8 Mon Sep 17 00:00:00 2001 From: Muhammad Atif Ali Date: Wed, 17 Apr 2024 11:02:37 +0300 Subject: [PATCH 4/4] review suggestions --- jetbrains-gateway/main.tf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/jetbrains-gateway/main.tf b/jetbrains-gateway/main.tf index 02b8edb1..4c174a2d 100644 --- a/jetbrains-gateway/main.tf +++ b/jetbrains-gateway/main.tf @@ -53,7 +53,7 @@ variable "coder_parameter_order" { variable "latest" { type = bool description = "Whether to fetch the latest version of the IDE." - default = true + default = false } variable "channel" { @@ -61,7 +61,7 @@ variable "channel" { description = "JetBrains IDE release channel. Valid values are release and eap." default = "release" validation { - condition = can(regex("^(?:release|eap)$", var.channel)) + condition = can(regex("^(release|eap)$", var.channel)) error_message = "The channel must be either release or eap." } }