temurin-install-testing/main.tf (158 lines of code) (raw):

terraform { required_providers { google = { source = "hashicorp/google" } } } provider "google" { project = var.project_id region = var.region zone = var.zone } resource "google_project_service" "compute" { service = "compute.googleapis.com" disable_on_destroy = false } resource "google_project_service" "storage" { service = "storage.googleapis.com" disable_on_destroy = false } resource "google_service_account" "default" { account_id = "temurin-service-account" display_name = "Service Account" } locals { x86_instances = var.enable_linux ? setproduct(var.x86_machine_types, var.x86_boot_images) : [] arm_instances = var.enable_arm ? setproduct(var.arm_machine_types, var.arm_boot_images) : [] linux_instances = [ for entry in concat(local.x86_instances, local.arm_instances) : { name = "${entry[0]}-${split("/", entry[1])[1]}" type = entry[0] image = entry[1] os_name = split("/", entry[1])[1] } ] windows_instances = var.enable_windows ? [ for entry in setproduct(var.x86_machine_types, var.x86_windows_boot_images) : { name = "${entry[0]}-${split("/", entry[1])[1]}" type = entry[0] image = entry[1] os_name = split("/", entry[1])[1] } ] : [] all_instances = concat(local.linux_instances, local.windows_instances) bucket_folder = var.bucket_folder == "" ? timestamp() : var.bucket_folder } resource "google_compute_instance" "windows" { for_each = { for index, vm in local.windows_instances : vm.name => vm } name = each.value.name machine_type = each.value.type tags = ["https-server", "http-server"] metadata = { windows-startup-script-cmd = "googet -noconfirm=true update && googet -noconfirm=true install google-compute-engine-ssh" enable-windows-ssh = "true" serial-port-logging-enable = "true" windows-startup-script-ps1 = templatefile( "${path.module}/startup.ps1", { bucket = data.google_storage_bucket.results.name vm_name = each.value.name bucket_folder = local.bucket_folder vm_zone = var.zone os_name = each.value.os_name machine_type = each.value.type }) } boot_disk { initialize_params { image = each.value.image } } network_interface { network = "default" access_config { // Ephemeral public IP } } service_account { email = google_service_account.default.email scopes = ["cloud-platform"] } depends_on = [ google_project_service.compute, google_service_account.default, google_storage_bucket_iam_policy.storage_policy ] } resource "google_compute_instance" "linux" { for_each = { for index, vm in local.linux_instances : vm.name => vm } name = each.value.name machine_type = each.value.type tags = ["https-server", "http-server"] metadata_startup_script = templatefile( "${path.module}/startup.sh", { bucket = data.google_storage_bucket.results.name vm_name = each.value.name bucket_folder = local.bucket_folder vm_zone = var.zone os_name = each.value.os_name machine_type = each.value.type }) boot_disk { initialize_params { image = each.value.image } } network_interface { network = "default" access_config { // Ephemeral public IP } } service_account { email = google_service_account.default.email scopes = ["cloud-platform"] } depends_on = [ google_project_service.compute, google_service_account.default, google_storage_bucket_iam_policy.storage_policy ] } data "google_iam_policy" "compute_viewer" { binding { role = "roles/compute.viewer" members = [ "serviceAccount:${google_service_account.default.email}" ] } } resource "google_compute_instance_iam_policy" "compute_policy" { for_each = { for index, vm in local.all_instances : vm.name => vm } instance_name = each.value.name policy_data = data.google_iam_policy.compute_viewer.policy_data depends_on = [google_compute_instance.linux, google_compute_instance.windows] } data "google_storage_bucket" "results" { name = var.bucket } data "google_iam_policy" "storage_policy" { binding { role = "roles/storage.admin" members = [ "serviceAccount:${google_service_account.default.email}" ] } } resource "google_storage_bucket_iam_policy" "storage_policy" { bucket = data.google_storage_bucket.results.name policy_data = data.google_iam_policy.storage_policy.policy_data }