modules/deploy-pipeline/main.tf (108 lines of code) (raw):

# TODO: Make indices for zones and regions strings locals { clusters_info = jsondecode(data.google_storage_bucket_object_content.clusters_info.content) target_SZ = var.archetype == "SZ" ? [local.clusters_info[var.zone_index[0]]] : null target_APZ = var.archetype == "APZ" ? [local.clusters_info[var.zone_index[0]], local.clusters_info[var.zone_index[1]]] : null mz_indices = var.archetype == "MZ" ? [var.region_index[0] * 3 + 0, var.region_index[0] * 3 + 1, var.region_index[0] * 3 + 2] : null target_MZ = var.archetype == "MZ" ? [local.clusters_info[local.mz_indices[0]], local.clusters_info[local.mz_indices[1]], local.clusters_info[local.mz_indices[2]]] : null apr_indices = var.archetype == "APR" ? [var.region_index[0] * 3 + 0, var.region_index[0] * 3 + 1, var.region_index[0] * 3 + 2, var.region_index[1] * 3 + 0, var.region_index[1] * 3 + 1, var.region_index[1] * 3 + 2] : null target_APR = var.archetype == "APR" ? [local.clusters_info[local.apr_indices[0]], local.clusters_info[local.apr_indices[1]], local.clusters_info[local.apr_indices[2]], local.clusters_info[local.apr_indices[3]], local.clusters_info[local.apr_indices[4]], local.clusters_info[local.apr_indices[5]]] : null ir_indices = var.archetype == "IR" ? [var.region_index[0] * 3 + 0, var.region_index[0] * 3 + 1, var.region_index[0] * 3 + 2, var.region_index[1] * 3 + 0, var.region_index[1] * 3 + 1, var.region_index[1] * 3 + 2] : null target_IR = var.archetype == "IR" ? [local.clusters_info[local.ir_indices[0]], local.clusters_info[local.ir_indices[1]], local.clusters_info[local.ir_indices[2]], local.clusters_info[local.ir_indices[3]], local.clusters_info[local.ir_indices[4]], local.clusters_info[local.ir_indices[5]]] : null target_G = var.archetype == "G" ? local.clusters_info : null targets = coalescelist(local.target_SZ, local.target_APZ, local.target_MZ, local.target_APR, local.target_IR, local.target_G) remaining_targets = tolist(setsubtract(local.clusters_info, local.targets)) } output "target" { value = local.targets } data "google_storage_bucket_object_content" "clusters_info" { name = "platform-values/clusters.json" bucket = var.project_id } resource "google_service_account" "clouddeploy" { project = var.project_id account_id = "clouddeploy-${var.service_name}" display_name = "Cloud Deploy Service Account" } resource "google_project_iam_member" "clouddeploy_container_developer" { project = var.project_id role = "roles/container.developer" member = "serviceAccount:${google_service_account.clouddeploy.email}" } resource "google_project_iam_member" "clouddeploy_member_deploy_jobrunner" { project = var.project_id role = "roles/clouddeploy.jobRunner" member = "serviceAccount:${google_service_account.clouddeploy.email}" } resource "google_clouddeploy_target" "child_target_apps" { for_each = { for i, v in local.targets : i => v } location = var.pipeline_location name = "child-target-${var.service_name}-${each.value.name}" execution_configs { usages = ["RENDER", "DEPLOY"] service_account = google_service_account.clouddeploy.email } gke { cluster = each.value.id } project = var.project_id require_approval = false } resource "google_clouddeploy_target" "multi_target_apps" { location = var.pipeline_location name = "multi-target-${var.service_name}" multi_target { target_ids = [for v in local.targets : "child-target-${var.service_name}-${v.name}"] } project = var.project_id require_approval = false } resource "google_clouddeploy_delivery_pipeline" "primary" { location = var.pipeline_location name = lower("${var.service_name}-pipeline") description = "Service delivery pipeline for the service ${var.service_name} for app clusters." project = var.project_id serial_pipeline { stages { profiles = ["prod"] target_id = google_clouddeploy_target.multi_target_apps.target_id } } provider = google-beta } resource "google_clouddeploy_target" "child_target_vs" { for_each = { for i, v in local.remaining_targets : i => v } location = var.pipeline_location name = "child-target-vs-${var.service_name}-${each.value.name}" execution_configs { usages = ["RENDER", "DEPLOY"] service_account = google_service_account.clouddeploy.email } gke { cluster = each.value.id } project = var.project_id require_approval = false } resource "google_clouddeploy_target" "multi_target_vs" { location = var.pipeline_location name = "multi-target-vs-${var.service_name}" multi_target { target_ids = [for v in local.remaining_targets : "child-target-vs-${var.service_name}-${v.name}"] } project = var.project_id require_approval = false } resource "google_clouddeploy_delivery_pipeline" "secondary" { location = var.pipeline_location name = lower("${var.service_name}-vs-pipeline") description = "Virtual service delivery pipeline for the service ${var.service_name} for app clusters." project = var.project_id serial_pipeline { stages { profiles = ["prod"] target_id = google_clouddeploy_target.multi_target_vs.target_id } } provider = google-beta }