// 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] }