feat: provider v0.1.9 — namespace removed from resources, moved to provider block

This commit is contained in:
“Naeel” 2026-03-09 15:12:07 +04:00
parent 695f217e13
commit 01402d8494
18 changed files with 109 additions and 99 deletions

View File

@ -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

View File

@ -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 (123...).
resource "sless_job" "hello_run" {
namespace = "default"
name = "hello-run"
function = sless_function.hello_job.name
event_json = jsonencode({ numbers = [100, 200, 300] })

View File

@ -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"
}

View File

@ -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

View File

@ -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"
}

View File

@ -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

View File

@ -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

View File

@ -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"

View File

@ -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"
}

View File

@ -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

View File

@ -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"
}

View File

@ -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
}

View File

@ -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

View File

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

View File

@ -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"
}

View File

@ -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
}

View File

@ -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

View File

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