Repinoid
a97d0cd80d
chore: update ignore rules
2026-10-27 14:19:59 +03:00
Repinoid
8a02d0a0b5
chore: update ignore rules
2026-10-27 14:09:07 +03:00
Naeel
f962b9806f
fix: invoke.go — forward Content-Length to proxied request (form POST fix)
...
Without ContentLength, Python BaseHTTPRequestHandler read 0 bytes from body.
operator v0.1.37, python runtime v0.1.4, pg-table-writer HTML form
2026-03-19 08:58:35 +03:00
Naeel
84f5903f49
docs: sync all documentation for agent handoff (v0.1.34 + funcs-service v0.2.0)
2026-03-18 20:19:48 +03:00
Naeel
63e2a2b634
fix+docs: FunctionJob label bugfix, job ErrAlreadyExists, python str→text/plain, operator.yaml v0.1.33, progress.md
...
- controllers/functionjob_controller.go:
- PodTemplate labels: functionjob=, function= (k8s 1.27+ удалил job-name=)
- getJobPodOutput принимает labelSelector вместо jobName
- захват stderr при Failed job; truncateForStatus() helper
- terraform/provider/internal/client/client.go: ErrJobAlreadyExists (409 Conflict)
- terraform/provider/internal/resources/job_resource.go: при конфликте создания — читаем существующий job
- runtimes/python3.11/server.py: str return → text/plain
- internal/builder/context.go: python runtime base image → v0.1.3
- deployments/k8s/operator.yaml: image → v0.1.33
- doc/progress.md: добавлены секции FunctionJob bugfix, str→text/plain, web-console v0.2.0
2026-03-18 17:41:44 +03:00
Naeel
399b4ce261
feat: web-console — HTML UI + source viewer + trigger toggle
...
- operator: GET /v1/namespaces/{ns}/functions/{name}/source
reads build context tar.gz from S3, strips Dockerfile, returns JSON files
- funcs-service v0.2.0:
- Accept: text/html → dark-themed HTML console with accordion cards
- GET /funcs/{ns}/source/{fn} → proxy to operator (service token auth)
- PATCH /funcs/{ns}/triggers/{name} → proxy enable/disable (only enabled field)
- curl (no text/html Accept) → plain text as before (backward compat)
- highlight.js syntax highlighting per file extension
- operator v0.1.34, funcs-service v0.2.0
2026-03-18 17:24:43 +03:00
Naeel
90e4b845cd
docs: document all changes and web-console plan
...
- doc/progress.md: funcs global service v0.1.x, URLs, next steps
- doc/decisions/log.md: storage architecture, funcs service decision, web-console plan
- doc/api/design.md: current + planned endpoints (/source, PATCH trigger)
- doc/architecture/overview.md: funcs-service component, S3 storage diagram
2026-03-18 16:38:18 +03:00
Naeel
56ec1d548f
feat: funcs-service v0.1.3 — /funcs/<namespace> URL without token
...
- /funcs/<namespace>: user opens URL in browser, no auth needed
service uses SLESS_SERVICE_TOKEN to query operator internally
- /funcs?token=<jwt>: token as query param (bookmarkable URL)
- /funcs: returns usage hint with both URL formats
- SLESS_SERVICE_TOKEN set via kubectl set env (not stored in repo)
2026-03-18 16:11:17 +03:00
Naeel
1960ac33cb
feat: funcs as global Go service (sless-funcs-service:v0.1.1)
...
- services/funcs/main.go: standalone Go HTTP server
extracts JWT sub -> SHA256[:8] -> namespace -> calls operator API
returns plain text list, sorted active first, /health probe endpoint
- services/funcs/Dockerfile: multi-stage Go build -> alpine
- deployments/k8s/funcs-service.yaml: Deployment+Service+Ingress in sless ns
ingress path /funcs -> sless-funcs-service:8090, reuses sless-operator-tls
- examples/POSTGRES/resources.tf: removed funcs_list function+trigger+output
Image: naeel/sless-funcs-service:v0.1.1
2026-03-18 15:58:08 +03:00
Naeel
ec61c2764f
feat: NodeJS pg-info function; funcs endpoint: filter + created_at/last_built_at; operator v0.1.32
2026-03-18 11:03:58 +03:00
Naeel
84a54671ee
feat: add funcs endpoint — list all functions with triggers for UI
2026-03-18 10:05:15 +03:00
Naeel
87d2422e8b
feat: POSTGRES example — add pg-table-reader HTTP function
2026-03-18 09:23:13 +03:00
Naeel
44283a6d26
docs: 2026-03-18 DNS incident — sless-api→sless.kube5s.ru, POSTGRES E2E PASS
2026-03-18 09:07:47 +03:00
Naeel
cd5695d0cc
fix: migrate sless endpoint from sless-api.kube5s.ru to sless.kube5s.ru (new cluster ingress 185.247.187.147)
2026-03-18 08:48:50 +03:00
Naeel
9bfed0dc77
fix: remove all prod endpoint references from examples (test stand only)
2026-03-18 08:08:20 +03:00
Naeel
00e4be5e28
docs: E2E results 2026-03-17 — all 4 examples PASS on test stand
2026-03-18 06:27:57 +03:00
“Naeel”
5ed8d76376
0
2026-03-15 09:38:27 +04:00
Naeel
e222dacbe4
feat: demo managed functions with harbor-backed operator setup
2026-03-14 18:16:53 +03:00
Naeel
2516ed61a2
chore: ignore *.tfvars in examples, remove ai_hint_level from pg-list-python
2026-03-12 09:21:20 +03:00
Naeel
29be4b7b5e
chore: provider v0.1.18, update examples (harbor branch)
2026-03-12 09:19:17 +03:00
“Naeel”
1889b18274
chore: terraform.tfvars.change — инструкция по переименованию
2026-03-11 18:38:51 +04:00
“Naeel”
23cca9bda3
chore: добавлены terraform.tfvars.change — шаблоны для токена (переименовать в terraform.tfvars)
2026-03-11 18:38:07 +04:00
“Naeel”
9201f5a72c
fix: ModifyPlan — terraform plan теперь видит изменения в source_dir (provider v0.1.16)
2026-03-11 18:27:46 +04:00
“Naeel”
05c9bfb1eb
security: убраны реальные токены из terraform.tfvars + инструкция в README
2026-03-11 17:41:34 +04:00
“Naeel”
b74ff361e4
docs: README для примера pg-list-python
2026-03-11 17:24:34 +04:00
“Naeel”
2726ca8a1e
docs: progress.md — harbor integration + UX fixes (v0.1.24–v0.1.28)
2026-03-11 17:23:32 +04:00
“Naeel”
ff1c54340b
chore: python runtime v0.1.2 + operator v0.1.28
...
- context.go: python3.11 runtime → v0.1.2 (server.py с JSON для всех методов)
- operator.yaml: v0.1.28
2026-03-11 17:08:33 +04:00
“Naeel”
1b26f5da30
fix: build logs in status + JSON for all HTTP methods in python runtime
...
- function_controller.go: KubeClient + getBuildPodLogs → Function.Status.Message
включает логи pip/kaniko при сбое сборки
- runtimes/python3.11/server.py: PUT/DELETE/PATCH/HEAD обрабатываются как вызовы функции;
send_error переопределён → JSON вместо HTML 501
- operator.yaml: v0.1.27
- main.go: KubeClient передаётся в FunctionReconciler
2026-03-11 17:03:54 +04:00
“Naeel”
5e97f089b4
fix: восстановлен requirements.txt после теста
2026-03-11 16:54:53 +04:00
“Naeel”
7759a81501
test: невалидный requirements.txt
2026-03-11 16:53:01 +04:00
“Naeel”
a78abfc542
docs: переработан examples/README.md + комментарии function.tf
2026-03-11 16:48:01 +04:00
“Naeel”
d466e9ce98
fix: Decimal→float для JSON сериализации price
2026-03-11 16:39:56 +04:00
“Naeel”
f773fd4a5f
feat: пример pg-list-python — список из PostgreSQL без джоба
2026-03-11 16:37:22 +04:00
“Naeel”
da6fb42e69
chore: удалён отладочный push-sample (Harbor интеграция закончена)
2026-03-11 16:33:26 +04:00
“Naeel”
3c452d17f7
fix: go1.23 build context — COPY . /app/handler/ вместо COPY handler/
2026-03-11 16:14:42 +04:00
“Naeel”
b8da6b07ab
refactor: rename handler.go→greeting.go, buildGreeting() in hello-go example
2026-03-11 16:02:49 +04:00
“Naeel”
a576c19499
feat: go1.23 runtime support
...
- runtimes/go1.23/server.go: HTTP-wrapper + job-runner (SLESS_MODE=job)
- runtimes/go1.23/go.mod: module sless/fn (изолирует от корневого go.mod)
- runtimes/go1.23/Dockerfile: multi-stage build (golang:1.23-alpine → alpine:3.20)
- internal/builder/context.go: go1.23 в runtimeBaseImage + generateDockerfile
- controllers/functionjob_controller.go: go1.23 runner (nil cmd + SLESS_MODE=job env)
- api/v1alpha1/function_types.go: enum go1.21 → go1.23
- config/crd/bases/...: CRD обновлён
- terraform/provider: OneOf обновлён
- examples/hello-go: HTTP + job примеры на go1.23
- deployments/k8s/operator.yaml: v0.1.25
2026-03-11 15:40:47 +04:00
“Naeel”
d3e632eb90
feat: harbor integration — EnsureProject + per-namespace image path
...
- internal/harbor/client.go: новый пакет, EnsureProject (GET+POST idempotent)
- config.go: добавлены HarborUser/HarborPass (из HARBOR_USER/HARBOR_PASS env)
- builder.go: Projecter интерфейс, harborClient поле, ImageRef: {host}/{ns}/{func}:{tag}
EnsureProject вызывается перед каждым Build()
- function_controller.go: HarborClient поле, EnsureProject при создании k8s NS
- main.go: создание harbor.Client если HARBOR_USER+HARBOR_PASS заданы
- operator.yaml: REGISTRY_HOST=pearlharbor..., HARBOR_USER=admin, v0.1.24
- hack/create-registry-secret.sh: переписан для Harbor (HARBOR_USER/HARBOR_PASS)
Смена registry — только через REGISTRY_HOST в ConfigMap, больше нигде.
2026-03-11 14:58:04 +04:00
“Naeel”
64cbd8cb5c
Ignore nested examples .git
2026-03-11 14:45:35 +04:00
“Naeel”
c5111b9d2f
chore: staged files from prev session (gitignore, examples, harbor guide)
2026-03-11 14:36:32 +04:00
“Naeel”
9e1a06d1ca
docs: удалённая машина теперь полная — kubectl + kubeconfig скопирован
2026-03-11 12:58:39 +04:00
“Naeel”
ee6dba67a3
docs: stress test 4/4 PASS (v0.1.23), баги задокументированы
2026-03-11 12:41:04 +04:00
“Naeel”
dff8febdb2
fix: operator v0.1.23 — BackoffLimit=2 в kaniko, пересоздание Failed функций; script: mod2 96→128
2026-03-11 12:26:06 +04:00
“Naeel”
d510018b2c
fix: run_stress_test.sh — tf_output_json для объектных outputs, fix pipeline в assert_step
2026-03-11 11:35:27 +04:00
“Naeel”
77ee97922a
chore: gitignore logs dirs
2026-03-11 11:14:28 +04:00
“Naeel”
25c13d64e6
test: run_stress_test.sh — полный стресс-тест всех примеров
2026-03-11 11:14:06 +04:00
“Naeel”
32615c59d5
test: E2E скрипт run_e2e_tests.sh + fix provider token/version в примерах
2026-03-11 10:49:36 +04:00
“Naeel”
4a4c2f4d2d
docs: update for v0.1.22 — Builder SoC, immediate fixes, unit tests
2026-03-11 09:42:12 +04:00
“Naeel”
5f3e5a6f65
refactor: Builder SoC + JWKS stub + unit tests
...
Builder SoC (builder/context.go):
- Moved generateDockerfile, runtimeBaseImage, zipToTarGz from handler/upload.go
to internal/builder/context.go.
Reason: knowledge about runtime images and build context structure is a
build concern, not an HTTP handler concern.
- Added PrepareContext(zipData []byte, runtime string) (*bytes.Buffer, error) —
single public entry point. Handler calls one function, gets ready buffer.
- zipToTarGz now accepts *zip.Reader instead of []byte to avoid double parsing.
- upload.go reduced from ~200 LOC to ~60 LOC (build logic gone).
auth.go — JWKS insertion point:
- Added verifySignature() stub with detailed comment explaining what v2
implementation needs (JWKS endpoint, kid lookup, RS256/ES256 verify).
- Shows exactly where to add the call in validateJWT.
Unit tests (9 total, all pass):
- controllers: TestBuildDeployment_EnvVarsSorted, TestBuildDeployment_EmptyEnv
- handler: TestHopByHopHeaders_* (3 tests)
- builder: TestPrepareContext_PythonWithRequirements, _NodeNoPackageJSON,
_UnsupportedRuntime, _DockerfileIsFirst
2026-03-11 09:34:34 +04:00
“Naeel”
7b8617fbe2
fix: immediate fixes from Opus review (v0.1.22)
...
- trigger: CronJob moved to deployNS (sless-fn-{userNS}), was tr.Namespace
Reason: with NetworkPolicy default-deny, pod in user-ns can't reach
Service in sless-fn-ns. Co-locating CronJob with Service guarantees
connectivity regardless of NetworkPolicy configuration.
handleTriggerDeletion updated consistently.
- trigger: pin curlimages/curl to 8.5.0 (was :latest)
Reason: reproducibility, no unexpected behavior changes from image updates.
- function: sort env vars in buildDeployment (was non-deterministic map range)
Reason: non-deterministic order caused k8s to detect container spec 'change'
on every reconcile → unnecessary pod restarts. Sorted order is stable.
- function: cleanup kaniko Job in handleDeletion
Reason: if Function deleted during Building phase, kaniko Job continued
running, wasting CPU/memory and pushing an unused image.
- invoke: filter hop-by-hop headers in proxy response (RFC 2616 §13.5.1)
Reason: Transfer-Encoding especially dangerous — forwarding it corrupts
response body framing for the client.
- config: SLESS_API_TOKEN no longer required
Reason: dead code — field loaded but never passed to any component.
Auth uses validateJWT() middleware, not static token.
Namespace lifecycle: user namespaces preserved on destroy (not changed).
E2E: apply 4 resources + destroy clean. Operator v0.1.22 deployed.
2026-03-11 09:20:09 +04:00