5-appinfra/modules/hpc-monte-carlo-infra/container_image.tf (93 lines of code) (raw):
/**
* Copyright 2025 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
resource "google_service_account" "builder" {
project = var.infra_project
account_id = "mc-builder"
}
resource "google_storage_bucket" "build_logs" {
name = "cb-mc-builder-logs-${var.infra_project}"
project = var.infra_project
uniform_bucket_level_access = true
force_destroy = var.bucket_force_destroy
location = var.region
}
# IAM Roles required to build the terraform image on Google Cloud Build
resource "google_storage_bucket_iam_member" "builder_admin" {
member = google_service_account.builder.member
bucket = google_storage_bucket.build_logs.name
role = "roles/storage.admin"
}
resource "google_project_iam_member" "builder_object_user" {
member = google_service_account.builder.member
project = var.infra_project
role = "roles/storage.objectUser"
}
resource "google_artifact_registry_repository_iam_member" "builder" {
project = google_artifact_registry_repository.research_images.project
location = google_artifact_registry_repository.research_images.location
repository = google_artifact_registry_repository.research_images.name
role = "roles/artifactregistry.repoAdmin"
member = google_service_account.builder.member
}
resource "google_artifact_registry_repository_iam_member" "allow_cluster_sa_download" {
for_each = var.cluster_service_accounts
project = google_artifact_registry_repository.research_images.project
location = google_artifact_registry_repository.research_images.location
repository = google_artifact_registry_repository.research_images.name
role = "roles/artifactregistry.reader"
member = "serviceAccount:${each.value}"
}
resource "time_sleep" "wait_iam_propagation" {
create_duration = "60s"
depends_on = [
google_artifact_registry_repository_iam_member.builder,
google_storage_bucket_iam_member.builder_admin,
google_project_iam_member.builder_object_user,
google_access_context_manager_access_level_condition.access-level-conditions,
]
}
resource "google_artifact_registry_repository" "research_images" {
location = var.region
project = var.infra_project
repository_id = "research-images"
description = "Docker repository for research images"
format = "DOCKER"
depends_on = [google_project_service.enable_apis]
}
module "build_mc_run_image_image" {
source = "terraform-google-modules/gcloud/google"
version = "~> 3.5"
upgrade = false
create_cmd_triggers = {
"tag_version" = local.docker_tag_version_terraform
}
create_cmd_entrypoint = "bash"
create_cmd_body = <<EOF
gcloud builds submit ${path.module} \
--tag ${var.region}-docker.pkg.dev/${var.infra_project}/${google_artifact_registry_repository.research_images.name}/mc_run:${local.docker_tag_version_terraform} \
--project=${var.infra_project} \
--service-account=${google_service_account.builder.id} \
--gcs-log-dir=${google_storage_bucket.build_logs.url} \
--worker-pool=${var.workerpool_id} || (
sleep 45 && gcloud builds submit ${path.module} \
--tag ${var.region}-docker.pkg.dev/${var.infra_project}/${google_artifact_registry_repository.research_images.name}/mc_run:${local.docker_tag_version_terraform} \
--project=${var.infra_project} \
--service-account=${google_service_account.builder.id} \
--gcs-log-dir=${google_storage_bucket.build_logs.url} \
--worker-pool=${var.workerpool_id}
)
EOF
module_depends_on = [time_sleep.wait_iam_propagation]
}