From 7d8cc1d46641ffd5be4af50d9a3c6b90d72107cb Mon Sep 17 00:00:00 2001 From: Muhammad Atif Ali Date: Fri, 23 Feb 2024 23:20:31 +0500 Subject: [PATCH] refcator and fix jetbrains-gateway --- jetbrains-gateway/main.tf | 111 ++++++++++++++++++++++++++------------ 1 file changed, 76 insertions(+), 35 deletions(-) diff --git a/jetbrains-gateway/main.tf b/jetbrains-gateway/main.tf index 32764e3..b7bd5c3 100644 --- a/jetbrains-gateway/main.tf +++ b/jetbrains-gateway/main.tf @@ -22,6 +22,10 @@ variable "agent_name" { variable "folder" { type = string description = "The directory to open in the IDE. e.g. /home/coder/project" + validation { + condition = can(regex("^(?:/[^/]+)+$", var.folder)) + error_message = "The folder must be a full path and must not start with a ~." + } } variable "default" { @@ -69,7 +73,7 @@ variable "jetbrains_ide_versions" { validation { condition = ( alltrue([ - for code in var.jetbrains_ide_versions : contains(["IU", "PS", "WS", "PY", "CL", "GO", "RM"], code) + for code in keys(var.jetbrains_ide_versions) : contains(["IU", "PS", "WS", "PY", "CL", "GO", "RM"], code) ]) ) error_message = "The jetbrains_ide_versions must contain a map of valid product codes. Valid product codes are ${join(",", ["IU", "PS", "WS", "PY", "CL", "GO", "RM"])}." @@ -103,58 +107,71 @@ variable "jetbrains_ides" { locals { jetbrains_ides = { "GO" = { - icon = "/icon/goland.svg", - name = "GoLand", - value = jsonencode(["GO", var.jetbrains_ide_versions["GO"].build_number, "https://download.jetbrains.com/go/goland-${var.jetbrains_ide_versions["GO"].version}.tar.gz"]) + icon = "/icon/goland.svg", + name = "GoLand", + 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" }, "WS" = { - icon = "/icon/webstorm.svg", - name = "WebStorm", - value = jsonencode(["WS", var.jetbrains_ide_versions["WS"].build_number, "https://download.jetbrains.com/webstorm/WebStorm-${var.jetbrains_ide_versions["WS"].version}.tar.gz"]) + icon = "/icon/webstorm.svg", + name = "WebStorm", + 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" }, "IU" = { - icon = "/icon/intellij.svg", - name = "IntelliJ IDEA Ultimate", - value = jsonencode(["IU", var.jetbrains_ide_versions["IU"].build_number, "https://download.jetbrains.com/idea/ideaIU-${var.jetbrains_ide_versions["IU"].version}.tar.gz"]) + icon = "/icon/intellij.svg", + name = "IntelliJ IDEA Ultimate", + 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" }, "PY" = { - icon = "/icon/pycharm.svg", - name = "PyCharm Professional", - value = jsonencode(["PY", var.jetbrains_ide_versions["PY"].build_number, "https://download.jetbrains.com/python/pycharm-professional-${var.jetbrains_ide_versions["PY"].version}.tar.gz"]) + icon = "/icon/pycharm.svg", + name = "PyCharm Professional", + 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" }, "CL" = { - icon = "/icon/clion.svg", - name = "CLion", - value = jsonencode(["CL", var.jetbrains_ide_versions["CL"].build_number, "https://download.jetbrains.com/cpp/CLion-${var.jetbrains_ide_versions["CL"].version}.tar.gz"]) + icon = "/icon/clion.svg", + name = "CLion", + 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" }, "PS" = { - icon = "/icon/phpstorm.svg", - name = "PhpStorm", - value = jsonencode(["PS", var.jetbrains_ide_versions["PS"].build_number, "https://download.jetbrains.com/webide/PhpStorm-${var.jetbrains_ide_versions["PS"].version}.tar.gz"]) + icon = "/icon/phpstorm.svg", + name = "PhpStorm", + 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" }, "RM" = { - icon = "/icon/rubymine.svg", - name = "RubyMine", - value = jsonencode(["RM", var.jetbrains_ide_versions["RM"].build_number, "https://download.jetbrains.com/ruby/RubyMine-${var.jetbrains_ide_versions["RM"].version}.tar.gz"]) + icon = "/icon/rubymine.svg", + name = "RubyMine", + 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" } } } data "coder_parameter" "jetbrains_ide" { - type = "list(string)" + type = "string" name = "jetbrains_ide" display_name = "JetBrains IDE" icon = "/icon/gateway.svg" mutable = true - # check if default is in the jet_brains_ides list and if it is not empty or null otherwise set it to null - default = contains(var.jetbrains_ides, var.default) ? var.default : null + default = var.default == "" ? var.jetbrains_ides[0] : var.default dynamic "option" { - for_each = { for key, value in local.jetbrains_ides : key => value if contains(var.jetbrains_ides, key) } + for_each = var.jetbrains_ides content { - icon = option.value.icon - name = option.value.name - value = option.value.value + icon = lookup(local.jetbrains_ides, option.value).icon + name = lookup(local.jetbrains_ides, option.value).name + value = lookup(local.jetbrains_ides, option.value).identifier } } } @@ -163,9 +180,9 @@ data "coder_workspace" "me" {} resource "coder_app" "gateway" { agent_id = var.agent_id - display_name = data.coder_parameter.jetbrains_ide.option[index(data.coder_parameter.jetbrains_ide.option.*.value, data.coder_parameter.jetbrains_ide.value)].name slug = "gateway" - icon = data.coder_parameter.jetbrains_ide.option[index(data.coder_parameter.jetbrains_ide.option.*.value, data.coder_parameter.jetbrains_ide.value)].icon + 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") external = true url = join("", [ "jetbrains-gateway://connect#type=coder&workspace=", @@ -179,14 +196,38 @@ resource "coder_app" "gateway" { "&token=", "$SESSION_TOKEN", "&ide_product_code=", - jsondecode(data.coder_parameter.jetbrains_ide.value)[0], + local.jetbrains_ides[data.coder_parameter.jetbrains_ide.value].identifier, "&ide_build_number=", - jsondecode(data.coder_parameter.jetbrains_ide.value)[1], + local.jetbrains_ides[data.coder_parameter.jetbrains_ide.value].build_number, "&ide_download_link=", - jsondecode(data.coder_parameter.jetbrains_ide.value)[2], + local.jetbrains_ides[data.coder_parameter.jetbrains_ide.value].download_link ]) } -output "jetbrains_ides" { +output "identifier" { value = data.coder_parameter.jetbrains_ide.value } + +output "name" { + value = coder_app.gateway.display_name +} + +output "icon" { + value = coder_app.gateway.icon +} + +output "download_link" { + value = lookup(local.jetbrains_ides, data.coder_parameter.jetbrains_ide.value).download_link +} + +output "build_number" { + value = lookup(local.jetbrains_ides, data.coder_parameter.jetbrains_ide.value).build_number +} + +output "version" { + value = var.jetbrains_ide_versions[data.coder_parameter.jetbrains_ide.value].version +} + +output "url" { + value = coder_app.gateway.url +} \ No newline at end of file