Skip to content

Commit 6cf94c9

Browse files
committed
Port over initial version of v1 loadtest infra tf code
1 parent ae3473d commit 6cf94c9

File tree

9 files changed

+539
-0
lines changed

9 files changed

+539
-0
lines changed

.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,3 +54,7 @@ site/stats/
5454
# direnv
5555
.envrc
5656
*.test
57+
58+
# Loadtesting
59+
./scaletest/terraform/.terraform
60+
./scaletest/terraform/.terraform.lock.hcl

scaletest/README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# Load Testing
2+
3+
TODO: write something here.

scaletest/terraform/coder.tf

Lines changed: 151 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,151 @@
1+
data "google_client_config" "default" {}
2+
3+
locals {
4+
coder_helm_repo = "https://helm.coder.com/v2"
5+
coder_helm_chart = "coder"
6+
coder_release_name = "coder-${var.name}"
7+
coder_namespace = "coder-${var.name}"
8+
}
9+
10+
provider "kubernetes" {
11+
host = "https://${google_container_cluster.primary.endpoint}"
12+
cluster_ca_certificate = base64decode(google_container_cluster.primary.master_auth.0.cluster_ca_certificate)
13+
token = data.google_client_config.default.access_token
14+
}
15+
16+
provider "helm" {
17+
kubernetes {
18+
host = "https://${google_container_cluster.primary.endpoint}"
19+
cluster_ca_certificate = base64decode(google_container_cluster.primary.master_auth.0.cluster_ca_certificate)
20+
token = data.google_client_config.default.access_token
21+
}
22+
}
23+
24+
resource "kubernetes_namespace" "coder_namespace" {
25+
metadata {
26+
name = local.coder_namespace
27+
}
28+
depends_on = [
29+
google_container_node_pool.coder
30+
]
31+
}
32+
33+
resource "random_password" "postgres-admin-password" {
34+
length = 12
35+
}
36+
37+
resource "random_password" "coder-postgres-password" {
38+
length = 12
39+
}
40+
41+
resource "kubernetes_secret" "coder-db" {
42+
type = "kubernetes.io/basic-auth"
43+
metadata {
44+
name = "coder-db-url"
45+
namespace = kubernetes_namespace.coder_namespace.metadata.0.name
46+
}
47+
data = {
48+
url = "postgres://coder:${random_password.coder-postgres-password.result}@/${google_sql_database_instance.db.ip_address}?sslmode=disable"
49+
}
50+
}
51+
52+
resource "tls_private_key" "coder" {
53+
algorithm = "ED25519"
54+
}
55+
56+
resource "tls_self_signed_cert" "coder" {
57+
private_key_pem = tls_private_key.coder.private_key_pem
58+
59+
subject {
60+
common_name = "${local.coder_release_name}.${local.coder_namespace}.svc.cluster.local"
61+
}
62+
63+
allowed_uses = ["server_auth", "digital_signature", "data_encipherment", "key_agreement", "key_encipherment"]
64+
65+
# 1 year
66+
validity_period_hours = 8760
67+
68+
dns_names = [
69+
"${local.coder_release_name}.${local.coder_namespace}.svc.cluster.local",
70+
"${local.coder_release_name}.${local.coder_namespace}",
71+
"${local.coder_release_name}",
72+
]
73+
}
74+
75+
resource "kubernetes_secret" "coder-tls" {
76+
type = "kubernetes.io/tls"
77+
metadata {
78+
name = "coder-tls"
79+
namespace = kubernetes_namespace.coder_namespace.metadata.0.name
80+
}
81+
82+
data = {
83+
"tls.crt" = tls_self_signed_cert.coder.cert_pem
84+
"tls.key" = tls_private_key.coder.private_key_pem
85+
}
86+
}
87+
88+
resource "kubernetes_secret" "coder-ca" {
89+
type = "Opaque"
90+
metadata {
91+
name = "coder-ca"
92+
namespace = kubernetes_namespace.coder_namespace.metadata.0.name
93+
}
94+
data = {
95+
"ca.crt" = "${tls_self_signed_cert.coder.cert_pem}"
96+
}
97+
}
98+
99+
resource "helm_release" "coder-chart" {
100+
repository = local.coder_helm_repo
101+
chart = local.coder_helm_chart
102+
name = local.coder_release_name
103+
version = var.coder_chart_version
104+
namespace = kubernetes_namespace.coder_namespace.metadata.0.name
105+
depends_on = [
106+
google_container_node_pool.coder,
107+
]
108+
values = [<<EOF
109+
coder:
110+
env:
111+
- name: "CODER_CACHE_DIRECTORY"
112+
value: "/tmp/coder"
113+
- name: "CODER_LOGGING_HUMAN"
114+
value: "/dev/null"
115+
- name: "CODER_LOGGING_STACKDRIVER"
116+
value: "/dev/stderr"
117+
- name: "CODER_PG_CONNECTION_URL"
118+
valueFrom:
119+
secretKeyRef:
120+
name: "${kubernetes_secret.coder-db.metadata.0.name}"
121+
key: url
122+
- name: "CODER_VERBOSE"
123+
value: "true"
124+
image: ${var.coder_image_repo}:${var.coder_image_tag}
125+
replicaCount: "${var.coder_replicas}"
126+
resources:
127+
requests:
128+
cpu: "${var.coder_cpu}"
129+
memory: "${var.coder_mem}"
130+
limits:
131+
cpu: "${var.coder_cpu}"
132+
memory: "${var.coder_mem}"
133+
securityContext:
134+
readOnlyRootFilesystem: true
135+
service:
136+
enable: true
137+
tls:
138+
secretNames:
139+
- "${kubernetes_secret.coder-tls.metadata.0.name}"
140+
volumeMounts:
141+
- mountPath: "/tmp"
142+
name: cache
143+
readOnly: false
144+
volumes:
145+
- emptyDir:
146+
sizeLimit: 1024Mi
147+
name: cache
148+
149+
EOF
150+
]
151+
}

