302 lines
9.3 KiB
HCL
302 lines
9.3 KiB
HCL
// 2026-03-21 — chaos_marathon.tf: 15 новых сервисов для часового хаос-марафона.
|
||
// Три рантайма: python3.11 (9), nodejs20 (2), go1.23 (2).
|
||
// Все зависят от sless_job.postgres_table_init_job.
|
||
|
||
# ── Python: работа с таблицей ─────────────────────────────────────────────────
|
||
|
||
# Считает строки по prefix — тест concurrent reads + COUNT агрегации.
|
||
resource "sless_service" "pg_counter" {
|
||
name = "pg-counter"
|
||
runtime = "python3.11"
|
||
entrypoint = "pg_counter.count"
|
||
memory_mb = 128
|
||
timeout_sec = 15
|
||
|
||
env_vars = {
|
||
PGHOST = local.pg_host
|
||
PGPORT = "5432"
|
||
PGDATABASE = local.pg_database
|
||
PGUSER = local.pg_username
|
||
PGPASSWORD = local.pg_password
|
||
PGSSLMODE = "require"
|
||
}
|
||
|
||
source_dir = "${path.module}/code/pg-counter"
|
||
depends_on = [sless_job.postgres_table_init_job]
|
||
}
|
||
|
||
# DELETE дублей по title — идемпотентный, повторный вызов безопасен.
|
||
resource "sless_service" "pg_dedup" {
|
||
name = "pg-dedup"
|
||
runtime = "python3.11"
|
||
entrypoint = "pg_dedup.dedup"
|
||
memory_mb = 128
|
||
timeout_sec = 30
|
||
|
||
env_vars = {
|
||
PGHOST = local.pg_host
|
||
PGPORT = "5432"
|
||
PGDATABASE = local.pg_database
|
||
PGUSER = local.pg_username
|
||
PGPASSWORD = local.pg_password
|
||
PGSSLMODE = "require"
|
||
}
|
||
|
||
source_dir = "${path.module}/code/pg-dedup"
|
||
depends_on = [sless_job.postgres_table_init_job]
|
||
}
|
||
|
||
# Поиск по title с ILIKE + пагинация — тест спецсимволов и SQL injection safety.
|
||
resource "sless_service" "pg_search" {
|
||
name = "pg-search"
|
||
runtime = "python3.11"
|
||
entrypoint = "pg_search.search"
|
||
memory_mb = 128
|
||
timeout_sec = 15
|
||
|
||
env_vars = {
|
||
PGHOST = local.pg_host
|
||
PGPORT = "5432"
|
||
PGDATABASE = local.pg_database
|
||
PGUSER = local.pg_username
|
||
PGPASSWORD = local.pg_password
|
||
PGSSLMODE = "require"
|
||
}
|
||
|
||
source_dir = "${path.module}/code/pg-search"
|
||
depends_on = [sless_job.postgres_table_init_job]
|
||
}
|
||
|
||
# Bulk INSERT через execute_values — до 500 строк за раз.
|
||
resource "sless_service" "pg_bulk_insert" {
|
||
name = "pg-bulk-insert"
|
||
runtime = "python3.11"
|
||
entrypoint = "pg_bulk_insert.bulk_insert"
|
||
memory_mb = 256
|
||
timeout_sec = 30
|
||
|
||
env_vars = {
|
||
PGHOST = local.pg_host
|
||
PGPORT = "5432"
|
||
PGDATABASE = local.pg_database
|
||
PGUSER = local.pg_username
|
||
PGPASSWORD = local.pg_password
|
||
PGSSLMODE = "require"
|
||
}
|
||
|
||
source_dir = "${path.module}/code/pg-bulk-insert"
|
||
depends_on = [sless_job.postgres_table_init_job]
|
||
}
|
||
|
||
# DELETE строк старше N минут — идемпотентный.
|
||
resource "sless_service" "pg_delete_old" {
|
||
name = "pg-delete-old"
|
||
runtime = "python3.11"
|
||
entrypoint = "pg_delete_old.delete_old"
|
||
memory_mb = 128
|
||
timeout_sec = 30
|
||
|
||
env_vars = {
|
||
PGHOST = local.pg_host
|
||
PGPORT = "5432"
|
||
PGDATABASE = local.pg_database
|
||
PGUSER = local.pg_username
|
||
PGPASSWORD = local.pg_password
|
||
PGSSLMODE = "require"
|
||
}
|
||
|
||
source_dir = "${path.module}/code/pg-delete-old"
|
||
depends_on = [sless_job.postgres_table_init_job]
|
||
}
|
||
|
||
# INSERT ON CONFLICT DO UPDATE — повторный вызов с тем же title безопасен.
|
||
resource "sless_service" "pg_upsert" {
|
||
name = "pg-upsert"
|
||
runtime = "python3.11"
|
||
entrypoint = "pg_upsert.upsert"
|
||
memory_mb = 128
|
||
timeout_sec = 15
|
||
|
||
env_vars = {
|
||
PGHOST = local.pg_host
|
||
PGPORT = "5432"
|
||
PGDATABASE = local.pg_database
|
||
PGUSER = local.pg_username
|
||
PGPASSWORD = local.pg_password
|
||
PGSSLMODE = "require"
|
||
}
|
||
|
||
source_dir = "${path.module}/code/pg-upsert"
|
||
depends_on = [sless_job.postgres_table_init_job]
|
||
}
|
||
|
||
# ── Python: chaos ─────────────────────────────────────────────────────────────
|
||
|
||
# Echo: принимает любой ввод и отражает обратно — проверка на мусорный input.
|
||
resource "sless_service" "chaos_echo" {
|
||
name = "chaos-echo"
|
||
runtime = "python3.11"
|
||
entrypoint = "chaos_echo.echo"
|
||
memory_mb = 128
|
||
timeout_sec = 10
|
||
|
||
source_dir = "${path.module}/code/chaos-echo"
|
||
depends_on = [sless_job.postgres_table_init_job]
|
||
}
|
||
|
||
# Валидация плохих параметров — тупой юзер не может уронить сервис.
|
||
resource "sless_service" "chaos_badparams" {
|
||
name = "chaos-badparams"
|
||
runtime = "python3.11"
|
||
entrypoint = "chaos_badparams.validate"
|
||
memory_mb = 128
|
||
timeout_sec = 10
|
||
|
||
source_dir = "${path.module}/code/chaos-badparams"
|
||
depends_on = [sless_job.postgres_table_init_job]
|
||
}
|
||
|
||
# Медленный pg_sleep — тест timeout enforcement.
|
||
resource "sless_service" "chaos_slowquery" {
|
||
name = "chaos-slowquery"
|
||
runtime = "python3.11"
|
||
entrypoint = "chaos_slowquery.slowquery"
|
||
memory_mb = 128
|
||
timeout_sec = 12
|
||
|
||
env_vars = {
|
||
PGHOST = local.pg_host
|
||
PGPORT = "5432"
|
||
PGDATABASE = local.pg_database
|
||
PGUSER = local.pg_username
|
||
PGPASSWORD = local.pg_password
|
||
PGSSLMODE = "require"
|
||
}
|
||
|
||
source_dir = "${path.module}/code/chaos-slowquery"
|
||
depends_on = [sless_job.postgres_table_init_job]
|
||
}
|
||
|
||
# Большой JSON response — тест памяти и серилизации.
|
||
resource "sless_service" "chaos_bigpayload" {
|
||
name = "chaos-bigpayload"
|
||
runtime = "python3.11"
|
||
entrypoint = "chaos_bigpayload.bigpayload"
|
||
memory_mb = 256
|
||
timeout_sec = 15
|
||
|
||
source_dir = "${path.module}/code/chaos-bigpayload"
|
||
depends_on = [sless_job.postgres_table_init_job]
|
||
}
|
||
|
||
# ── Node.js ───────────────────────────────────────────────────────────────────
|
||
|
||
# Bulk INSERT через параметризованный multi-value query.
|
||
resource "sless_service" "js_pg_batch" {
|
||
name = "js-pg-batch"
|
||
runtime = "nodejs20"
|
||
entrypoint = "js_pg_batch.run"
|
||
memory_mb = 128
|
||
timeout_sec = 30
|
||
|
||
env_vars = {
|
||
PGHOST = local.pg_host
|
||
PGPORT = "5432"
|
||
PGDATABASE = local.pg_database
|
||
PGUSER = local.pg_username
|
||
PGPASSWORD = local.pg_password
|
||
PGSSLMODE = "require"
|
||
}
|
||
|
||
source_dir = "${path.module}/code/js-pg-batch"
|
||
depends_on = [sless_job.postgres_table_init_job]
|
||
}
|
||
|
||
# Идемпотентный INSERT — повторный вызов с тем же key = existing, не дубль.
|
||
resource "sless_service" "js_idempotent" {
|
||
name = "js-idempotent"
|
||
runtime = "nodejs20"
|
||
entrypoint = "js_idempotent.run"
|
||
memory_mb = 128
|
||
timeout_sec = 15
|
||
|
||
env_vars = {
|
||
PGHOST = local.pg_host
|
||
PGPORT = "5432"
|
||
PGDATABASE = local.pg_database
|
||
PGUSER = local.pg_username
|
||
PGPASSWORD = local.pg_password
|
||
PGSSLMODE = "require"
|
||
}
|
||
|
||
source_dir = "${path.module}/code/js-idempotent"
|
||
depends_on = [sless_job.postgres_table_init_job]
|
||
}
|
||
|
||
# ── Go 1.23 ───────────────────────────────────────────────────────────────────
|
||
|
||
# Параллельные concurrent INSERTs из N горутин внутри одного пода.
|
||
resource "sless_service" "go_pg_race" {
|
||
name = "go-pg-race"
|
||
runtime = "go1.23"
|
||
entrypoint = "handler.Handle"
|
||
memory_mb = 256
|
||
timeout_sec = 30
|
||
|
||
env_vars = {
|
||
PGHOST = local.pg_host
|
||
PGPORT = "5432"
|
||
PGDATABASE = local.pg_database
|
||
PGUSER = local.pg_username
|
||
PGPASSWORD = local.pg_password
|
||
PGSSLMODE = "require"
|
||
}
|
||
|
||
source_dir = "${path.module}/code/go-pg-race"
|
||
depends_on = [sless_job.postgres_table_init_job]
|
||
}
|
||
|
||
# Atomic-счётчик в памяти + PG INSERT на каждый вызов.
|
||
resource "sless_service" "go_counter_atomic" {
|
||
name = "go-counter-atomic"
|
||
runtime = "go1.23"
|
||
entrypoint = "handler.Handle"
|
||
memory_mb = 128
|
||
timeout_sec = 15
|
||
|
||
env_vars = {
|
||
PGHOST = local.pg_host
|
||
PGPORT = "5432"
|
||
PGDATABASE = local.pg_database
|
||
PGUSER = local.pg_username
|
||
PGPASSWORD = local.pg_password
|
||
PGSSLMODE = "require"
|
||
}
|
||
|
||
source_dir = "${path.module}/code/go-counter-atomic"
|
||
depends_on = [sless_job.postgres_table_init_job]
|
||
}
|
||
|
||
# ── Python: retry ─────────────────────────────────────────────────────────────
|
||
|
||
# Запись с retry при transient PG error — тест устойчивости к сбоям.
|
||
resource "sless_service" "py_retry_writer" {
|
||
name = "py-retry-writer"
|
||
runtime = "python3.11"
|
||
entrypoint = "py_retry_writer.retry_write"
|
||
memory_mb = 128
|
||
timeout_sec = 30
|
||
|
||
env_vars = {
|
||
PGHOST = local.pg_host
|
||
PGPORT = "5432"
|
||
PGDATABASE = local.pg_database
|
||
PGUSER = local.pg_username
|
||
PGPASSWORD = local.pg_password
|
||
PGSSLMODE = "require"
|
||
}
|
||
|
||
source_dir = "${path.module}/code/py-retry-writer"
|
||
depends_on = [sless_job.postgres_table_init_job]
|
||
}
|