1
1
data "google_client_config" "default" {}
2
2
3
3
locals {
4
- coder_url = " https://${ var . name } -${ var . deployments [0 ]. name } -scaletest.${ var . cloudflare_domain } "
4
+ coder_subdomain = " ${ var . name } -primary-scaletest"
5
+ coder_url = " https://${ local . coder_subdomain } .${ var . cloudflare_domain } "
5
6
coder_admin_email = " admin@coder.com"
7
+ coder_admin_full_name = " Coder Admin"
6
8
coder_admin_user = " coder"
9
+ coder_admin_password = " SomeSecurePassword!"
7
10
coder_helm_repo = " https://helm.coder.com/v2"
8
11
coder_helm_chart = " coder"
9
12
coder_namespace = " coder-${ var . name } "
@@ -14,6 +17,8 @@ locals {
14
17
}
15
18
16
19
resource "kubernetes_namespace" "coder_namespace" {
20
+ provider = kubernetes. primary
21
+
17
22
metadata {
18
23
name = local. coder_namespace
19
24
}
@@ -41,6 +46,8 @@ resource "kubernetes_secret" "coder-db" {
41
46
}
42
47
43
48
resource "kubernetes_secret" "provisionerd_psk" {
49
+ provider = kubernetes. primary
50
+
44
51
type = " Opaque"
45
52
metadata {
46
53
name = " coder-provisioner-psk"
@@ -56,13 +63,16 @@ resource "kubernetes_secret" "provisionerd_psk" {
56
63
57
64
# OIDC secret needs to be manually provisioned for now.
58
65
data "kubernetes_secret" "coder_oidc" {
66
+ provider = kubernetes. primary
59
67
metadata {
60
68
namespace = kubernetes_namespace. coder_namespace . metadata . 0 . name
61
69
name = " coder-oidc"
62
70
}
63
71
}
64
72
65
73
resource "kubectl_manifest" "coder_certificate" {
74
+ provider = kubectl. primary
75
+
66
76
depends_on = [ helm_release . cert-manager ]
67
77
yaml_body = << YAML
68
78
apiVersion: cert-manager.io/v1
81
91
}
82
92
83
93
data "kubernetes_secret" "coder_tls" {
94
+ provider = kubernetes. primary
95
+
84
96
metadata {
85
97
namespace = kubernetes_namespace. coder_namespace . metadata . 0 . name
86
98
name = " ${ var . name } -tls"
@@ -89,6 +101,8 @@ data "kubernetes_secret" "coder_tls" {
89
101
}
90
102
91
103
resource "helm_release" "coder-chart" {
104
+ provider = helm. primary
105
+
92
106
repository = local. coder_helm_repo
93
107
chart = local. coder_helm_chart
94
108
name = local. coder_release_name
@@ -103,7 +117,7 @@ coder:
103
117
- matchExpressions:
104
118
- key: "cloud.google.com/gke-nodepool"
105
119
operator: "In"
106
- values: ["${ google_container_node_pool . node_pool [0 ]. name } "]
120
+ values: ["${ google_container_node_pool . node_pool [" primary_coder " ]. name } "]
107
121
podAntiAffinity:
108
122
preferredDuringSchedulingIgnoredDuringExecution:
109
123
- weight: 1
@@ -196,7 +210,7 @@ coder:
196
210
service:
197
211
enable: true
198
212
sessionAffinity: None
199
- loadBalancerIP: "${ google_compute_address . coder [0 ]. address } "
213
+ loadBalancerIP: "${ google_compute_address . coder [" primary " ]. address } "
200
214
volumeMounts:
201
215
- mountPath: "/tmp"
202
216
name: cache
@@ -224,7 +238,7 @@ coder:
224
238
- matchExpressions:
225
239
- key: "cloud.google.com/gke-nodepool"
226
240
operator: "In"
227
- values: ["${ google_container_node_pool . node_pool [0 ]. name } "]
241
+ values: ["${ google_container_node_pool . node_pool [" primary_coder " ]. name } "]
228
242
podAntiAffinity:
229
243
preferredDuringSchedulingIgnoredDuringExecution:
230
244
- weight: 1
@@ -278,3 +292,57 @@ coder:
278
292
EOF
279
293
]
280
294
}
295
+
296
+ data "http" "coder_healthy" {
297
+ url = " http://${ local . coder_subdomain } .${ var . cloudflare_domain } "
298
+ // Wait up to 5 minutes for DNS to propogate
299
+ retry {
300
+ attempts = 30
301
+ min_delay_ms = 10000
302
+ }
303
+
304
+ lifecycle {
305
+ postcondition {
306
+ condition = self. status_code == 200
307
+ error_message = " ${ self . url } returned an unhealthy status code"
308
+ }
309
+ }
310
+
311
+ depends_on = [ helm_release . coder-chart , cloudflare_record . coder ]
312
+ }
313
+
314
+ resource "terraform_data" "proxy_tokens" {
315
+ count = 1
316
+ provisioner "local-exec" {
317
+ interpreter = [ " /bin/bash" , " -c" ]
318
+ command = << EOF
319
+ curl 'http://${ local . coder_subdomain } .${ var . cloudflare_domain } /api/v2/users/first' \
320
+ --data-raw $'{"email":"${ local . coder_admin_email } ","password":"${ local . coder_admin_password } ","username":"${ local . coder_admin_user } ","name":"${ local . coder_admin_full_name } ","trial":false}' \
321
+ --insecure --silent --output /dev/null
322
+
323
+ token=$(curl 'http://${ local . coder_subdomain } .${ var . cloudflare_domain } /api/v2/users/login' \
324
+ --data-raw $'{"email":"${ local . coder_admin_email } ","password":"${ local . coder_admin_password } "}' \
325
+ --insecure --silent | jq -r .session_token)
326
+
327
+ curl 'http://${ local . coder_subdomain } .${ var . cloudflare_domain } /api/v2/licenses' \
328
+ -H "Coder-Session-Token: $${token}" \
329
+ --data-raw '{"license":"${ var . coder_license } "}' \
330
+ --insecure --silent --output /dev/null
331
+
332
+ europe_token=$(curl 'http://${ local . coder_subdomain } .${ var . cloudflare_domain } /api/v2/workspaceproxies' \
333
+ -H "Coder-Session-Token: $${token}" \
334
+ --data-raw '{"name":"europe"}' \
335
+ --insecure --silent | jq -r .proxy_token)
336
+
337
+ asia_token=$(curl 'http://${ local . coder_subdomain } .${ var . cloudflare_domain } /api/v2/workspaceproxies' \
338
+ -H "Coder-Session-Token: $${token}" \
339
+ --data-raw '{"name":"asia"}' \
340
+ --insecure --silent | jq -r .proxy_token)
341
+
342
+ echo "{\"europe\": \"$${europe_token}\", \"asia\": \"$${asia_token}\"}"
343
+ EOF
344
+ }
345
+
346
+ depends_on = [ data . http . coder_healthy ]
347
+ }
348
+
0 commit comments