mirror of
https://github.com/R0m1k3/Loki.git
synced 2026-10-17 12:16:21 +02:00
Lot 35 : routes de base de la façade aussi par le tunnel du relais
Les neuf routes que la façade sert toujours (ping, status, config, ligne de commande du moteur, couches du modèle, chemins, RAM, VRAM, journal du service) arrivent désormais à la façade par le tunnel du relais aussi : withFacadeChat les lui remet dès qu'elle tourne (facade_core.go). Les handlers du Go ne servent plus que sans façade (LOKI_FACADE=0). Côté Rust, une requête relayée par le Go (jeton interne) n'est pas réauthentifiée, comme pour les routes des lots. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016tcGfJWefW5kUGoC2wL8cv
This commit is contained in:
8 files changed
+186
-9
No files matched your search
@@ -142,6 +142,8 @@ func withFacadeChat(path string, h http.HandlerFunc) http.HandlerFunc {
|
||||
held, unavailable = facadeBench, "banc d'essai indisponible : "
|
||||
case facadeTuneRoutes[path]:
|
||||
held, unavailable = facadeTune, "optimiseur indisponible : "
|
||||
case facadeCoreRoutes[path]:
|
||||
held, unavailable = facadeCore, "façade indisponible : "
|
||||
default:
|
||||
return h
|
||||
}
|
||||
|
||||
@@ -312,7 +312,7 @@ func TestFacadeRelaieLesModeles(t *testing.T) {
|
||||
t.Fatalf("reçu par la façade : %v", got)
|
||||
}
|
||||
// Le chat, lui, reste ici (LOKI_CHAT absent), et les routes voisines aussi.
|
||||
for _, p := range []string{"/api/chat/send", "/api/model/layers", "/api/presets"} {
|
||||
for _, p := range []string{"/api/chat/send", "/api/mem/health", "/api/presets"} {
|
||||
w := httptest.NewRecorder()
|
||||
withFacadeChat(p, local)(w, httptest.NewRequest("POST", p, nil))
|
||||
if w.Body.String() != "go" {
|
||||
@@ -1125,9 +1125,9 @@ func TestFacadeMoteurImage(t *testing.T) {
|
||||
t.Fatalf("relais : %v", calls)
|
||||
}
|
||||
w := httptest.NewRecorder()
|
||||
withFacadeChat("/api/engine/cmdline", local)(w, httptest.NewRequest("GET", "/api/engine/cmdline", nil))
|
||||
withFacadeChat("/api/llamacpp/install", local)(w, httptest.NewRequest("POST", "/api/llamacpp/install", nil))
|
||||
if w.Body.String() != "go" {
|
||||
t.Fatalf("/api/engine/cmdline doit rester au Go : %q", w.Body.String())
|
||||
t.Fatalf("/api/llamacpp/install doit rester au Go : %q", w.Body.String())
|
||||
}
|
||||
|
||||
// Sans jeton interne, rien ne part.
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
package loki
|
||||
|
||||
// facade_core.go — les routes de base que la façade sert toujours (api.rs,
|
||||
// lot 35 de la migration) : santé, état, configuration, ligne de commande du
|
||||
// moteur, mémoire vive et vidéo, journal du service, chemins, couches du
|
||||
// modèle. Quand elles arrivent par le tunnel du relais (accès distant, E2E),
|
||||
// le Go les lui remet aussi, comme les routes des lots : ses propres
|
||||
// handlers ne servent plus que sans façade (LOKI_FACADE=0).
|
||||
|
||||
var facadeCoreRoutes = map[string]bool{
|
||||
"/api/ping": true,
|
||||
"/api/status": true,
|
||||
"/api/config": true,
|
||||
"/api/engine/cmdline": true,
|
||||
"/api/model/layers": true,
|
||||
"/api/paths": true,
|
||||
"/api/ram": true,
|
||||
"/api/vram": true,
|
||||
"/api/service/log": true,
|
||||
}
|
||||
|
||||
// facadeCore : une façade tourne devant ce processus (son adresse et le
|
||||
// jeton interne sont là).
|
||||
func facadeCore() bool {
|
||||
return facadeAddr() != "" && internalToken() != ""
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
package loki
|
||||
|
||||
import (
|
||||
"io"
|
||||
"net/http"
|
||||
"net/http/httptest"
|
||||
"strings"
|
||||
"testing"
|
||||
)
|
||||
|
||||
// Lot 35 : les routes de base arrivent à la façade par le tunnel du relais
|
||||
// dès qu'elle tourne, sans variable ; sans façade (LOKI_FACADE=0 : ni
|
||||
// adresse ni jeton), le Go les sert lui-même.
|
||||
func TestFacadeRelaieLesRoutesDeBase(t *testing.T) {
|
||||
testHome(t)
|
||||
f := demarrerFacade(t)
|
||||
t.Setenv(facadeChatEnv, "")
|
||||
local := func(w http.ResponseWriter, r *http.Request) { io.WriteString(w, "go") }
|
||||
for p := range facadeCoreRoutes {
|
||||
w := httptest.NewRecorder()
|
||||
withFacadeChat(p, local)(w, httptest.NewRequest("GET", p, nil))
|
||||
if w.Body.String() != f.reply {
|
||||
t.Fatalf("%s : réponse %q", p, w.Body.String())
|
||||
}
|
||||
}
|
||||
if got := f.recu(); len(got) != len(facadeCoreRoutes) || !strings.HasSuffix(strings.TrimSpace(got[0]), "jeton") {
|
||||
t.Fatalf("reçu par la façade : %v", got)
|
||||
}
|
||||
// Une route que le Go garde : ici.
|
||||
w := httptest.NewRecorder()
|
||||
withFacadeChat("/api/mem/health", local)(w, httptest.NewRequest("GET", "/api/mem/health", nil))
|
||||
if w.Body.String() != "go" {
|
||||
t.Fatalf("route du Go relayée : %q", w.Body.String())
|
||||
}
|
||||
// Façade muette : 502 qui le dit.
|
||||
f.srv.Close()
|
||||
w = httptest.NewRecorder()
|
||||
withFacadeChat("/api/status", local)(w, httptest.NewRequest("GET", "/api/status", nil))
|
||||
if w.Code != http.StatusBadGateway || !strings.Contains(w.Body.String(), "façade indisponible : ") {
|
||||
t.Fatalf("façade muette : %d %s", w.Code, w.Body.String())
|
||||
}
|
||||
// Sans façade : le Go sert.
|
||||
t.Setenv(facadeAddrEnv, "")
|
||||
w = httptest.NewRecorder()
|
||||
withFacadeChat("/api/status", local)(w, httptest.NewRequest("GET", "/api/status", nil))
|
||||
if w.Body.String() != "go" {
|
||||
t.Fatalf("sans façade : %q", w.Body.String())
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user