mirror of
https://github.com/coder/coder.git
synced 2026-09-24 15:04:27 +08:00
chore: update templates to use rich parameters (#6397)
This commit is contained in:
@@ -2,7 +2,7 @@ terraform {
|
||||
required_providers {
|
||||
coder = {
|
||||
source = "coder/coder"
|
||||
version = "~> 0.6.12"
|
||||
version = "~> 0.6.17"
|
||||
}
|
||||
aws = {
|
||||
source = "hashicorp/aws"
|
||||
@@ -11,16 +11,28 @@ terraform {
|
||||
}
|
||||
}
|
||||
|
||||
variable "ecs-cluster" {
|
||||
description = "Input the ECS cluster ARN to host the workspace"
|
||||
default = ""
|
||||
}
|
||||
variable "cpu" {
|
||||
default = "1024"
|
||||
provider "coder" {
|
||||
feature_use_managed_variables = true
|
||||
}
|
||||
|
||||
variable "memory" {
|
||||
default = "2048"
|
||||
variable "ecs-cluster" {
|
||||
description = "Input the ECS cluster ARN to host the workspace"
|
||||
}
|
||||
|
||||
data "coder_parameter" "cpu" {
|
||||
name = "cpu"
|
||||
description = "The number of CPU units to reserve for the container"
|
||||
type = "number"
|
||||
default = "1024"
|
||||
mutable = true
|
||||
}
|
||||
|
||||
data "coder_parameter" "memory" {
|
||||
name = "memory"
|
||||
description = "The amount of memory (in MiB) to allow the container to use"
|
||||
type = "number"
|
||||
default = "2048"
|
||||
mutable = true
|
||||
}
|
||||
|
||||
# configure AWS provider with creds present on Coder server host
|
||||
@@ -34,14 +46,14 @@ resource "aws_ecs_task_definition" "workspace" {
|
||||
family = "coder"
|
||||
|
||||
requires_compatibilities = ["EC2"]
|
||||
cpu = var.cpu
|
||||
memory = var.memory
|
||||
cpu = data.coder_parameter.cpu.value
|
||||
memory = data.coder_parameter.memory.value
|
||||
container_definitions = jsonencode([
|
||||
{
|
||||
name = "coder-workspace-${data.coder_workspace.me.id}"
|
||||
image = "codercom/enterprise-base:ubuntu"
|
||||
cpu = 1024
|
||||
memory = 2048
|
||||
cpu = tonumber(data.coder_parameter.cpu.value)
|
||||
memory = tonumber(data.coder_parameter.memory.value)
|
||||
essential = true
|
||||
user = "coder"
|
||||
command = ["sh", "-c", coder_agent.coder.init_script]
|
||||
@@ -92,11 +104,10 @@ resource "aws_ecs_service" "workspace" {
|
||||
data "coder_workspace" "me" {}
|
||||
|
||||
resource "coder_agent" "coder" {
|
||||
arch = "amd64"
|
||||
auth = "token"
|
||||
os = "linux"
|
||||
dir = "/home/coder"
|
||||
|
||||
arch = "amd64"
|
||||
auth = "token"
|
||||
os = "linux"
|
||||
dir = "/home/coder"
|
||||
login_before_ready = false
|
||||
startup_script_timeout = 180
|
||||
startup_script = <<-EOT
|
||||
|
||||
@@ -2,7 +2,7 @@ terraform {
|
||||
required_providers {
|
||||
coder = {
|
||||
source = "coder/coder"
|
||||
version = "~> 0.6.12"
|
||||
version = "~> 0.6.17"
|
||||
}
|
||||
aws = {
|
||||
source = "hashicorp/aws"
|
||||
@@ -11,53 +11,133 @@ terraform {
|
||||
}
|
||||
}
|
||||
|
||||
# Last updated 2022-05-31
|
||||
# Last updated 2023-03-14
|
||||
# aws ec2 describe-regions | jq -r '[.Regions[].RegionName] | sort'
|
||||
variable "region" {
|
||||
description = "What region should your workspace live in?"
|
||||
data "coder_parameter" "region" {
|
||||
name = "Region"
|
||||
description = "The region to deploy the workspace in."
|
||||
default = "us-east-1"
|
||||
validation {
|
||||
condition = contains([
|
||||
"ap-northeast-1",
|
||||
"ap-northeast-2",
|
||||
"ap-northeast-3",
|
||||
"ap-south-1",
|
||||
"ap-southeast-1",
|
||||
"ap-southeast-2",
|
||||
"ca-central-1",
|
||||
"eu-central-1",
|
||||
"eu-north-1",
|
||||
"eu-west-1",
|
||||
"eu-west-2",
|
||||
"eu-west-3",
|
||||
"sa-east-1",
|
||||
"us-east-1",
|
||||
"us-east-2",
|
||||
"us-west-1",
|
||||
"us-west-2"
|
||||
], var.region)
|
||||
error_message = "Invalid region!"
|
||||
mutable = false
|
||||
option {
|
||||
name = "Asia Pacific (Tokyo)"
|
||||
value = "ap-northeast-1"
|
||||
icon = "/emojis/1f1ef-1f1f5.png"
|
||||
}
|
||||
option {
|
||||
name = "Asia Pacific (Seoul)"
|
||||
value = "ap-northeast-2"
|
||||
icon = "/emojis/1f1f0-1f1f7.png"
|
||||
}
|
||||
option {
|
||||
name = "Asia Pacific (Osaka-Local)"
|
||||
value = "ap-northeast-3"
|
||||
icon = "/emojis/1f1f0-1f1f7.png"
|
||||
}
|
||||
option {
|
||||
name = "Asia Pacific (Mumbai)"
|
||||
value = "ap-south-1"
|
||||
icon = "/emojis/1f1f0-1f1f7.png"
|
||||
}
|
||||
option {
|
||||
name = "Asia Pacific (Singapore)"
|
||||
value = "ap-southeast-1"
|
||||
icon = "/emojis/1f1f0-1f1f7.png"
|
||||
}
|
||||
option {
|
||||
name = "Asia Pacific (Sydney)"
|
||||
value = "ap-southeast-2"
|
||||
icon = "/emojis/1f1f0-1f1f7.png"
|
||||
}
|
||||
option {
|
||||
name = "Canada (Central)"
|
||||
value = "ca-central-1"
|
||||
icon = "/emojis/1f1e8-1f1e6.png"
|
||||
}
|
||||
option {
|
||||
name = "EU (Frankfurt)"
|
||||
value = "eu-central-1"
|
||||
icon = "/emojis/1f1ea-1f1fa.png"
|
||||
}
|
||||
option {
|
||||
name = "EU (Stockholm)"
|
||||
value = "eu-north-1"
|
||||
icon = "/emojis/1f1ea-1f1fa.png"
|
||||
}
|
||||
option {
|
||||
name = "EU (Ireland)"
|
||||
value = "eu-west-1"
|
||||
icon = "/emojis/1f1ea-1f1fa.png"
|
||||
}
|
||||
option {
|
||||
name = "EU (London)"
|
||||
value = "eu-west-2"
|
||||
icon = "/emojis/1f1ea-1f1fa.png"
|
||||
}
|
||||
option {
|
||||
name = "EU (Paris)"
|
||||
value = "eu-west-3"
|
||||
icon = "/emojis/1f1ea-1f1fa.png"
|
||||
}
|
||||
option {
|
||||
name = "South America (São Paulo)"
|
||||
value = "sa-east-1"
|
||||
icon = "/emojis/1f1e7-1f1f7.png"
|
||||
}
|
||||
option {
|
||||
name = "US East (N. Virginia)"
|
||||
value = "us-east-1"
|
||||
icon = "/emojis/1f1fa-1f1f8.png"
|
||||
}
|
||||
option {
|
||||
name = "US East (Ohio)"
|
||||
value = "us-east-2"
|
||||
icon = "/emojis/1f1fa-1f1f8.png"
|
||||
}
|
||||
option {
|
||||
name = "US West (N. California)"
|
||||
value = "us-west-1"
|
||||
icon = "/emojis/1f1fa-1f1f8.png"
|
||||
}
|
||||
option {
|
||||
name = "US West (Oregon)"
|
||||
value = "us-west-2"
|
||||
icon = "/emojis/1f1fa-1f1f8.png"
|
||||
}
|
||||
}
|
||||
|
||||
variable "instance_type" {
|
||||
data "coder_parameter" "instance_type" {
|
||||
name = "Instance Type"
|
||||
description = "What instance type should your workspace use?"
|
||||
default = "t3.micro"
|
||||
validation {
|
||||
condition = contains([
|
||||
"t3.micro",
|
||||
"t3.small",
|
||||
"t3.medium",
|
||||
"t3.large",
|
||||
"t3.xlarge",
|
||||
"t3.2xlarge",
|
||||
], var.instance_type)
|
||||
error_message = "Invalid instance type!"
|
||||
mutable = false
|
||||
option {
|
||||
name = "2 vCPU, 1 GiB RAM"
|
||||
value = "t3.micro"
|
||||
}
|
||||
option {
|
||||
name = "2 vCPU, 2 GiB RAM"
|
||||
value = "t3.small"
|
||||
}
|
||||
option {
|
||||
name = "2 vCPU, 4 GiB RAM"
|
||||
value = "t3.medium"
|
||||
}
|
||||
option {
|
||||
name = "2 vCPU, 8 GiB RAM"
|
||||
value = "t3.large"
|
||||
}
|
||||
option {
|
||||
name = "4 vCPU, 16 GiB RAM"
|
||||
value = "t3.xlarge"
|
||||
}
|
||||
option {
|
||||
name = "8 vCPU, 32 GiB RAM"
|
||||
value = "t3.2xlarge"
|
||||
}
|
||||
}
|
||||
|
||||
provider "aws" {
|
||||
region = var.region
|
||||
region = data.coder_parameter.region.value
|
||||
}
|
||||
|
||||
data "coder_workspace" "me" {
|
||||
@@ -77,10 +157,9 @@ data "aws_ami" "ubuntu" {
|
||||
}
|
||||
|
||||
resource "coder_agent" "main" {
|
||||
arch = "amd64"
|
||||
auth = "aws-instance-identity"
|
||||
os = "linux"
|
||||
|
||||
arch = "amd64"
|
||||
auth = "aws-instance-identity"
|
||||
os = "linux"
|
||||
login_before_ready = false
|
||||
startup_script_timeout = 180
|
||||
startup_script = <<-EOT
|
||||
@@ -174,8 +253,8 @@ EOT
|
||||
|
||||
resource "aws_instance" "dev" {
|
||||
ami = data.aws_ami.ubuntu.id
|
||||
availability_zone = "${var.region}a"
|
||||
instance_type = var.instance_type
|
||||
availability_zone = "${data.coder_parameter.region.value}a"
|
||||
instance_type = data.coder_parameter.instance_type.value
|
||||
|
||||
user_data = data.coder_workspace.me.transition == "start" ? local.user_data_start : local.user_data_end
|
||||
tags = {
|
||||
@@ -189,7 +268,7 @@ resource "coder_metadata" "workspace_info" {
|
||||
resource_id = aws_instance.dev.id
|
||||
item {
|
||||
key = "region"
|
||||
value = var.region
|
||||
value = data.coder_parameter.region.value
|
||||
}
|
||||
item {
|
||||
key = "instance type"
|
||||
|
||||
@@ -2,7 +2,7 @@ terraform {
|
||||
required_providers {
|
||||
coder = {
|
||||
source = "coder/coder"
|
||||
version = "~> 0.6.12"
|
||||
version = "~> 0.6.17"
|
||||
}
|
||||
aws = {
|
||||
source = "hashicorp/aws"
|
||||
@@ -11,53 +11,133 @@ terraform {
|
||||
}
|
||||
}
|
||||
|
||||
# Last updated 2022-05-31
|
||||
# Last updated 2023-03-14
|
||||
# aws ec2 describe-regions | jq -r '[.Regions[].RegionName] | sort'
|
||||
variable "region" {
|
||||
description = "What region should your workspace live in?"
|
||||
data "coder_parameter" "region" {
|
||||
name = "Region"
|
||||
description = "The region to deploy the workspace in."
|
||||
default = "us-east-1"
|
||||
validation {
|
||||
condition = contains([
|
||||
"ap-northeast-1",
|
||||
"ap-northeast-2",
|
||||
"ap-northeast-3",
|
||||
"ap-south-1",
|
||||
"ap-southeast-1",
|
||||
"ap-southeast-2",
|
||||
"ca-central-1",
|
||||
"eu-central-1",
|
||||
"eu-north-1",
|
||||
"eu-west-1",
|
||||
"eu-west-2",
|
||||
"eu-west-3",
|
||||
"sa-east-1",
|
||||
"us-east-1",
|
||||
"us-east-2",
|
||||
"us-west-1",
|
||||
"us-west-2"
|
||||
], var.region)
|
||||
error_message = "Invalid region!"
|
||||
mutable = false
|
||||
option {
|
||||
name = "Asia Pacific (Tokyo)"
|
||||
value = "ap-northeast-1"
|
||||
icon = "/emojis/1f1ef-1f1f5.png"
|
||||
}
|
||||
option {
|
||||
name = "Asia Pacific (Seoul)"
|
||||
value = "ap-northeast-2"
|
||||
icon = "/emojis/1f1f0-1f1f7.png"
|
||||
}
|
||||
option {
|
||||
name = "Asia Pacific (Osaka-Local)"
|
||||
value = "ap-northeast-3"
|
||||
icon = "/emojis/1f1f0-1f1f7.png"
|
||||
}
|
||||
option {
|
||||
name = "Asia Pacific (Mumbai)"
|
||||
value = "ap-south-1"
|
||||
icon = "/emojis/1f1f0-1f1f7.png"
|
||||
}
|
||||
option {
|
||||
name = "Asia Pacific (Singapore)"
|
||||
value = "ap-southeast-1"
|
||||
icon = "/emojis/1f1f0-1f1f7.png"
|
||||
}
|
||||
option {
|
||||
name = "Asia Pacific (Sydney)"
|
||||
value = "ap-southeast-2"
|
||||
icon = "/emojis/1f1f0-1f1f7.png"
|
||||
}
|
||||
option {
|
||||
name = "Canada (Central)"
|
||||
value = "ca-central-1"
|
||||
icon = "/emojis/1f1e8-1f1e6.png"
|
||||
}
|
||||
option {
|
||||
name = "EU (Frankfurt)"
|
||||
value = "eu-central-1"
|
||||
icon = "/emojis/1f1ea-1f1fa.png"
|
||||
}
|
||||
option {
|
||||
name = "EU (Stockholm)"
|
||||
value = "eu-north-1"
|
||||
icon = "/emojis/1f1ea-1f1fa.png"
|
||||
}
|
||||
option {
|
||||
name = "EU (Ireland)"
|
||||
value = "eu-west-1"
|
||||
icon = "/emojis/1f1ea-1f1fa.png"
|
||||
}
|
||||
option {
|
||||
name = "EU (London)"
|
||||
value = "eu-west-2"
|
||||
icon = "/emojis/1f1ea-1f1fa.png"
|
||||
}
|
||||
option {
|
||||
name = "EU (Paris)"
|
||||
value = "eu-west-3"
|
||||
icon = "/emojis/1f1ea-1f1fa.png"
|
||||
}
|
||||
option {
|
||||
name = "South America (São Paulo)"
|
||||
value = "sa-east-1"
|
||||
icon = "/emojis/1f1e7-1f1f7.png"
|
||||
}
|
||||
option {
|
||||
name = "US East (N. Virginia)"
|
||||
value = "us-east-1"
|
||||
icon = "/emojis/1f1fa-1f1f8.png"
|
||||
}
|
||||
option {
|
||||
name = "US East (Ohio)"
|
||||
value = "us-east-2"
|
||||
icon = "/emojis/1f1fa-1f1f8.png"
|
||||
}
|
||||
option {
|
||||
name = "US West (N. California)"
|
||||
value = "us-west-1"
|
||||
icon = "/emojis/1f1fa-1f1f8.png"
|
||||
}
|
||||
option {
|
||||
name = "US West (Oregon)"
|
||||
value = "us-west-2"
|
||||
icon = "/emojis/1f1fa-1f1f8.png"
|
||||
}
|
||||
}
|
||||
|
||||
variable "instance_type" {
|
||||
data "coder_parameter" "instance_type" {
|
||||
name = "Instance Type"
|
||||
description = "What instance type should your workspace use?"
|
||||
default = "t3.micro"
|
||||
validation {
|
||||
condition = contains([
|
||||
"t3.micro",
|
||||
"t3.small",
|
||||
"t3.medium",
|
||||
"t3.large",
|
||||
"t3.xlarge",
|
||||
"t3.2xlarge",
|
||||
], var.instance_type)
|
||||
error_message = "Invalid instance type!"
|
||||
mutable = false
|
||||
option {
|
||||
name = "2 vCPU, 1 GiB RAM"
|
||||
value = "t3.micro"
|
||||
}
|
||||
option {
|
||||
name = "2 vCPU, 2 GiB RAM"
|
||||
value = "t3.small"
|
||||
}
|
||||
option {
|
||||
name = "2 vCPU, 4 GiB RAM"
|
||||
value = "t3.medium"
|
||||
}
|
||||
option {
|
||||
name = "2 vCPU, 8 GiB RAM"
|
||||
value = "t3.large"
|
||||
}
|
||||
option {
|
||||
name = "4 vCPU, 16 GiB RAM"
|
||||
value = "t3.xlarge"
|
||||
}
|
||||
option {
|
||||
name = "8 vCPU, 32 GiB RAM"
|
||||
value = "t3.2xlarge"
|
||||
}
|
||||
}
|
||||
|
||||
provider "aws" {
|
||||
region = var.region
|
||||
region = data.coder_parameter.region.value
|
||||
}
|
||||
|
||||
data "coder_workspace" "me" {
|
||||
@@ -74,10 +154,9 @@ data "aws_ami" "windows" {
|
||||
}
|
||||
|
||||
resource "coder_agent" "main" {
|
||||
arch = "amd64"
|
||||
auth = "aws-instance-identity"
|
||||
os = "windows"
|
||||
|
||||
arch = "amd64"
|
||||
auth = "aws-instance-identity"
|
||||
os = "windows"
|
||||
login_before_ready = false
|
||||
}
|
||||
|
||||
@@ -104,9 +183,8 @@ EOT
|
||||
|
||||
resource "aws_instance" "dev" {
|
||||
ami = data.aws_ami.windows.id
|
||||
availability_zone = "${var.region}a"
|
||||
instance_type = var.instance_type
|
||||
count = 1
|
||||
availability_zone = "${data.coder_parameter.region.value}a"
|
||||
instance_type = data.coder_parameter.instance_type.value
|
||||
|
||||
user_data = data.coder_workspace.me.transition == "start" ? local.user_data_start : local.user_data_end
|
||||
tags = {
|
||||
@@ -114,14 +192,13 @@ resource "aws_instance" "dev" {
|
||||
# Required if you are using our example policy, see template README
|
||||
Coder_Provisioned = "true"
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
resource "coder_metadata" "workspace_info" {
|
||||
resource_id = aws_instance.dev.id
|
||||
item {
|
||||
key = "region"
|
||||
value = var.region
|
||||
value = data.coder_parameter.region.value
|
||||
}
|
||||
item {
|
||||
key = "instance type"
|
||||
|
||||
@@ -2,73 +2,215 @@ terraform {
|
||||
required_providers {
|
||||
coder = {
|
||||
source = "coder/coder"
|
||||
version = "~> 0.6.12"
|
||||
version = "~> 0.6.17"
|
||||
}
|
||||
azurerm = {
|
||||
source = "hashicorp/azurerm"
|
||||
version = "=3.0.0"
|
||||
version = "~>3.47.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
variable "location" {
|
||||
data "coder_parameter" "location" {
|
||||
name = "Location"
|
||||
description = "What location should your workspace live in?"
|
||||
default = "eastus"
|
||||
validation {
|
||||
condition = contains([
|
||||
"eastus",
|
||||
"southcentralus",
|
||||
"westus2",
|
||||
"australiaeast",
|
||||
"southeastasia",
|
||||
"northeurope",
|
||||
"westeurope",
|
||||
"centralindia",
|
||||
"eastasia",
|
||||
"japaneast",
|
||||
"brazilsouth",
|
||||
"asia",
|
||||
"asiapacific",
|
||||
"australia",
|
||||
"brazil",
|
||||
"india",
|
||||
"japan",
|
||||
"southafrica",
|
||||
"switzerland",
|
||||
"uae",
|
||||
], var.location)
|
||||
error_message = "Invalid location!"
|
||||
icon = "/emojis/1f310.png"
|
||||
mutable = false
|
||||
option {
|
||||
name = "US (Virginia)"
|
||||
value = "eastus"
|
||||
icon = "/emojis/1f1fa-1f1f8.png"
|
||||
}
|
||||
option {
|
||||
name = "US (Virginia) 2"
|
||||
value = "eastus2"
|
||||
icon = "/emojis/1f1fa-1f1f8.png"
|
||||
}
|
||||
option {
|
||||
name = "US (Texas)"
|
||||
value = "southcentralus"
|
||||
icon = "/emojis/1f1fa-1f1f8.png"
|
||||
}
|
||||
option {
|
||||
name = "US (Washington)"
|
||||
value = "westus2"
|
||||
icon = "/emojis/1f1fa-1f1f8.png"
|
||||
}
|
||||
option {
|
||||
name = "US (Arizona)"
|
||||
value = "westus3"
|
||||
icon = "/emojis/1f1fa-1f1f8.png"
|
||||
}
|
||||
option {
|
||||
name = "US (Iowa)"
|
||||
value = "centralus"
|
||||
icon = "/emojis/1f1fa-1f1f8.png"
|
||||
}
|
||||
option {
|
||||
name = "Canada (Toronto)"
|
||||
value = "canadacentral"
|
||||
icon = "/emojis/1f1e8-1f1e6.png"
|
||||
}
|
||||
option {
|
||||
name = "Brazil (Sao Paulo)"
|
||||
value = "brazilsouth"
|
||||
icon = "/emojis/1f1e7-1f1f7.png"
|
||||
}
|
||||
option {
|
||||
name = "East Asia (Hong Kong)"
|
||||
value = "eastasia"
|
||||
icon = "/emojis/1f1f0-1f1f7.png"
|
||||
}
|
||||
option {
|
||||
name = "Southeast Asia (Singapore)"
|
||||
value = "southeastasia"
|
||||
icon = "/emojis/1f1f0-1f1f7.png"
|
||||
}
|
||||
option {
|
||||
name = "Australia (New South Wales)"
|
||||
value = "australiaeast"
|
||||
icon = "/emojis/1f1e6-1f1fa.png"
|
||||
}
|
||||
option {
|
||||
name = "China (Hebei)"
|
||||
value = "chinanorth3"
|
||||
icon = "/emojis/1f1e8-1f1f3.png"
|
||||
}
|
||||
option {
|
||||
name = "India (Pune)"
|
||||
value = "centralindia"
|
||||
icon = "/emojis/1f1ee-1f1f3.png"
|
||||
}
|
||||
option {
|
||||
name = "Japan (Tokyo)"
|
||||
value = "japaneast"
|
||||
icon = "/emojis/1f1ef-1f1f5.png"
|
||||
}
|
||||
option {
|
||||
name = "Korea (Seoul)"
|
||||
value = "koreacentral"
|
||||
icon = "/emojis/1f1f0-1f1f7.png"
|
||||
}
|
||||
option {
|
||||
name = "Europe (Ireland)"
|
||||
value = "northeurope"
|
||||
icon = "/emojis/1f1ea-1f1fa.png"
|
||||
}
|
||||
option {
|
||||
name = "Europe (Netherlands)"
|
||||
value = "westeurope"
|
||||
icon = "/emojis/1f1ea-1f1fa.png"
|
||||
}
|
||||
option {
|
||||
name = "France (Paris)"
|
||||
value = "francecentral"
|
||||
icon = "/emojis/1f1eb-1f1f7.png"
|
||||
}
|
||||
option {
|
||||
name = "Germany (Frankfurt)"
|
||||
value = "germanywestcentral"
|
||||
icon = "/emojis/1f1e9-1f1ea.png"
|
||||
}
|
||||
option {
|
||||
name = "Norway (Oslo)"
|
||||
value = "norwayeast"
|
||||
icon = "/emojis/1f1f3-1f1f4.png"
|
||||
}
|
||||
option {
|
||||
name = "Sweden (Gävle)"
|
||||
value = "swedencentral"
|
||||
icon = "/emojis/1f1f8-1f1ea.png"
|
||||
}
|
||||
option {
|
||||
name = "Switzerland (Zurich)"
|
||||
value = "switzerlandnorth"
|
||||
icon = "/emojis/1f1e8-1f1ed.png"
|
||||
}
|
||||
option {
|
||||
name = "Qatar (Doha)"
|
||||
value = "qatarcentral"
|
||||
icon = "/emojis/1f1f6-1f1e6.png"
|
||||
}
|
||||
option {
|
||||
name = "UAE (Dubai)"
|
||||
value = "uaenorth"
|
||||
icon = "/emojis/1f1e6-1f1ea.png"
|
||||
}
|
||||
option {
|
||||
name = "South Africa (Johannesburg)"
|
||||
value = "southafricanorth"
|
||||
icon = "/emojis/1f1ff-1f1e6.png"
|
||||
}
|
||||
option {
|
||||
name = "UK (London)"
|
||||
value = "uksouth"
|
||||
icon = "/emojis/1f1ec-1f1e7.png"
|
||||
}
|
||||
}
|
||||
|
||||
variable "instance_type" {
|
||||
data "coder_parameter" "instance_type" {
|
||||
name = "Instance Type"
|
||||
description = "What instance type should your workspace use?"
|
||||
default = "Standard_B4ms"
|
||||
validation {
|
||||
condition = contains([
|
||||
"Standard_B1ms",
|
||||
"Standard_B2ms",
|
||||
"Standard_B4ms",
|
||||
"Standard_B8ms",
|
||||
"Standard_B12ms",
|
||||
"Standard_B16ms",
|
||||
"Standard_D2as_v5",
|
||||
"Standard_D4as_v5",
|
||||
"Standard_D8as_v5",
|
||||
"Standard_D16as_v5",
|
||||
"Standard_D32as_v5",
|
||||
], var.instance_type)
|
||||
error_message = "Invalid instance type!"
|
||||
icon = "/icon/azure.png"
|
||||
mutable = false
|
||||
option {
|
||||
name = "Standard_B1ms (1 vCPU, 2 GiB RAM)"
|
||||
value = "Standard_B1ms"
|
||||
}
|
||||
option {
|
||||
name = "Standard_B2ms (2 vCPU, 8 GiB RAM)"
|
||||
value = "Standard_B2ms"
|
||||
}
|
||||
option {
|
||||
name = "Standard_B4ms (4 vCPU, 16 GiB RAM)"
|
||||
value = "Standard_B4ms"
|
||||
}
|
||||
option {
|
||||
name = "Standard_B8ms (8 vCPU, 32 GiB RAM)"
|
||||
value = "Standard_B8ms"
|
||||
}
|
||||
option {
|
||||
name = "Standard_B12ms (12 vCPU, 48 GiB RAM)"
|
||||
value = "Standard_B12ms"
|
||||
}
|
||||
option {
|
||||
name = "Standard_B16ms (16 vCPU, 64 GiB RAM)"
|
||||
value = "Standard_B16ms"
|
||||
}
|
||||
option {
|
||||
name = "Standard_D2as_v5 (2 vCPU, 8 GiB RAM)"
|
||||
value = "Standard_D2as_v5"
|
||||
}
|
||||
option {
|
||||
name = "Standard_D4as_v5 (4 vCPU, 16 GiB RAM)"
|
||||
value = "Standard_D4as_v5"
|
||||
}
|
||||
option {
|
||||
name = "Standard_D8as_v5 (8 vCPU, 32 GiB RAM)"
|
||||
value = "Standard_D8as_v5"
|
||||
}
|
||||
option {
|
||||
name = "Standard_D16as_v5 (16 vCPU, 64 GiB RAM)"
|
||||
value = "Standard_D16as_v5"
|
||||
}
|
||||
option {
|
||||
name = "Standard_D32as_v5 (32 vCPU, 128 GiB RAM)"
|
||||
value = "Standard_D32as_v5"
|
||||
}
|
||||
}
|
||||
|
||||
variable "home_size" {
|
||||
type = number
|
||||
data "coder_parameter" "home_size" {
|
||||
name = "Home Volume Size"
|
||||
description = "How large would you like your home volume to be (in GB)?"
|
||||
default = 20
|
||||
type = "number"
|
||||
icon = "/icon/azure.png"
|
||||
mutable = false
|
||||
validation {
|
||||
condition = var.home_size >= 1
|
||||
error_message = "Value must be greater than or equal to 1."
|
||||
min = 1
|
||||
max = 1024
|
||||
}
|
||||
}
|
||||
|
||||
@@ -80,10 +222,9 @@ data "coder_workspace" "me" {
|
||||
}
|
||||
|
||||
resource "coder_agent" "main" {
|
||||
arch = "amd64"
|
||||
os = "linux"
|
||||
auth = "azure-instance-identity"
|
||||
|
||||
arch = "amd64"
|
||||
os = "linux"
|
||||
auth = "azure-instance-identity"
|
||||
login_before_ready = false
|
||||
}
|
||||
|
||||
@@ -99,7 +240,7 @@ locals {
|
||||
|
||||
resource "azurerm_resource_group" "main" {
|
||||
name = "${local.prefix}-resources"
|
||||
location = var.location
|
||||
location = data.coder_parameter.location.value
|
||||
|
||||
tags = {
|
||||
Coder_Provisioned = "true"
|
||||
@@ -160,7 +301,7 @@ resource "azurerm_managed_disk" "home" {
|
||||
name = "home"
|
||||
resource_group_name = azurerm_resource_group.main.name
|
||||
storage_account_type = "StandardSSD_LRS"
|
||||
disk_size_gb = var.home_size
|
||||
disk_size_gb = data.coder_parameter.home_size.value
|
||||
}
|
||||
|
||||
// azurerm requires an SSH key (or password) for an admin user or it won't start a VM. However,
|
||||
@@ -175,7 +316,7 @@ resource "azurerm_linux_virtual_machine" "main" {
|
||||
name = "vm"
|
||||
resource_group_name = azurerm_resource_group.main.name
|
||||
location = azurerm_resource_group.main.location
|
||||
size = var.instance_type
|
||||
size = data.coder_parameter.instance_type.value
|
||||
// cloud-init overwrites this, so the value here doesn't matter
|
||||
admin_username = "adminuser"
|
||||
admin_ssh_key {
|
||||
@@ -227,6 +368,6 @@ resource "coder_metadata" "home_info" {
|
||||
|
||||
item {
|
||||
key = "size"
|
||||
value = "${var.home_size} GiB"
|
||||
value = "${data.coder_parameter.home_size.value} GiB"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@ terraform {
|
||||
required_providers {
|
||||
coder = {
|
||||
source = "coder/coder"
|
||||
version = "~> 0.6.12"
|
||||
version = "~> 0.6.17"
|
||||
}
|
||||
digitalocean = {
|
||||
source = "digitalocean/digitalocean"
|
||||
@@ -11,6 +11,10 @@ terraform {
|
||||
}
|
||||
}
|
||||
|
||||
provider "coder" {
|
||||
feature_use_managed_variables = true
|
||||
}
|
||||
|
||||
variable "step1_do_project_id" {
|
||||
type = string
|
||||
description = <<-EOF
|
||||
@@ -21,9 +25,11 @@ variable "step1_do_project_id" {
|
||||
sensitive = true
|
||||
|
||||
validation {
|
||||
# make sure length of alphanumeric string is 36
|
||||
condition = length(var.step1_do_project_id) == 36
|
||||
error_message = "Invalid Digital Ocean Project ID."
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
variable "step2_do_admin_ssh_key" {
|
||||
@@ -45,43 +51,179 @@ variable "step2_do_admin_ssh_key" {
|
||||
}
|
||||
}
|
||||
|
||||
variable "droplet_image" {
|
||||
type = string
|
||||
description = "Which Droplet image would you like to use for your workspace?"
|
||||
default = "ubuntu-22-04-x64"
|
||||
validation {
|
||||
condition = contains(["ubuntu-22-04-x64", "ubuntu-20-04-x64", "fedora-36-x64", "fedora-35-x64", "debian-11-x64", "debian-10-x64", "centos-stream-9-x64", "centos-stream-8-x64", "rockylinux-8-x64", "rockylinux-8-4-x64"], var.droplet_image)
|
||||
error_message = "Value must be ubuntu-22-04-x64, ubuntu-20-04-x64, fedora-36-x64, fedora-35-x64, debian-11-x64, debian-10-x64, centos-stream-9-x64, centos-stream-8-x64, rockylinux-8-x64 or rockylinux-8-4-x64."
|
||||
data "coder_parameter" "droplet_image" {
|
||||
name = "Which Droplet image would you like to use for your workspace?"
|
||||
default = "ubuntu-22-04-x64"
|
||||
type = "string"
|
||||
mutable = false
|
||||
option {
|
||||
name = "Ubuntu 22.04"
|
||||
value = "ubuntu-22-04-x64"
|
||||
icon = "/icon/ubuntu.svg"
|
||||
}
|
||||
option {
|
||||
name = "Ubuntu 20.04"
|
||||
value = "ubuntu-20-04-x64"
|
||||
icon = "/icon/ubuntu.svg"
|
||||
}
|
||||
option {
|
||||
name = "Fedora 36"
|
||||
value = "fedora-36-x64"
|
||||
icon = "/icon/fedora.svg"
|
||||
}
|
||||
option {
|
||||
name = "Fedora 35"
|
||||
value = "fedora-35-x64"
|
||||
icon = "/icon/fedora.svg"
|
||||
}
|
||||
option {
|
||||
name = "Debian 11"
|
||||
value = "debian-11-x64"
|
||||
icon = "/icon/debian.svg"
|
||||
}
|
||||
option {
|
||||
name = "Debian 10"
|
||||
value = "debian-10-x64"
|
||||
icon = "/icon/debian.svg"
|
||||
}
|
||||
option {
|
||||
name = "CentOS Stream 9"
|
||||
value = "centos-stream-9-x64"
|
||||
icon = "/icon/centos.svg"
|
||||
}
|
||||
option {
|
||||
name = "CentOS Stream 8"
|
||||
value = "centos-stream-8-x64"
|
||||
icon = "/icon/centos.svg"
|
||||
}
|
||||
option {
|
||||
name = "Rocky Linux 8"
|
||||
value = "rockylinux-8-x64"
|
||||
icon = "/icon/rockylinux.svg"
|
||||
}
|
||||
option {
|
||||
name = "Rocky Linux 8.4"
|
||||
value = "rockylinux-8-4-x64"
|
||||
icon = "/icon/rockylinux.svg"
|
||||
}
|
||||
}
|
||||
|
||||
variable "droplet_size" {
|
||||
type = string
|
||||
description = "Which Droplet configuration would you like to use?"
|
||||
default = "s-1vcpu-1gb"
|
||||
validation {
|
||||
condition = contains(["s-1vcpu-1gb", "s-1vcpu-2gb", "s-2vcpu-2gb", "s-2vcpu-4gb", "s-4vcpu-8gb", "s-8vcpu-16gb"], var.droplet_size)
|
||||
error_message = "Value must be s-1vcpu-1gb, s-1vcpu-2gb, s-2vcpu-2gb, s-2vcpu-4gb, s-4vcpu-8gb or s-8vcpu-16gb."
|
||||
data "coder_parameter" "droplet_size" {
|
||||
name = "Which Droplet configuration would you like to use?"
|
||||
default = "s-1vcpu-1gb"
|
||||
type = "string"
|
||||
icon = "/icon/memory.svg"
|
||||
mutable = false
|
||||
option {
|
||||
name = "1 vCPU, 1 GB RAM"
|
||||
value = "s-1vcpu-1gb"
|
||||
}
|
||||
option {
|
||||
name = "1 vCPU, 2 GB RAM"
|
||||
value = "s-1vcpu-2gb"
|
||||
}
|
||||
option {
|
||||
name = "2 vCPU, 2 GB RAM"
|
||||
value = "s-2vcpu-2gb"
|
||||
}
|
||||
option {
|
||||
name = "2 vCPU, 4 GB RAM"
|
||||
value = "s-2vcpu-4gb"
|
||||
}
|
||||
option {
|
||||
name = "4 vCPU, 8 GB RAM"
|
||||
value = "s-4vcpu-8gb"
|
||||
}
|
||||
option {
|
||||
name = "8 vCPU, 16 GB RAM"
|
||||
value = "s-8vcpu-16gb"
|
||||
}
|
||||
}
|
||||
|
||||
variable "home_volume_size" {
|
||||
type = number
|
||||
description = "How large would you like your home volume to be (in GB)?"
|
||||
default = 20
|
||||
|
||||
data "coder_parameter" "home_volume_size" {
|
||||
name = "How large would you like your home volume to be (in GB)?"
|
||||
description = "This volume will be mounted to /home/coder."
|
||||
type = "number"
|
||||
default = "20"
|
||||
mutable = false
|
||||
validation {
|
||||
condition = var.home_volume_size >= 1
|
||||
error_message = "Value must be greater than or equal to 1."
|
||||
min = 1
|
||||
max = 999999
|
||||
}
|
||||
}
|
||||
|
||||
variable "region" {
|
||||
type = string
|
||||
description = "Which region would you like to use?"
|
||||
data "coder_parameter" "region" {
|
||||
name = "Which region would you like to use?"
|
||||
description = "This is the region where your workspace will be created."
|
||||
icon = "/emojis/1f30e.png"
|
||||
type = "string"
|
||||
default = "ams3"
|
||||
validation {
|
||||
condition = contains(["nyc1", "nyc2", "nyc3", "sfo1", "sfo2", "sfo3", "ams2", "ams3", "sgp1", "lon1", "fra1", "tor1", "blr1"], var.region)
|
||||
error_message = "Value must be nyc1, nyc2, nyc3, sfo1, sfo2, sfo3, ams2, ams3, sgp1, lon1, fra1, tor1 or blr1."
|
||||
mutable = false
|
||||
option {
|
||||
name = "New York 1"
|
||||
value = "nyc1"
|
||||
icon = "/emojis/1f1fa-1f1f8.png"
|
||||
}
|
||||
option {
|
||||
name = "New York 2"
|
||||
value = "nyc2"
|
||||
icon = "/emojis/1f1fa-1f1f8.png"
|
||||
}
|
||||
option {
|
||||
name = "New York 3"
|
||||
value = "nyc3"
|
||||
icon = "/emojis/1f1fa-1f1f8.png"
|
||||
}
|
||||
option {
|
||||
name = "San Francisco 1"
|
||||
value = "sfo1"
|
||||
icon = "/emojis/1f1fa-1f1f8.png"
|
||||
}
|
||||
option {
|
||||
name = "San Francisco 2"
|
||||
value = "sfo2"
|
||||
icon = "/emojis/1f1fa-1f1f8.png"
|
||||
}
|
||||
option {
|
||||
name = "San Francisco 3"
|
||||
value = "sfo3"
|
||||
icon = "/emojis/1f1fa-1f1f8.png"
|
||||
}
|
||||
option {
|
||||
name = "Amsterdam 2"
|
||||
value = "ams2"
|
||||
icon = "/emojis/1f1f3-1f1f1.png"
|
||||
}
|
||||
option {
|
||||
name = "Amsterdam 3"
|
||||
value = "ams3"
|
||||
icon = "/emojis/1f1f3-1f1f1.png"
|
||||
}
|
||||
option {
|
||||
name = "Singapore 1"
|
||||
value = "sgp1"
|
||||
icon = "/emojis/1f1f8-1f1ec.png"
|
||||
}
|
||||
option {
|
||||
name = "London 1"
|
||||
value = "lon1"
|
||||
icon = "/emojis/1f1ec-1f1e7.png"
|
||||
}
|
||||
option {
|
||||
name = "Frankfurt 1"
|
||||
value = "fra1"
|
||||
icon = "/emojis/1f1e9-1f1ea.png"
|
||||
}
|
||||
option {
|
||||
name = "Toronto 1"
|
||||
value = "tor1"
|
||||
icon = "/emojis/1f1e8-1f1e6.png"
|
||||
}
|
||||
option {
|
||||
name = "Bangalore 1"
|
||||
value = "blr1"
|
||||
icon = "/emojis/1f1ee-1f1f3.png"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -101,9 +243,9 @@ resource "coder_agent" "main" {
|
||||
}
|
||||
|
||||
resource "digitalocean_volume" "home_volume" {
|
||||
region = var.region
|
||||
region = data.coder_parameter.region.value
|
||||
name = "coder-${data.coder_workspace.me.id}-home"
|
||||
size = var.home_volume_size
|
||||
size = data.coder_parameter.home_volume_size.value
|
||||
initial_filesystem_type = "ext4"
|
||||
initial_filesystem_label = "coder-home"
|
||||
# Protect the volume from being deleted due to changes in attributes.
|
||||
@@ -113,11 +255,12 @@ resource "digitalocean_volume" "home_volume" {
|
||||
}
|
||||
|
||||
resource "digitalocean_droplet" "workspace" {
|
||||
region = var.region
|
||||
count = data.coder_workspace.me.start_count
|
||||
name = "coder-${data.coder_workspace.me.owner}-${data.coder_workspace.me.name}"
|
||||
image = var.droplet_image
|
||||
size = var.droplet_size
|
||||
region = data.coder_parameter.region.value
|
||||
count = data.coder_workspace.me.start_count
|
||||
name = "coder-${data.coder_workspace.me.owner}-${data.coder_workspace.me.name}"
|
||||
image = data.coder_parameter.droplet_image.value
|
||||
size = data.coder_parameter.droplet_size.value
|
||||
|
||||
volume_ids = [digitalocean_volume.home_volume.id]
|
||||
user_data = templatefile("cloud-config.yaml.tftpl", {
|
||||
username = data.coder_workspace.me.owner
|
||||
@@ -161,5 +304,4 @@ resource "coder_metadata" "volume-info" {
|
||||
key = "size"
|
||||
value = "${digitalocean_volume.home_volume.size} GiB"
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -2,11 +2,11 @@ terraform {
|
||||
required_providers {
|
||||
coder = {
|
||||
source = "coder/coder"
|
||||
version = "~> 0.6.12"
|
||||
version = "~> 0.6.17"
|
||||
}
|
||||
docker = {
|
||||
source = "kreuzwerker/docker"
|
||||
version = "~> 2.20.2"
|
||||
version = "~> 3.0.1"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -21,9 +21,8 @@ data "coder_workspace" "me" {
|
||||
}
|
||||
|
||||
resource "coder_agent" "main" {
|
||||
arch = data.coder_provisioner.me.arch
|
||||
os = "linux"
|
||||
|
||||
arch = data.coder_provisioner.me.arch
|
||||
os = "linux"
|
||||
login_before_ready = false
|
||||
startup_script_timeout = 180
|
||||
startup_script = <<-EOT
|
||||
|
||||
@@ -3,11 +3,11 @@ terraform {
|
||||
required_providers {
|
||||
coder = {
|
||||
source = "coder/coder"
|
||||
version = "~> 0.6.12"
|
||||
version = "~> 0.6.17"
|
||||
}
|
||||
docker = {
|
||||
source = "kreuzwerker/docker"
|
||||
version = "~> 2.20.2"
|
||||
version = "~> 3.0.1"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -22,9 +22,8 @@ data "coder_workspace" "me" {
|
||||
}
|
||||
|
||||
resource "coder_agent" "main" {
|
||||
arch = data.coder_provisioner.me.arch
|
||||
os = "linux"
|
||||
|
||||
arch = data.coder_provisioner.me.arch
|
||||
os = "linux"
|
||||
login_before_ready = false
|
||||
startup_script_timeout = 180
|
||||
startup_script = <<-EOT
|
||||
@@ -50,24 +49,29 @@ resource "coder_app" "code-server" {
|
||||
interval = 3
|
||||
threshold = 10
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
variable "docker_image" {
|
||||
description = "What Docker image would you like to use for your workspace?"
|
||||
data "coder_parameter" "docker_image" {
|
||||
name = "What Docker image would you like to use for your workspace?"
|
||||
description = "The Docker image will be used to build your workspace. You can choose from a list of pre-built images or provide your own."
|
||||
default = "base"
|
||||
|
||||
# List of images available for the user to choose from.
|
||||
# Delete this condition to give users free text input.
|
||||
validation {
|
||||
condition = contains(["base", "java", "node"], var.docker_image)
|
||||
error_message = "Invalid Docker image!"
|
||||
icon = "/icon/docker.png"
|
||||
type = "string"
|
||||
mutable = false
|
||||
option {
|
||||
name = "Base"
|
||||
value = "base"
|
||||
icon = "/icon/code.svg"
|
||||
}
|
||||
|
||||
# Prevents admin errors when the image is not found
|
||||
validation {
|
||||
condition = fileexists("images/${var.docker_image}.Dockerfile")
|
||||
error_message = "Invalid Docker image. The file does not exist in the images directory."
|
||||
option {
|
||||
name = "Java"
|
||||
value = "java"
|
||||
icon = "/icon/java.svg"
|
||||
}
|
||||
option {
|
||||
name = "Node"
|
||||
value = "node"
|
||||
icon = "/icon/node.svg"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -101,18 +105,17 @@ resource "docker_volume" "home_volume" {
|
||||
resource "docker_image" "coder_image" {
|
||||
name = "coder-base-${data.coder_workspace.me.owner}-${lower(data.coder_workspace.me.name)}"
|
||||
build {
|
||||
path = "./images/"
|
||||
dockerfile = "${var.docker_image}.Dockerfile"
|
||||
tag = ["coder-${var.docker_image}:v0.1"]
|
||||
context = "./images/"
|
||||
dockerfile = "${data.coder_parameter.docker_image.value}.Dockerfile"
|
||||
tag = ["coder-${data.coder_parameter.docker_image.value}:v0.1"]
|
||||
}
|
||||
|
||||
# Keep alive for other workspaces to use upon deletion
|
||||
keep_locally = true
|
||||
}
|
||||
|
||||
resource "docker_container" "workspace" {
|
||||
count = data.coder_workspace.me.start_count
|
||||
image = docker_image.coder_image.latest
|
||||
image = docker_image.coder_image.image_id
|
||||
# Uses lower() to avoid Docker restriction on container names.
|
||||
name = "coder-${data.coder_workspace.me.owner}-${lower(data.coder_workspace.me.name)}"
|
||||
# Hostname makes the shell more user friendly: coder@my-workspace:~$
|
||||
@@ -154,6 +157,6 @@ resource "coder_metadata" "container_info" {
|
||||
|
||||
item {
|
||||
key = "image"
|
||||
value = var.docker_image
|
||||
value = data.coder_parameter.docker_image.value
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,11 +9,11 @@ terraform {
|
||||
required_providers {
|
||||
coder = {
|
||||
source = "coder/coder"
|
||||
version = "~> 0.6.12"
|
||||
version = "~> 0.6.17"
|
||||
}
|
||||
docker = {
|
||||
source = "kreuzwerker/docker"
|
||||
version = "~> 2.20.2"
|
||||
version = "~> 3.0.1"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -27,26 +27,33 @@ provider "docker" {
|
||||
data "coder_workspace" "me" {
|
||||
}
|
||||
|
||||
variable "docker_image" {
|
||||
default = "codercom/enterprise-base:ubuntu"
|
||||
data "coder_parameter" "docker_image" {
|
||||
name = "What Docker image would you like to use for your workspace?"
|
||||
description = "The Docker image will be used to build your workspace."
|
||||
default = "codercom/enterprise-base:ubuntu"
|
||||
icon = "/icon/docker.png"
|
||||
type = "string"
|
||||
mutable = false
|
||||
}
|
||||
|
||||
variable "dotfiles_uri" {
|
||||
data "coder_parameter" "dotfiles_uri" {
|
||||
name = "What dotfiles repo would you like to use for your workspace?"
|
||||
description = <<-EOF
|
||||
Dotfiles repo URI (optional)
|
||||
|
||||
see https://dotfiles.github.io
|
||||
EOF
|
||||
default = ""
|
||||
type = "string"
|
||||
mutable = true
|
||||
}
|
||||
|
||||
resource "coder_agent" "main" {
|
||||
arch = data.coder_provisioner.me.arch
|
||||
os = "linux"
|
||||
|
||||
arch = data.coder_provisioner.me.arch
|
||||
os = "linux"
|
||||
login_before_ready = false
|
||||
startup_script_timeout = 180
|
||||
env = { "DOTFILES_URI" = var.dotfiles_uri != "" ? var.dotfiles_uri : null }
|
||||
env = { "DOTFILES_URI" = data.coder_parameter.dotfiles_uri.value != "" ? data.coder_parameter.dotfiles_uri.value : null }
|
||||
startup_script = <<-EOT
|
||||
set -e
|
||||
if [ -n "$DOTFILES_URI" ]; then
|
||||
@@ -85,7 +92,7 @@ resource "docker_volume" "home_volume" {
|
||||
|
||||
resource "docker_container" "workspace" {
|
||||
count = data.coder_workspace.me.start_count
|
||||
image = var.docker_image
|
||||
image = data.coder_parameter.docker_image.value
|
||||
# Uses lower() to avoid Docker restriction on container names.
|
||||
name = "coder-${data.coder_workspace.me.owner}-${lower(data.coder_workspace.me.name)}"
|
||||
# Hostname makes the shell more user friendly: coder@my-workspace:~$
|
||||
@@ -127,6 +134,6 @@ resource "coder_metadata" "container_info" {
|
||||
|
||||
item {
|
||||
key = "image"
|
||||
value = var.docker_image
|
||||
value = data.coder_parameter.docker_image.value
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,11 +2,11 @@ terraform {
|
||||
required_providers {
|
||||
coder = {
|
||||
source = "coder/coder"
|
||||
version = "~> 0.6.12"
|
||||
version = "~> 0.6.17"
|
||||
}
|
||||
docker = {
|
||||
source = "kreuzwerker/docker"
|
||||
version = "~> 2.22"
|
||||
version = "~> 3.0.1"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -25,9 +25,8 @@ data "coder_workspace" "me" {
|
||||
}
|
||||
|
||||
resource "coder_agent" "main" {
|
||||
arch = data.coder_provisioner.me.arch
|
||||
os = "linux"
|
||||
|
||||
arch = data.coder_provisioner.me.arch
|
||||
os = "linux"
|
||||
login_before_ready = false
|
||||
startup_script_timeout = 180
|
||||
startup_script = <<-EOT
|
||||
@@ -66,7 +65,6 @@ resource "coder_app" "code-server" {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
resource "docker_volume" "home_volume" {
|
||||
name = "coder-${data.coder_workspace.me.id}-home"
|
||||
# Protect the volume from being deleted due to changes in attributes.
|
||||
@@ -94,11 +92,10 @@ resource "docker_volume" "home_volume" {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
resource "docker_image" "main" {
|
||||
name = "coder-${data.coder_workspace.me.id}"
|
||||
build {
|
||||
path = "./build"
|
||||
context = "./build"
|
||||
build_args = {
|
||||
USER = local.username
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@ terraform {
|
||||
required_providers {
|
||||
coder = {
|
||||
source = "coder/coder"
|
||||
version = "~> 0.6.12"
|
||||
version = "~> 0.6.17"
|
||||
}
|
||||
google = {
|
||||
source = "hashicorp/google"
|
||||
@@ -11,21 +11,49 @@ terraform {
|
||||
}
|
||||
}
|
||||
|
||||
provider "coder" {
|
||||
feature_use_managed_variables = true
|
||||
}
|
||||
|
||||
variable "project_id" {
|
||||
description = "Which Google Compute Project should your workspace live in?"
|
||||
}
|
||||
|
||||
variable "zone" {
|
||||
description = "What region should your workspace live in?"
|
||||
default = "us-central1-a"
|
||||
validation {
|
||||
condition = contains(["northamerica-northeast1-a", "us-central1-a", "us-west2-c", "europe-west4-b", "southamerica-east1-a"], var.zone)
|
||||
error_message = "Invalid zone!"
|
||||
data "coder_parameter" "zone" {
|
||||
name = "What region should your workspace live in?"
|
||||
type = "string"
|
||||
icon = "/emojis/1f30e.png"
|
||||
default = "us-central1-a"
|
||||
mutable = false
|
||||
option {
|
||||
name = "North America (Northeast)"
|
||||
value = "northamerica-northeast1-a"
|
||||
icon = "/emojis/1f1fa-1f1f8.png"
|
||||
}
|
||||
option {
|
||||
name = "North America (Central)"
|
||||
value = "us-central1-a"
|
||||
icon = "/emojis/1f1fa-1f1f8.png"
|
||||
}
|
||||
option {
|
||||
name = "North America (West)"
|
||||
value = "us-west2-c"
|
||||
icon = "/emojis/1f1fa-1f1f8.png"
|
||||
}
|
||||
option {
|
||||
name = "Europe (West)"
|
||||
value = "europe-west4-b"
|
||||
icon = "/emojis/1f1ea-1f1fa.png"
|
||||
}
|
||||
option {
|
||||
name = "South America (East)"
|
||||
value = "southamerica-east1-a"
|
||||
icon = "/emojis/1f1e7-1f1f7.png"
|
||||
}
|
||||
}
|
||||
|
||||
provider "google" {
|
||||
zone = var.zone
|
||||
zone = data.coder_parameter.zone.value
|
||||
project = var.project_id
|
||||
}
|
||||
|
||||
@@ -38,7 +66,7 @@ data "coder_workspace" "me" {
|
||||
resource "google_compute_disk" "root" {
|
||||
name = "coder-${data.coder_workspace.me.id}-root"
|
||||
type = "pd-ssd"
|
||||
zone = var.zone
|
||||
zone = data.coder_parameter.zone.value
|
||||
image = "debian-cloud/debian-11"
|
||||
lifecycle {
|
||||
ignore_changes = [name, image]
|
||||
@@ -46,10 +74,9 @@ resource "google_compute_disk" "root" {
|
||||
}
|
||||
|
||||
resource "coder_agent" "main" {
|
||||
auth = "google-instance-identity"
|
||||
arch = "amd64"
|
||||
os = "linux"
|
||||
|
||||
auth = "google-instance-identity"
|
||||
arch = "amd64"
|
||||
os = "linux"
|
||||
login_before_ready = false
|
||||
startup_script_timeout = 180
|
||||
startup_script = <<-EOT
|
||||
@@ -79,7 +106,7 @@ resource "coder_app" "code-server" {
|
||||
}
|
||||
|
||||
resource "google_compute_instance" "dev" {
|
||||
zone = var.zone
|
||||
zone = data.coder_parameter.zone.value
|
||||
count = data.coder_workspace.me.start_count
|
||||
name = "coder-${lower(data.coder_workspace.me.owner)}-${lower(data.coder_workspace.me.name)}-root"
|
||||
machine_type = "e2-medium"
|
||||
|
||||
@@ -2,7 +2,7 @@ terraform {
|
||||
required_providers {
|
||||
coder = {
|
||||
source = "coder/coder"
|
||||
version = "~> 0.6.12"
|
||||
version = "~> 0.6.17"
|
||||
}
|
||||
google = {
|
||||
source = "hashicorp/google"
|
||||
@@ -11,21 +11,49 @@ terraform {
|
||||
}
|
||||
}
|
||||
|
||||
provider "coder" {
|
||||
feature_use_managed_variables = true
|
||||
}
|
||||
|
||||
variable "project_id" {
|
||||
description = "Which Google Compute Project should your workspace live in?"
|
||||
}
|
||||
|
||||
variable "zone" {
|
||||
description = "What region should your workspace live in?"
|
||||
default = "us-central1-a"
|
||||
validation {
|
||||
condition = contains(["northamerica-northeast1-a", "us-central1-a", "us-west2-c", "europe-west4-b", "southamerica-east1-a"], var.zone)
|
||||
error_message = "Invalid zone!"
|
||||
data "coder_parameter" "zone" {
|
||||
name = "What region should your workspace live in?"
|
||||
type = "string"
|
||||
default = "us-central1-a"
|
||||
icon = "/emojis/1f30e.png"
|
||||
mutable = false
|
||||
option {
|
||||
name = "North America (Northeast)"
|
||||
value = "northamerica-northeast1-a"
|
||||
icon = "/emojis/1f1fa-1f1f8.png"
|
||||
}
|
||||
option {
|
||||
name = "North America (Central)"
|
||||
value = "us-central1-a"
|
||||
icon = "/emojis/1f1fa-1f1f8.png"
|
||||
}
|
||||
option {
|
||||
name = "North America (West)"
|
||||
value = "us-west2-c"
|
||||
icon = "/emojis/1f1fa-1f1f8.png"
|
||||
}
|
||||
option {
|
||||
name = "Europe (West)"
|
||||
value = "europe-west4-b"
|
||||
icon = "/emojis/1f1ea-1f1fa.png"
|
||||
}
|
||||
option {
|
||||
name = "South America (East)"
|
||||
value = "southamerica-east1-a"
|
||||
icon = "/emojis/1f1e7-1f1f7.png"
|
||||
}
|
||||
}
|
||||
|
||||
provider "google" {
|
||||
zone = var.zone
|
||||
zone = data.coder_parameter.zone.value
|
||||
project = var.project_id
|
||||
}
|
||||
|
||||
@@ -83,7 +111,7 @@ module "gce-container" {
|
||||
}
|
||||
|
||||
resource "google_compute_instance" "dev" {
|
||||
zone = var.zone
|
||||
zone = data.coder_parameter.zone.value
|
||||
count = data.coder_workspace.me.start_count
|
||||
name = "coder-${lower(data.coder_workspace.me.owner)}-${lower(data.coder_workspace.me.name)}"
|
||||
machine_type = "e2-medium"
|
||||
|
||||
@@ -2,7 +2,7 @@ terraform {
|
||||
required_providers {
|
||||
coder = {
|
||||
source = "coder/coder"
|
||||
version = "~> 0.6.12"
|
||||
version = "~> 0.6.17"
|
||||
}
|
||||
google = {
|
||||
source = "hashicorp/google"
|
||||
@@ -11,21 +11,49 @@ terraform {
|
||||
}
|
||||
}
|
||||
|
||||
provider "coder" {
|
||||
feature_use_managed_variables = true
|
||||
}
|
||||
|
||||
variable "project_id" {
|
||||
description = "Which Google Compute Project should your workspace live in?"
|
||||
}
|
||||
|
||||
variable "zone" {
|
||||
description = "What region should your workspace live in?"
|
||||
default = "us-central1-a"
|
||||
validation {
|
||||
condition = contains(["northamerica-northeast1-a", "us-central1-a", "us-west2-c", "europe-west4-b", "southamerica-east1-a"], var.zone)
|
||||
error_message = "Invalid zone!"
|
||||
data "coder_parameter" "zone" {
|
||||
name = "What region should your workspace live in?"
|
||||
type = "string"
|
||||
default = "us-central1-a"
|
||||
icon = "/emojis/1f30e.png"
|
||||
mutable = false
|
||||
option {
|
||||
name = "North America (Northeast)"
|
||||
value = "northamerica-northeast1-a"
|
||||
icon = "/emojis/1f1fa-1f1f8.png"
|
||||
}
|
||||
option {
|
||||
name = "North America (Central)"
|
||||
value = "us-central1-a"
|
||||
icon = "/emojis/1f1fa-1f1f8.png"
|
||||
}
|
||||
option {
|
||||
name = "North America (West)"
|
||||
value = "us-west2-c"
|
||||
icon = "/emojis/1f1fa-1f1f8.png"
|
||||
}
|
||||
option {
|
||||
name = "Europe (West)"
|
||||
value = "europe-west4-b"
|
||||
icon = "/emojis/1f1ea-1f1fa.png"
|
||||
}
|
||||
option {
|
||||
name = "South America (East)"
|
||||
value = "southamerica-east1-a"
|
||||
icon = "/emojis/1f1e7-1f1f7.png"
|
||||
}
|
||||
}
|
||||
|
||||
provider "google" {
|
||||
zone = var.zone
|
||||
zone = data.coder_parameter.zone.value
|
||||
project = var.project_id
|
||||
}
|
||||
|
||||
@@ -38,7 +66,7 @@ data "google_compute_default_service_account" "default" {
|
||||
resource "google_compute_disk" "root" {
|
||||
name = "coder-${data.coder_workspace.me.id}-root"
|
||||
type = "pd-ssd"
|
||||
zone = var.zone
|
||||
zone = data.coder_parameter.zone.value
|
||||
image = "projects/windows-cloud/global/images/windows-server-2022-dc-core-v20220215"
|
||||
lifecycle {
|
||||
ignore_changes = [name, image]
|
||||
@@ -54,7 +82,7 @@ resource "coder_agent" "main" {
|
||||
}
|
||||
|
||||
resource "google_compute_instance" "dev" {
|
||||
zone = var.zone
|
||||
zone = data.coder_parameter.zone.value
|
||||
count = data.coder_workspace.me.start_count
|
||||
name = "coder-${lower(data.coder_workspace.me.owner)}-${lower(data.coder_workspace.me.name)}"
|
||||
machine_type = "e2-medium"
|
||||
|
||||
@@ -2,11 +2,11 @@ terraform {
|
||||
required_providers {
|
||||
coder = {
|
||||
source = "coder/coder"
|
||||
version = "~> 0.6.12"
|
||||
version = "~> 0.6.17"
|
||||
}
|
||||
kubernetes = {
|
||||
source = "hashicorp/kubernetes"
|
||||
version = "~> 2.10"
|
||||
version = "~> 2.18"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -17,40 +17,60 @@ provider "kubernetes" {
|
||||
|
||||
data "coder_workspace" "me" {}
|
||||
|
||||
variable "os" {
|
||||
description = "Operating system"
|
||||
validation {
|
||||
condition = contains(["ubuntu", "fedora"], var.os)
|
||||
error_message = "Invalid zone!"
|
||||
}
|
||||
data "coder_parameter" "os" {
|
||||
name = "Operating system"
|
||||
default = "ubuntu"
|
||||
}
|
||||
|
||||
variable "cpu" {
|
||||
description = "CPU (__ cores)"
|
||||
default = 2
|
||||
validation {
|
||||
condition = contains([
|
||||
"2",
|
||||
"4",
|
||||
"6",
|
||||
"8"
|
||||
], var.cpu)
|
||||
error_message = "Invalid cpu!"
|
||||
option {
|
||||
name = "Ubuntu"
|
||||
value = "ubuntu"
|
||||
icon = "/icon/ubuntu.svg"
|
||||
}
|
||||
option {
|
||||
name = "Fedora"
|
||||
value = "fedora"
|
||||
icon = "/icon/fedora.svg"
|
||||
}
|
||||
}
|
||||
|
||||
variable "memory" {
|
||||
description = "Memory (__ GB)"
|
||||
default = 2
|
||||
validation {
|
||||
condition = contains([
|
||||
"2",
|
||||
"4",
|
||||
"6",
|
||||
"8"
|
||||
], var.memory)
|
||||
error_message = "Invalid memory!"
|
||||
data "coder_parameter" "cpu" {
|
||||
name = "CPU (cores)"
|
||||
default = "2"
|
||||
option {
|
||||
name = "2 Cores"
|
||||
value = "2"
|
||||
}
|
||||
option {
|
||||
name = "4 Cores"
|
||||
value = "4"
|
||||
}
|
||||
option {
|
||||
name = "6 Cores"
|
||||
value = "6"
|
||||
}
|
||||
option {
|
||||
name = "8 Cores"
|
||||
value = "8"
|
||||
}
|
||||
}
|
||||
|
||||
data "coder_parameter" "memory" {
|
||||
name = "Memory (GB)"
|
||||
default = "2"
|
||||
option {
|
||||
name = "2 GB"
|
||||
value = "2"
|
||||
}
|
||||
option {
|
||||
name = "4 GB"
|
||||
value = "4"
|
||||
}
|
||||
option {
|
||||
name = "6 GB"
|
||||
value = "6"
|
||||
}
|
||||
option {
|
||||
name = "8 GB"
|
||||
value = "8"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -72,10 +92,11 @@ resource "coder_agent" "dev" {
|
||||
|
||||
# code-server
|
||||
resource "coder_app" "code-server" {
|
||||
agent_id = coder_agent.dev.id
|
||||
name = "code-server"
|
||||
icon = "/icon/code.svg"
|
||||
url = "http://localhost:13337"
|
||||
agent_id = coder_agent.dev.id
|
||||
display_name = "Code Server"
|
||||
slug = "code-server"
|
||||
icon = "/icon/code.svg"
|
||||
url = "http://localhost:13337"
|
||||
}
|
||||
|
||||
resource "kubernetes_pod" "main" {
|
||||
@@ -100,7 +121,7 @@ resource "kubernetes_pod" "main" {
|
||||
container {
|
||||
name = "dev"
|
||||
# We recommend building your own from our reference: see ./images directory
|
||||
image = "ghcr.io/coder/podman:${var.os}"
|
||||
image = "ghcr.io/coder/podman:${data.coder_parameter.os.value}"
|
||||
image_pull_policy = "Always"
|
||||
command = ["/bin/bash", "-c", coder_agent.dev.init_script]
|
||||
security_context {
|
||||
@@ -115,8 +136,8 @@ resource "kubernetes_pod" "main" {
|
||||
limits = {
|
||||
# Acquire a FUSE device, powered by smarter-device-manager
|
||||
"github.com/fuse" : 1
|
||||
cpu = "${var.cpu}"
|
||||
memory = "${var.memory}Gi"
|
||||
cpu = "${data.coder_parameter.cpu.value}"
|
||||
memory = "${data.coder_parameter.memory.value}Gi"
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -2,18 +2,21 @@ terraform {
|
||||
required_providers {
|
||||
coder = {
|
||||
source = "coder/coder"
|
||||
version = "~> 0.6.12"
|
||||
version = "~> 0.6.17"
|
||||
}
|
||||
kubernetes = {
|
||||
source = "hashicorp/kubernetes"
|
||||
version = "~> 2.12.1"
|
||||
version = "~> 2.18"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
provider "coder" {
|
||||
feature_use_managed_variables = true
|
||||
}
|
||||
|
||||
variable "use_kubeconfig" {
|
||||
type = bool
|
||||
sensitive = true
|
||||
description = <<-EOF
|
||||
Use host kubeconfig? (true/false)
|
||||
|
||||
@@ -23,63 +26,82 @@ variable "use_kubeconfig" {
|
||||
Set this to true if the Coder host is running outside the Kubernetes cluster
|
||||
for workspaces. A valid "~/.kube/config" must be present on the Coder host.
|
||||
EOF
|
||||
default = false
|
||||
}
|
||||
|
||||
variable "namespace" {
|
||||
type = string
|
||||
sensitive = true
|
||||
description = "The Kubernetes namespace to create workspaces in (must exist prior to creating workspaces)"
|
||||
}
|
||||
|
||||
variable "cpu" {
|
||||
description = "CPU (__ cores)"
|
||||
default = 2
|
||||
validation {
|
||||
condition = contains([
|
||||
"2",
|
||||
"4",
|
||||
"6",
|
||||
"8"
|
||||
], var.cpu)
|
||||
error_message = "Invalid cpu!"
|
||||
data "coder_parameter" "cpu" {
|
||||
name = "CPU (cores)"
|
||||
default = "2"
|
||||
icon = "/icon/memory.svg"
|
||||
mutable = true
|
||||
option {
|
||||
name = "2 Cores"
|
||||
value = "2"
|
||||
}
|
||||
option {
|
||||
name = "4 Cores"
|
||||
value = "4"
|
||||
}
|
||||
option {
|
||||
name = "6 Cores"
|
||||
value = "6"
|
||||
}
|
||||
option {
|
||||
name = "8 Cores"
|
||||
value = "8"
|
||||
}
|
||||
}
|
||||
|
||||
variable "memory" {
|
||||
description = "Memory (__ GB)"
|
||||
default = 2
|
||||
validation {
|
||||
condition = contains([
|
||||
"2",
|
||||
"4",
|
||||
"6",
|
||||
"8"
|
||||
], var.memory)
|
||||
error_message = "Invalid memory!"
|
||||
data "coder_parameter" "memory" {
|
||||
name = "Memory (GB)"
|
||||
default = "2"
|
||||
icon = "/icon/memory.svg"
|
||||
mutable = true
|
||||
option {
|
||||
name = "2 GB"
|
||||
value = "2"
|
||||
}
|
||||
option {
|
||||
name = "4 GB"
|
||||
value = "4"
|
||||
}
|
||||
option {
|
||||
name = "6 GB"
|
||||
value = "6"
|
||||
}
|
||||
option {
|
||||
name = "8 GB"
|
||||
value = "8"
|
||||
}
|
||||
}
|
||||
|
||||
variable "home_disk_size" {
|
||||
type = number
|
||||
description = "How large would you like your home volume to be (in GB)?"
|
||||
default = 10
|
||||
data "coder_parameter" "home_disk_size" {
|
||||
name = "Home Disk Size (GB)"
|
||||
default = "10"
|
||||
type = "number"
|
||||
icon = "/emojis/1f4be.png"
|
||||
mutable = false
|
||||
validation {
|
||||
condition = var.home_disk_size >= 1
|
||||
error_message = "Value must be greater than or equal to 1."
|
||||
min = 1
|
||||
max = 99999
|
||||
}
|
||||
}
|
||||
|
||||
provider "kubernetes" {
|
||||
# Authenticate via ~/.kube/config or a Coder-specific ServiceAccount, depending on admin preferences
|
||||
config_path = var.use_kubeconfig == true ? "~/.kube/config" : null
|
||||
config_path = var.namespace == true ? "~/.kube/config" : null
|
||||
}
|
||||
|
||||
data "coder_workspace" "me" {}
|
||||
|
||||
resource "coder_agent" "main" {
|
||||
os = "linux"
|
||||
arch = "amd64"
|
||||
|
||||
os = "linux"
|
||||
arch = "amd64"
|
||||
login_before_ready = false
|
||||
startup_script_timeout = 180
|
||||
startup_script = <<-EOT
|
||||
@@ -132,7 +154,7 @@ resource "kubernetes_persistent_volume_claim" "home" {
|
||||
access_modes = ["ReadWriteOnce"]
|
||||
resources {
|
||||
requests = {
|
||||
storage = "${var.home_disk_size}Gi"
|
||||
storage = "${data.coder_parameter.home_disk_size.value}Gi"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -181,8 +203,8 @@ resource "kubernetes_pod" "main" {
|
||||
"memory" = "512Mi"
|
||||
}
|
||||
limits = {
|
||||
"cpu" = "${var.cpu}"
|
||||
"memory" = "${var.memory}Gi"
|
||||
"cpu" = "${data.coder_parameter.cpu.value}"
|
||||
"memory" = "${data.coder_parameter.memory.value}Gi"
|
||||
}
|
||||
}
|
||||
volume_mount {
|
||||
|
||||
Reference in New Issue
Block a user