Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
gitpod-io
GitHub Repository: gitpod-io/gitpod
Path: blob/main/dev/preview/infrastructure/modules/gce/vm.tf
2506 views
data "google_compute_default_service_account" "default" {
  provider = google
}

data "google_service_account" "node_service_account" {
  account_id = "preview-environmnet-node"
}

resource "google_compute_instance" "default" {
  provider = google

  name                      = local.vm_name
  machine_type              = local.machine_type
  zone                      = "europe-west1-c"
  allow_stopping_for_update = true

  boot_disk {
    initialize_params {
      image = "projects/workspace-clusters/global/images/${var.vm_image}"
      type  = "pd-ssd"
      size  = 256
    }
  }

  # Attach two local SSDs when large VM is enabled.
  # These increase the containerd and workspace lvm volume sizes,
  # allowing us to e.g. run more e2e tests in parallel without
  # running into node disk pressure.
  dynamic "scratch_disk" {
    for_each = var.with_large_vm == true ? [1, 2] : []
    content {
      interface = "NVME"
    }
  }

  tags = ["preview"]


  dynamic "scheduling" {
    for_each = var.use_spot == true ? [1] : []
    content {
      provisioning_model          = "SPOT"
      preemptible                 = true
      automatic_restart           = false
      instance_termination_action = "DELETE"
    }
  }

  metadata = {
    serial-port-enable = true
    user-data          = local.cloudinit_user_data
  }

  network_interface {
    network = "default"

    access_config {
      nat_ip = google_compute_address.static-preview-ip.address
    }
  }

  metadata_startup_script = local.startup_script

  service_account {
    # Google recommends custom service accounts that have cloud-platform scope and permissions granted via IAM Roles.
    email  = data.google_service_account.node_service_account.email
    scopes = ["cloud-platform"]
  }
}

resource "google_compute_address" "static-preview-ip" {
  provider = google
  region   = "europe-west1"
  name     = var.preview_name
}

locals {
  vm_name = "preview-${var.preview_name}"
  bootstrap_script = templatefile("${path.module}/../../scripts/bootstrap-k3s.sh", {
    vm_name      = local.vm_name
    preview_name = var.preview_name
  })

  trustmanager_script = file("${path.module}/../../scripts/install-trustmanager.sh")

  startup_script = <<-EOT
    ${local.bootstrap_script}
    ${local.trustmanager_script}
  EOT

  cloudinit_user_data = templatefile("${path.module}/cloudinit.yaml", {
    vm_name = local.vm_name
  })

  machine_type = var.with_large_vm ? "n2d-standard-32" : var.vm_type
}