scaletest/terraform/gcp_cluster.tf

Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
data "google_compute_default_service_account" "default" {
2+
project = var.project_id
3+
}
4+
5+
resource "google_container_cluster" "primary" {
6+
name = "${var.name}-cluster"
7+
location = var.zone
8+
project = var.project_id
9+
network = google_compute_network.vpc.name
10+
subnetwork = google_compute_subnetwork.subnet.name
11+
initial_node_count = 1
12+
remove_default_node_pool = true
13+
network_policy {
14+
enabled = true
15+
}
16+
depends_on = [
17+
google_project_service.api["container.googleapis.com"]
18+
]
19+
monitoring_config {
20+
enable_components = []
21+
managed_prometheus {
22+
enabled = true
23+
}
24+
}
25+
}
26+
27+
resource "google_container_node_pool" "coder" {
28+
name = "${var.name}-node-pool-coder"
29+
location = var.zone
30+
project = var.project_id
31+
cluster = google_container_cluster.primary.name
32+
node_count = var.nodepool_size_coder
33+
node_config {
34+
oauth_scopes = [
35+
"https://www.googleapis.com/auth/logging.write",
36+
"https://www.googleapis.com/auth/monitoring",
37+
"https://www.googleapis.com/auth/trace.append",
38+
"https://www.googleapis.com/auth/devstorage.read_only",
39+
"https://www.googleapis.com/auth/service.management.readonly",
40+
"https://www.googleapis.com/auth/servicecontrol",
41+
]
42+
disk_size_gb = var.node_disk_size_gb
43+
machine_type = var.nodepool_machine_type_coder
44+
image_type = var.node_image_type
45+
preemptible = var.node_preemptible
46+
service_account = data.google_compute_default_service_account.default.email
47+
tags = ["gke-node", "${var.project_id}-gke"]
48+
labels = {
49+
env = var.project_id
50+
}
51+
metadata = {
52+
disable-legacy-endpoints = "true"
53+
}
54+
}
55+
56+
depends_on = [
57+
google_container_cluster.primary
58+
]
59+
}
60+
61+
resource "google_container_node_pool" "workspaces" {
62+
name = "${var.name}-node-pool-workspaces"
63+
location = var.zone
64+
project = var.project_id
65+
cluster = google_container_cluster.primary.name
66+
node_count = var.nodepool_size_workspaces
67+
node_config {
68+
oauth_scopes = [
69+
"https://www.googleapis.com/auth/logging.write",
70+
"https://www.googleapis.com/auth/monitoring",
71+
"https://www.googleapis.com/auth/trace.append",
72+
"https://www.googleapis.com/auth/devstorage.read_only",
73+
"https://www.googleapis.com/auth/service.management.readonly",
74+
"https://www.googleapis.com/auth/servicecontrol",
75+
]
76+
disk_size_gb = var.node_disk_size_gb
77+
machine_type = var.nodepool_machine_type_workspaces
78+
image_type = var.node_image_type
79+
preemptible = var.node_preemptible
80+
service_account = data.google_compute_default_service_account.default.email
81+
tags = ["gke-node", "${var.project_id}-gke"]
82+
labels = {
83+
env = var.project_id
84+
}
85+
metadata = {
86+
disable-legacy-endpoints = "true"
87+
}
88+
}
89+
90+
depends_on = [
91+
google_container_cluster.primary
92+
]
93+
}
94+
95+
resource "google_container_node_pool" "misc" {
96+
name = "${var.name}-node-pool-misc"
97+
location = var.zone
98+
project = var.project_id
99+
cluster = google_container_cluster.primary.name
100+
node_count = var.nodepool_size_misc
101+
node_config {
102+
oauth_scopes = [
103+
"https://www.googleapis.com/auth/logging.write",
104+
"https://www.googleapis.com/auth/monitoring",
105+
"https://www.googleapis.com/auth/trace.append",
106+
"https://www.googleapis.com/auth/devstorage.read_only",
107+
"https://www.googleapis.com/auth/service.management.readonly",
108+
"https://www.googleapis.com/auth/servicecontrol",
109+
]
110+
disk_size_gb = var.node_disk_size_gb
111+
machine_type = var.nodepool_machine_type_misc
112+
image_type = var.node_image_type
113+
preemptible = var.node_preemptible
114+
service_account = data.google_compute_default_service_account.default.email
115+
tags = ["gke-node", "${var.project_id}-gke"]
116+
labels = {
117+
env = var.project_id
118+
}
119+
metadata = {
120+
disable-legacy-endpoints = "true"
121+
}
122+
}
123+
124+
depends_on = [
125+
google_container_cluster.primary
126+
]
127+
}

