fix: document cron router auth chain

This commit is contained in:
Naeel
2026-04-29 08:39:19 +03:00
parent a534fddd2c
commit 35fd9ec40e
19 changed files with 1903 additions and 15 deletions
+40
View File
@@ -0,0 +1,40 @@
# Fission timetrigger CLI
Официальный CLI-раздел для cron-триггеров в Fission использует команду `fission timetrigger`.
## Команды
### `fission timetrigger`
Групповая команда для управления time triggers.
Подкоманды из официальной справки:
- `fission timetrigger create` — создать time trigger
- `fission timetrigger delete` — удалить time trigger
- `fission timetrigger list` — показать список time triggers
- `fission timetrigger showschedule` — показать ближайшие запуски для cron-выражения
- `fission timetrigger update` — обновить time trigger
### `fission timetrigger create`
Создает time trigger.
Основные параметры:
- `--name` — имя триггера
- `--function` — имя функции
- `--cron` — cron-спецификация
- `--method` — HTTP method для вызова функции
- `--subpath` — под-путь внутри функции, если функция поддерживает routing
- `--spec` — сохранить spec вместо создания в кластере
- `--dry` — показать сгенерированные spec-файлы
### `fission timetrigger showschedule`
Показывает ближайшие моменты запуска для cron-строки.
Параметры:
- `--cron` — cron-спецификация
- `--round` — количество следующих запусков для вывода
## Важные детали из документации
- Cron-строка может быть в формате с шестью полями: секунды, минуты, часы, день месяца, месяц, день недели.
- Поддерживаются читаемые форматы вроде `@every 5m` и `@hourly`.
- При отображении расписания используется время сервера, а не локальное время клиента.
+47
View File
@@ -0,0 +1,47 @@
# Fission TimeTrigger CRD
В официальной CRD Reference Fission cron-триггер называется `TimeTrigger`.
## Kind
- `apiVersion`: `fission.io/v1`
- `kind`: `TimeTrigger`
## Назначение
`TimeTrigger` запускает функцию по расписанию, заданному cron-строкой.
## Spec
Согласно официальной схеме, у `TimeTriggerSpec` есть поля:
- `cron` — cron schedule
- `functionref` — ссылка на функцию
- `method` — HTTP method для вызова функции, по умолчанию `POST`
- `subpath` — под-путь для маршрутизации внутри функции, по умолчанию `/`
## FunctionReference
`functionref` содержит ссылку на функцию:
- `type` — тип ссылки, для time trigger используется `name`
- `name` — имя функции
## Минимальный пример
```yaml
apiVersion: fission.io/v1
kind: TimeTrigger
metadata:
name: cron-job
namespace: fission-function
spec:
cron: "*/5 * * * *"
functionref:
type: name
name: hello
```
## Что важно помнить
- `TimeTrigger` вызывает функцию через HTTP-вызов.
- Если функция внутри сама поддерживает routing, `subpath` помогает выбрать нужный маршрут.
- `method` можно использовать, если триггер должен дергать функцию не `POST`, а `GET`, `PUT`, `DELETE` или `HEAD`.
+39
View File
@@ -0,0 +1,39 @@
# Fission cron examples
Ниже примеры cron-расписаний из официальной документации Fission.
## Примеры cron строк
### Каждые 30 минут
```bash
fission timetrigger create --name halfhourly --function hello --cron "0 */30 * * * *"
```
### Каждую минуту
```bash
fission timetrigger create --name minute --function hello --cron "@every 1m"
```
### Проверка расписания
```bash
fission timetrigger showschedule --cron "0 30 * * * *" --round 5
```
## Как читать cron в Fission
Официальная CLI-справка указывает, что поля cron идут так:
- секунды
- минуты
- часы
- день месяца
- месяц
- день недели
## Практический вывод
Для Fission cron-триггеров обычно важны три вещи:
- имя триггера
- имя функции
- cron-выражение
Если функция поддерживает routing, дополнительно можно задавать `subpath` и `method`.
+46
View File
@@ -0,0 +1,46 @@
# Fission cron: наши выводы и факты
Короткий локальный конспект, чтобы не искать повторно по сторонней документации.
## Что делает оригинальный Fission
- Cron в Fission запускается штатным механизмом `TimeTrigger` / `timetrigger`.
- `timer` — отдельный controller-под, который живет постоянно, пока deployment поднят.
- `timer` смотрит только те namespace-ы, которые ему явно заданы при старте.
- Когда наступает время, `timer` инициирует обычный Fission invoke через `router`.
- Console не участвует в выполнении cron после создания/обновления `TimeTrigger`.
## Что важно для multi-namespace
- Да, в Fission изначально заложена работа с несколькими namespace-ами.
- Но это не "авто-перебор всего кластера".
- Нужен явный watch-list, обычно через `FISSION_RESOURCE_NAMESPACES`.
- Если namespace не входит в этот список, `timer` его `TimeTrigger` не увидит.
## Что делает наша console
- Console создает или обновляет `TimeTrigger` в namespace пользователя.
- В `TimeTrigger` задаются:
- `spec.cron`
- `spec.functionref`
- `spec.method`
- `spec.subpath`
- После этого дальнейший запуск полностью делает Fission.
- Console только управляет CRD и показывает состояние/метрики.
## Что мы выяснили в этом проекте
- Основная проблема была не в cron-механизме Fission как таковом, а в visibility namespaces для `timer`.
- `timer` сначала смотрел только `default`, поэтому user namespace был невидим.
- Дополнительно, history на `/cron` хранится в памяти процесса console, поэтому rollout сбрасывает накопленные снимки.
## Практический вывод
- Для cron важно не только создать `TimeTrigger`, но и убедиться, что `timer` watch-ит namespace пользователя.
- Если `/cron` пустой после rollout, это может быть:
- `timer` не видит namespace
- `TimeTrigger` не создан
- invoke не дошел до функции
- snapshot не сохранился в `cron_metrics`
- Console не запускает shell-команды в Kubernetes и не исполняет cron сама.
- Console только создает CRD, а дальше работает штатный Fission controller path.
+8
View File
@@ -0,0 +1,8 @@
# CRON glossary
- `TimeTrigger` — CRD-объект Fission для запуска функции по расписанию.
- `timetrigger` — CLI-команда для управления time triggers.
- `cron` — строка расписания, по которой Fission планирует вызов функции.
- `functionref` — ссылка на функцию, которую должен вызывать триггер.
- `method` — HTTP-метод вызова функции.
- `subpath` — путь внутри функции, если она поддерживает внутренний routing.
+159
View File
@@ -0,0 +1,159 @@
# GPT 5.4 handoff: Fission CRON plan
## Goal
Составить только план действий по теме Fission cron / time triggers. Не писать реализацию сейчас. Не раздувать ответ. Нужен прагматичный, короткий, пошаговый план.
## What is the topic
В Fission cron-триггеры в документации и CRD называются `TimeTrigger`, а в CLI — `fission timetrigger`.
## Official docs used as source of truth
- https://fission.io/docs/usage/triggers/
- https://fission.io/docs/usage/triggers/timer/
- https://fission.io/docs/reference/crd-reference/
- https://fission.io/docs/reference/fission-cli/fission_timetrigger/
- https://fission.io/docs/reference/fission-cli/fission_timetrigger_create/
- https://fission.io/docs/reference/fission-cli/fission_timetrigger_showschedule/
## Facts to keep in mind
- There is no dedicated `/docs/cron/` page on the official site; relevant official page is `Timer Triggers`.
- Timer triggers run functions on a schedule.
- Cron spec supports 6 fields: seconds, minutes, hours, day of month, month, day of week.
- Readable forms are supported too: `@every 5m`, `@hourly`.
- Schedule output should use server time, not client time.
## CRD facts
- `apiVersion`: `fission.io/v1`
- `kind`: `TimeTrigger`
- `spec.cron` — cron expression
- `spec.functionref` — function reference
- `spec.method` — HTTP method, default `POST`
- `spec.subpath` — subpath, default `/`
- `functionref.type` is `name`
- `functionref.name` is the function name
## CLI facts
### `fission timetrigger`
Subcommands from official docs:
- `create`
- `delete`
- `list`
- `showschedule`
- `update`
### `fission timetrigger create`
Key flags:
- `--name`
- `--function`
- `--cron`
- `--method`
- `--subpath`
- `--spec`
- `--dry`
### `fission timetrigger showschedule`
Key flags:
- `--cron`
- `--round`
## Repo facts
Current repo has a local CRON folder with:
- `CRON/README.md`
- `CRON/CLI.md`
- `CRON/CRD.md`
- `CRON/EXAMPLES.md`
- `CRON/GLOSSARY.md`
Relevant console routes currently visible in code:
- `GET /api/timetriggers`
- `GET /console/api/timetriggers`
This means current console code clearly exposes listing for timetriggers; do not assume create/delete UI is already implemented unless verified separately.
## What the plan should optimize for
- shortest path to useful outcome
- no token waste
- no speculative implementation details
- only actions that are justified by the facts above
## Recommended output format for GPT 5.4
1. One-line conclusion
2. Short numbered plan
3. Risks or unknowns, only if they block the plan
4. No extra explanation
## Plan for mini
1. Зафиксировать целевой результат: что именно нужно сделать с cron в этом проекте.
Нужно выбрать одно из трёх:
`документация`, `console API CRUD`, `UI CRUD/просмотр`, либо полный путь поэтапно.
2. Принять официальный термин как базовый.
В коде и плане опираться на `TimeTrigger`/`timetrigger`, а не на абстрактное “cron”, чтобы не путать CLI, CRD и UI.
3. Разделить текущее состояние на “уже есть” и “надо сделать”.
Уже есть:
`официальная сводка`, `CRON docs`, `GET /api/timetriggers`, `GET /console/api/timetriggers`.
Проверить отдельно:
есть ли `POST/DELETE/UPDATE` для timetriggers в console API, модель запроса, UI-форма, UI-delete.
4. Если цель именно реализация, сначала закрыть backend API.
Минимальный набор:
`CreateTimeTriggerRequest`,
`POST /console/api/timetriggers`,
`DELETE /console/api/timetriggers/:name`,
при необходимости `PUT`.
Логика должна строить CRD `fission.io/v1`, `kind: TimeTrigger` с полями:
`cron`, `functionref`, `method`, `subpath`.
5. После backend закрыть валидацию.
Нужно валидировать:
имя,
существование функции,
непустой `cron`,
при необходимости `method`,
дефолты для `method=POST`, `subpath=/`.
Отдельно не гадать формат cron вручную, если можно отдать это на Fission/его контракт.
6. Затем делать UI только после подтверждённого backend.
Минимум:
список timetriggers,
создание,
удаление,
опционально редактирование.
Если UI не нужен сейчас, не тратить на него время.
7. Тестировать в том же порядке.
Сначала unit/integration на API builder TimeTrigger.
Потом живой сценарий:
создать функцию,
создать timetrigger,
проверить list,
проверить delete.
`showschedule` использовать как вспомогательную проверку cron-строк, а не как часть console API.
8. Документацию держать синхронно с реализацией.
Обновлять только новую папку CRON и соседние материалы, не размазывая контекст по старым документам без необходимости.
9. Не делать лишнего на первом проходе.
Не трогать:
Terraform provider,
сложный scheduler,
расширенные cron-валидаторы,
полный UI-редизайн,
пока не готов минимальный CRUD по TimeTrigger.
10. Рабочий порядок для mini:
сначала поиск фактов в коде,
потом backend routes/models/handlers,
потом тесты,
потом UI,
потом короткая проверка живым сценарием.
+126
View File
@@ -0,0 +1,126 @@
# Python cron function template
Эту функцию можно создать вручную в console UI и привязать к `TimeTrigger`.
Она собирает базовые метрики системы, отдает JSON и сразу отправляет snapshot в страницу cron dashboard.
## Что нужно задать в UI
- `Route`: например `/system-metrics`
- `Methods`: `GET,POST`
- `Cron`: например `*/5 * * * *`
- `Entrypoint`: `main.main`
## Код
```python
import json
import os
import socket
import urllib.request
from datetime import datetime, timezone
def read_meminfo():
mem = {}
try:
with open('/proc/meminfo', 'r', encoding='utf-8') as fh:
for line in fh:
if ':' not in line:
continue
key, value = line.split(':', 1)
parts = value.strip().split()
if not parts:
continue
try:
mem[key] = float(parts[0]) / 1024.0 # kB -> MB
except ValueError:
continue
except OSError:
pass
return mem
def read_uptime_sec():
try:
with open('/proc/uptime', 'r', encoding='utf-8') as fh:
return float(fh.read().split()[0])
except Exception:
return 0.0
def read_disk_gb(path='/'):
st = os.statvfs(path)
total = (st.f_blocks * st.f_frsize) / (1024 ** 3)
free = (st.f_bavail * st.f_frsize) / (1024 ** 3)
used = total - free
return total, free, used
def payload():
mem = read_meminfo()
total = mem.get('MemTotal', 0.0)
free = mem.get('MemFree', 0.0)
available = mem.get('MemAvailable', free)
used = max(0.0, total - free) if total else 0.0
mem_percent = (used / total) * 100.0 if total else 0.0
try:
load1, load5, load15 = os.getloadavg()
except (AttributeError, OSError):
load1 = load5 = load15 = 0.0
disk_total, disk_free, disk_used = read_disk_gb('/')
return {
'timestamp': datetime.now(timezone.utc).isoformat().replace('+00:00', 'Z'),
'source': os.getenv('CRON_SOURCE', 'python-cron'),
'hostname': socket.gethostname(),
'status': 'ok',
'memory_total_mb': round(total, 2),
'memory_free_mb': round(free, 2),
'memory_available_mb': round(available, 2),
'memory_used_mb': round(used, 2),
'memory_percent': round(mem_percent, 2),
'cpu_load_1m': round(load1, 2),
'cpu_load_5m': round(load5, 2),
'cpu_load_15m': round(load15, 2),
'disk_total_gb': round(disk_total, 2),
'disk_free_gb': round(disk_free, 2),
'disk_used_gb': round(disk_used, 2),
'uptime_sec': round(read_uptime_sec(), 2),
}
def push_snapshot(data):
target = os.getenv('CRON_TARGET_URL', 'http://fission-console.fission.svc.cluster.local/cron/api/metrics')
req = urllib.request.Request(
target,
data=json.dumps(data).encode('utf-8'),
method='POST',
headers={'Content-Type': 'application/json'},
)
token = os.getenv('CRON_TOKEN', '').strip()
if token:
req.add_header('X-Cron-Token', token)
with urllib.request.urlopen(req, timeout=10) as resp:
return resp.read().decode('utf-8', errors='ignore')
def main():
data = payload()
try:
push_snapshot(data)
except Exception as exc:
data['push_error'] = str(exc)
return {
'status': 200,
'headers': {'Content-Type': 'application/json'},
'body': json.dumps(data, ensure_ascii=False),
}
```
## Что важно
- `CRON_TARGET_URL` можно оставить по умолчанию, если console доступна по публичному URL.
- Если захочешь защитить ingest, задай `CRON_TOKEN` в функции и такой же `X-Cron-Token` на стороне console.
- Функция не требует внешних библиотек.
+22
View File
@@ -0,0 +1,22 @@
# CRON в Fission
Эта папка собрана по официальной документации Fission и посвящена time-based triggers, которые в CLI называются `timetrigger`, а в CRD — `TimeTrigger`.
## Кратко
Fission Timer Trigger запускает функцию по cron-расписанию. Это не HTTP-trigger и не message-queue trigger, а отдельный механизм запуска по времени.
Официальные страницы, на которых основана сводка:
- https://fission.io/docs/usage/triggers/
- https://fission.io/docs/usage/triggers/timer/
- https://fission.io/docs/reference/crd-reference/
- https://fission.io/docs/reference/fission-cli/fission_timetrigger/
- https://fission.io/docs/reference/fission-cli/fission_timetrigger_create/
- https://fission.io/docs/reference/fission-cli/fission_timetrigger_showschedule/
## Что здесь описано
- [CLI](CLI.md) — команды `fission timetrigger`
- [CRD](CRD.md) — объект `TimeTrigger` и его поля
- [Examples](EXAMPLES.md) — примеры cron-расписаний
- [Glossary](GLOSSARY.md) — короткие определения терминов