fix: document cron router auth chain
This commit is contained in:
+40
@@ -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
@@ -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`.
|
||||
@@ -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`.
|
||||
@@ -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.
|
||||
@@ -0,0 +1,8 @@
|
||||
# CRON glossary
|
||||
|
||||
- `TimeTrigger` — CRD-объект Fission для запуска функции по расписанию.
|
||||
- `timetrigger` — CLI-команда для управления time triggers.
|
||||
- `cron` — строка расписания, по которой Fission планирует вызов функции.
|
||||
- `functionref` — ссылка на функцию, которую должен вызывать триггер.
|
||||
- `method` — HTTP-метод вызова функции.
|
||||
- `subpath` — путь внутри функции, если она поддерживает внутренний routing.
|
||||
@@ -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,
|
||||
потом короткая проверка живым сценарием.
|
||||
@@ -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.
|
||||
- Функция не требует внешних библиотек.
|
||||
@@ -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) — короткие определения терминов
|
||||
Reference in New Issue
Block a user