scaletest/terraform/gcp_db.tf

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
data "google_compute_network" "default" {
2+
project = var.project_id
3+
name = "default"
4+
}
5+
6+
data "google_compute_global_address" "sql_peering" {
7+
name = "sql-ip-address"
8+
}
9+
10+
resource "google_service_networking_connection" "private_vpc_connection" {
11+
network = data.google_compute_network.default.id
12+
service = "servicenetworking.googleapis.com"
13+
reserved_peering_ranges = [google_compute_global_address.sql_peering.name]
14+
}
15+
16+
resource "google_sql_database_instance" "db" {
17+
name = "${var.name}-db"
18+
region = var.region
19+
database_version = var.cloudsql_version
20+
21+
depends_on = [google_service_networking_connection.private_vpc_connection]
22+
23+
settings {
24+
tier = var.cloudsql_tier
25+
activation_policy = "ALWAYS"
26+
availability_type = "ZONAL"
27+
28+
location_preference {
29+
zone = var.zone
30+
}
31+
32+
database_flags {
33+
name = "max_connections"
34+
value = "500"
35+
}
36+
37+
ip_configuration {
38+
ipv4_enabled = false
39+
private_network = data.google_compute_network.default.id
40+
}
41+
42+
insights_config {
43+
query_insights_enabled = true
44+
query_string_length = 1024
45+
record_application_tags = false
46+
record_client_address = false
47+
}
48+
}
49+
}

scaletest/terraform/gcp_project.tf

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
provider "google" {
2+
region = var.region
3+
project = var.project_id
4+
}
5+
6+
locals {
7+
project_apis = [
8+
"cloudtrace",
9+
"compute",
10+
"container",
11+
"logging",
12+
"monitoring",
13+
"servicemanagement",
14+
"servicenetworking",
15+
"sqladmin",
16+
"stackdriver",
17+
"storage-api",
18+
]
19+
}
20+
21+
data "google_project" "project" {
22+
project_id = var.project_id
23+
}
24+
25+
resource "google_project_service" "api" {
26+
for_each = toset(local.project_apis)
27+
project = data.google_project.project.project_id
28+
service = "${each.value}.googleapis.com"
29+
30+
disable_dependent_services = false
31+
disable_on_destroy = false
32+
}

scaletest/terraform/gcp_vpc.tf

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
resource "google_compute_network" "vpc" {
2+
project = var.project_id
3+
name = "${var.name}-vpc"
4+
auto_create_subnetworks = "false"
5+
depends_on = [
6+
google_project_service.api["compute.googleapis.com"]
7+
]
8+
}
9+
10+
resource "google_compute_subnetwork" "subnet" {
11+
name = "${var.name}-subnet"
12+
project = var.project_id
13+
region = var.region
14+
network = google_compute_network.vpc.name
15+
ip_cidr_range = "10.10.0.0/24"
16+
}
17+
18+
resource "google_compute_global_address" "sql_peering" {
19+
name = "${var.name}-sql-peering"
20+
purpose = "VPC_PEERING"
21+
address_type = "INTERNAL"
22+
# prefix_length = 16
23+
network = google_compute_network.vpc.id
24+
}

0 commit comments

Comments
 (0)