feat: Allow workspace resources to attach multiple agents (#942)

This enables a "kubernetes_pod" to attach multiple agents that
could be for multiple services. Each agent is required to have
a unique name, so SSH syntax is:

`coder ssh <workspace>.<agent>`

A resource can have zero agents too, they aren't required.
This commit is contained in:
Kyle Carberry
2022-04-11 16:06:15 -05:00
committed by GitHub
parent 2835bb45e5
commit 19b4323512
47 changed files with 1550 additions and 1040 deletions
+5 -12
View File
@@ -2,7 +2,7 @@ terraform {
required_providers {
coder = {
source = "coder/coder"
version = "0.2.1"
version = "~> 0.3.1"
}
}
}
@@ -55,12 +55,6 @@ provider "aws" {
data "coder_workspace" "me" {
}
data "coder_agent_script" "dev" {
arch = "amd64"
auth = "aws-instance-identity"
os = "linux"
}
data "aws_ami" "ubuntu" {
most_recent = true
filter {
@@ -75,8 +69,9 @@ data "aws_ami" "ubuntu" {
}
resource "coder_agent" "dev" {
count = data.coder_workspace.me.transition == "start" ? 1 : 0
instance_id = aws_instance.dev[0].id
arch = "amd64"
auth = "aws-instance-identity"
os = "linux"
}
locals {
@@ -105,7 +100,7 @@ Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="userdata.txt"
#!/bin/bash
sudo -E -u ubuntu sh -c '${data.coder_agent_script.dev.value}'
sudo -E -u ubuntu sh -c '${coder_agent.dev.init_script}'
--//--
EOT
@@ -139,11 +134,9 @@ resource "aws_instance" "dev" {
ami = data.aws_ami.ubuntu.id
availability_zone = "${var.region}a"
instance_type = "t3.micro"
count = 1
user_data = data.coder_workspace.me.transition == "start" ? local.user_data_start : local.user_data_end
tags = {
Name = "coder-${data.coder_workspace.me.owner}-${data.coder_workspace.me.name}"
}
}
+5 -10
View File
@@ -2,7 +2,7 @@ terraform {
required_providers {
coder = {
source = "coder/coder"
version = "0.2.1"
version = "~> 0.3.1"
}
}
}
@@ -42,12 +42,6 @@ provider "aws" {
data "coder_workspace" "me" {
}
data "coder_agent_script" "dev" {
arch = "amd64"
auth = "aws-instance-identity"
os = "windows"
}
data "aws_ami" "windows" {
most_recent = true
owners = ["amazon"]
@@ -59,8 +53,9 @@ data "aws_ami" "windows" {
}
resource "coder_agent" "dev" {
count = data.coder_workspace.me.transition == "start" ? 1 : 0
instance_id = aws_instance.dev[0].id
arch = "amd64"
auth = "aws-instance-identity"
os = "windows"
}
locals {
@@ -71,7 +66,7 @@ locals {
user_data_start = <<EOT
<powershell>
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
${data.coder_agent_script.dev.value}
${coder_agent.dev.init_script}
</powershell>
<persist>true</persist>
EOT
+12 -22
View File
@@ -2,7 +2,7 @@ terraform {
required_providers {
coder = {
source = "coder/coder"
version = "~> 0.2"
version = "~> 0.3.1"
}
google = {
source = "hashicorp/google"
@@ -42,25 +42,14 @@ provider "google" {
project = jsondecode(var.service_account).project_id
}
data "coder_workspace" "me" {
}
data "coder_agent_script" "dev" {
auth = "google-instance-identity"
arch = "amd64"
os = "linux"
}
data "google_compute_default_service_account" "default" {
}
resource "random_string" "random" {
length = 8
special = false
data "coder_workspace" "me" {
}
resource "google_compute_disk" "root" {
name = "coder-${lower(random_string.random.result)}"
name = "coder-${data.coder_workspace.me.owner}-${data.coder_workspace.me.name}-root"
type = "pd-ssd"
zone = var.zone
image = "debian-cloud/debian-9"
@@ -69,10 +58,16 @@ resource "google_compute_disk" "root" {
}
}
resource "coder_agent" "dev" {
auth = "google-instance-identity"
arch = "amd64"
os = "linux"
}
resource "google_compute_instance" "dev" {
zone = var.zone
count = data.coder_workspace.me.transition == "start" ? 1 : 0
name = "coder-${lower(random_string.random.result)}"
count = data.coder_workspace.me.start_count
name = "coder-${data.coder_workspace.me.owner}-${data.coder_workspace.me.name}"
machine_type = "e2-medium"
network_interface {
network = "default"
@@ -88,10 +83,5 @@ resource "google_compute_instance" "dev" {
email = data.google_compute_default_service_account.default.email
scopes = ["cloud-platform"]
}
metadata_startup_script = data.coder_agent_script.dev.value
}
resource "coder_agent" "dev" {
count = length(google_compute_instance.dev)
instance_id = google_compute_instance.dev[0].instance_id
metadata_startup_script = coder_agent.dev.init_script
}
+10 -20
View File
@@ -2,7 +2,7 @@ terraform {
required_providers {
coder = {
source = "coder/coder"
version = "~> 0.2"
version = "~> 0.3.1"
}
google = {
source = "hashicorp/google"
@@ -45,22 +45,11 @@ provider "google" {
data "coder_workspace" "me" {
}
data "coder_agent_script" "dev" {
auth = "google-instance-identity"
arch = "amd64"
os = "windows"
}
data "google_compute_default_service_account" "default" {
}
resource "random_string" "random" {
length = 8
special = false
}
resource "google_compute_disk" "root" {
name = "coder-${lower(random_string.random.result)}"
name = "coder-${data.coder_workspace.me.owner}-${data.coder_workspace.me.name}-root"
type = "pd-ssd"
zone = var.zone
image = "projects/windows-cloud/global/images/windows-server-2022-dc-core-v20220215"
@@ -69,9 +58,15 @@ resource "google_compute_disk" "root" {
}
}
resource "coder_agent" "dev" {
auth = "google-instance-identity"
arch = "amd64"
os = "windows"
}
resource "google_compute_instance" "dev" {
zone = var.zone
count = data.coder_workspace.me.transition == "start" ? 1 : 0
count = data.coder_workspace.me.start_count
name = "coder-${data.coder_workspace.me.owner}-${data.coder_workspace.me.name}"
machine_type = "e2-medium"
network_interface {
@@ -89,12 +84,7 @@ resource "google_compute_instance" "dev" {
scopes = ["cloud-platform"]
}
metadata = {
windows-startup-script-ps1 = data.coder_agent_script.dev.value
windows-startup-script-ps1 = coder_agent.dev.init_script
serial-port-enable = "TRUE"
}
}
resource "coder_agent" "dev" {
count = length(google_compute_instance.dev)
instance_id = google_compute_instance.dev[0].instance_id
}