feat(routing): 引入多执行池智能调度
将 Worker 发现、路由画像、容量与执行传输抽象为平台无关接口,新增 Kubernetes 和静态容量适配器,并以 shadow 模式接入生产配置。 实现网络与容量评分、路由防抖、池队列、同步 Worker 租约、一次性执行令牌,以及提交状态不明时禁止重复分配的安全语义。 新增 0105 兼容迁移、管理接口、指标、OpenAPI 和回归测试。已执行全量 Go 测试、go vet、OpenAPI、迁移安全、Compose 与 Kustomize 验证。
This commit is contained in:
@@ -0,0 +1,53 @@
|
||||
package runner
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"io"
|
||||
"net/http"
|
||||
"net/http/httptest"
|
||||
"testing"
|
||||
|
||||
"github.com/easyai/easyai-ai-gateway/apps/api/internal/executionpool"
|
||||
)
|
||||
|
||||
func TestHTTPExecutionTransportUsesAdvertisedEndpointAndProtocol(t *testing.T) {
|
||||
server := httptest.NewServer(http.HandlerFunc(func(response http.ResponseWriter, request *http.Request) {
|
||||
if request.URL.Path != workerExecutionPath {
|
||||
t.Fatalf("path=%q", request.URL.Path)
|
||||
}
|
||||
if got := request.Header.Get("Authorization"); got != "Worker signed-token" {
|
||||
t.Fatalf("authorization=%q", got)
|
||||
}
|
||||
var payload InternalExecutionRequest
|
||||
if err := json.NewDecoder(request.Body).Decode(&payload); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if payload.TaskID != "task-1" || payload.LeaseID != "lease-1" || !payload.Stream {
|
||||
t.Fatalf("payload=%+v", payload)
|
||||
}
|
||||
response.Header().Set("X-Worker", "accepted")
|
||||
response.WriteHeader(http.StatusAccepted)
|
||||
_, _ = response.Write([]byte("ok"))
|
||||
}))
|
||||
defer server.Close()
|
||||
|
||||
transport := httpExecutionTransport{client: server.Client()}
|
||||
result, err := transport.Execute(context.Background(), executionpool.WorkerDescriptor{
|
||||
WorkerID: "worker-1", PoolID: "pool-1", Endpoint: server.URL,
|
||||
}, executionpool.ExecutionRequest{
|
||||
TaskID: "task-1", PoolID: "pool-1", WorkerID: "worker-1", LeaseID: "lease-1",
|
||||
AuthorizationToken: "signed-token", Stream: true,
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
defer result.Body.Close()
|
||||
body, err := io.ReadAll(result.Body)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if result.StatusCode != http.StatusAccepted || len(result.Headers["X-Worker"]) != 1 || result.Headers["X-Worker"][0] != "accepted" || string(body) != "ok" {
|
||||
t.Fatalf("result=%+v body=%q", result, body)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user