From 8bd53050a893bdca618556300e7d80cb05607809 Mon Sep 17 00:00:00 2001 From: Marcin Tojek Date: Wed, 30 Aug 2023 12:08:09 +0200 Subject: [PATCH] docs: describe dynamic options and locals --- examples/parameters-dynamic-options/README.md | 40 +++++ examples/parameters-dynamic-options/main.tf | 157 ++++++++++++++++++ .../parameters-dynamic-options/variables.yml | 2 + 3 files changed, 199 insertions(+) create mode 100644 examples/parameters-dynamic-options/README.md create mode 100644 examples/parameters-dynamic-options/main.tf create mode 100644 examples/parameters-dynamic-options/variables.yml diff --git a/examples/parameters-dynamic-options/README.md b/examples/parameters-dynamic-options/README.md new file mode 100644 index 0000000000000..2c6c00d6acc83 --- /dev/null +++ b/examples/parameters-dynamic-options/README.md @@ -0,0 +1,40 @@ +--- +name: Sample Template with Dynamic Parameter Options +description: Review the sample template and introduce dynamic parameter options to your template +tags: [local, docker, parameters] +icon: /icon/docker.png +--- + +# Overview + +This Coder template presents use of [dynamic](https://developer.hashicorp.com/terraform/language/expressions/dynamic-blocks) [parameter options](https://coder.com/docs/v2/latest/templates/parameters#options) and Terraform [locals](https://developer.hashicorp.com/terraform/language/values/locals). + +## Use case + +The Coder template makes use of Docker containers to provide workspace users with programming language SDKs like Go, Java, and more. +The template administrator wants to make sure that only certain versions of these programming environments are available, +without allowing users to manually change them. + +Workspace users should simply choose the programming environment they prefer. When the template admin upgrades SDK versions, +during the next workspace update the chosen environment will automatically be upgraded to the latest version without causing any disruption or prompts. + +The references to Docker images are represented by Terraform variables, and they're passed via the configuration file like this: + +```yaml +go_image: "bitnami/golang:1.20-debian-11" +java_image: "bitnami/java:1.8-debian-11 +``` + +The template admin needs to update image references, publish a new version of the template, and then either handle workspace updates on their own or let workspace users take care of it. + +## Development + +Update the template and push it using the following command: + +```bash +./scripts/coder-dev.sh templates push examples-parameters-dynamic-options \ + -d examples/parameters-dynamic-options \ + --variables-file examples/parameters-dynamic-options/variables.yml \ + --create \ + -y +``` diff --git a/examples/parameters-dynamic-options/main.tf b/examples/parameters-dynamic-options/main.tf new file mode 100644 index 0000000000000..20071e2664309 --- /dev/null +++ b/examples/parameters-dynamic-options/main.tf @@ -0,0 +1,157 @@ +terraform { + required_providers { + coder = { + source = "coder/coder" + version = "0.11.1" + } + docker = { + source = "kreuzwerker/docker" + version = "~> 2.22" + } + } +} + +variable "go_image" { + description = "Go SDK image reference" + type = string +} + +variable "java_image" { + description = "Java image reference." + type = string +} + +locals { + username = data.coder_workspace.me.owner + + images = { + "go" = var.go_image, + "java" = var.java_image, + } +} + +data "coder_provisioner" "me" { +} + +data "coder_workspace" "me" { +} + +data "coder_parameter" "container_image" { + name = "container_image" + display_name = "Workspace container image" + description = "Select the container image for your development environment." + default = "java" + mutable = true + + dynamic "option" { + for_each = [for k in keys(local.images) : { name = k, value = lower(k) }] + content { + name = option.value.name + value = option.value.value + } + } +} + +resource "coder_agent" "main" { + arch = data.coder_provisioner.me.arch + os = "linux" + startup_script = <