From a1f3a6b606f5e01bf554a5490a906306ac69c745 Mon Sep 17 00:00:00 2001 From: Cian Johnston Date: Fri, 22 Sep 2023 15:55:47 +0100 Subject: [PATCH] refactor(scaletest/terraform): break up infra creation and k8s resource provisioning (#9824) Breaks up scaletest/terraform into {infra, k8s}. --- .../terraform/{ => infra}/gcp_cluster.tf | 4 +- scaletest/terraform/{ => infra}/gcp_db.tf | 12 ++ .../terraform/{ => infra}/gcp_project.tf | 5 - scaletest/terraform/{ => infra}/gcp_vpc.tf | 0 scaletest/terraform/infra/main.tf | 20 +++ scaletest/terraform/infra/outputs.tf | 73 +++++++++++ scaletest/terraform/infra/vars.tf | 102 +++++++++++++++ scaletest/terraform/{ => k8s}/coder.tf | 55 ++------ scaletest/terraform/{ => k8s}/main.tf | 20 +-- scaletest/terraform/{ => k8s}/prometheus.tf | 28 ++-- scaletest/terraform/{ => k8s}/vars.tf | 121 ++++++------------ 11 files changed, 286 insertions(+), 154 deletions(-) rename scaletest/terraform/{ => infra}/gcp_cluster.tf (95%) rename scaletest/terraform/{ => infra}/gcp_db.tf (81%) rename scaletest/terraform/{ => infra}/gcp_project.tf (88%) rename scaletest/terraform/{ => infra}/gcp_vpc.tf (100%) create mode 100644 scaletest/terraform/infra/main.tf create mode 100644 scaletest/terraform/infra/outputs.tf create mode 100644 scaletest/terraform/infra/vars.tf rename scaletest/terraform/{ => k8s}/coder.tf (85%) rename scaletest/terraform/{ => k8s}/main.tf (70%) rename scaletest/terraform/{ => k8s}/prometheus.tf (86%) rename scaletest/terraform/{ => k8s}/vars.tf (62%) diff --git a/scaletest/terraform/gcp_cluster.tf b/scaletest/terraform/infra/gcp_cluster.tf similarity index 95% rename from scaletest/terraform/gcp_cluster.tf rename to scaletest/terraform/infra/gcp_cluster.tf index d83ab99c8c..577894790d 100644 --- a/scaletest/terraform/gcp_cluster.tf +++ b/scaletest/terraform/infra/gcp_cluster.tf @@ -3,7 +3,9 @@ data "google_compute_default_service_account" "default" { } locals { - cluster_kubeconfig_path = "${abspath(path.module)}/../.coderv2/${var.name}-cluster.kubeconfig" + abs_module_path = abspath(path.module) + rel_kubeconfig_path = "../../.coderv2/${var.name}-cluster.kubeconfig" + cluster_kubeconfig_path = abspath("${local.abs_module_path}/${local.rel_kubeconfig_path}") } resource "google_container_cluster" "primary" { diff --git a/scaletest/terraform/gcp_db.tf b/scaletest/terraform/infra/gcp_db.tf similarity index 81% rename from scaletest/terraform/gcp_db.tf rename to scaletest/terraform/infra/gcp_db.tf index 8855d24f6d..1a02324ce0 100644 --- a/scaletest/terraform/gcp_db.tf +++ b/scaletest/terraform/infra/gcp_db.tf @@ -42,6 +42,14 @@ resource "google_sql_database" "coder" { deletion_policy = "ABANDON" } +resource "random_password" "coder-postgres-password" { + length = 12 +} + +resource "random_password" "prometheus-postgres-password" { + length = 12 +} + resource "google_sql_user" "coder" { project = var.project_id instance = google_sql_database_instance.db.id @@ -61,3 +69,7 @@ resource "google_sql_user" "prometheus" { # required for postgres, otherwise user fails to delete deletion_policy = "ABANDON" } + +locals { + coder_db_url = "postgres://${google_sql_user.coder.name}:${urlencode(random_password.coder-postgres-password.result)}@${google_sql_database_instance.db.private_ip_address}/${google_sql_database.coder.name}?sslmode=disable" +} diff --git a/scaletest/terraform/gcp_project.tf b/scaletest/terraform/infra/gcp_project.tf similarity index 88% rename from scaletest/terraform/gcp_project.tf rename to scaletest/terraform/infra/gcp_project.tf index c233042e66..1073a621c3 100644 --- a/scaletest/terraform/gcp_project.tf +++ b/scaletest/terraform/infra/gcp_project.tf @@ -1,8 +1,3 @@ -provider "google" { - region = var.region - project = var.project_id -} - locals { project_apis = [ "cloudtrace", diff --git a/scaletest/terraform/gcp_vpc.tf b/scaletest/terraform/infra/gcp_vpc.tf similarity index 100% rename from scaletest/terraform/gcp_vpc.tf rename to scaletest/terraform/infra/gcp_vpc.tf diff --git a/scaletest/terraform/infra/main.tf b/scaletest/terraform/infra/main.tf new file mode 100644 index 0000000000..1724692b19 --- /dev/null +++ b/scaletest/terraform/infra/main.tf @@ -0,0 +1,20 @@ +terraform { + required_providers { + google = { + source = "hashicorp/google" + version = "~> 4.36" + } + + random = { + source = "hashicorp/random" + version = "~> 3.5" + } + } + + required_version = "~> 1.5.0" +} + +provider "google" { + region = var.region + project = var.project_id +} diff --git a/scaletest/terraform/infra/outputs.tf b/scaletest/terraform/infra/outputs.tf new file mode 100644 index 0000000000..f5e619eca3 --- /dev/null +++ b/scaletest/terraform/infra/outputs.tf @@ -0,0 +1,73 @@ +output "coder_db_url" { + description = "URL of the database for Coder." + value = local.coder_db_url + sensitive = true +} + +output "coder_address" { + description = "IP address to use for the Coder service." + value = google_compute_address.coder.address +} + +output "kubernetes_kubeconfig_path" { + description = "Kubeconfig path." + value = local.cluster_kubeconfig_path +} + +output "kubernetes_nodepool_coder" { + description = "Name of the nodepool on which to run Coder." + value = google_container_node_pool.coder.name +} + +output "kubernetes_nodepool_misc" { + description = "Name of the nodepool on which to run everything else." + value = google_container_node_pool.misc.name +} + +output "kubernetes_nodepool_workspaces" { + description = "Name of the nodepool on which to run workspaces." + value = google_container_node_pool.workspaces.name +} + +output "prometheus_external_label_cluster" { + description = "Value for the Prometheus external label named cluster." + value = google_container_cluster.primary.name +} + +output "prometheus_postgres_dbname" { + description = "Name of the database for Prometheus to monitor." + value = google_sql_database.coder.name +} + +output "prometheus_postgres_host" { + description = "Hostname of the database for Prometheus to connect to." + value = google_sql_database_instance.db.private_ip_address +} + +output "prometheus_postgres_password" { + description = "Postgres password for Prometheus." + value = random_password.prometheus-postgres-password.result + sensitive = true +} + +output "prometheus_postgres_user" { + description = "Postgres username for Prometheus." + value = google_sql_user.prometheus.name +} + +resource "local_file" "outputs" { + filename = "${path.module}/../../.coderv2/infra_outputs.tfvars" + content = <