Files
nomad/enos/modules/run_workloads/main.tf
2025-03-14 17:03:35 +01:00

91 lines
2.5 KiB
HCL

# Copyright (c) HashiCorp, Inc.
# SPDX-License-Identifier: BUSL-1.1
terraform {
required_providers {
enos = {
source = "hashicorp-forge/enos"
}
}
}
locals {
nomad_env = {
NOMAD_ADDR = var.nomad_addr
NOMAD_CACERT = var.ca_file
NOMAD_CLIENT_CERT = var.cert_file
NOMAD_CLIENT_KEY = var.key_file
NOMAD_TOKEN = var.nomad_token
}
consul_env = {
CONSUL_HTTP_TOKEN = var.consul_token
CONSUL_CACERT = var.ca_file
CONSUL_HTTP_ADDR = var.consul_addr
}
vault_env = {
VAULT_TOKEN = var.vault_token
VAULT_PATH = var.vault_mount_path
VAULT_ADDR = var.vault_addr
}
system_job_count = length({ for k, v in var.workloads : k => v if v.type == "system" })
service_batch_allocs = sum([for wl in var.workloads : wl.alloc_count])
}
resource "enos_local_exec" "wait_for_nomad_api" {
environment = local.nomad_env
scripts = [abspath("${path.module}/scripts/wait_for_nomad_api.sh")]
}
resource "enos_local_exec" "get_nodes" {
depends_on = [enos_local_exec.wait_for_nomad_api]
environment = local.nomad_env
inline = ["nomad node status -json | jq '[.[] | select(.SchedulingEligibility == \"eligible\" and .Status == \"ready\")] | length'"]
}
resource "enos_local_exec" "get_jobs" {
depends_on = [enos_local_exec.wait_for_nomad_api]
environment = local.nomad_env
inline = ["nomad job status| awk '$4 == \"running\" {count++} END {print count+0}'"]
}
resource "enos_local_exec" "get_allocs" {
depends_on = [enos_local_exec.wait_for_nomad_api]
environment = local.nomad_env
inline = ["nomad alloc status -json | jq '[.[] | select(.ClientStatus == \"running\")] | length'"]
}
resource "local_file" "vault_workload" {
filename = "${path.module}/jobs/vault-secrets.nomad.hcl"
content = templatefile("${path.module}/templates/vault-secrets.nomad.hcl.tpl", {
secret_path = "${var.vault_mount_path}/default/get-secret"
})
}
resource "enos_local_exec" "workloads" {
depends_on = [
enos_local_exec.get_jobs,
enos_local_exec.get_allocs,
local_file.vault_workload
]
for_each = var.workloads
environment = merge(
local.nomad_env,
local.vault_env,
local.consul_env,
)
inline = [
each.value.pre_script != null ? abspath("${path.module}/${each.value.pre_script}") : "echo ok",
"nomad job run -var alloc_count=${each.value.alloc_count} ${path.module}/${each.value.job_spec}",
each.value.post_script != null ? abspath("${path.module}/${each.value.post_script}") : "echo ok"
]
}