From 01402d84944df0556a26abc7a2276a8ef34ce560 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CNaeel=E2=80=9D?= Date: Mon, 9 Mar 2026 15:12:07 +0400 Subject: [PATCH] =?UTF-8?q?feat:=20provider=20v0.1.9=20=E2=80=94=20namespa?= =?UTF-8?q?ce=20removed=20from=20resources,=20moved=20to=20provider=20bloc?= =?UTF-8?q?k?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hello-node/http.tf | 2 -- hello-node/job.tf | 2 -- hello-node/main.tf | 7 ++++--- notes-python/init.tf | 2 -- notes-python/main.tf | 7 ++++--- notes-python/notes-list.tf | 2 -- notes-python/notes.tf | 2 -- notes-python/sql-runner.tf | 1 - pg-query/main.tf | 7 ++++--- pg-query/pg-query.tf | 2 -- simple-node/main.tf | 26 ++++++++++++++++++++------ simple-node/outputs.tf | 8 +++++--- simple-node/time-display.tf | 22 +++++++++++----------- simple-node/time-getter.tf | 27 +++++++++++++-------------- simple-python/main.tf | 26 +++++++++++++++++++------- simple-python/outputs.tf | 10 +++++----- simple-python/time-display.tf | 26 +++++++++++--------------- simple-python/time-getter.tf | 29 +++++++++++++---------------- 18 files changed, 109 insertions(+), 99 deletions(-) diff --git a/hello-node/http.tf b/hello-node/http.tf index d7d796a..76c92d1 100644 --- a/hello-node/http.tf +++ b/hello-node/http.tf @@ -14,7 +14,6 @@ data "archive_file" "handler_http" { } resource "sless_function" "hello_http" { - namespace = "default" name = "hello-http" runtime = "nodejs20" entrypoint = "handler-http.handle" @@ -28,7 +27,6 @@ resource "sless_function" "hello_http" { } resource "sless_trigger" "hello_http" { - namespace = "default" name = "hello-http-trigger" type = "http" function = sless_function.hello_http.name diff --git a/hello-node/job.tf b/hello-node/job.tf index 30ac4f0..0c8fc5a 100644 --- a/hello-node/job.tf +++ b/hello-node/job.tf @@ -16,7 +16,6 @@ data "archive_file" "handler_job" { } resource "sless_function" "hello_job" { - namespace = "default" name = "hello-job" runtime = "nodejs20" entrypoint = "handler-job.handle" @@ -31,7 +30,6 @@ resource "sless_function" "hello_job" { # Одноразовый запуск. Все поля immutable — изменение любого пересоздаёт джоб. # run_id: 0 = не запускать, 1+ = запустить. Для повторного запуска увеличь run_id (1→2→3...). resource "sless_job" "hello_run" { - namespace = "default" name = "hello-run" function = sless_function.hello_job.name event_json = jsonencode({ numbers = [100, 200, 300] }) diff --git a/hello-node/main.tf b/hello-node/main.tf index f38a1c2..271f13b 100644 --- a/hello-node/main.tf +++ b/hello-node/main.tf @@ -8,7 +8,7 @@ terraform { required_providers { sless = { source = "terra.k8c.ru/naeel/sless" - version = "~> 0.1.7" + version = "~> 0.1.9" } archive = { source = "hashicorp/archive" @@ -18,7 +18,8 @@ terraform { } provider "sless" { - endpoint = "https://sless-api.kube5s.ru" - token = "dev-token-change-me" + endpoint = "https://sless-api.kube5s.ru" + token = "dev-token-change-me" + namespace = "default" } diff --git a/notes-python/init.tf b/notes-python/init.tf index 0924819..85cf5fb 100644 --- a/notes-python/init.tf +++ b/notes-python/init.tf @@ -14,7 +14,6 @@ # Джоб создания таблицы notes. # CREATE TABLE IF NOT EXISTS — безопасно запускать повторно, таблица не пересоздаётся. resource "sless_job" "notes_table_init" { - namespace = "default" name = "notes-create-table" function = sless_function.sql_runner.name wait_timeout_sec = 120 @@ -32,7 +31,6 @@ resource "sless_job" "notes_table_init" { resource "sless_job" "notes_index_init" { depends_on = [sless_job.notes_table_init] - namespace = "default" name = "notes-create-index" function = sless_function.sql_runner.name wait_timeout_sec = 60 diff --git a/notes-python/main.tf b/notes-python/main.tf index 65124e0..62af59a 100644 --- a/notes-python/main.tf +++ b/notes-python/main.tf @@ -14,7 +14,7 @@ terraform { # Провайдер для управления serverless функциями через sless API sless = { source = "terra.k8c.ru/naeel/sless" - version = "~> 0.1.7" + version = "~> 0.1.9" } # hashicorp/archive — для упаковки исходников в zip перед загрузкой archive = { @@ -27,6 +27,7 @@ terraform { # sless провайдер подключается к API кластера. # В продакшне token следует передавать через TF_VAR или secrets. provider "sless" { - endpoint = "https://sless-api.kube5s.ru" - token = "dev-token-change-me" + endpoint = "https://sless-api.kube5s.ru" + token = "dev-token-change-me" + namespace = "default" } diff --git a/notes-python/notes-list.tf b/notes-python/notes-list.tf index 5ed81f5..1b76e13 100644 --- a/notes-python/notes-list.tf +++ b/notes-python/notes-list.tf @@ -18,7 +18,6 @@ data "archive_file" "notes_list_zip" { # Read-only функция в кластере. # entrypoint = "notes_list.list_notes" → файл notes_list.py, функция list_notes(). resource "sless_function" "notes_list" { - namespace = "default" name = "notes-list" runtime = "python3.11" entrypoint = "notes_list.list_notes" @@ -36,7 +35,6 @@ resource "sless_function" "notes_list" { # HTTP-триггер для read-only функции. # Создаёт Ingress, URL доступен в outputs.tf. resource "sless_trigger" "notes_list_http" { - namespace = "default" name = "notes-list-http" type = "http" function = sless_function.notes_list.name diff --git a/notes-python/notes.tf b/notes-python/notes.tf index 8e2a17c..d7f2b8e 100644 --- a/notes-python/notes.tf +++ b/notes-python/notes.tf @@ -20,7 +20,6 @@ data "archive_file" "notes_crud_zip" { # CRUD функция в кластере. # entrypoint = "notes_crud.crud" → файл notes_crud.py, функция crud(). resource "sless_function" "notes_crud" { - namespace = "default" name = "notes" runtime = "python3.11" entrypoint = "notes_crud.crud" @@ -39,7 +38,6 @@ resource "sless_function" "notes_crud" { # Создаёт Ingress в кластере, URL доступен в outputs.tf. # Базовый URL: https://sless-api.kube5s.ru/fn/default/notes resource "sless_trigger" "notes_crud_http" { - namespace = "default" name = "notes-http" type = "http" function = sless_function.notes_crud.name diff --git a/notes-python/sql-runner.tf b/notes-python/sql-runner.tf index 9800b6d..92bc8ad 100644 --- a/notes-python/sql-runner.tf +++ b/notes-python/sql-runner.tf @@ -17,7 +17,6 @@ data "archive_file" "sql_runner_zip" { # entrypoint = "sql_runner.run_sql" → файл sql_runner.py, функция run_sql(). # memory_mb=128 достаточно — DDL запросы не требуют памяти на вычисления. resource "sless_function" "sql_runner" { - namespace = "default" name = "sql-runner" runtime = "python3.11" entrypoint = "sql_runner.run_sql" diff --git a/pg-query/main.tf b/pg-query/main.tf index 42f18db..787cea3 100644 --- a/pg-query/main.tf +++ b/pg-query/main.tf @@ -6,7 +6,7 @@ terraform { required_providers { sless = { source = "terra.k8c.ru/naeel/sless" - version = "~> 0.1.7" + version = "~> 0.1.9" } archive = { source = "hashicorp/archive" @@ -16,6 +16,7 @@ terraform { } provider "sless" { - endpoint = "https://sless-api.kube5s.ru" - token = "dev-token-change-me" + endpoint = "https://sless-api.kube5s.ru" + token = "dev-token-change-me" + namespace = "default" } diff --git a/pg-query/pg-query.tf b/pg-query/pg-query.tf index f3b876b..e12048a 100644 --- a/pg-query/pg-query.tf +++ b/pg-query/pg-query.tf @@ -13,7 +13,6 @@ data "archive_file" "handler_pg_query" { } resource "sless_function" "pg_query" { - namespace = "default" name = "pg-query" runtime = "python3.11" entrypoint = "handler.handle" @@ -31,7 +30,6 @@ resource "sless_function" "pg_query" { } resource "sless_trigger" "pg_query_http" { - namespace = "default" name = "pg-query-http" type = "http" function = sless_function.pg_query.name diff --git a/simple-node/main.tf b/simple-node/main.tf index 76bb8eb..fc6d96b 100644 --- a/simple-node/main.tf +++ b/simple-node/main.tf @@ -1,13 +1,26 @@ # Создано: 2026-03-09 -# main.tf — точка входа для примера simple-node. -# Демонстрирует цепочку: sless_job (one-shot) → sless_function (http). -# Аналог simple-python, но на Node.js 20. +# main.tf — пример: запустить один раз скрипт при деплое и передать его результат в функцию. +# То же самое что simple-python, но на Node.js 20. +# +# Как это работает: +# 1. При «terraform apply» запускается скрипт-джоб (time_getter) +# 2. Скрипт возвращает JSON с текущим временем +# 3. Terraform подхватывает этот JSON и передаёт в переменную окружения HTTP-функции (time_display) +# 4. Функция отдаёт время при каждом запросе +# +# Зачем такое нужно: +# Если данные нужны функции, но считаются один раз при деплое — +# напишите логику в джоб, а результат передайте через env_vars. +# Например: получить токен, версию схемы БД, время деплоя и т.д. +# +# namespace задаётся один раз здесь, в блоке provider. +# В ресурсах (sless_function, sless_trigger, sless_job) namespace НЕ указывается. terraform { required_providers { sless = { source = "terra.k8c.ru/naeel/sless" - version = "~> 0.1.8" + version = "~> 0.1.9" } archive = { source = "hashicorp/archive" @@ -17,6 +30,7 @@ terraform { } provider "sless" { - endpoint = "https://sless-api.kube5s.ru" - token = "dev-token-change-me" + endpoint = "https://sless-api.kube5s.ru" + token = "dev-token-change-me" + namespace = "default" } diff --git a/simple-node/outputs.tf b/simple-node/outputs.tf index 06204e2..4d59ef6 100644 --- a/simple-node/outputs.tf +++ b/simple-node/outputs.tf @@ -1,12 +1,14 @@ # Создано: 2026-03-09 -# outputs.tf — полезные значения после terraform apply. +# outputs.tf — что выводит terraform после apply. +# Адрес вашей функции — откройте в браузере или вставьте в curl output "display_url" { - description = "URL HTTP-триггера функции time_display" + description = "URL функции time_display" value = sless_trigger.display_http.url } +# Что вернул скрипт-джоб — именно это передано в функцию как JOB_TIME output "job_result" { - description = "Stdout джоба (return value функции getTime)" + description = "Результат выполнения скрипта time_getter" value = sless_job.run_getter.message } diff --git a/simple-node/time-display.tf b/simple-node/time-display.tf index 33ee0d3..0779f74 100644 --- a/simple-node/time-display.tf +++ b/simple-node/time-display.tf @@ -1,35 +1,35 @@ # Создано: 2026-03-09 -# time-display.tf — постоянная HTTP-функция, получающая данные от джоба. +# time-display.tf — HTTP-функция, доступная по URL после apply. +# Получает результат джоба (из time-getter.tf) через переменную окружения JOB_TIME. -# Упаковываем код функции в zip +# Упаковываем код функции в zip для загрузки data "archive_file" "time_display_zip" { type = "zip" source_dir = "${path.module}/code/time_display" output_path = "${path.module}/dist/time_display.zip" } -# HTTP-функция: постоянный Deployment, читает JOB_TIME из env +# HTTP-функция — отвечает на запросы по URL из outputs.tf resource "sless_function" "time_display" { - namespace = "default" - name = "simple-node-time-display" + name = "simple-node-time-display" # уникальное имя в namespace runtime = "nodejs20" - entrypoint = "time_display.showTime" + entrypoint = "time_display.showTime" # файл.функция в code/time_display/ memory_mb = 64 - # Значение вычислено джобом при apply и зафиксировано в state + # Передаём результат джоба в функцию через переменную окружения. + # В коде функции: process.env.JOB_TIME env_vars = { JOB_TIME = sless_job.run_getter.message } code_path = data.archive_file.time_display_zip.output_path - code_hash = filesha256("${path.module}/code/time_display/time_display.js") + code_hash = filesha256("${path.module}/code/time_display/time_display.js") # для пересборки при изменении кода - depends_on = [sless_job.run_getter] + depends_on = [sless_job.run_getter] # ждём завершения джоба перед деплоем функции } -# HTTP-триггер — публикует функцию по URL +# Публикуем функцию по HTTP — URL будет в outputs.tf resource "sless_trigger" "display_http" { - namespace = "default" name = "simple-node-display-http" type = "http" function = sless_function.time_display.name diff --git a/simple-node/time-getter.tf b/simple-node/time-getter.tf index 2edea62..b1212c2 100644 --- a/simple-node/time-getter.tf +++ b/simple-node/time-getter.tf @@ -1,36 +1,35 @@ # Создано: 2026-03-09 -# time-getter.tf — одноразовая функция + джоб запускающий её при apply. -# sless_job.run_getter.message после apply содержит stdout runner-а: -# {"time":"2026-03-09T12:34:56.789Z"} -# Это значение terraform записывает в env JOB_TIME функции time_display. +# time-getter.tf — скрипт который запускается ОДИН РАЗ при terraform apply. +# После запуска его результат доступен через: sless_job.run_getter.message +# Смотри time-display.tf — там этот результат передаётся в функцию. -# Упаковываем код функции в zip +# Упаковываем код скрипта в zip для загрузки data "archive_file" "time_getter_zip" { type = "zip" source_dir = "${path.module}/code/time_getter" output_path = "${path.module}/dist/time_getter.zip" } -# Функция-вычислитель: запускается только джобом, не имеет HTTP-триггера +# Функция для скрипта — без HTTP-триггера, вызывается только через джоб ниже resource "sless_function" "time_getter" { - namespace = "default" - name = "simple-node-time-getter" + name = "simple-node-time-getter" # уникальное имя в namespace runtime = "nodejs20" - entrypoint = "time_getter.getTime" + entrypoint = "time_getter.getTime" # файл.функция в code/time_getter/ memory_mb = 64 code_path = data.archive_file.time_getter_zip.output_path - code_hash = filesha256("${path.module}/code/time_getter/time_getter.js") + code_hash = filesha256("${path.module}/code/time_getter/time_getter.js") # для пересборки при изменении кода } -# Джоб: запускает time_getter один раз при terraform apply. +# Джоб — запускает функцию time_getter один раз прямо при apply. +# run_id = 1 означает «запустить». Если увеличить (2, 3...) — запустится снова. +# После завершения: sless_job.run_getter.message = то что вернула функция resource "sless_job" "run_getter" { - namespace = "default" name = "simple-node-getter-run" function = sless_function.time_getter.name run_id = 1 - wait_timeout_sec = 120 - event_json = "{}" + wait_timeout_sec = 120 # сколько секунд ждать завершения скрипта + event_json = "{}" # входные данные для скрипта (пусто — данные не нужны) depends_on = [sless_function.time_getter] } diff --git a/simple-python/main.tf b/simple-python/main.tf index 4b7c748..90381fa 100644 --- a/simple-python/main.tf +++ b/simple-python/main.tf @@ -1,14 +1,25 @@ # Создано: 2026-03-09 -# main.tf — точка входа для примера simple-python. -# Демонстрирует цепочку: sless_job (one-shot) → sless_function (http). -# Джоб запускается при terraform apply, его stdout (JSON) попадает в -# sless_job.run_getter.message и передаётся функции через env_vars. +# main.tf — пример: запустить один раз скрипт при деплое и передать его результат в функцию. +# +# Как это работает: +# 1. При «terraform apply» запускается скрипт-джоб (time_getter) +# 2. Скрипт возвращает JSON с текущим временем +# 3. Terraform подхватывает этот JSON и передаёт в переменную окружения HTTP-функции (time_display) +# 4. Функция отдаёт время при каждом запросе +# +# Зачем такое нужно: +# Если данные нужны функции, но считаются один раз при деплое — +# напишите логику в джоб, а результат передайте через env_vars. +# Например: получить токен, версию схемы БД, время деплоя и т.д. +# +# namespace задаётся один раз здесь, в блоке provider. +# В ресурсах (sless_function, sless_trigger, sless_job) namespace НЕ указывается. terraform { required_providers { sless = { source = "terra.k8c.ru/naeel/sless" - version = "~> 0.1.8" + version = "~> 0.1.9" } archive = { source = "hashicorp/archive" @@ -18,6 +29,7 @@ terraform { } provider "sless" { - endpoint = "https://sless-api.kube5s.ru" - token = "dev-token-change-me" + endpoint = "https://sless-api.kube5s.ru" + token = "dev-token-change-me" + namespace = "default" } diff --git a/simple-python/outputs.tf b/simple-python/outputs.tf index b4c03b3..4d59ef6 100644 --- a/simple-python/outputs.tf +++ b/simple-python/outputs.tf @@ -1,14 +1,14 @@ # Создано: 2026-03-09 -# outputs.tf — полезные значения после terraform apply. +# outputs.tf — что выводит terraform после apply. -# URL HTTP-триггера для тестирования функции display +# Адрес вашей функции — откройте в браузере или вставьте в curl output "display_url" { - description = "URL HTTP-триггера функции time_display" + description = "URL функции time_display" value = sless_trigger.display_http.url } -# Результат джоба — JSON строка {"time": "..."} из stdout функции get_time() +# Что вернул скрипт-джоб — именно это передано в функцию как JOB_TIME output "job_result" { - description = "Stdout джоба (return value функции get_time)" + description = "Результат выполнения скрипта time_getter" value = sless_job.run_getter.message } diff --git a/simple-python/time-display.tf b/simple-python/time-display.tf index 861c938..236a0de 100644 --- a/simple-python/time-display.tf +++ b/simple-python/time-display.tf @@ -1,39 +1,35 @@ # Создано: 2026-03-09 -# time-display.tf — постоянная HTTP-функция, получающая данные от джоба. -# JOB_TIME берётся из sless_job.run_getter.message (stdout джоба) — -# это JSON строка {"time": "..."}, terraform передаёт её в env целиком. -# Функция парсит её через os.environ, а не через event — демонстрирует -# паттерн "данные вычислены один раз при деплое, используются на каждый запрос". +# time-display.tf — HTTP-функция, доступная по URL после apply. +# Получает результат джоба (из time-getter.tf) через переменную окружения JOB_TIME. -# Упаковываем код функции в zip +# Упаковываем код функции в zip для загрузки data "archive_file" "time_display_zip" { type = "zip" source_dir = "${path.module}/code/time_display" output_path = "${path.module}/dist/time_display.zip" } -# HTTP-функция: постоянный Deployment, читает JOB_TIME из env +# HTTP-функция — отвечает на запросы по URL из outputs.tf resource "sless_function" "time_display" { - namespace = "default" - name = "simple-py-time-display" + name = "simple-py-time-display" # уникальное имя в namespace runtime = "python3.11" - entrypoint = "time_display.show_time" + entrypoint = "time_display.show_time" # файл.функция в code/time_display/ memory_mb = 64 - # Значение вычислено джобом при apply и зафиксировано в state + # Передаём результат джоба в функцию через переменную окружения. + # В коде функции: os.environ.get("JOB_TIME") env_vars = { JOB_TIME = sless_job.run_getter.message } code_path = data.archive_file.time_display_zip.output_path - code_hash = filesha256("${path.module}/code/time_display/time_display.py") + code_hash = filesha256("${path.module}/code/time_display/time_display.py") # для пересборки при изменении кода - depends_on = [sless_job.run_getter] + depends_on = [sless_job.run_getter] # ждём завершения джоба перед деплоем функции } -# HTTP-триггер — публикует функцию по URL +# Публикуем функцию по HTTP — URL будет в outputs.tf resource "sless_trigger" "display_http" { - namespace = "default" name = "simple-py-display-http" type = "http" function = sless_function.time_display.name diff --git a/simple-python/time-getter.tf b/simple-python/time-getter.tf index b833025..3295ef0 100644 --- a/simple-python/time-getter.tf +++ b/simple-python/time-getter.tf @@ -1,38 +1,35 @@ # Создано: 2026-03-09 -# time-getter.tf — одноразовая функция + джоб запускающий её при apply. -# sless_job.run_getter.message после apply содержит stdout runner-а: -# {"time": "2026-03-09T12:34:56.789012+00:00"} -# Это значение terraform записывает в env JOB_TIME функции time_display. +# time-getter.tf — скрипт который запускается ОДИН РАЗ при terraform apply. +# После запуска его результат доступен через: sless_job.run_getter.message +# Смотри time-display.tf — там этот результат передаётся в функцию. -# Упаковываем код функции в zip +# Упаковываем код скрипта в zip для загрузки data "archive_file" "time_getter_zip" { type = "zip" source_dir = "${path.module}/code/time_getter" output_path = "${path.module}/dist/time_getter.zip" } -# Функция-вычислитель: запускается только джобом, не имеет HTTP-триггера +# Функция для скрипта — без HTTP-триггера, вызывается только через джоб ниже resource "sless_function" "time_getter" { - namespace = "default" - name = "simple-py-time-getter" + name = "simple-py-time-getter" # уникальное имя в namespace runtime = "python3.11" - entrypoint = "time_getter.get_time" + entrypoint = "time_getter.get_time" # файл.функция в code/time_getter/ memory_mb = 64 code_path = data.archive_file.time_getter_zip.output_path - code_hash = filesha256("${path.module}/code/time_getter/time_getter.py") + code_hash = filesha256("${path.module}/code/time_getter/time_getter.py") # для пересборки при изменении кода } -# Джоб: запускает time_getter один раз при terraform apply. -# run_id > 0 — разрешение на запуск (run_id=0 пропускается оператором). -# После завершения message = stdout пода = json возвращённый get_time(). +# Джоб — запускает функцию time_getter один раз прямо при apply. +# run_id = 1 означает «запустить». Если увеличить (2, 3...) — запустится снова. +# После завершения: sless_job.run_getter.message = то что вернула функция resource "sless_job" "run_getter" { - namespace = "default" name = "simple-py-getter-run" function = sless_function.time_getter.name run_id = 1 - wait_timeout_sec = 120 - event_json = "{}" + wait_timeout_sec = 120 # сколько секунд ждать завершения скрипта + event_json = "{}" # входные данные для скрипта (пусто — данные не нужны) depends_on = [sless_function.time_getter] }